{"version":"https://jsonfeed.org/version/1","title":"Stéphane HUC :: IT Log","home_page_url":"https://doc.huc.fr.eu.org","feed_url":"https://doc.huc.fr.eu.org/fr/feed.json","description":"Documentations Administration Système, Réseaux, Web","author":{"avatar":"/svg/Logo_final.svg","name":"Stéphane HUC","url":"https://doc.huc.fr.eu.org"},"icon":"/svg/Logo_final.svg","favicon":"/img/favicon.ico","items":[{"id":"tag:doc.huc.fr.eu.org,2026-09-22:/fr/web/hugo/render-hook-image-video/#549cbe980aaca38db2145cd8b5d2c58ae295206a2350eb3edc5f63412f7fa22c","url":"https://it-log.fr.eu.org/fr/web/hugo/render-hook-image-video/","title":"Hugo : Render Hook Image & Video","author":{"name":"Stéphane HUC"},"content_text":"Description Hugo gère la syntaxe Markdown des images, par le biais du moteur Goldmark.\nLe format Markdown pour les images est connu :\n![Tux](tux.jpg \u0026#34;Logo du Manchot\u0026#34;) Hugo permet de surcharger le comportement par le biais de \u0026ldquo;render hook\u0026rdquo; - qui se traduirait en français par \u0026lsquo;crochet de rendu\u0026rsquo;. Ceux-ci sont à écrire généralement dans un sous-répertoire nommé _markup du répertoire principal layouts.\nJ\u0026rsquo;utilise historiquement celui créé par \u0026ldquo;Veriphor LLC\u0026rdquo;, déposé sous licence Apache 2.0… parce qu\u0026rsquo;à l\u0026rsquo;époque en 2023, cela m\u0026rsquo;était plus simple et je n\u0026rsquo;avais vraiment pas compris la mécanique derrière. Donc, pourquoi écrire ce que d\u0026rsquo;autres avaient certainement mieux fait que moi…\nCe render hook nécessite la modification de la configuration des modules à monter, tel que :\nmounts: - source: assets target: assets - source: static target: assets Puis l\u0026rsquo;ajout de ces paramètres dans la configuration :\nrender_hooks: image: # ignore (default), warning, or error (fails the build) errorLevel: warning (…) Ce sont les prérequis…\nModifications Puis au courant de l\u0026rsquo;année 2026, j\u0026rsquo;ai commencé à triturer ce modèle pour essayer :\nd\u0026rsquo;apporter un peu plus de sens, en ajoutant l\u0026rsquo;élément a et picture de détecter si une taille d\u0026rsquo;affichage est demandée, puis ajouter des sources pour l\u0026rsquo;affichage des formats webp, puis avif de modifier le code pour gèrer les images au format svg et aujourd\u0026rsquo;hui, je me suis posé la question de gérer l\u0026rsquo;affichage de vidéo. Nativement, Markdown ne supporte pas l\u0026rsquo;affichage vidéo.\nJe veux pouvoir utiliser la syntaxe pour les images et que le crochet fasse la détection d\u0026rsquo;une image ou d\u0026rsquo;une vidéo et affiche le code adéquat.\nAprès le gros du travail effectué par le code originel, j\u0026rsquo;ai initialisé quelques variables utiles pour le traitement futur d\u0026rsquo;un média image ou vidéo, avant l\u0026rsquo;initialisation du dictionnaire d\u0026rsquo;attributs $attrs :\n(…) {{- /* Initialize variables. */}} {{- $alt := .PlainText -}} {{- $content := \u0026#34;\u0026#34; -}} {{- $dest := .Destination | safeURL -}} {{- $ext := $r.MediaType.SubType -}} {{- $height := \u0026#34;\u0026#34; -}} {{- $media := $r.MediaType.MainType -}} {{- $src := $r.RelPermalink -}} {{- $srcset := dict }} {{- $title := .Title | transform.HTMLEscape -}} {{- $type := $r.MediaType -}} {{- $width := \u0026#34;\u0026#34; -}} (…) $r étant la variable ressource…\nJ\u0026rsquo;ai de fait modifié l\u0026rsquo;initialisation du dictionnaire $attrs, tel que :\n(…) {{- /* Initialize attributes. */}} {{- $attrs := merge .Attributes (dict) }} {{- if eq $media \u0026#34;image\u0026#34; }} {{- $img := $r -}} {{- with $r }} {{- if eq $ext \u0026#34;svg\u0026#34; }} (…) {{- else }} {{- $attrs = merge $attrs (dict \u0026#34;id\u0026#34; $id \u0026#34;alt\u0026#34; $alt \u0026#34;title\u0026#34; $title \u0026#34;src\u0026#34; $src) }} (…) En effet, le besoin de gérer les attributs d\u0026rsquo;image n\u0026rsquo;est sensible que pour les images autres que le format SVG, du moins actuellement.\nMediatype Une des choses que fait très bien Hugo est la détection du type de media. Il est ainsi possible grâce à l\u0026rsquo;utilisation de l\u0026rsquo;objet .MediaType d\u0026rsquo;une ressource de savoir si c\u0026rsquo;est une image ou autre chose, telle une vidéo. .MainType est la méthode d\u0026rsquo;objet qui retourne le type principal de la ressource, initialisée dans la variable $media.\nIl suffit ensuite d\u0026rsquo;utiliser la variable $media pour alimenter du code spécifique :\n{{- if eq $media \u0026#34;image\u0026#34; }} (…) {{- else if eq $media \u0026#34;video\u0026#34; }} (…) {{- end }} Image Déterminer la taille d\u0026rsquo;image Pour déterminer si une taille d\u0026rsquo;affichage de l\u0026rsquo;image est demandée, je rajoute dans la syntaxe d\u0026rsquo;image l\u0026rsquo;argument suivant w et précise la taille désirée, tel que ?w=250 par exemple.\nPour gérer cette particularité dans le render hook, j\u0026rsquo;ai dû le modifier pour déterminer si l\u0026rsquo;ajout était fait dans l\u0026rsquo;url de l\u0026rsquo;image :\n{{- /* Determine if \u0026#39;w=\u0026#39; on $u */ -}} {{ $w := \u0026#34;\u0026#34; }} {{- if findRE \u0026#34;w=\u0026#34; $u }} {{ $w = replaceRE \u0026#34;.*w=([^ ]*).*\u0026#34; \u0026#34;$1\u0026#34; $u }} {{- end }} Puis il faut gérer la retouche de la taille d\u0026rsquo;image, dans le bloc de code du media image :\n(…) {{- $img := $r -}} {{- with $r }} (…) {{- if $w }} {{- $width = $w -}} {{- $img = $r.Resize (printf \u0026#34;%sx\u0026#34; $w) -}} {{- with $img }}{{- $height = .Height -}}{{- end -}} {{ else }} {{- $height = .Height -}} {{- $width = .Width -}} {{- end }} {{- $attrs = merge $attrs (dict \u0026#34;height\u0026#34; (string $height) \u0026#34;width\u0026#34; (string $width)) }} (…) L\u0026rsquo;image est retravaillée s\u0026rsquo;il y a présence de l\u0026rsquo;argument $w ; le code détecte la largeur de l\u0026rsquo;image créée, sinon si l\u0026rsquo;argument n\u0026rsquo;est pas présent, il récupère la taille de l\u0026rsquo;image ressource. Ainsi les paramètres height et width ont toujours une valeur adéquate, à restituer dans le code source HTML lié.\nSources avif, webp /!\\ Depuis la version 0.162.0, Hugo est enfin capable de gèrer le format Avif ! J\u0026rsquo;ai donc retouché le code…\nPour ajouter les sources webp, et avif, cela se fait en deux temps :\nUne première fois pour retoucher l\u0026rsquo;image aux formats avif et webp : (…) {{/* Hugo.version need to: 0.162.0, to support Avif */}} {{- if site.Params.enable.img.avif }} {{- with .Resize (printf \u0026#34;%dx%d avif\u0026#34; ($height | int) ($width | int)) }} {{ $srcset = merge $srcset (dict \u0026#34;avif\u0026#34; (dict \u0026#34;srcset\u0026#34; .RelPermalink \u0026#34;type\u0026#34; .MediaType)) }} {{- end }} {{- end }} {{- if site.Params.enable.img.webp }} {{- with .Resize (printf \u0026#34;%dx%d webp\u0026#34; ($height | int) ($width | int)) }} {{ $srcset = merge $srcset (dict \u0026#34;webp\u0026#34; (dict \u0026#34;srcset\u0026#34; .RelPermalink \u0026#34;type\u0026#34; .MediaType)) }} {{- end }} {{- end }} (…) PS : Comme vous pouvez le remarquer, j\u0026rsquo;ai fait le choix d\u0026rsquo;appeler des booléens depuis la configuration des paramètres, pour activer ou non le support desdits formats.\nUne deuxième fois, dans le code HTML restitué : (…) \u0026lt;picture\u0026gt; {{- with $srcset }} {{ range $srcset }} {{ with . }} \u0026lt;source srcset=\u0026#34;{{ .srcset }}\u0026#34; type=\u0026#34;{{ .type }}\u0026#34;\u0026gt; {{- end }} {{- end }} {{- end }} \u0026lt;img (…) \u0026gt; \u0026lt;/picture\u0026gt; (…) Déterminer le format svg Pour déterminer le format svg, l\u0026rsquo;utilisation de la méthode .SubType de l\u0026rsquo;objet ressource est viable.\nAu sein du code déterminant le média image, la condition si le sous-type du média est svg alors il récupère le contenu du svg, puisque SVG est un contenu textuel.\n(…) {{- if eq $ext \u0026#34;svg\u0026#34; }} {{- $content = .Content | safeHTML -}} {{- else }} (…) ; traitement des autres formats d\u0026#39;image {{- end }} (…) Puis dans un deuxième temps, l\u0026rsquo;affichage du code HTML, tel que :\n(…) \u0026lt;figure role=\u0026#34;figure\u0026#34; {{- with $title }}aria-label=\u0026#34;{{ . }}\u0026#34;{{- end }}\u0026gt; \u0026lt;a href=\u0026#34;{{ $src }}\u0026#34; {{- with $title }}title=\u0026#34;{{ $title }}\u0026#34;{{- end }}\u0026gt; {{- with $content }} {{ . }} {{- else }} (…) je réfléchis à l\u0026rsquo;ajout du paramètre w dans l\u0026rsquo;url de l\u0026rsquo;image svg - mais pour l\u0026rsquo;instant rien ne me satisfait… Vidéo Aucun traitement d\u0026rsquo;image n\u0026rsquo;est ni fait ni à faire - sur la vidéo… le code appel directement le HTML correspondant nécessaire :\n(…) {{- else if eq $media \u0026#34;video\u0026#34; }} \u0026lt;video controls height=\u0026#34;\u0026#34; loading=\u0026#34;lazy\u0026#34; preload=\u0026#34;metadata\u0026#34; width=\u0026#34;50%\u0026#34;\u0026gt; \u0026lt;source src=\u0026#34;{{ $src }}\u0026#34; type=\u0026#34;{{ $type }}\u0026#34;\u0026gt; \u0026lt;p\u0026gt; \u0026lt;em\u0026gt;{{ T \u0026#34;txtNoSupportVideo\u0026#34; }}\u0026lt;/em\u0026gt; \u0026lt;a href=\u0026#34;{{ $dest }}\u0026#34; title=\u0026#34;{{ $title }}\u0026#34;\u0026gt;{{ $dest }}\u0026lt;/a\u0026gt; \u0026lt;/p\u0026gt; \u0026lt;/video\u0026gt; (…) faites attention au texte linguistique… Utilisation Comment je l\u0026rsquo;utilise ?\nTrès simplement :\n⇒ une image, tel mon logo, au format PNG :\n![Logo au format PNG](/images/Logo_full_192px.png \u0026#34;Mon logo au format PNG\u0026#34;) Mon logo au format PNG ![Logo au format PNG, taille demandée de 128 px](/images/Logo_full_192px.png?w=128 \u0026#34;Mon logo au format PNG, retaillé à 128px\u0026#34;) Mon logo au format PNG, retaillé à 128px ⇒ une image, tel mon logo, au format SVG :\n![Logo au format SVG](/svg/Logo_final.svg \u0026#34;Mon logo au format SVG\u0026#34;) \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 au format SVG ⇒ une vidéo, au hasard celle de \u0026ldquo;Big Buck Bunny\u0026rdquo; (sous Licence CC 3.0, par la fondation Blender, hébergé sur archive.org)\n![Vidéo de \u0026#34;Big Buck Bunny\u0026#34;](https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4 \u0026#34;Big Buck Bunny\u0026#34;) Le navigateur utilisé ne prend pas en charge les vidéos intégrées. Voici le lien pour pouvoir télécharger la vidéo : https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4 TL;DR Pour les impatients, allez donc télécharger :\nle code actuel du render hook image Pour les détails, lisez l\u0026rsquo;article ! ;)\nRemerciements l\u0026rsquo;article Link and image render hooks Voilà !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eHugo\u003c/strong\u003e gère la syntaxe Markdown des images, par le biais du moteur Goldmark.\u003c/p\u003e\n\u003cp\u003eLe format Markdown pour les images est connu :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-md\" data-lang=\"md\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e![\u003cspan style=\"color:#5bc4bf\"\u003eTux\u003c/span\u003e](\u003cspan style=\"color:#06b6ef\"\u003etux.jpg \u0026#34;Logo du Manchot\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eHugo\u003c/strong\u003e permet de surcharger le comportement par le biais de \u0026ldquo;\u003ca href=\"https://gohugo.io/render-hooks/introduction/\" rel=\"external\"\u003erender hook\u003c/a\u003e\u0026rdquo; - qui se traduirait en français par \u0026lsquo;crochet de rendu\u0026rsquo;. Ceux-ci sont à écrire généralement dans un sous-répertoire nommé \u003ccode\u003e_markup\u003c/code\u003e du répertoire principal \u003ccode\u003elayouts\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eJ\u0026rsquo;utilise historiquement celui créé par \u0026ldquo;Veriphor LLC\u0026rdquo;, déposé sous licence Apache 2.0… parce qu\u0026rsquo;à l\u0026rsquo;époque en 2023, cela m\u0026rsquo;était plus simple et je n\u0026rsquo;avais vraiment pas compris la mécanique derrière. Donc, \u003cem\u003epourquoi écrire ce que d\u0026rsquo;autres avaient certainement mieux fait que moi\u003c/em\u003e…\u003c/p\u003e\n\u003cp\u003eCe render hook nécessite la modification de la configuration des modules à monter, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003emounts:\n  - source: assets\n    target: assets\n  - source: static\n    target: assets\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuis l\u0026rsquo;ajout de ces paramètres dans la configuration :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003erender_hooks:\n  image:\n    # ignore (default), warning, or error (fails the build)\n    errorLevel: warning\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCe sont les prérequis…\u003c/p\u003e\n\u003ch2 id=\"modifications\"\u003eModifications\u003c/h2\u003e\n\u003cp\u003ePuis au courant de l\u0026rsquo;année 2026, j\u0026rsquo;ai commencé à triturer ce modèle pour essayer :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ed\u0026rsquo;apporter un peu plus de sens, en ajoutant l\u0026rsquo;élément \u003ccode\u003ea\u003c/code\u003e et \u003ccode\u003epicture\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ede détecter si une taille d\u0026rsquo;affichage est demandée,\u003c/li\u003e\n\u003cli\u003epuis ajouter des sources pour l\u0026rsquo;affichage des formats webp, puis avif\u003c/li\u003e\n\u003cli\u003ede modifier le code pour gèrer les images au format svg\u003c/li\u003e\n\u003cli\u003eet aujourd\u0026rsquo;hui, je me suis posé la question de gérer l\u0026rsquo;affichage de vidéo.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNativement, Markdown ne supporte pas l\u0026rsquo;affichage vidéo.\u003c/p\u003e\n\u003cp\u003eJe veux pouvoir utiliser la syntaxe pour les images et que le crochet fasse la détection d\u0026rsquo;une image ou d\u0026rsquo;une vidéo et affiche le code adéquat.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAprès le gros du travail effectué par le code originel, j\u0026rsquo;ai initialisé quelques variables utiles pour le traitement futur d\u0026rsquo;un média image ou vidéo, avant l\u0026rsquo;initialisation du dictionnaire d\u0026rsquo;attributs \u003ccode\u003e$attrs\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e(…)\n{{- /* Initialize variables. */}}\n\n{{- $alt := .PlainText -}}\n{{- $content := \u0026#34;\u0026#34; -}}\n{{- $dest := .Destination | safeURL -}}\n{{- $ext := $r.MediaType.SubType -}}\n{{- $height := \u0026#34;\u0026#34; -}}\n{{- $media := $r.MediaType.MainType -}}\n{{- $src := $r.RelPermalink -}}\n{{- $srcset := dict }}\n{{- $title := .Title | transform.HTMLEscape -}}\n{{- $type := $r.MediaType -}}\n{{- $width := \u0026#34;\u0026#34; -}}\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003e$r\u003c/code\u003e étant la variable ressource…\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai de fait modifié l\u0026rsquo;initialisation du dictionnaire \u003ccode\u003e$attrs\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e(…)\n{{- /* Initialize attributes. */}}\n{{- $attrs := merge .Attributes (dict) }}\n\n{{- if eq $media \u0026#34;image\u0026#34; }}\n\n    {{- $img := $r -}}\n\n    {{- with $r }}\n\n        {{- if eq $ext \u0026#34;svg\u0026#34; }}\n\n            (…)\n\n        {{- else }}\n\n            {{- $attrs = merge $attrs (dict \u0026#34;id\u0026#34; $id \u0026#34;alt\u0026#34; $alt \u0026#34;title\u0026#34; $title \u0026#34;src\u0026#34; $src) }}\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEn effet, le besoin de gérer les attributs d\u0026rsquo;image n\u0026rsquo;est sensible que pour les images autres que le format SVG, \u003cem\u003edu moins actuellement\u003c/em\u003e.\u003c/p\u003e\n\u003ch2 id=\"mediatype\"\u003eMediatype\u003c/h2\u003e\n\u003cp\u003eUne des choses que fait très bien Hugo est la détection du type de media. Il est ainsi possible grâce à l\u0026rsquo;utilisation de l\u0026rsquo;objet \u003ccode\u003e.MediaType\u003c/code\u003e d\u0026rsquo;une ressource de savoir si c\u0026rsquo;est une image ou autre chose, telle une vidéo. \u003cbr\u003e\n\u003ccode\u003e.MainType\u003c/code\u003e est la méthode d\u0026rsquo;objet qui retourne le type principal de la ressource, initialisée dans la variable \u003ccode\u003e$media\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl suffit ensuite d\u0026rsquo;utiliser la variable \u003ccode\u003e$media\u003c/code\u003e pour alimenter du code spécifique :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- if eq $media \u0026#34;image\u0026#34; }}\n(…)\n\n{{- else if eq $media \u0026#34;video\u0026#34; }}\n(…)\n\n{{- end }}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"image\"\u003eImage\u003c/h2\u003e\n\u003ch3 id=\"déterminer-la-taille-dimage\"\u003eDéterminer la taille d\u0026rsquo;image\u003c/h3\u003e\n\u003cp\u003ePour déterminer si une taille d\u0026rsquo;affichage de l\u0026rsquo;image est demandée, je rajoute dans la syntaxe d\u0026rsquo;image l\u0026rsquo;argument suivant \u003ccode\u003ew\u003c/code\u003e et précise la taille désirée, tel que \u003ccode\u003e?w=250\u003c/code\u003e par exemple.\u003c/p\u003e\n\u003cp\u003ePour gérer cette particularité dans le render hook, j\u0026rsquo;ai dû le modifier pour déterminer si l\u0026rsquo;ajout était fait dans l\u0026rsquo;url de l\u0026rsquo;image :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- /* Determine if \u0026#39;w=\u0026#39; on $u */ -}}\n{{ $w := \u0026#34;\u0026#34; }}\n{{- if findRE \u0026#34;w=\u0026#34; $u }}\n    {{ $w = replaceRE \u0026#34;.*w=([^ ]*).*\u0026#34; \u0026#34;$1\u0026#34; $u }}\n{{- end }}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuis il faut gérer la retouche de la taille d\u0026rsquo;image, dans le bloc de code du media image :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e(…)\n    {{- $img := $r -}}\n\n    {{- with $r }}\n\n        (…)\n\n            {{- if $w }}\n                {{- $width = $w -}}\n                {{- $img = $r.Resize (printf \u0026#34;%sx\u0026#34; $w) -}}\n                {{- with $img }}{{- $height = .Height -}}{{- end -}}\n\n            {{ else }}\n                {{- $height = .Height -}}\n                {{- $width = .Width -}}\n\n            {{- end }}\n\n            {{- $attrs = merge $attrs (dict \u0026#34;height\u0026#34; (string $height) \u0026#34;width\u0026#34; (string $width)) }}\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eL\u0026rsquo;image est retravaillée s\u0026rsquo;il y a présence de l\u0026rsquo;argument \u003ccode\u003e$w\u003c/code\u003e ; le code détecte la largeur de l\u0026rsquo;image créée, sinon si l\u0026rsquo;argument n\u0026rsquo;est pas présent, il récupère la taille de l\u0026rsquo;image ressource. \u003cbr\u003e\nAinsi les paramètres \u003ccode\u003eheight\u003c/code\u003e et \u003ccode\u003ewidth\u003c/code\u003e ont toujours une valeur adéquate, à restituer dans le code source HTML lié.\u003c/p\u003e\n\u003ch3 id=\"sources-avif-webp\"\u003eSources avif, webp\u003c/h3\u003e\n\u003cp\u003e/!\\ \u003cstrong\u003eDepuis la version 0.162.0, Hugo est enfin capable de gèrer le format Avif\u003c/strong\u003e ! \u003cbr\u003e\n\u003cem\u003eJ\u0026rsquo;ai donc retouché le code\u003c/em\u003e…\u003c/p\u003e\n\u003cp\u003ePour ajouter les sources webp, et avif, cela se fait en deux temps :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUne première fois pour retoucher l\u0026rsquo;image aux formats avif et webp :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e(…)\n            {{/* Hugo.version need to: 0.162.0, to support Avif */}}\n            {{- if site.Params.enable.img.avif }}\n                {{- with .Resize (printf \u0026#34;%dx%d avif\u0026#34; ($height | int) ($width | int)) }}\n                    {{ $srcset = merge $srcset (dict \u0026#34;avif\u0026#34; (dict \u0026#34;srcset\u0026#34; .RelPermalink \u0026#34;type\u0026#34; .MediaType)) }}\n                {{- end }}\n            {{- end }}\n\n            {{- if site.Params.enable.img.webp }}\n                {{- with .Resize (printf \u0026#34;%dx%d webp\u0026#34; ($height | int) ($width | int)) }}\n                    {{ $srcset = merge $srcset (dict \u0026#34;webp\u0026#34; (dict \u0026#34;srcset\u0026#34; .RelPermalink \u0026#34;type\u0026#34; .MediaType)) }}\n                {{- end }}\n            {{- end }}\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003e\u003cstrong\u003ePS\u003c/strong\u003e : Comme vous pouvez le remarquer, j\u0026rsquo;ai fait le choix d\u0026rsquo;appeler des booléens depuis la configuration des paramètres, pour activer ou non le support desdits formats\u003c/em\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUne deuxième fois, dans le code HTML restitué :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e(…)\n        \u0026lt;picture\u0026gt;\n            {{- with $srcset }}\n                {{ range $srcset }}\n                    {{ with . }}\n                    \u0026lt;source srcset=\u0026#34;{{ .srcset }}\u0026#34; type=\u0026#34;{{ .type }}\u0026#34;\u0026gt;\n                    {{- end }}\n                {{- end }}\n            {{- end }}\n            \u0026lt;img (…) \u0026gt;\n        \u0026lt;/picture\u0026gt;\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"déterminer-le-format-svg\"\u003eDéterminer le format svg\u003c/h3\u003e\n\u003cp\u003ePour déterminer le format svg, l\u0026rsquo;utilisation de la méthode \u003ccode\u003e.SubType\u003c/code\u003e de l\u0026rsquo;objet ressource est viable.\u003c/p\u003e\n\u003cp\u003eAu sein du code déterminant le média image, la condition si le sous-type du média est \u003ccode\u003esvg\u003c/code\u003e alors il récupère le contenu du svg, puisque SVG est un contenu textuel.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e(…)\n{{- if eq $ext \u0026#34;svg\u0026#34; }}\n\n    {{- $content = .Content | safeHTML -}}\n\n{{- else }}\n    (…) ; traitement des autres formats d\u0026#39;image\n\n{{- end }}\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuis dans un deuxième temps, l\u0026rsquo;affichage du code HTML, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e(…)\n\u0026lt;figure role=\u0026#34;figure\u0026#34; {{- with $title }}aria-label=\u0026#34;{{ . }}\u0026#34;{{- end }}\u0026gt;\n    \u0026lt;a href=\u0026#34;{{ $src }}\u0026#34; {{- with $title }}title=\u0026#34;{{ $title }}\u0026#34;{{- end }}\u0026gt;\n        {{- with $content }}\n            {{ . }}\n        {{- else }}\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003cem\u003eje réfléchis à l\u0026rsquo;ajout du paramètre \u003ccode\u003ew\u003c/code\u003e dans l\u0026rsquo;url de l\u0026rsquo;image svg - mais pour l\u0026rsquo;instant rien ne me satisfait…\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"vidéo\"\u003eVidéo\u003c/h2\u003e\n\u003cp\u003eAucun traitement d\u0026rsquo;image n\u0026rsquo;est ni fait ni à faire - sur la vidéo… le code appel directement le HTML correspondant nécessaire :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e(…)\n{{- else if eq $media \u0026#34;video\u0026#34; }}\n\u0026lt;video controls height=\u0026#34;\u0026#34; loading=\u0026#34;lazy\u0026#34; preload=\u0026#34;metadata\u0026#34; width=\u0026#34;50%\u0026#34;\u0026gt;\n    \u0026lt;source src=\u0026#34;{{ $src }}\u0026#34; type=\u0026#34;{{ $type }}\u0026#34;\u0026gt;\n    \u0026lt;p\u0026gt;\n        \u0026lt;em\u0026gt;{{ T \u0026#34;txtNoSupportVideo\u0026#34; }}\u0026lt;/em\u0026gt;\n        \u0026lt;a href=\u0026#34;{{ $dest }}\u0026#34; title=\u0026#34;{{ $title }}\u0026#34;\u0026gt;{{ $dest }}\u0026lt;/a\u0026gt;\n    \u0026lt;/p\u0026gt;\n\u0026lt;/video\u0026gt;\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003cem\u003efaites attention au texte linguistique\u003c/em\u003e…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eComment je l\u0026rsquo;utilise ?\u003c/p\u003e\n\u003cp\u003eTrès simplement :\u003c/p\u003e\n\u003cp\u003e⇒ une image, tel mon logo, au format PNG :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e![Logo au format PNG](/images/Logo_full_192px.png \u0026#34;Mon logo au format PNG\u0026#34;)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\n\n            \n                    \n                    \u003cfigure role=\"figure\"aria-label=\"Mon logo au format PNG\"\u003e\n    \u003ca href=\"/images/Logo_full_192px.png\"title=\"Mon logo au format PNG\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/Logo_full_192px_hu_145456570917431d.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/Logo_full_192px_hu_29da4fe66809d41c.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Logo au format PNG\"\n                    height=\"192\"\n                    id=\"img_images_Logo_full_192px.png_0\"\n                    src=\"/images/Logo_full_192px.png\"\n                    title=\"Mon logo au format PNG\"\n                    width=\"192\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\u003cfigcaption\u003eMon logo au format PNG\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e![Logo au format PNG, taille demandée de 128 px](/images/Logo_full_192px.png?w=128 \u0026#34;Mon logo au format PNG, retaillé à 128px\u0026#34;)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"aria-label=\"Mon logo au format PNG, retaillé à 128px\"\u003e\n    \u003ca href=\"/images/Logo_full_192px.png\"title=\"Mon logo au format PNG, retaillé à 128px\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/Logo_full_192px_hu_138c3be0e4d124b3.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/Logo_full_192px_hu_737bc5b134955f15.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Logo au format PNG, taille demandée de 128 px\"\n                    height=\"128\"\n                    id=\"img_images_Logo_full_192px.png_1\"\n                    src=\"/images/Logo_full_192px.png\"\n                    title=\"Mon logo au format PNG, retaillé à 128px\"\n                    width=\"128\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\u003cfigcaption\u003eMon logo au format PNG, retaillé à 128px\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e⇒ une image, tel mon logo, au format SVG :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e![Logo au format SVG](/svg/Logo_final.svg \u0026#34;Mon logo au format SVG\u0026#34;)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cfigure role=\"figure\"aria-label=\"Mon logo au format SVG\"\u003e\n    \u003ca href=\"/svg/Logo_final.svg\"title=\"Mon logo au format SVG\"\u003e\n        \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        \n    \u003c/a\u003e\u003cfigcaption\u003eMon logo au format SVG\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e⇒ une vidéo, au hasard celle de \u0026ldquo;Big Buck Bunny\u0026rdquo; (\u003cem\u003esous Licence CC 3.0, par la fondation Blender, hébergé sur archive.org\u003c/em\u003e)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e![Vidéo de \u0026#34;Big Buck Bunny\u0026#34;](https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4 \u0026#34;Big Buck Bunny\u0026#34;)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\n\u003cvideo controls height=\"\" loading=\"lazy\" preload=\"metadata\" width=\"50%\"\u003e\n    \u003csource src=\"/big_buck_bunny_720p_surround_15174821828975708530.mp4\" type=\"video/mp4\"\u003e\n    \u003cp\u003e\n        \u003cem\u003eLe navigateur utilisé ne prend pas en charge les vidéos intégrées. Voici le lien pour pouvoir télécharger la vidéo : \u003c/em\u003e\n        \u003ca href=\"https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4\" title=\"Big Buck Bunny\"\u003ehttps://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4\u003c/a\u003e\n    \u003c/p\u003e\n\u003c/video\u003e\u003c/p\u003e\n\u003ch2 id=\"tldr\"\u003eTL;DR\u003c/h2\u003e\n\u003cp\u003ePour les impatients, allez donc télécharger :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele code actuel du \u003ca href=\"https://codeberg.org/hucste/it-log/src/branch/main/layouts/_markup/render-image.html\" rel=\"external\"\u003erender hook image\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour les détails, lisez l\u0026rsquo;article ! ;)\u003c/p\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;article \u003ca href=\"https://www.veriphor.com/articles/link-and-image-render-hooks/\" rel=\"external\"\u003e\u003cem\u003eLink and image render hooks\u003c/em\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n","summary":"Comment utiliser le procédé de 'render hook' pour gérer à la fois l'inclusion d'image ou de vidéo dans Hugo avec seulement la syntaxe image markdown.","tags":["Render","Hook"],"date_published":"2026-09-22T21:31:44+02:00","date_modified":"2026-10-02T17:38:16+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-09-20:/fr/web/hugo/fediverse-comments-hugo/#6926add2b770e59fca4b2daed3d2b703f3387cfb88928248079411d48732b082","url":"https://it-log.fr.eu.org/fr/web/hugo/fediverse-comments-hugo/","title":"Le Fediverse commente Hugo","author":{"name":"Stéphane HUC"},"content_text":"Description Cet article décrit avec plus ou moins de finesse - ç-à-d que je vais m\u0026rsquo;efforcer de ne pas oublier de détails - l\u0026rsquo;inclusion d\u0026rsquo;un système de commentaires affiché en bas de page d\u0026rsquo;articles fait avec Hugo, utilisant le fediverse, Mastodon principalement.\nMes exigences à ce propos :\nêtre le plus simple à mettre en place utiliser le fediverse, afin de ne pas avoir à \u0026ldquo;modèrer\u0026rdquo; et surtout ne pas avoir à modèrer localement Utiliser le fediverse nécessite :\nd\u0026rsquo;avoir un compte sur un serveur gérant ActivityPub donne du sens pour un site web parlant d\u0026rsquo;informatique améliore grandement la visibilité Mastodon-comments Il se trouve que le sentier est déjà fortement balisé !\nUn développeur, nommé Daniel Pecos Martínez, a écrit il y a trois ans un composant web qui intégre les commentaires, republiages et autres fonctionnalités venant d\u0026rsquo;un compte Mastodon.\nUn détail à bien comprendre :\n⇒ il est strictement nécessaire de :\npublier l\u0026rsquo;article créé avec Hugo sur n\u0026rsquo;importe quel hébergement de faire une annonce depuis un compte sur Mastodon, de copier l\u0026rsquo;identificant du toot pour l\u0026rsquo;intégrer dans le frontmatter de l\u0026rsquo;article, puis de republier l\u0026rsquo;article sur l\u0026rsquo;hébergement dédié. Et, oui, cela se fait en deux temps…\nLe code est disponible sur : https://github.com/dpecos/mastodon-comments\nQuelques détails à assimiler :\nce code utilise quelques bibliothèques (à savoir DOMPurify, Font Awesome) depuis un des CDN de CloudFare ; le choix du développeur ne voulant pas héberger lesdites bibliothèques. l\u0026rsquo;outil est chargé de manière dynamique au grés du scroll du lecteur Si ces choix vous plaisent, il n\u0026rsquo;y a vraiment qu\u0026rsquo;à copier l\u0026rsquo;exemple du fichier index pour intégrer directement et très rapidement ce système de commentaires.\nMais (c|s)es choix ne me vont pas !\nJe ne veux pas :\nutiliser de bibliothèques (plus ou moins) lourdes à distance, et surtout pas depuis CloudFare. utiliser Font Awesome qui nécessite le chargement de plusieurs icônes pour n\u0026rsquo;afficher au final que quelques unes. d\u0026rsquo;autant que principalement, j\u0026rsquo;utilise celles disponibles sur le site tablericons.com localement au-travers du système de données Hugo.Data Car oui, je tiens à utiliser du code SVG pour afficher les icônes disponibles.\nMastodon-comments-modifié Hugo.Data Dans le répertoire data, j\u0026rsquo;utilise un fichier nommé SVG.yaml, où l\u0026rsquo;on retrouve les icônes copiés principalement depuis Tablericons.\nJe dépose ici le code des 4 utilisés :\nmenu-order: \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon icon-tabler icon-tabler-menu-order\u0026#34; viewBox=\u0026#34;0 0 24 24\u0026#34; fill=\u0026#34;none\u0026#34; stroke=\u0026#34;#000000\u0026#34; stroke-width=\u0026#34;1\u0026#34; stroke-linecap=\u0026#34;round\u0026#34; stroke-linejoin=\u0026#34;round\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M4 10h16\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M4 14h16\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M9 18l3 3l3 -3\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M9 6l3 -3l3 3\u0026#34; /\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39; repeat: \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon icon-tabler icon-tabler-repeat\u0026#34; viewBox=\u0026#34;0 0 24 24\u0026#34; fill=\u0026#34;none\u0026#34; stroke=\u0026#34;#000000\u0026#34; stroke-width=\u0026#34;1\u0026#34; stroke-linecap=\u0026#34;round\u0026#34; stroke-linejoin=\u0026#34;round\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M4 12v-3a3 3 0 0 1 3 -3h13m-3 -3l3 3l-3 3\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M20 12v3a3 3 0 0 1 -3 3h-13m3 3l-3 -3l3 -3\u0026#34; /\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39; reply: \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon icon-tabler icon-tabler-reply\u0026#34; viewBox=\u0026#34;0 0 24 24\u0026#34; fill=\u0026#34;none\u0026#34; stroke=\u0026#34;#000000\u0026#34; stroke-width=\u0026#34;1\u0026#34; stroke-linecap=\u0026#34;round\u0026#34; stroke-linejoin=\u0026#34;round\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12z\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M11 8l-3 3l3 3\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M16 11h-8\u0026#34; /\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39; star: \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon icon-tabler icon-tabler-star\u0026#34; viewBox=\u0026#34;0 0 24 24\u0026#34; fill=\u0026#34;currentColor\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M8.243 7.34l-6.38 .925l-.113 .023a1 1 0 0 0 -.44 1.684l4.622 4.499l-1.09 6.355l-.013 .11a1 1 0 0 0 1.464 .944l5.706 -3l5.693 3l.1 .046a1 1 0 0 0 1.352 -1.1l-1.091 -6.355l4.624 -4.5l.078 -.085a1 1 0 0 0 -.633 -1.62l-6.38 -.926l-2.852 -5.78a1 1 0 0 0 -1.794 0l-2.853 5.78z\u0026#34; /\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39; Dans le répertoire _partials, j\u0026rsquo;ai deux autres sous-répertoires :\nun premier nommé utils où se situe le fichier permettant l\u0026rsquo;appel des icônes SVG, nommé très basiquement icon.html un deuxième nommé components où j\u0026rsquo;ai placé le script JS nécessaire que j\u0026rsquo;ai modifié pour utiliser lesdites icônes SVG. partial utils/icon {{- $ := index . \u0026#34;$\u0026#34; -}} {{- $name := .name -}} {{- $class := .class | default $name -}} {{- $icon := index hugo.Data.SVG $name -}} {{- $class := printf \u0026#34;icon %s\u0026#34; $class -}} {{- return (replace $icon \u0026#34;icon\u0026#34; $class | safeHTML) -}} Ce code n\u0026rsquo;a pas été écrit par mes soins… mais il est simple et fonctionnel\najouts CSS Il est nécessaire d\u0026rsquo;ajouter une taille aux icônes SVG dans le code CSS, tel que :\narticle.mastodon-comment svg { height: 24px; width: 24px; } #mastodon-stats svg { height: 32px; width: 32px; } Bien sûr, à vous de vous adapter ! Pour finir cette partie, je redéfinis dans le fichier principal CSS la taille de l\u0026rsquo;élément mastodon-comments -et non plus dans le code source HTML.\n#comments mastodon-comments { max-width: 1024px; } Ce qui permettra de l\u0026rsquo;adapter selon les medias utilisés… partial component/mastodon-comments-modified.js \u0026lt;script defer type=\u0026#34;module\u0026#34;\u0026gt; // ============================================================ // Set language dependend texts // ============================================================ const i18n = { en: { commentsTitle: \u0026#34;Comments\u0026#34;, replyIntro: \u0026#34;You can use your Fediverse (i.e. Mastodon, among many others) account to reply to this\u0026#34;, replyLinkText: \u0026#34;post\u0026#34;, replyButtonLabel: \u0026#34;Reply\u0026#34;, loadingText: \u0026#34;Loading comments from the Fediverse...\u0026#34;, noCommentsText: \u0026#34;No comments found\u0026#34;, dialogTitle: \u0026#34;Reply to this post\u0026#34;, dialogCloseTitle: \u0026#34;Close\u0026#34;, dialogCloseSymbol: \u0026#34;\u0026amp;times;\u0026#34;, dialogExplain: \u0026#34;Comments are powered by Mastodon. With an account on Mastodon (or elsewhere on the Fediverse), you can respond to this post. Simply enter your mastodon instance below, and add a reply:\u0026#34;, goButtonLabel: \u0026#34;Go\u0026#34;, copyAlternativeText: \u0026#34;Alternatively, copy this URL and paste it into the search bar of your Mastodon app:\u0026#34;, copyButtonLabel: \u0026#34;Copy\u0026#34;, copiedButtonLabel: \u0026#34;Copied!\u0026#34;, instancePlaceholder: \u0026#34;mastodon.social\u0026#34;, instanceMissingAlert: \u0026#34;Please provide the name of your instance\u0026#34;, dateLocale: \u0026#34;en-US\u0026#34;, }, de: { commentsTitle: \u0026#34;Kommentare\u0026#34;, replyIntro: \u0026#34;Du kannst mit deinem Fediverse-Konto (z.B. Mastodon) auf diesen\u0026#34;, replyLinkText: \u0026#34;Beitrag antworten\u0026#34;, replyButtonLabel: \u0026#34;Antworten\u0026#34;, loadingText: \u0026#34;Kommentare werden aus dem Fediverse geladen...\u0026#34;, noCommentsText: \u0026#34;Keine Kommentare gefunden\u0026#34;, dialogTitle: \u0026#34;Auf diesen Beitrag antworten\u0026#34;, dialogCloseTitle: \u0026#34;Schließen\u0026#34;, dialogCloseSymbol: \u0026#34;\u0026amp;times;\u0026#34;, dialogExplain: \u0026#34;Kommentare werden über Mastodon bereitgestellt. Mit einem Konto bei Mastodon (oder anderswo im Fediverse) kannst du auf diesen Beitrag antworten. Gib einfach deine Mastodon-Instanz unten ein:\u0026#34;, goButtonLabel: \u0026#34;Los\u0026#34;, copyAlternativeText: \u0026#34;Alternativ kannst du diese URL kopieren und in die Suchleiste deiner Mastodon-App einfügen:\u0026#34;, copyButtonLabel: \u0026#34;Kopieren\u0026#34;, copiedButtonLabel: \u0026#34;Kopiert!\u0026#34;, instancePlaceholder: \u0026#34;mastodon.social\u0026#34;, instanceMissingAlert: \u0026#34;Bitte gib den Namen deiner Instanz an\u0026#34;, dateLocale: \u0026#34;de-DE\u0026#34;, }, fr: { commentsTitle: \u0026#34;Commentaires\u0026#34;, replyIntro: \u0026#34;Vous pouvez utiliser votre compte Fediverse (ex. Mastodon) pour répondre à ce\u0026#34;, replyLinkText: \u0026#34;billet\u0026#34;, replyButtonLabel: \u0026#34;Répondre\u0026#34;, loadingText: \u0026#34;Chargement des commentaires depuis le Fediverse…\u0026#34;, noCommentsText: \u0026#34;Aucun commentaire trouvé\u0026#34;, dialogTitle: \u0026#34;Répondre à ce billet\u0026#34;, dialogCloseTitle: \u0026#34;Fermer\u0026#34;, dialogCloseSymbol: \u0026#34;\u0026amp;times;\u0026#34;, dialogExplain: \u0026#34;Les commentaires sont alimentés par Mastodon. Avec un compte sur Mastodon (ou ailleurs sur le Fediverse), vous pouvez répondre à ce billet. Entrez simplement votre instance Mastodon ci-dessous : \u0026#34;, goButtonLabel: \u0026#34;Aller\u0026#34;, copyAlternativeText: \u0026#34;Vous pouvez aussi copier cette URL et la coller dans la barre de recherche de votre application Mastodon : \u0026#34;, copyButtonLabel: \u0026#34;Copier\u0026#34;, copiedButtonLabel: \u0026#34;Copié !\u0026#34;, instancePlaceholder: \u0026#34;mastodon.social\u0026#34;, instanceMissingAlert: \u0026#34;Veuillez indiquer le nom de votre instance\u0026#34;, dateLocale: \u0026#34;fr-FR\u0026#34;, }, es: { commentsTitle: \u0026#34;Comentarios\u0026#34;, replyIntro: \u0026#34;Puedes usar tu cuenta del Fediverso (ej. Mastodon, entre otros) para comentar este\u0026#34;, replyLinkText: \u0026#34;toot\u0026#34;, replyButtonLabel: \u0026#34;Responder\u0026#34;, loadingText: \u0026#34;Cargando comentarios del Fediverso...\u0026#34;, noCommentsText: \u0026#34;No se han encontrado comentarios\u0026#34;, dialogTitle: \u0026#34;Responde a este post\u0026#34;, dialogCloseTitle: \u0026#34;Cerrar\u0026#34;, dialogCloseSymbol: \u0026#34;\u0026amp;times;\u0026#34;, dialogExplain: \u0026#34;Comentarios gracias a Mastodon. Con una cuenta en Mastodon (o en cualquier otro sitio en el Fediverso), puedes responder a esta entrada. Simplemente introduce tu instancia y pulsa responder:\u0026#34;, goButtonLabel: \u0026#34;Ir\u0026#34;, copyAlternativeText: \u0026#34;O puedes copiar esta URL y pegarla en el cuadro de búsqueda de tu aplicación Mastodon:\u0026#34;, copyButtonLabel: \u0026#34;Copiar\u0026#34;, copiedButtonLabel: \u0026#34;¡Copiado!\u0026#34;, instancePlaceholder: \u0026#34;mastodon.social\u0026#34;, instanceMissingAlert: \u0026#34;Por favor introduce tu instancia\u0026#34;, dateLocale: \u0026#34;es-ES\u0026#34;, }, }; const DEFAULT_LANG = \u0026#34;fr\u0026#34;; // ============================================================ const icon_clock = \u0026#34;{{ partial \u0026#34;utils/icon\u0026#34; (dict \u0026#34;$\u0026#34; $ \u0026#34;name\u0026#34; \u0026#34;clock\u0026#34;) }}\u0026#34;; const icon_reply = \u0026#34;{{ partial \u0026#34;utils/icon\u0026#34; (dict \u0026#34;$\u0026#34; $ \u0026#34;name\u0026#34; \u0026#34;reply\u0026#34;) }}\u0026#34;; const icon_retweet = \u0026#34;{{ partial \u0026#34;utils/icon\u0026#34; (dict \u0026#34;$\u0026#34; $ \u0026#34;name\u0026#34; \u0026#34;repeat\u0026#34;) }}\u0026#34;; const icon_star = \u0026#34;{{ partial \u0026#34;utils/icon\u0026#34; (dict \u0026#34;$\u0026#34; $ \u0026#34;name\u0026#34; \u0026#34;star\u0026#34;) }}\u0026#34;; const styles = ` :root { --font-color: #5d686f; --font-size: 1.0rem; --block-border-width: 1px; --block-border-radius: 3px; --block-border-color: #ededf0; --block-background-color: #f7f8f8; --dialog-background-color: #ffffff; --muted-color: #5d686f; --reply-color: #003eaa; --reblog-color: #8c8dff; --favourite-color: #ca8f04; --button-color: #595aff; --button-hover-color: #4849ff; --comment-indent: 40px; } @media (prefers-color-scheme: dark) { :root { --font-color: #d1d1d1; --block-border-color: #3e3e3e; --block-background-color: #1e1e1e; --dialog-background-color: #2d2d2d; --muted-color: #8a9ba3; --reply-color: #7b9fff; --reblog-color: #a8a9ff; --favourite-color: #e6b44a; --button-color: #6c6dff; --button-hover-color: #595aff; } } [data-theme=\u0026#34;dark\u0026#34;] { --font-color: #d1d1d1; --block-border-color: #3e3e3e; --block-background-color: #1e1e1e; --dialog-background-color: #2d2d2d; --muted-color: #8a9ba3; --reply-color: #7b9fff; --reblog-color: #a8a9ff; --favourite-color: #e6b44a; --button-color: #6c6dff; --button-hover-color: #595aff; } mastodon-comments { font-size: var(--font-size); } p { margin: 0 0 1rem 0; } #mastodon-stats { text-align: center; font-size: calc(var(--font-size) * 1.5); } #mastodon-title { font-size: calc(var(--font-size) * 1.5); font-weight: bold; } #mastodon-comments-list { margin: 0 auto; padding: 0; } #mastodon-comments-list ul { padding-left: var(--comment-indent); } #mastodon-comments-list li { list-style: none; } .mastodon-comment { background-color: var(--block-background-color); border-radius: var(--block-border-radius); border: var(--block-border-width) var(--block-border-color) solid; padding: 15px; margin-bottom: 1.5rem; display: flex; flex-direction: column; color: var(--font-color); } .mastodon-comment p { margin-bottom: 0px; } .mastodon-comment .author { padding-top:0; display:flex; } .mastodon-comment .author a { text-decoration: none; } .mastodon-comment .author .avatar img { margin-right:1rem; min-width:60px; border-radius: 5px; } .mastodon-comment .author .details { display: flex; flex-direction: column; line-height: 1.2em; } .mastodon-comment .author .details .name { font-weight: bold; } .mastodon-comment .author .details .user { color: var(--muted-color); font-size: medium; } .mastodon-comment .author .date { margin-left: auto; font-size: small; } .mastodon-comment .content { margin: 15px 0; line-height: 1.5em; } .mastodon-comment .author .details a, .mastodon-comment .content p { margin-bottom: 10px; } .mastodon-comment .attachments { margin: 0px 10px; } .mastodon-comment .attachments \u0026gt; * { margin: 0px 10px; } .mastodon-comment .attachments img { max-width: 100%; } .mastodon-comment .status \u0026gt; div, #mastodon-stats \u0026gt; div { display: inline-block; margin-right: 15px; } .mastodon-comment .status a, #mastodon-stats a { color: var(--muted-color); text-decoration: none; } .mastodon-comment .status .replies.active a, #mastodon-stats .replies.active a { color: var(--reply-color); } .mastodon-comment .status .reblogs.active a, #mastodon-stats .reblogs.active a { color: var(--reblog-color); } .mastodon-comment .status .favourites.active a, #mastodon-stats .favourites.active a { color: var(--favourite-color); } @media only screen and (max-width: 640px) { .mastodon-comment .author { flex-wrap: nowrap; align-items: flex-start; } .mastodon-comment .author .date { margin-left: 0; text-align: right; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; } } dialog { border: none; border-radius: var(--block-border-radius); box-shadow: 0 0 10px rgba(0,0,0,0.1); padding: 20px; max-width: 500px; width: 90%; color: var(--font-color); background-color: var(--dialog-background-color); } dialog::backdrop { background: rgba(0,0,0,0.5); } dialog h3 { margin-top: 0; } dialog #close { position: absolute; top: 10px; right: 10px; border: none; background: none; font-size: 1.5rem; cursor: pointer; color: var(--font-color); } .input-row { display: flex; gap: 10px; margin: 10px 0; } .input-row input { flex-grow: 1; padding: 8px; border: 1px solid var(--block-border-color); border-radius: var(--block-border-radius); background-color: var(--block-background-color); color: var(--font-color); } .button { padding: 8px 16px; background-color: var(--button-color); color: white; border: none; border-radius: var(--block-border-radius); cursor: pointer; } #add-comment { display: block; margin: 10px 0; } .button:hover { background-color: var(--button-hover-color); } `; class MastodonComments extends HTMLElement { constructor() { super(); this.host = this.getAttribute(\u0026#34;host\u0026#34;); this.user = this.getAttribute(\u0026#34;user\u0026#34;); this.tootId = this.getAttribute(\u0026#34;tootId\u0026#34;); this.filter = this.getAttribute(\u0026#34;filter\u0026#34;); this.commentsLoaded = false; this.tootAccountURI = null; // Resolve locale: attribute → \u0026lt;html lang\u0026gt; → default const lang = this.getAttribute(\u0026#34;lang\u0026#34;) || document.documentElement.lang?.split(\u0026#34;-\u0026#34;)[0] || navigator.language?.split(\u0026#34;-\u0026#34;)[0] || DEFAULT_LANG; this.locale = i18n[lang] ?? i18n[DEFAULT_LANG]; this.dateFormatter = new Intl.DateTimeFormat(this.locale.dateLocale, { year: \u0026#34;numeric\u0026#34;, month: \u0026#34;2-digit\u0026#34;, day: \u0026#34;2-digit\u0026#34;, hour: \u0026#34;2-digit\u0026#34;, minute: \u0026#34;2-digit\u0026#34;, hour12: false, formatMatcher: \u0026#34;basic\u0026#34;, }); if (!document.getElementById(\u0026#34;mastodon-comments-styles\u0026#34;)) { const styleElem = document.createElement(\u0026#34;style\u0026#34;); styleElem.id = \u0026#34;mastodon-comments-styles\u0026#34;; styleElem.innerHTML = styles; document.head.appendChild(styleElem); } } connectedCallback() { this.mastodonPostUrl = `https://${this.host}/@${this.user}/${this.tootId}`; this.innerHTML = ` \u0026lt;div id=\u0026#34;mastodon-stats\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;div id=\u0026#34;mastodon-title\u0026#34;\u0026gt;${this.locale.commentsTitle}\u0026lt;/div\u0026gt; \u0026lt;p\u0026gt;${this.locale.replyIntro} \u0026lt;a class=\u0026#34;link\u0026#34; href=\u0026#34;${this.mastodonPostUrl}\u0026#34; rel=\u0026#34;ugc\u0026#34;\u0026gt;${this.locale.replyLinkText}\u0026lt;/a\u0026gt;. \u0026lt;button id=\u0026#34;add-comment\u0026#34; class=\u0026#34;button\u0026#34;\u0026gt;${this.locale.replyButtonLabel}\u0026lt;/button\u0026gt; \u0026lt;/p\u0026gt; \u0026lt;ul id=\u0026#34;mastodon-comments-list\u0026#34;\u0026gt;\u0026lt;/ul\u0026gt; \u0026lt;dialog id=\u0026#34;comment-dialog\u0026#34;\u0026gt; \u0026lt;h3\u0026gt;${this.locale.dialogTitle}\u0026lt;/h3\u0026gt; \u0026lt;button title=\u0026#34;${this.locale.dialogCloseTitle}\u0026#34; id=\u0026#34;close\u0026#34;\u0026gt;${this.locale.dialogCloseSymbol}\u0026lt;/button\u0026gt; \u0026lt;p\u0026gt;${this.locale.dialogExplain}\u0026lt;/p\u0026gt; \u0026lt;div class=\u0026#34;input-row\u0026#34;\u0026gt; \u0026lt;input type=\u0026#34;text\u0026#34; inputmode=\u0026#34;url\u0026#34; autocapitalize=\u0026#34;none\u0026#34; autocomplete=\u0026#34;off\u0026#34; value=\u0026#34;${ this.escapeHtml(localStorage.getItem(\u0026#34;mastodonUrl\u0026#34;)) ?? \u0026#34;\u0026#34; }\u0026#34; id=\u0026#34;instanceName\u0026#34; placeholder=\u0026#34;${this.locale.instancePlaceholder}\u0026#34;\u0026gt; \u0026lt;button class=\u0026#34;button\u0026#34; id=\u0026#34;go\u0026#34;\u0026gt;${this.locale.goButtonLabel}\u0026lt;/button\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;p\u0026gt;${this.locale.copyAlternativeText}\u0026lt;/p\u0026gt; \u0026lt;div class=\u0026#34;input-row\u0026#34;\u0026gt; \u0026lt;input type=\u0026#34;text\u0026#34; readonly id=\u0026#34;copyInput\u0026#34; value=\u0026#34;${this.mastodonPostUrl}\u0026#34;\u0026gt; \u0026lt;button class=\u0026#34;button\u0026#34; id=\u0026#34;copy\u0026#34;\u0026gt;${this.locale.copyButtonLabel}\u0026lt;/button\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/dialog\u0026gt; `; const comments = this.querySelector(\u0026#34;#mastodon-comments-list\u0026#34;); const rootStyle = this.getAttribute(\u0026#34;style\u0026#34;); if (rootStyle) { comments.setAttribute(\u0026#34;style\u0026#34;, rootStyle); } this.respondToVisibility(comments, this.loadComments.bind(this)); this.initDialog(); } initDialog() { const dialog = this.querySelector(\u0026#34;#comment-dialog\u0026#34;); const addCommentBtn = this.querySelector(\u0026#34;#add-comment\u0026#34;); const closeBtn = this.querySelector(\u0026#34;#close\u0026#34;); const goBtn = this.querySelector(\u0026#34;#go\u0026#34;); const copyBtn = this.querySelector(\u0026#34;#copy\u0026#34;); const instanceNameInput = this.querySelector(\u0026#34;#instanceName\u0026#34;); const copyInput = this.querySelector(\u0026#34;#copyInput\u0026#34;); addCommentBtn.addEventListener(\u0026#34;click\u0026#34;, () =\u0026gt; { dialog.showModal(); }); closeBtn.addEventListener(\u0026#34;click\u0026#34;, () =\u0026gt; { dialog.close(); }); dialog.addEventListener(\u0026#34;keydown\u0026#34;, (e) =\u0026gt; { if (e.key === \u0026#34;Escape\u0026#34;) { dialog.close(); } }); dialog.addEventListener(\u0026#34;click\u0026#34;, (event) =\u0026gt; { var rect = dialog.getBoundingClientRect(); var isInDialog = rect.top \u0026lt;= event.clientY \u0026amp;\u0026amp; event.clientY \u0026lt;= rect.top + rect.height \u0026amp;\u0026amp; rect.left \u0026lt;= event.clientX \u0026amp;\u0026amp; event.clientX \u0026lt;= rect.left + rect.width; if (!isInDialog) { dialog.close(); } }); goBtn.addEventListener(\u0026#34;click\u0026#34;, () =\u0026gt; { let url = instanceNameInput.value.trim(); if (url === \u0026#34;\u0026#34;) { window.alert(this.locale.instanceMissingAlert); return; } localStorage.setItem(\u0026#34;mastodonUrl\u0026#34;, url); if (!url.startsWith(\u0026#34;https://\u0026#34;)) { url = `https://${url}`; } window.open( `${url}/authorize_interaction?uri=${this.mastodonPostUrl}`, \u0026#34;_blank\u0026#34;, ); }); instanceNameInput.addEventListener(\u0026#34;keydown\u0026#34;, (e) =\u0026gt; { if (e.key === \u0026#34;Enter\u0026#34;) { goBtn.dispatchEvent(new Event(\u0026#34;click\u0026#34;)); } }); copyBtn.addEventListener(\u0026#34;click\u0026#34;, () =\u0026gt; { copyInput.select(); navigator.clipboard.writeText(this.mastodonPostUrl); copyBtn.innerHTML = this.locale.copiedButtonLabel; window.setTimeout(() =\u0026gt; { copyBtn.innerHTML = this.locale.copyButtonLabel; }, 1000); }); } escapeHtml(unsafe) { return (unsafe || \u0026#34;\u0026#34;) .replace(/\u0026amp;/g, \u0026#34;\u0026amp;amp;\u0026#34;) .replace(/\u0026lt;/g, \u0026#34;\u0026amp;lt;\u0026#34;) .replace(/\u0026gt;/g, \u0026#34;\u0026amp;gt;\u0026#34;) .replace(/\u0026#34;/g, \u0026#34;\u0026amp;quot;\u0026#34;) .replace(/\u0026#39;/g, \u0026#34;\u0026amp;#039;\u0026#34;); } toot_active(toot, what) { var count = toot[what + \u0026#34;_count\u0026#34;]; return count \u0026gt; 0 ? \u0026#34;active\u0026#34; : \u0026#34;\u0026#34;; } toot_count(toot, what) { var count = toot[what + \u0026#34;_count\u0026#34;]; return count \u0026gt; 0 ? count : \u0026#34;\u0026#34;; } toot_stats(toot) { return ` \u0026lt;div class=\u0026#34;replies ${this.toot_active(toot, \u0026#34;replies\u0026#34;)}\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;${ toot.url }\u0026#34; rel=\u0026#34;ugc nofollow\u0026#34;\u0026gt;${icon_reply} ${this.toot_count( toot, \u0026#34;replies\u0026#34;, )}\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;reblogs ${this.toot_active(toot, \u0026#34;reblogs\u0026#34;)}\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;${ toot.url }/reblogs\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt;${icon_retweet} ${this.toot_count( toot, \u0026#34;reblogs\u0026#34;, )}\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;favourites ${this.toot_active(toot, \u0026#34;favourites\u0026#34;)}\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;${ toot.url }/favourites\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt;${icon_star} ${this.toot_count( toot, \u0026#34;favourites\u0026#34;, )}\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; `; } user_account(account) { var result = `@${account.acct}`; if (account.acct.indexOf(\u0026#34;@\u0026#34;) === -1) { const domain = new URL(account.url); result += `@${domain.hostname}`; } return result; } formatDate(dateString) { return this.dateFormatter .format(new Date(dateString)) .replace(\u0026#34;,\u0026#34;, \u0026#34;\u0026#34;) .replace(/(\\d+)\\/(\\d+)\\/(\\d+)/, \u0026#34;$3-$1-$2\u0026#34;); // only necessary when dealing with \u0026#34;en-US\u0026#34; locale } async render_toots(toots, in_reply_to) { const filterFunction = async (toot) =\u0026gt; { const isReplyToToot = toot.in_reply_to_id === in_reply_to; let isFilteredOut = false; if (isReplyToToot \u0026amp;\u0026amp; this.filter) { let isTootByOwner = false; let isFavoritedByOwner = false; if (this.filter === \u0026#34;favorites\u0026#34;) { isTootByOwner = toot.account.username === this.user; if (!isTootByOwner \u0026amp;\u0026amp; toot.favourites_count \u0026gt; 0) { const data = await fetch( \u0026#34;https://\u0026#34; + this.host + \u0026#34;/api/v1/statuses/\u0026#34; + toot.id + \u0026#34;/favourited_by\u0026#34;, ).then((response) =\u0026gt; response.json()); isFavoritedByOwner = data.some( (record) =\u0026gt; record.username === this.user, ); } isFilteredOut = !isTootByOwner \u0026amp;\u0026amp; !isFavoritedByOwner; } } return isReplyToToot \u0026amp;\u0026amp; !isFilteredOut; }; // apply async filter and wait for all to finish const tootsToRender = []; await Promise.all( toots.map(async (toot) =\u0026gt; { if (await filterFunction(toot)) { tootsToRender.push(toot); } }), ); tootsToRender .sort((a, b) =\u0026gt; a.created_at.localeCompare(b.created_at)) .forEach((toot) =\u0026gt; { this.render_toot(toots, toot); }); } render_toot(toots, toot) { toot.account.display_name = this.escapeHtml(toot.account.display_name); toot.account.emojis.forEach((emoji) =\u0026gt; { toot.account.display_name = toot.account.display_name.replace( `:${emoji.shortcode}:`, `\u0026lt;img src=\u0026#34;${this.escapeHtml(emoji.static_url)}\u0026#34; alt=\u0026#34;Emoji ${ emoji.shortcode }\u0026#34; height=\u0026#34;20\u0026#34; width=\u0026#34;20\u0026#34; /\u0026gt;`, ); }); const mastodonComment = ` \u0026lt;article class=\u0026#34;mastodon-comment\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;author\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;avatar\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;user\u0026#34; href=\u0026#34;${ toot.account.url }\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt;\u0026lt;img src=\u0026#34;${this.escapeHtml( toot.account.avatar_static )}\u0026#34; height=60 width=60 alt=\u0026#34;${ toot.account.username }\u0026#34; loading=\u0026#34;lazy\u0026#34;\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;details\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;name\u0026#34; href=\u0026#34;${toot.account.url}\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt;${ toot.account.display_name }\u0026lt;/a\u0026gt; \u0026lt;a class=\u0026#34;user\u0026#34; href=\u0026#34;${ toot.account.url }\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt;${this.user_account(toot.account)}\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;a class=\u0026#34;date\u0026#34; href=\u0026#34;${toot.url}\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt; ${icon_clock} \u0026lt;time datetime=\u0026#34;${toot.created_at}\u0026#34;\u0026gt; ${this.formatDate(toot.created_at)}${toot.edited_at ? \u0026#34; (*)\u0026#34; : \u0026#34;\u0026#34;} \u0026lt;/time\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;content\u0026#34;\u0026gt;${toot.content}\u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;attachments\u0026#34;\u0026gt; ${toot.media_attachments .map((attachment) =\u0026gt; { if (attachment.type === \u0026#34;image\u0026#34;) { return `\u0026lt;a href=\u0026#34;${attachment.url}\u0026#34; rel=\u0026#34;ugc nofollow\u0026#34;\u0026gt;\u0026lt;img src=\u0026#34;${ attachment.preview_url }\u0026#34; alt=\u0026#34;${this.escapeHtml(attachment.description)}\u0026#34; loading=\u0026#34;lazy\u0026#34; /\u0026gt;\u0026lt;/a\u0026gt;`; } else if (attachment.type === \u0026#34;video\u0026#34;) { return `\u0026lt;video controls preload=\u0026#34;none\u0026#34;\u0026gt;\u0026lt;source src=\u0026#34;${attachment.url}\u0026#34; type=\u0026#34;${attachment.mime_type}\u0026#34;\u0026gt;\u0026lt;/video\u0026gt;`; } else if (attachment.type === \u0026#34;gifv\u0026#34;) { return `\u0026lt;video autoplay loop muted playsinline\u0026gt;\u0026lt;source src=\u0026#34;${attachment.url}\u0026#34; type=\u0026#34;${attachment.mime_type}\u0026#34;\u0026gt;\u0026lt;/video\u0026gt;`; } else if (attachment.type === \u0026#34;audio\u0026#34;) { return `\u0026lt;audio controls\u0026gt;\u0026lt;source src=\u0026#34;${attachment.url}\u0026#34; type=\u0026#34;${attachment.mime_type}\u0026#34;\u0026gt;\u0026lt;/audio\u0026gt;`; } else { return `\u0026lt;a href=\u0026#34;${attachment.url}\u0026#34; rel=\u0026#34;ugc nofollow\u0026#34;\u0026gt;${attachment.type}\u0026lt;/a\u0026gt;`; } }) .join(\u0026#34;\u0026#34;)} \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;status\u0026#34;\u0026gt; ${this.toot_stats(toot)} \u0026lt;/div\u0026gt; \u0026lt;/article\u0026gt; `; var li = document.createElement(\u0026#34;li\u0026#34;); li.setAttribute(\u0026#34;id\u0026#34;, toot.id); li.innerHTML = typeof DOMPurify !== \u0026#34;undefined\u0026#34; ? DOMPurify.sanitize(mastodonComment.trim()) : mastodonComment.trim(); if (toot.in_reply_to_id === this.tootId) { this.querySelector(\u0026#34;#mastodon-comments-list\u0026#34;).appendChild(li); } else { const parentToot = toots.find((t) =\u0026gt; t.id === toot.in_reply_to_id); if (parentToot) { const ul = document.createElement(\u0026#34;ul\u0026#34;); this.querySelector(`[id=\u0026#34;${toot.in_reply_to_id}\u0026#34;]`) .appendChild(ul) .appendChild(li); } } this.render_toots(toots, toot.id); } loadComments() { if (this.commentsLoaded) return; this.querySelector(\u0026#34;#mastodon-comments-list\u0026#34;).innerHTML = this.locale.loadingText; const _this = this; fetch(`https://${this.host}/api/v1/statuses/${this.tootId}`) .then((response) =\u0026gt; response.json()) .then((toot) =\u0026gt; { this.querySelector(\u0026#34;#mastodon-stats\u0026#34;).innerHTML = this.toot_stats(toot); this.tootAccountURI = toot.account.uri; }); fetch(`https://${this.host}/api/v1/statuses/${this.tootId}/context`) .then((response) =\u0026gt; response.json()) .then((data) =\u0026gt; { if ( data.descendants \u0026amp;\u0026amp; Array.isArray(data.descendants) \u0026amp;\u0026amp; data.descendants.length \u0026gt; 0 ) { this.querySelector(\u0026#34;#mastodon-comments-list\u0026#34;).innerHTML = \u0026#34;\u0026#34;; _this.render_toots(data.descendants, _this.tootId, 0); } else { this.querySelector(\u0026#34;#mastodon-comments-list\u0026#34;).innerHTML = `\u0026lt;p\u0026gt;${this.locale.noCommentsText}\u0026lt;/p\u0026gt;`; } _this.commentsLoaded = true; }); } respondToVisibility(element, callback) { var options = { root: null, }; var observer = new IntersectionObserver((entries, observer) =\u0026gt; { entries.forEach((entry) =\u0026gt; { if (entry.intersectionRatio \u0026gt; 0) { callback(); } }); }, options); observer.observe(element); } } customElements.define(\u0026#34;mastodon-comments\u0026#34;, MastodonComments); \u0026lt;/script\u0026gt; Où l\u0026rsquo;on remarquera les détails suivants :\nmodification de la langue par défaut en fr l\u0026rsquo;ajout des 4 icônes par la création de 4 constantes adéquats, nécessitant la modification du code, principalement celui de la fonction toot_stats. En passant, remarquez l\u0026rsquo;inclusion de l\u0026rsquo;appel au partiel icon ci-dessus. je n\u0026rsquo;ai pas touché aux définitions de style CSS. PS : En passant, j\u0026rsquo;ai fait une PR à l\u0026rsquo;auteur pour de très petites corrections linguistiques, en rapport avec le FR… en espérant qu\u0026rsquo;il veuille bien l\u0026rsquo;intégrer, sinon ce n\u0026rsquo;est pas grave, d\u0026rsquo;autant qu\u0026rsquo;elles sont faites dans mon code.\npartial comments Création d\u0026rsquo;un partiel nommé logiquement comments qui est appelé depuis le fichier principal single :\n{{- if and site.Params.enable.comments .Params.mastodon.tootId }} {{- $u := urls.Parse .Params.mastodon.tootId -}} {{- $s := strings.Split $u.RequestURI \u0026#34;/\u0026#34; -}} {{- $user := substr (index $s 1) 1 | safeHTML -}} {{- $tootId := index $s 2 | safeHTML -}} {{- partial \u0026#34;components/mastodon-comments-modified.js\u0026#34; . -}} \u0026lt;div id=\u0026#34;comments\u0026#34;\u0026gt; \u0026lt;mastodon-comments host=\u0026#34;{{ $u.Hostname }}\u0026#34; user=\u0026#34;{{ $user }}\u0026#34; tootId=\u0026#34;{{ $tootId }}\u0026#34;\u0026gt; \u0026lt;/mastodon-comments\u0026gt; \u0026lt;/div\u0026gt; {{- end }} Comme vous pouvez le remarquer, il nécessite la création et l\u0026rsquo;utilisation de nouveaux paramètres Hugo.\nun premier paramètre permettant l\u0026rsquo;activation du système de commentaires au sein de Hugo. un dernier, celui-ci qui sera créé dans le frontmatter de l\u0026rsquo;article à promouvoir. Le code ne s\u0026rsquo;affichera que si et seulement si le système de commentaires est activé, dans les paramètres Hugo, ET s\u0026rsquo;il y a bien un identifiant de message Mastodon dans le frontmatter de l\u0026rsquo;article en question !\nPS : J\u0026rsquo;ai eu dans l\u0026rsquo;idée, très forte, de simplifier encore plus afin de n\u0026rsquo;avoir qu\u0026rsquo;à copier-coller l\u0026rsquo;URL complète de l\u0026rsquo;identifiant du post au sein de Mastodon dans le frontmatter et \u0026ldquo;d\u0026rsquo;éclater\u0026rdquo; l\u0026rsquo;URL copié pour obtenir les noms d\u0026rsquo;hôte et d\u0026rsquo;utilisateur dédié.\nparams enable:comments Dans le fichier de configuration d\u0026rsquo;Hugo, ajoutons -ici au format YAML, depuis un fichier dédié nommé params.yaml ; à vous d\u0026rsquo;adapter… :\nenable: (…) comments: true modification de l\u0026rsquo;archétype Modification de l\u0026rsquo;archétype afin d\u0026rsquo;ajouter lors de la création de nouvel article le paramètre adéquat :\nparams: mastodon: tootId: la variable tootId recevra l\u0026rsquo;identifiant du post Mastodon. Il faudra copier l\u0026rsquo;URL complète dans le frontmatter de l\u0026rsquo;article concerné ! mastodon-comments.css Dans le sous-répertoire css de mes assets, j\u0026rsquo;ai crée le fichier mastodon-comments.css pour y copier-coller le code ad hoc :\n/* mastodon-comments { --font-color: #5d686f; --font-size: 1.0rem; --block-border-width: 1px; --block-border-radius: 3px; --block-border-color: #ededf0; --block-background-color: #f7f8f8; --comment-indent: 40px; } */ @media only screen and (max-width: 1024px) { mastodon-comments { --comment-indent: 20px; } } @media only screen and (max-width: 640px) { mastodon-comments { --comment-indent: 0px; } } body { font-family: sans-serif; background-color: #ffffff; color: #222222; } @media (prefers-color-scheme: dark) { body { background-color: #121212; color: #d1d1d1; } } C\u0026rsquo;est exactement celui fourni par le projet mastodon-comments. Je n\u0026rsquo;ai fait que le mettre dans un fichier CSS à part, qui est appelé dans mon code Hugo écrit dans le partial link qui sert à gérer le code CSS.\nJe ne montre pas l\u0026rsquo;appel CSS écrit dans le partial.\npurify.js Dans le sous-répertoire js de mes assets, j\u0026rsquo;ai un énième répertoire nommé vendors où j\u0026rsquo;ai déposé le code copié du projet DOM Purify, qui est appelé par le code Hugo écrit dans le partial js pour la gestion des appels javascript.\nLà encore, j\u0026rsquo;ai modifié mon appel des scripts javascript afin qu\u0026rsquo;il tienne compte de l\u0026rsquo;activation du système de commentaires dans les paramètres Hugo. Si celui-ci n\u0026rsquo;est pas actif, alors l\u0026rsquo;appel au fichier JS relatif ne se fait pas, tel que :\n(…) {{- if site.Params.enable.comments }} {{- $purify := resources.Get \u0026#34;js/vendors/purify.js\u0026#34; -}} {{- $global = $global | append $purify -}} {{- end }} {{- $global = $global | resources.Concat \u0026#34;js/1.js\u0026#34; -}} {{- with $global }} (…) Bien sûr, à vous d\u0026rsquo;adapter selon votre code Hugo ! PS : Je me demande même s\u0026rsquo;il ne serait pas intéressant de n\u0026rsquo;inclure ce code si ET seulement si un id de message mastodon existe aussi dans le frontmatter… à creuser !\nVoilà !\nJ\u0026rsquo;espère sincérement ne rien avoir oublié… Cet article vous donnera peut-être des idées à partager vous aussi ; faites-le en commentaires ;-)\nURLs Retrouvez-ici les différentes URL utiles :\nle projet DOM Purify et sa bibliothèque disponible depuis le dépôt GitHub. ⇒ mes modifications de code :\ncss/mastodon-comments.css partial comments partial component/mastodon-comments-modified.js Remerciements Il y a deux articles, dont l\u0026rsquo;un renvoie vers le premier qui m\u0026rsquo;ont énormément aidé dans la démarche :\nAdding comments to your static blog with Mastodon Mastodon as comment system for your static blog ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eCet article décrit avec plus ou moins de finesse - \u003cem\u003eç-à-d que je vais m\u0026rsquo;efforcer de ne pas oublier de détails\u003c/em\u003e - l\u0026rsquo;inclusion d\u0026rsquo;un système de commentaires affiché en bas de page d\u0026rsquo;articles fait avec Hugo, utilisant le fediverse, Mastodon principalement.\u003c/p\u003e\n\u003cp\u003eMes exigences à ce propos :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eêtre le plus simple à mettre en place\u003c/li\u003e\n\u003cli\u003eutiliser le fediverse, afin de ne pas avoir à \u0026ldquo;modèrer\u0026rdquo; et surtout ne pas avoir à modèrer localement\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUtiliser le fediverse nécessite :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ed\u0026rsquo;avoir un compte sur un serveur gérant ActivityPub\u003c/li\u003e\n\u003cli\u003edonne du sens pour un site web parlant d\u0026rsquo;informatique\u003c/li\u003e\n\u003cli\u003eaméliore grandement la visibilité\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"mastodon-comments\"\u003eMastodon-comments\u003c/h2\u003e\n\u003cp\u003eIl se trouve que le sentier est déjà fortement balisé !\u003c/p\u003e\n\u003cp\u003eUn développeur, nommé Daniel Pecos Martínez, a écrit il y a trois ans un composant web qui intégre les commentaires, republiages et autres fonctionnalités venant d\u0026rsquo;un compte Mastodon.\u003c/p\u003e\n\u003cp\u003eUn détail à bien comprendre :\u003c/p\u003e\n\u003cp\u003e⇒ il est strictement nécessaire de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epublier l\u0026rsquo;article créé avec Hugo sur n\u0026rsquo;importe quel hébergement\u003c/li\u003e\n\u003cli\u003ede faire une annonce depuis un compte sur Mastodon,\u003c/li\u003e\n\u003cli\u003ede copier l\u0026rsquo;identificant du toot pour l\u0026rsquo;intégrer dans le frontmatter de l\u0026rsquo;article,\u003c/li\u003e\n\u003cli\u003epuis de republier l\u0026rsquo;article sur l\u0026rsquo;hébergement dédié.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEt, oui, cela se fait en deux temps…\u003c/p\u003e\n\u003cp\u003eLe code est disponible sur : \u003ca href=\"https://github.com/dpecos/mastodon-comments\" rel=\"external\"\u003ehttps://github.com/dpecos/mastodon-comments\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eQuelques détails à assimiler :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ece code utilise quelques bibliothèques (\u003cem\u003eà savoir DOMPurify, Font Awesome\u003c/em\u003e) depuis un des CDN de CloudFare ; le choix du développeur ne voulant pas héberger lesdites bibliothèques.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;outil est chargé de manière dynamique au grés du scroll du lecteur\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi ces choix vous plaisent, il n\u0026rsquo;y a vraiment qu\u0026rsquo;à copier l\u0026rsquo;\u003ca href=\"https://github.com/dpecos/mastodon-comments/blob/master/example/index.html\" rel=\"external\"\u003eexemple du fichier index\u003c/a\u003e pour intégrer directement et très rapidement ce système de commentaires.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eMais (c|s)es choix ne me vont pas !\u003c/p\u003e\n\u003cp\u003eJe ne veux pas :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eutiliser de bibliothèques (\u003cem\u003eplus ou moins\u003c/em\u003e) lourdes à distance, et surtout pas depuis CloudFare.\u003c/li\u003e\n\u003cli\u003eutiliser Font Awesome qui nécessite le chargement de plusieurs icônes pour n\u0026rsquo;afficher au final que quelques unes.\u003c/li\u003e\n\u003cli\u003ed\u0026rsquo;autant que principalement, j\u0026rsquo;utilise celles disponibles sur le site tablericons.com localement au-travers du système de données Hugo.Data\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCar oui, je tiens à utiliser du code SVG pour afficher les icônes disponibles.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"mastodon-comments-modifié\"\u003eMastodon-comments-modifié\u003c/h2\u003e\n\u003ch3 id=\"hugodata\"\u003eHugo.Data\u003c/h3\u003e\n\u003cp\u003eDans le répertoire \u003ccode\u003edata\u003c/code\u003e, j\u0026rsquo;utilise un fichier nommé SVG.yaml, où l\u0026rsquo;on retrouve les icônes copiés principalement depuis Tablericons.\u003c/p\u003e\n\u003cp\u003eJe dépose ici le code des 4 utilisés :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003emenu-order: \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon icon-tabler icon-tabler-menu-order\u0026#34; viewBox=\u0026#34;0 0 24 24\u0026#34; fill=\u0026#34;none\u0026#34; stroke=\u0026#34;#000000\u0026#34; stroke-width=\u0026#34;1\u0026#34; stroke-linecap=\u0026#34;round\u0026#34; stroke-linejoin=\u0026#34;round\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M4 10h16\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M4 14h16\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M9 18l3 3l3 -3\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M9 6l3 -3l3 3\u0026#34; /\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39;\nrepeat: \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon icon-tabler icon-tabler-repeat\u0026#34; viewBox=\u0026#34;0 0 24 24\u0026#34; fill=\u0026#34;none\u0026#34; stroke=\u0026#34;#000000\u0026#34; stroke-width=\u0026#34;1\u0026#34; stroke-linecap=\u0026#34;round\u0026#34; stroke-linejoin=\u0026#34;round\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M4 12v-3a3 3 0 0 1 3 -3h13m-3 -3l3 3l-3 3\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M20 12v3a3 3 0 0 1 -3 3h-13m3 3l-3 -3l3 -3\u0026#34; /\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39;\nreply: \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon icon-tabler icon-tabler-reply\u0026#34; viewBox=\u0026#34;0 0 24 24\u0026#34; fill=\u0026#34;none\u0026#34; stroke=\u0026#34;#000000\u0026#34; stroke-width=\u0026#34;1\u0026#34; stroke-linecap=\u0026#34;round\u0026#34; stroke-linejoin=\u0026#34;round\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12z\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M11 8l-3 3l3 3\u0026#34; /\u0026gt;\u0026lt;path d=\u0026#34;M16 11h-8\u0026#34; /\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39;\nstar: \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon icon-tabler icon-tabler-star\u0026#34; viewBox=\u0026#34;0 0 24 24\u0026#34; fill=\u0026#34;currentColor\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M8.243 7.34l-6.38 .925l-.113 .023a1 1 0 0 0 -.44 1.684l4.622 4.499l-1.09 6.355l-.013 .11a1 1 0 0 0 1.464 .944l5.706 -3l5.693 3l.1 .046a1 1 0 0 0 1.352 -1.1l-1.091 -6.355l4.624 -4.5l.078 -.085a1 1 0 0 0 -.633 -1.62l-6.38 -.926l-2.852 -5.78a1 1 0 0 0 -1.794 0l-2.853 5.78z\u0026#34; /\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDans le répertoire \u003ccode\u003e_partials\u003c/code\u003e, j\u0026rsquo;ai deux autres sous-répertoires :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eun premier nommé \u003ccode\u003eutils\u003c/code\u003e où se situe le fichier permettant l\u0026rsquo;appel des icônes SVG, nommé très basiquement \u003ccode\u003eicon.html\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eun deuxième nommé \u003ccode\u003ecomponents\u003c/code\u003e où j\u0026rsquo;ai placé le script JS nécessaire que j\u0026rsquo;ai modifié pour utiliser lesdites icônes SVG.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"partial-utilsicon\"\u003epartial \u003ccode\u003eutils/icon\u003c/code\u003e\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- $ := index . \u0026#34;$\u0026#34; -}}\n{{- $name := .name -}}\n{{- $class := .class | default $name -}}\n{{- $icon := index hugo.Data.SVG $name -}}\n{{- $class := printf \u0026#34;icon %s\u0026#34; $class -}}\n{{- return (replace $icon \u0026#34;icon\u0026#34; $class | safeHTML) -}}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCe code n\u0026rsquo;a pas été écrit par mes soins… mais il est simple et fonctionnel\u003c/p\u003e\n\u003ch3 id=\"ajouts-css\"\u003eajouts CSS\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire d\u0026rsquo;ajouter une taille aux icônes SVG dans le code CSS, 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-css\" data-lang=\"css\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003earticle\u003c/span\u003e.\u003cspan style=\"color:#fec418\"\u003emastodon-comment\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003esvg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eheight\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e\u003cspan style=\"color:#fec418\"\u003epx\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ewidth\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e\u003cspan style=\"color:#fec418\"\u003epx\u003c/span\u003e;\n\u003c/span\u003e\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:#fec418\"\u003emastodon-stats\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003esvg\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eheight\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e32\u003c/span\u003e\u003cspan style=\"color:#fec418\"\u003epx\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ewidth\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e32\u003c/span\u003e\u003cspan style=\"color:#fec418\"\u003epx\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\u003eBien sûr, à vous de vous adapter !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003ePour finir cette partie, je redéfinis dans le fichier principal CSS la taille de l\u0026rsquo;élément \u003ccode\u003emastodon-comments\u003c/code\u003e -\u003cem\u003eet non plus dans le code source HTML\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-css\" data-lang=\"css\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e#\u003cspan style=\"color:#fec418\"\u003ecomments\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003emastodon-comments\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003emax-width\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e1024\u003c/span\u003e\u003cspan style=\"color:#fec418\"\u003epx\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\u003eCe qui permettra de l\u0026rsquo;adapter selon les medias utilisés…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"partial-componentmastodon-comments-modifiedjs\"\u003epartial \u003ccode\u003ecomponent/mastodon-comments-modified.js\u003c/code\u003e\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-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:#06b6ef\"\u003edefer\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;module\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:#776e71\"\u003e// ============================================================\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e// Set language dependend texts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e// ============================================================\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ei18n\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:#06b6ef\"\u003een\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:#06b6ef\"\u003ecommentsTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Comments\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyIntro\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;You can use your Fediverse (i.e. Mastodon, among many others) account to reply to this\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyLinkText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;post\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Reply\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eloadingText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Loading comments from the Fediverse...\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003enoCommentsText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;No comments found\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Reply to this post\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogCloseTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Close\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogCloseSymbol\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026amp;times;\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogExplain\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;Comments are powered by Mastodon. With an account on Mastodon (or elsewhere on the Fediverse), you can respond to this post. Simply enter your mastodon instance below, and add a reply:\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003egoButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Go\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopyAlternativeText\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;Alternatively, copy this URL and paste it into the search bar of your Mastodon app:\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopyButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Copy\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopiedButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Copied!\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003einstancePlaceholder\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;mastodon.social\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003einstanceMissingAlert\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Please provide the name of your instance\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edateLocale\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;en-US\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\"\u003ede\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:#06b6ef\"\u003ecommentsTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Kommentare\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyIntro\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;Du kannst mit deinem Fediverse-Konto (z.B. Mastodon) auf diesen\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyLinkText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Beitrag antworten\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Antworten\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eloadingText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Kommentare werden aus dem Fediverse geladen...\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003enoCommentsText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Keine Kommentare gefunden\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Auf diesen Beitrag antworten\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogCloseTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Schließen\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogCloseSymbol\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026amp;times;\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogExplain\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;Kommentare werden über Mastodon bereitgestellt. Mit einem Konto bei Mastodon (oder anderswo im Fediverse) kannst du auf diesen Beitrag antworten. Gib einfach deine Mastodon-Instanz unten ein:\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003egoButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Los\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopyAlternativeText\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;Alternativ kannst du diese URL kopieren und in die Suchleiste deiner Mastodon-App einfügen:\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopyButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Kopieren\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopiedButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Kopiert!\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003einstancePlaceholder\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;mastodon.social\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003einstanceMissingAlert\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Bitte gib den Namen deiner Instanz an\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edateLocale\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;de-DE\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\"\u003efr\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:#06b6ef\"\u003ecommentsTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Commentaires\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyIntro\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;Vous pouvez utiliser votre compte Fediverse (ex. Mastodon) pour répondre à ce\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyLinkText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;billet\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Répondre\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eloadingText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Chargement des commentaires depuis le Fediverse…\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003enoCommentsText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Aucun commentaire trouvé\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Répondre à ce billet\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogCloseTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Fermer\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogCloseSymbol\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026amp;times;\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogExplain\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;Les commentaires sont alimentés par Mastodon. Avec un compte sur Mastodon (ou ailleurs sur le Fediverse), vous pouvez répondre à ce billet. Entrez simplement votre instance Mastodon ci-dessous : \u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003egoButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Aller\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopyAlternativeText\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;Vous pouvez aussi copier cette URL et la coller dans la barre de recherche de votre application Mastodon : \u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopyButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Copier\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopiedButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Copié !\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003einstancePlaceholder\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;mastodon.social\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003einstanceMissingAlert\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Veuillez indiquer le nom de votre instance\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edateLocale\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;fr-FR\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\"\u003ees\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:#06b6ef\"\u003ecommentsTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Comentarios\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyIntro\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;Puedes usar tu cuenta del Fediverso (ej. Mastodon, entre otros) para comentar este\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyLinkText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;toot\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ereplyButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Responder\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eloadingText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Cargando comentarios del Fediverso...\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003enoCommentsText\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;No se han encontrado comentarios\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Responde a este post\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogCloseTitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Cerrar\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogCloseSymbol\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026amp;times;\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edialogExplain\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;Comentarios gracias a Mastodon. Con una cuenta en Mastodon (o en cualquier otro sitio en el Fediverso), puedes responder a esta entrada. Simplemente introduce tu instancia y pulsa responder:\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003egoButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Ir\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopyAlternativeText\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;O puedes copiar esta URL y pegarla en el cuadro de búsqueda de tu aplicación Mastodon:\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopyButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Copiar\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ecopiedButtonLabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;¡Copiado!\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003einstancePlaceholder\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;mastodon.social\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003einstanceMissingAlert\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Por favor introduce tu instancia\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edateLocale\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;es-ES\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};\n\u003c/span\u003e\u003c/span\u003e\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\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eDEFAULT_LANG\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:#776e71\"\u003e// ============================================================\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eicon_clock\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ partial \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eutils\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eicon\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; (dict \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; $ \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eclock\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:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eicon_reply\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ partial \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eutils\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eicon\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; (dict \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; $ \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ereply\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:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eicon_retweet\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ partial \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eutils\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eicon\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; (dict \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; $ \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003erepeat\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:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eicon_star\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ partial \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eutils\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eicon\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; (dict \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; $ \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003estar\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\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003estyles\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:root {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --font-color: #5d686f;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --font-size: 1.0rem;\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  --block-border-width: 1px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --block-border-radius: 3px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --block-border-color: #ededf0;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --block-background-color: #f7f8f8;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --dialog-background-color: #ffffff;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --muted-color: #5d686f;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --reply-color: #003eaa;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --reblog-color: #8c8dff;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --favourite-color: #ca8f04;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --button-color: #595aff;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --button-hover-color: #4849ff;\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  --comment-indent: 40px;\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@media (prefers-color-scheme: dark) {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  :root {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    --font-color: #d1d1d1;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    --block-border-color: #3e3e3e;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    --block-background-color: #1e1e1e;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    --dialog-background-color: #2d2d2d;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    --muted-color: #8a9ba3;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    --reply-color: #7b9fff;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    --reblog-color: #a8a9ff;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    --favourite-color: #e6b44a;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    --button-color: #6c6dff;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    --button-hover-color: #595aff;\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[data-theme=\u0026#34;dark\u0026#34;] {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --font-color: #d1d1d1;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --block-border-color: #3e3e3e;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --block-background-color: #1e1e1e;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --dialog-background-color: #2d2d2d;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --muted-color: #8a9ba3;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --reply-color: #7b9fff;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --reblog-color: #a8a9ff;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --favourite-color: #e6b44a;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --button-color: #6c6dff;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  --button-hover-color: #595aff;\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\"\u003emastodon-comments {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  font-size: var(--font-size);\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\"\u003ep {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin: 0 0 1rem 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\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e#mastodon-stats {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  text-align: center;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  font-size: calc(var(--font-size) * 1.5);\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#mastodon-title {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  font-size: calc(var(--font-size) * 1.5);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  font-weight: bold;\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#mastodon-comments-list {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin: 0 auto;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  padding: 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\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e#mastodon-comments-list ul {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  padding-left: var(--comment-indent);\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#mastodon-comments-list li {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  list-style: none;\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.mastodon-comment {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  background-color: var(--block-background-color);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  border-radius: var(--block-border-radius);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  border: var(--block-border-width) var(--block-border-color) solid;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  padding: 15px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin-bottom: 1.5rem;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  display: flex;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  flex-direction: column;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  color: var(--font-color);\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.mastodon-comment p {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin-bottom: 0px;\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.mastodon-comment .author {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  padding-top:0;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  display:flex;\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.mastodon-comment .author a {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  text-decoration: none;\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.mastodon-comment .author .avatar img {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin-right:1rem;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  min-width:60px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  border-radius: 5px;\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.mastodon-comment .author .details {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  display: flex;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  flex-direction: column;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  line-height: 1.2em;\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.mastodon-comment .author .details .name {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  font-weight: bold;\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.mastodon-comment .author .details .user {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  color: var(--muted-color);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  font-size: medium;\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.mastodon-comment .author .date {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin-left: auto;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  font-size: small;\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.mastodon-comment .content {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin: 15px 0;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  line-height: 1.5em;\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.mastodon-comment .author .details a,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e.mastodon-comment .content p {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin-bottom: 10px;\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.mastodon-comment .attachments {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin: 0px 10px;\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.mastodon-comment .attachments \u0026gt; * {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin: 0px 10px;\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.mastodon-comment .attachments img {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  max-width: 100%;\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.mastodon-comment .status \u0026gt; div, #mastodon-stats \u0026gt; div {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  display: inline-block;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin-right: 15px;\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.mastodon-comment .status a, #mastodon-stats a {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  color: var(--muted-color);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  text-decoration: none;\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.mastodon-comment .status .replies.active a, #mastodon-stats .replies.active a {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  color: var(--reply-color);\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.mastodon-comment .status .reblogs.active a, #mastodon-stats .reblogs.active a {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  color: var(--reblog-color);\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.mastodon-comment .status .favourites.active a, #mastodon-stats .favourites.active a {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  color: var(--favourite-color);\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@media only screen and (max-width: 640px) {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  .mastodon-comment .author {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    flex-wrap: nowrap;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    align-items: flex-start;\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  .mastodon-comment .author .date {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    margin-left: 0;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    text-align: right;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    white-space: nowrap;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    overflow: hidden;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    text-overflow: ellipsis;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    max-width: 100%;\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\"\u003edialog {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  border: none;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  border-radius: var(--block-border-radius);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  box-shadow: 0 0 10px rgba(0,0,0,0.1);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  padding: 20px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  max-width: 500px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  width: 90%;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  color: var(--font-color);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  background-color: var(--dialog-background-color);\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\"\u003edialog::backdrop {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  background: rgba(0,0,0,0.5);\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\"\u003edialog h3 {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin-top: 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\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003edialog #close {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  position: absolute;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  top: 10px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  right: 10px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  border: none;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  background: none;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  font-size: 1.5rem;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  cursor: pointer;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  color: var(--font-color);\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.input-row {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  display: flex;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  gap: 10px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin: 10px 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\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e.input-row input {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  flex-grow: 1;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  padding: 8px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  border: 1px solid var(--block-border-color);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  border-radius: var(--block-border-radius);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  background-color: var(--block-background-color);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  color: var(--font-color);\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.button {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  padding: 8px 16px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  background-color: var(--button-color);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  color: white;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  border: none;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  border-radius: var(--block-border-radius);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  cursor: pointer;\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#add-comment {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  display: block;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  margin: 10px 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\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e.button:hover {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  background-color: var(--button-hover-color);\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`\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\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:#06b6ef\"\u003eMastodonComments\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eextends\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eHTMLElement\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003econstructor\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003esuper\u003c/span\u003e();\n\u003c/span\u003e\u003c/span\u003e\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\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ehost\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003egetAttribute\u003c/span\u003e(\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        \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003euser\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003egetAttribute\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;user\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etootId\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003egetAttribute\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;tootId\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003efilter\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003egetAttribute\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;filter\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\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ecommentsLoaded\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\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:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etootAccountURI\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enull\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\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// Resolve locale: attribute → \u0026lt;html lang\u0026gt; → default\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003elang\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\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003egetAttribute\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;lang\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            document.\u003cspan style=\"color:#06b6ef\"\u003edocumentElement\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elang\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e?\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003esplit\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;-\u0026#34;\u003c/span\u003e)[\u003cspan style=\"color:#f99b15\"\u003e0\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:#06b6ef\"\u003enavigator\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elanguage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e?\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003esplit\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;-\u0026#34;\u003c/span\u003e)[\u003cspan style=\"color:#f99b15\"\u003e0\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:#06b6ef\"\u003eDEFAULT_LANG\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ei18n\u003c/span\u003e[\u003cspan style=\"color:#06b6ef\"\u003elang\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e??\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ei18n\u003c/span\u003e[\u003cspan style=\"color:#06b6ef\"\u003eDEFAULT_LANG\u003c/span\u003e];\n\u003c/span\u003e\u003c/span\u003e\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\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edateFormatter\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eIntl\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eDateTimeFormat\u003c/span\u003e(\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edateLocale\u003c/span\u003e, {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eyear\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;numeric\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003emonth\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;2-digit\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eday\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;2-digit\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003ehour\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;2-digit\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eminute\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;2-digit\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003ehour12\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\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\"\u003eformatMatcher\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;basic\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\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\u003edocument.\u003cspan style=\"color:#06b6ef\"\u003egetElementById\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;mastodon-comments-styles\u0026#34;\u003c/span\u003e)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003estyleElem\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e document.\u003cspan style=\"color:#06b6ef\"\u003ecreateElement\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003estyleElem\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;mastodon-comments-styles\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003estyleElem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003einnerHTML\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003estyles\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            document.\u003cspan style=\"color:#06b6ef\"\u003ehead\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eappendChild\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003estyleElem\u003c/span\u003e);\n\u003c/span\u003e\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:#06b6ef\"\u003econnectedCallback\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emastodonPostUrl\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e`https://\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ehost\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:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003euser\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:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etootId\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003einnerHTML\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          \u0026lt;div id=\u0026#34;mastodon-stats\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e          \u0026lt;div id=\u0026#34;mastodon-title\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ecommentsTitle\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e          \u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ereplyIntro\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u0026lt;a class=\u0026#34;link\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              href=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emastodonPostUrl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; rel=\u0026#34;ugc\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ereplyLinkText\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/a\u0026gt;.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              \u0026lt;button id=\u0026#34;add-comment\u0026#34; class=\u0026#34;button\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ereplyButtonLabel\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/button\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e          \u0026lt;/p\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          \u0026lt;ul id=\u0026#34;mastodon-comments-list\u0026#34;\u0026gt;\u0026lt;/ul\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          \u0026lt;dialog id=\u0026#34;comment-dialog\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;h3\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edialogTitle\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/h3\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;button title=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edialogCloseTitle\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; id=\u0026#34;close\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edialogCloseSymbol\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/button\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edialogExplain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/p\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;div class=\u0026#34;input-row\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              \u0026lt;input type=\u0026#34;text\u0026#34; inputmode=\u0026#34;url\u0026#34; autocapitalize=\u0026#34;none\u0026#34; autocomplete=\u0026#34;off\u0026#34; value=\u0026#34;\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:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eescapeHtml\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003elocalStorage\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003egetItem\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;mastodonUrl\u0026#34;\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:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; id=\u0026#34;instanceName\u0026#34; placeholder=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003einstancePlaceholder\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              \u0026lt;button class=\u0026#34;button\u0026#34; id=\u0026#34;go\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003egoButtonLabel\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/button\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ecopyAlternativeText\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/p\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;div class=\u0026#34;input-row\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              \u0026lt;input type=\u0026#34;text\u0026#34; readonly id=\u0026#34;copyInput\u0026#34; value=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emastodonPostUrl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              \u0026lt;button class=\u0026#34;button\u0026#34; id=\u0026#34;copy\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ecopyButtonLabel\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/button\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e          \u0026lt;/dialog\u0026gt;\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ecomments\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003equerySelector\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#mastodon-comments-list\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erootStyle\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003egetAttribute\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;style\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:#06b6ef\"\u003erootStyle\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003ecomments\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003esetAttribute\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003erootStyle\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003erespondToVisibility\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003ecomments\u003c/span\u003e, \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eloadComments\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ebind\u003c/span\u003e(\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e));\n\u003c/span\u003e\u003c/span\u003e\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\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003einitDialog\u003c/span\u003e();\n\u003c/span\u003e\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\"\u003einitDialog\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edialog\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003equerySelector\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#comment-dialog\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eaddCommentBtn\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003equerySelector\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#add-comment\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ecloseBtn\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003equerySelector\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#close\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003egoBtn\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003equerySelector\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#go\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ecopyBtn\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003equerySelector\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#copy\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003einstanceNameInput\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003equerySelector\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#instanceName\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ecopyInput\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003equerySelector\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#copyInput\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\"\u003eaddCommentBtn\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaddEventListener\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;click\u0026#34;\u003c/span\u003e, () =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003edialog\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eshowModal\u003c/span\u003e();\n\u003c/span\u003e\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\"\u003ecloseBtn\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaddEventListener\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;click\u0026#34;\u003c/span\u003e, () =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003edialog\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eclose\u003c/span\u003e();\n\u003c/span\u003e\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\"\u003edialog\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaddEventListener\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;keydown\u0026#34;\u003c/span\u003e, (\u003cspan style=\"color:#06b6ef\"\u003ee\u003c/span\u003e) =\u0026gt; {\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:#06b6ef\"\u003ee\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ekey\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Escape\u0026#34;\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003edialog\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eclose\u003c/span\u003e();\n\u003c/span\u003e\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:#06b6ef\"\u003edialog\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaddEventListener\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;click\u0026#34;\u003c/span\u003e, (\u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e) =\u0026gt; {\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\"\u003erect\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edialog\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003egetBoundingClientRect\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\"\u003eisInDialog\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:#06b6ef\"\u003erect\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etop\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eclientY\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eclientY\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erect\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etop\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erect\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eheight\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003erect\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eleft\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eclientX\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eclientX\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erect\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eleft\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erect\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ewidth\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:#06b6ef\"\u003eisInDialog\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003edialog\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eclose\u003c/span\u003e();\n\u003c/span\u003e\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:#06b6ef\"\u003egoBtn\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaddEventListener\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;click\u0026#34;\u003c/span\u003e, () =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003elet\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003einstanceNameInput\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etrim\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:#06b6ef\"\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                window.\u003cspan style=\"color:#06b6ef\"\u003ealert\u003c/span\u003e(\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003einstanceMissingAlert\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;\n\u003c/span\u003e\u003c/span\u003e\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\"\u003elocalStorage\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003esetItem\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;mastodonUrl\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eurl\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:#06b6ef\"\u003eurl\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003estartsWith\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:#06b6ef\"\u003eurl\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e`https://\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\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            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            window.\u003cspan style=\"color:#06b6ef\"\u003eopen\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:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/authorize_interaction?uri=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emastodonPostUrl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\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\u0026#34;_blank\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        });\n\u003c/span\u003e\u003c/span\u003e\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\"\u003einstanceNameInput\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaddEventListener\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;keydown\u0026#34;\u003c/span\u003e, (\u003cspan style=\"color:#06b6ef\"\u003ee\u003c/span\u003e) =\u0026gt; {\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:#06b6ef\"\u003ee\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ekey\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Enter\u0026#34;\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003egoBtn\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edispatchEvent\u003c/span\u003e(\u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eEvent\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;click\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        });\n\u003c/span\u003e\u003c/span\u003e\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\"\u003ecopyBtn\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaddEventListener\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;click\u0026#34;\u003c/span\u003e, () =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003ecopyInput\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eselect\u003c/span\u003e();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003enavigator\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eclipboard\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ewriteText\u003c/span\u003e(\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emastodonPostUrl\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003ecopyBtn\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003einnerHTML\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ecopiedButtonLabel\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            window.\u003cspan style=\"color:#06b6ef\"\u003esetTimeout\u003c/span\u003e(() =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003ecopyBtn\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003einnerHTML\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ecopyButtonLabel\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }, \u003cspan style=\"color:#f99b15\"\u003e1000\u003c/span\u003e);\n\u003c/span\u003e\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:#06b6ef\"\u003eescapeHtml\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eunsafe\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\"\u003eunsafe\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:#06b6ef\"\u003ereplace\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e/\u0026amp;/g\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026amp;amp;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            .\u003cspan style=\"color:#06b6ef\"\u003ereplace\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e/\u0026lt;/g\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026amp;lt;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            .\u003cspan style=\"color:#06b6ef\"\u003ereplace\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e/\u0026gt;/g\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026amp;gt;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            .\u003cspan style=\"color:#06b6ef\"\u003ereplace\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e/\u0026#34;/g\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026amp;quot;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            .\u003cspan style=\"color:#06b6ef\"\u003ereplace\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e/\u0026#39;/g\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026amp;#039;\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etoot_active\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003ewhat\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\"\u003ecount\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e[\u003cspan style=\"color:#06b6ef\"\u003ewhat\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;_count\u0026#34;\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\"\u003ecount\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e?\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;active\u0026#34;\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etoot_count\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003ewhat\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\"\u003ecount\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e[\u003cspan style=\"color:#06b6ef\"\u003ewhat\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;_count\u0026#34;\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\"\u003ecount\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e?\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ecount\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etoot_stats\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\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:#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;div class=\u0026#34;replies \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etoot_active\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;replies\u0026#34;\u003c/span\u003e)\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;a href=\u0026#34;\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:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; rel=\u0026#34;ugc nofollow\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eicon_reply\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:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etoot_count\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#48b685\"\u003e\u0026#34;replies\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            )\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e          \u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e          \u0026lt;div class=\u0026#34;reblogs \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etoot_active\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;reblogs\u0026#34;\u003c/span\u003e)\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;a href=\u0026#34;\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:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/reblogs\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eicon_retweet\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:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etoot_count\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#48b685\"\u003e\u0026#34;reblogs\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            )\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e          \u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e          \u0026lt;div class=\u0026#34;favourites \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etoot_active\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;favourites\u0026#34;\u003c/span\u003e)\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;a href=\u0026#34;\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:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/favourites\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eicon_star\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:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etoot_count\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#48b685\"\u003e\u0026#34;favourites\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            )\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e          \u0026lt;/div\u0026gt;\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    }\n\u003c/span\u003e\u003c/span\u003e\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\"\u003euser_account\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eaccount\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\"\u003eresult\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e`@\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eacct\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\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:#815ba4\"\u003eif\u003c/span\u003e (\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eacct\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eindexOf\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;@\u0026#34;\u003c/span\u003e) \u003cspan style=\"color:#5bc4bf\"\u003e===\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:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edomain\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eURL\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eresult\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e`@\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003edomain\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ehostname\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\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        }\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\"\u003eresult\u003c/span\u003e;\n\u003c/span\u003e\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\"\u003eformatDate\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003edateString\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\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edateFormatter\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            .\u003cspan style=\"color:#06b6ef\"\u003eformat\u003c/span\u003e(\u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e Date(\u003cspan style=\"color:#06b6ef\"\u003edateString\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            .\u003cspan style=\"color:#06b6ef\"\u003ereplace\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;,\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:#06b6ef\"\u003ereplace\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e/(\\d+)\\/(\\d+)\\/(\\d+)/\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;$3-$1-$2\u0026#34;\u003c/span\u003e); \u003cspan style=\"color:#776e71\"\u003e// only necessary when dealing with \u0026#34;en-US\u0026#34; locale\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003easync\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erender_toots\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoots\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003ein_reply_to\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003efilterFunction\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003easync\u003c/span\u003e (\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e) =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eisReplyToToot\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ein_reply_to_id\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ein_reply_to\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003elet\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eisFilteredOut\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\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:#815ba4\"\u003eif\u003c/span\u003e (\u003cspan style=\"color:#06b6ef\"\u003eisReplyToToot\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003efilter\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#815ba4\"\u003elet\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eisTootByOwner\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\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:#815ba4\"\u003elet\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eisFavoritedByOwner\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\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:#815ba4\"\u003eif\u003c/span\u003e (\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003efilter\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;favorites\u0026#34;\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#06b6ef\"\u003eisTootByOwner\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eusername\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003euser\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:#06b6ef\"\u003eisTootByOwner\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003efavourites_count\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\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\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edata\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eawait\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003efetch\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            \u003cspan style=\"color:#48b685\"\u003e\u0026#34;https://\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:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ehost\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;/api/v1/statuses/\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:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eid\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;/favourited_by\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        ).\u003cspan style=\"color:#06b6ef\"\u003ethen\u003c/span\u003e((\u003cspan style=\"color:#06b6ef\"\u003eresponse\u003c/span\u003e) =\u0026gt; \u003cspan style=\"color:#06b6ef\"\u003eresponse\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#06b6ef\"\u003eisFavoritedByOwner\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edata\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003esome\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            (\u003cspan style=\"color:#06b6ef\"\u003erecord\u003c/span\u003e) =\u0026gt; \u003cspan style=\"color:#06b6ef\"\u003erecord\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eusername\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003euser\u003c/span\u003e,\n\u003c/span\u003e\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:#06b6ef\"\u003eisFilteredOut\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e!\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eisTootByOwner\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e!\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eisFavoritedByOwner\u003c/span\u003e;\n\u003c/span\u003e\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\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eisReplyToToot\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e!\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eisFilteredOut\u003c/span\u003e;\n\u003c/span\u003e\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// apply async filter and wait for all to finish\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etootsToRender\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\"\u003eawait\u003c/span\u003e Promise.\u003cspan style=\"color:#06b6ef\"\u003eall\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003etoots\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emap\u003c/span\u003e(\u003cspan style=\"color:#815ba4\"\u003easync\u003c/span\u003e (\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e) =\u0026gt; {\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:#815ba4\"\u003eawait\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003efilterFunction\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#06b6ef\"\u003etootsToRender\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003epush\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e);\n\u003c/span\u003e\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003etootsToRender\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            .\u003cspan style=\"color:#06b6ef\"\u003esort\u003c/span\u003e((\u003cspan style=\"color:#06b6ef\"\u003ea\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eb\u003c/span\u003e) =\u0026gt; \u003cspan style=\"color:#06b6ef\"\u003ea\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ecreated_at\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocaleCompare\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eb\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ecreated_at\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            .\u003cspan style=\"color:#06b6ef\"\u003eforEach\u003c/span\u003e((\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e) =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003erender_toot\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoots\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e);\n\u003c/span\u003e\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:#06b6ef\"\u003erender_toot\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoots\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edisplay_name\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eescapeHtml\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edisplay_name\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eemojis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eforEach\u003c/span\u003e((\u003cspan style=\"color:#06b6ef\"\u003eemoji\u003c/span\u003e) =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edisplay_name\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edisplay_name\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ereplace\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:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eemoji\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eshortcode\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\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`\u0026lt;img src=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eescapeHtml\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eemoji\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003estatic_url\u003c/span\u003e)\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; alt=\u0026#34;Emoji \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:#06b6ef\"\u003eemoji\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eshortcode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; height=\u0026#34;20\u0026#34; width=\u0026#34;20\u0026#34; /\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        });\n\u003c/span\u003e\u003c/span\u003e\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\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003emastodonComment\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          \u0026lt;article class=\u0026#34;mastodon-comment\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;div class=\u0026#34;author\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              \u0026lt;div class=\u0026#34;avatar\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                \u0026lt;a class=\u0026#34;user\u0026#34; href=\u0026#34;\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:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt;\u0026lt;img src=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eescapeHtml\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eavatar_static\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                )\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; height=60 width=60 alt=\u0026#34;\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:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eusername\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; loading=\u0026#34;lazy\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                \u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              \u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              \u0026lt;div class=\u0026#34;details\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                \u0026lt;a class=\u0026#34;name\u0026#34; href=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt;\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:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edisplay_name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                \u0026lt;a class=\u0026#34;user\u0026#34; href=\u0026#34;\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:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003euser_account\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e)\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              \u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              \u0026lt;a class=\u0026#34;date\u0026#34; href=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; rel=\u0026#34;nofollow\u0026#34;\u0026gt;\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:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eicon_clock\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\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                  \u0026lt;time datetime=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ecreated_at\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026gt;\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:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eformatDate\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ecreated_at\u003c/span\u003e)\u003cspan style=\"color:#f99b15\"\u003e}${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eedited_at\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:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\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                  \u0026lt;/time\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              \u0026lt;/a\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;div class=\u0026#34;content\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003econtent\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            \u0026lt;div class=\u0026#34;attachments\u0026#34;\u0026gt;\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:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emedia_attachments\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    .\u003cspan style=\"color:#06b6ef\"\u003emap\u003c/span\u003e((\u003cspan style=\"color:#06b6ef\"\u003eattachment\u003c/span\u003e) =\u0026gt; {\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:#06b6ef\"\u003eattachment\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\u0026#34;\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:#48b685\"\u003e`\u0026lt;a href=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eattachment\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; rel=\u0026#34;ugc nofollow\u0026#34;\u0026gt;\u0026lt;img src=\u0026#34;\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:#06b6ef\"\u003eattachment\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003epreview_url\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            \u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; alt=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eescapeHtml\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eattachment\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edescription\u003c/span\u003e)\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; loading=\u0026#34;lazy\u0026#34; /\u0026gt;\u0026lt;/a\u0026gt;`\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        \u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e else if (attachment.type === \u0026#34;video\u0026#34;) {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                            return `\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003evideo\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003econtrols\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003epreload\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;none\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003esource\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;${attachment.url}\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;${attachment.mime_type}\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026lt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e/video\u0026gt;`;\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 \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e (\u003cspan style=\"color:#06b6ef\"\u003eattachment\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;gifv\u0026#34;\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:#48b685\"\u003e`\u0026lt;video autoplay loop muted playsinline\u0026gt;\u0026lt;source src=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eattachment\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; type=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eattachment\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emime_type\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026gt;\u0026lt;/video\u0026gt;`\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 \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e (\u003cspan style=\"color:#06b6ef\"\u003eattachment\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;audio\u0026#34;\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:#48b685\"\u003e`\u0026lt;audio controls\u0026gt;\u0026lt;source src=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eattachment\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; type=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eattachment\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emime_type\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026gt;\u0026lt;/audio\u0026gt;`\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:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e`\u0026lt;a href=\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eattachment\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; rel=\u0026#34;ugc nofollow\u0026#34;\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eattachment\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/a\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                    })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    .\u003cspan style=\"color:#06b6ef\"\u003ejoin\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\u0026lt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e/div\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\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;status\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:#06b6ef\"\u003e$\u003c/span\u003e{\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etoot_stats\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\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:#ef6155\"\u003e/div\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:#ef6155\"\u003e/article\u0026gt;\u003c/span\u003e\n\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        var li = document.createElement(\u0026#34;li\u0026#34;);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        li.setAttribute(\u0026#34;id\u0026#34;, toot.id);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        li.innerHTML =\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            typeof DOMPurify !== \u0026#34;undefined\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                ? DOMPurify.sanitize(mastodonComment.trim())\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                : mastodonComment.trim();\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        if (toot.in_reply_to_id === this.tootId) {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            this.querySelector(\u0026#34;#mastodon-comments-list\u0026#34;).appendChild(li);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        } else {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            const parentToot = toots.find((t) =\u0026gt; t.id === toot.in_reply_to_id);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            if (parentToot) {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                const ul = document.createElement(\u0026#34;ul\u0026#34;);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                this.querySelector(`\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;${toot.in_reply_to_id}\u0026#34;\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                    .appendChild(ul)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                    .appendChild(li);\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        this.render_toots(toots, toot.id);\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    loadComments() {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        if (this.commentsLoaded) return;\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        this.querySelector(\u0026#34;#mastodon-comments-list\u0026#34;).innerHTML =\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            this.locale.loadingText;\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        const _this = this;\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        fetch(`\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ehttps\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#776e71\"\u003e//${this.host}/api/v1/statuses/${this.tootId}`)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            .\u003cspan style=\"color:#06b6ef\"\u003ethen\u003c/span\u003e((\u003cspan style=\"color:#06b6ef\"\u003eresponse\u003c/span\u003e) =\u0026gt; \u003cspan style=\"color:#06b6ef\"\u003eresponse\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\"\u003ethen\u003c/span\u003e((\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e) =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003equerySelector\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#mastodon-stats\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003einnerHTML\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etoot_stats\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etootAccountURI\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etoot\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eaccount\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003euri\u003c/span\u003e;\n\u003c/span\u003e\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\"\u003efetch\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e`https://\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ehost\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/api/v1/statuses/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etootId\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/context`\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            .\u003cspan style=\"color:#06b6ef\"\u003ethen\u003c/span\u003e((\u003cspan style=\"color:#06b6ef\"\u003eresponse\u003c/span\u003e) =\u0026gt; \u003cspan style=\"color:#06b6ef\"\u003eresponse\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\"\u003ethen\u003c/span\u003e((\u003cspan style=\"color:#06b6ef\"\u003edata\u003c/span\u003e) =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\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:#06b6ef\"\u003edescendants\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    Array.\u003cspan style=\"color:#06b6ef\"\u003eisArray\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003edata\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edescendants\u003c/span\u003e) \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\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:#06b6ef\"\u003edescendants\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elength\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\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                ) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003equerySelector\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#mastodon-comments-list\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003einnerHTML\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:#06b6ef\"\u003e_this\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003erender_toots\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003edata\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edescendants\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003e_this\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003etootId\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\"\u003eelse\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003equerySelector\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#mastodon-comments-list\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003einnerHTML\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`\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003ethis\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elocale\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003enoCommentsText\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;/p\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003e_this\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ecommentsLoaded\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\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    }\n\u003c/span\u003e\u003c/span\u003e\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\"\u003erespondToVisibility\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eelement\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003ecallback\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\"\u003eoptions\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:#06b6ef\"\u003eroot\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\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\"\u003evar\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eobserver\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eIntersectionObserver\u003c/span\u003e((\u003cspan style=\"color:#06b6ef\"\u003eentries\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eobserver\u003c/span\u003e) =\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eentries\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eforEach\u003c/span\u003e((\u003cspan style=\"color:#06b6ef\"\u003eentry\u003c/span\u003e) =\u0026gt; {\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:#06b6ef\"\u003eentry\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eintersectionRatio\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\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\"\u003ecallback\u003c/span\u003e();\n\u003c/span\u003e\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\"\u003eoptions\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eobserver\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eobserve\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eelement\u003c/span\u003e);\n\u003c/span\u003e\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:#06b6ef\"\u003ecustomElements\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;mastodon-comments\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eMastodonComments\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:#ef6155\"\u003e/script\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOù l\u0026rsquo;on remarquera les détails suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emodification de la langue par défaut en \u003ccode\u003efr\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;ajout des 4 icônes par la création de 4 constantes adéquats, nécessitant la modification du code, principalement celui de la fonction \u003ccode\u003etoot_stats\u003c/code\u003e. En passant, remarquez l\u0026rsquo;inclusion de l\u0026rsquo;appel au partiel \u003ccode\u003eicon\u003c/code\u003e ci-dessus.\u003c/li\u003e\n\u003cli\u003eje n\u0026rsquo;ai pas touché aux définitions de style CSS.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003ePS\u003c/strong\u003e : En passant, j\u0026rsquo;ai fait une \u003ca href=\"https://github.com/dpecos/mastodon-comments/pull/20\" rel=\"external\"\u003ePR\u003c/a\u003e à l\u0026rsquo;auteur pour de très petites corrections linguistiques, en rapport avec le FR… en espérant qu\u0026rsquo;il veuille bien l\u0026rsquo;intégrer, sinon ce n\u0026rsquo;est pas grave, d\u0026rsquo;autant qu\u0026rsquo;elles sont faites dans mon code\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"partial-comments\"\u003epartial \u003ccode\u003ecomments\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eCréation d\u0026rsquo;un partiel nommé logiquement \u003ccode\u003ecomments\u003c/code\u003e qui est appelé depuis le fichier principal \u003ccode\u003esingle\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- if and site.Params.enable.comments .Params.mastodon.tootId }}\n{{- $u := urls.Parse .Params.mastodon.tootId -}}\n{{- $s := strings.Split $u.RequestURI \u0026#34;/\u0026#34; -}}\n{{- $user := substr (index $s 1) 1 | safeHTML -}}\n{{- $tootId := index $s 2 | safeHTML -}}\n{{- partial \u0026#34;components/mastodon-comments-modified.js\u0026#34; . -}}\n\u0026lt;div id=\u0026#34;comments\u0026#34;\u0026gt;\n    \u0026lt;mastodon-comments host=\u0026#34;{{ $u.Hostname }}\u0026#34; user=\u0026#34;{{ $user }}\u0026#34; tootId=\u0026#34;{{ $tootId }}\u0026#34;\u0026gt;\n    \u0026lt;/mastodon-comments\u0026gt;\n\u0026lt;/div\u0026gt;\n{{- end }}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eComme vous pouvez le remarquer, il nécessite la création et l\u0026rsquo;utilisation de nouveaux paramètres Hugo.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eun premier paramètre permettant l\u0026rsquo;activation du système de commentaires au sein de Hugo.\u003c/li\u003e\n\u003cli\u003eun dernier, celui-ci qui sera créé dans le frontmatter de l\u0026rsquo;article à promouvoir.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eLe code ne s\u0026rsquo;affichera que si et seulement si le système de commentaires est activé, dans les paramètres Hugo, ET s\u0026rsquo;il y a bien un identifiant de message Mastodon dans le frontmatter de l\u0026rsquo;article en question !\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003ePS\u003c/strong\u003e : J\u0026rsquo;ai eu dans l\u0026rsquo;idée, très forte, de simplifier encore plus afin de n\u0026rsquo;avoir qu\u0026rsquo;à copier-coller l\u0026rsquo;URL complète de l\u0026rsquo;identifiant du post au sein de Mastodon dans le frontmatter et \u0026ldquo;d\u0026rsquo;éclater\u0026rdquo; l\u0026rsquo;URL copié pour obtenir les noms d\u0026rsquo;hôte et d\u0026rsquo;utilisateur dédié.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"params-enablecomments\"\u003eparams enable:comments\u003c/h3\u003e\n\u003cp\u003eDans le fichier de configuration d\u0026rsquo;Hugo, ajoutons -\u003cem\u003eici au format YAML, depuis un fichier dédié nommé \u003ccode\u003eparams.yaml\u003c/code\u003e ; à vous d\u0026rsquo;adapter…\u003c/em\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003eenable:\n  (…)\n  comments: true\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"modification-de-larchétype\"\u003emodification de l\u0026rsquo;archétype\u003c/h3\u003e\n\u003cp\u003eModification de l\u0026rsquo;archétype afin d\u0026rsquo;ajouter lors de la création de nouvel article le paramètre adéquat :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003eparams:\n  mastodon:\n    tootId:\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003ela variable \u003ccode\u003etootId\u003c/code\u003e recevra l\u0026rsquo;identifiant du post Mastodon. Il faudra copier l\u0026rsquo;URL complète dans le frontmatter de l\u0026rsquo;article concerné !\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"mastodon-commentscss\"\u003emastodon-comments.css\u003c/h3\u003e\n\u003cp\u003eDans le sous-répertoire \u003ccode\u003ecss\u003c/code\u003e de mes assets, j\u0026rsquo;ai crée le fichier \u003ccode\u003emastodon-comments.css\u003c/code\u003e pour y copier-coller le code ad hoc :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-css\" data-lang=\"css\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e/*\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e      mastodon-comments {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e        --font-color: #5d686f;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e        --font-size: 1.0rem;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e        --block-border-width: 1px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e        --block-border-radius: 3px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e        --block-border-color: #ededf0;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e        --block-background-color: #f7f8f8;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e        --comment-indent: 40px;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e      }\n\u003c/span\u003e\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\"\u003emedia\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eonly\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003escreen\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eand\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003emax-width\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e1024px\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\"\u003emastodon-comments\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u003cspan style=\"color:#ef6155\"\u003e--comment-indent\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e\u003cspan style=\"color:#fec418\"\u003epx\u003c/span\u003e;\n\u003c/span\u003e\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\"\u003emedia\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eonly\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003escreen\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eand\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003emax-width\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e640px\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\"\u003emastodon-comments\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u003cspan style=\"color:#ef6155\"\u003e--comment-indent\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#fec418\"\u003epx\u003c/span\u003e;\n\u003c/span\u003e\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:#5bc4bf\"\u003ebody\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003efont-family\u003c/span\u003e: \u003cspan style=\"color:#815ba4\"\u003esans-serif\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ebackground-color\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e#ffffff\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ecolor\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e#222222\u003c/span\u003e;\n\u003c/span\u003e\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\"\u003emedia\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003eprefers-color-scheme\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003edark\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\"\u003ebody\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ebackground-color\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e#121212\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ecolor\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e#d1d1d1\u003c/span\u003e;\n\u003c/span\u003e\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\u003eC\u0026rsquo;est exactement celui fourni par le projet mastodon-comments. Je n\u0026rsquo;ai fait que le mettre dans un fichier CSS à part, qui est appelé dans mon code Hugo écrit dans le partial \u003ccode\u003elink\u003c/code\u003e qui sert à gérer le code CSS.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eJe ne montre pas l\u0026rsquo;appel CSS écrit dans le partial\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"purifyjs\"\u003epurify.js\u003c/h3\u003e\n\u003cp\u003eDans le sous-répertoire \u003ccode\u003ejs\u003c/code\u003e de mes assets, j\u0026rsquo;ai un énième répertoire nommé \u003ccode\u003evendors\u003c/code\u003e où j\u0026rsquo;ai déposé le code copié du projet DOM Purify, qui est appelé par le code Hugo écrit dans le partial \u003ccode\u003ejs\u003c/code\u003e pour la gestion des appels javascript.\u003c/p\u003e\n\u003cp\u003eLà encore, j\u0026rsquo;ai modifié mon appel des scripts javascript afin qu\u0026rsquo;il tienne compte de l\u0026rsquo;activation du système de commentaires dans les paramètres Hugo. Si celui-ci n\u0026rsquo;est pas actif, alors l\u0026rsquo;appel au fichier JS relatif ne se fait pas, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e(…)\n{{- if site.Params.enable.comments }}\n    {{- $purify := resources.Get \u0026#34;js/vendors/purify.js\u0026#34; -}}\n    {{- $global = $global | append $purify -}}\n{{- end }}\n\n{{- $global = $global | resources.Concat \u0026#34;js/1.js\u0026#34; -}}\n{{- with $global }}\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003eBien sûr, à vous d\u0026rsquo;adapter selon votre code Hugo !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003ePS\u003c/strong\u003e : Je me demande même s\u0026rsquo;il ne serait pas intéressant de n\u0026rsquo;inclure ce code si ET seulement si un id de message mastodon existe aussi dans le frontmatter… à creuser !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;espère sincérement ne rien avoir oublié… \u003cbr\u003e\nCet article vous donnera peut-être des idées à partager vous aussi ; faites-le en commentaires ;-)\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"urls\"\u003eURLs\u003c/h2\u003e\n\u003cp\u003eRetrouvez-ici les différentes URL utiles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele projet \u003ca href=\"https://dompurify.com/\" rel=\"external\"\u003eDOM Purify\u003c/a\u003e et sa \u003ca href=\"https://github.com/cure53/DOMPurify\" rel=\"external\"\u003ebibliothèque disponible depuis le dépôt GitHub\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ mes modifications de code :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/blob/master/assets/css/mastodon-comments.css\" rel=\"external\"\u003ecss/mastodon-comments.css\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003epartial \u003ca href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/blob/master/layouts/_partials/comments.html\" rel=\"external\"\u003ecomments\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003epartial \u003ca href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/blob/master/layouts/_partials/components/mastodon-comments-modified.js\" rel=\"external\"\u003ecomponent/mastodon-comments-modified.js\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eIl y a deux articles, dont l\u0026rsquo;un renvoie vers le premier qui m\u0026rsquo;ont énormément aidé dans la démarche :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/\" rel=\"external\"\u003eAdding comments to your static blog with Mastodon\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://danielpecos.com/2022/12/25/mastodon-as-comment-system-for-your-static-blog/\" rel=\"external\"\u003eMastodon as comment system for your static blog\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","summary":"Comment mettre en place une 'gestion' des commentaires d'articles publiés par le biais du fediverse avec Hugo, en seulement quelques minutes.","tags":["Hugo","fediverse","ActivityPub"],"date_published":"2026-09-20T15:08:21+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-07-15:/fr/post/fabrication-humaine/#938616819284e3466ccd6363b0561173c328adb3fbe4653470fbd63dc78281e4","url":"https://it-log.fr.eu.org/fr/post/fabrication-humaine/","title":"Fabrication Humaine","author":{"name":"Stéphane HUC"},"content_text":"Description Au cours de cette journée du 15 juillet 2026, au fil de mes pérégrinations sur Internet, ou plutôt dans le consensus de ma veille informatique, une information a retenu mon attention :\nIl existe depuis 2024, une association qui regroupe tout type d\u0026rsquo;auteurs, d\u0026rsquo;artistes et d\u0026rsquo;acteurs qui revendiquent l\u0026rsquo;esprit humain en tant que processus créatif d\u0026rsquo;une œuvre, et ne reconnaît l\u0026rsquo;œuvre qu\u0026rsquo;au-travers de ce process, refusant la reconnaissance, dans l\u0026rsquo;état actuel, d\u0026rsquo;une œuvre faite par IA. Il n\u0026rsquo;exclut pas l\u0026rsquo;usage de l\u0026rsquo;IA, mais ne lui reconnaît pas de processus cognitif à la création.\nCette association a créé un label, et un logo dont le but est d\u0026rsquo;informer le \u0026ldquo;lecteur\u0026rdquo; de ce processus qui tient à cœur des créateurs adhérants. À ce propos, l\u0026rsquo;adhésion est formellement gratuite, les logos tout autant.\nFabrication Humaine\nPrésentation de l\u0026rsquo;association : https://www.fabricationhumaine.org/#Association ⇒ Manifeste\nJe reproduis la prime partie du manifeste :\nNous sommes une association d’artistes, lecteurs, auditeurs, spectateurs, experts en IA, éditeurs, producteurs, galeristes, libraires, journalistes, simples citoyens, concernés par l’impact actuel et potentiel de l’intelligence artificielle (IA) dans notre société. Nous alertons sur ses effets dans le domaine culturel : il sera de plus en plus difficile de reconnaître une œuvre artistique d’un produit généré par l’IA. Le public doit pouvoir être informé des conditions de réalisation d’une œuvre et si son auteur a utilisé ou non l’IA dans son processus créatif.\ncf: https://www.fabricationhumaine.org/#Manifeste\n⇒ Charte\nLa charte est accessible : https://www.fabricationhumaine.org/Charte\n⇒ Logo\nDeux logos existent :\nNoir : \u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e Blanc : \u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e Ergo sum \u0026ldquo;Ergo sum\u0026rdquo; : \u0026ldquo;je suis\u0026rdquo; ; à la base, la citation complète est \u0026ldquo;Cogito Ergo sum\u0026rdquo;… qui une fois traduit signifie : \u0026ldquo;Je pense donc je suis\u0026rdquo; (citation attribuée au mathématicien, philosophe René Descartes)\nCette citation, à laquelle j\u0026rsquo;adhère profondément, résume bien la situation. Personnellement, j\u0026rsquo;adhère à la démarche. Je ne suis pas contre l\u0026rsquo;IA, l\u0026rsquo;Informatique Automatique existante actuelle — quelqu\u0026rsquo;un me crie dans l\u0026rsquo;oreille que la définition de l\u0026rsquo;IA n\u0026rsquo;est pas celà ! Ahhh bon… : Informatique Autonome ? Encore moins… du moins pas actuellement. Intelligence Artificielle. Hummm… où est l\u0026rsquo;intelligence actuellement derrière ce processus informatique ?!\nLe marché qui lui est artificiellement gonflé au point des impacts non négligeables sur plus d\u0026rsquo;un pan de la société humaine, et pas que matériel ou cognitif, définit l\u0026rsquo;abréviation pour faire assimiler dans la pensée commune, globalisante, ce que n\u0026rsquo;est pas… ce processus informatique.\nIl n\u0026rsquo;est pas créateur, ni créatif ; oui, il peut aider à la production d\u0026rsquo;œuvres, et parfois sublimant l\u0026rsquo;esprit créatif humain, voire en faisant mieux, mais ce n\u0026rsquo;est pas \u0026ldquo;ex-nihilo\u0026rdquo;, autrement dit, à partir de rien. Il doit être \u0026ldquo;prompté\u0026rdquo;, acté. Ce processus informatique peut faire parfois de belles choses, créé de belles œuvres, mais pas, là encore actuellement, de son propre processus cognitif, car il n\u0026rsquo;en a tout simplement pas.\nDe même, un auteur qui utilise l\u0026rsquo;IA complètement pour la création totale de son œuvre en faisant croire que c\u0026rsquo;est lui et lui seul qui la crée, est une abérration intellectuelle, une manipulation mensongère. Il est l\u0026rsquo;auteur, certes, mais ce n\u0026rsquo;est pas l\u0026rsquo;IA qui l\u0026rsquo;est. Cacher le fait est de la manipulation intellectuelle. Un processus cognitif malsain ! Mais cet aspect est un autre domaine…\nBref… D\u0026rsquo;où la raison pour laquelle sur mes trois sites, vous retrouverez en bas de page le logo officiel de l\u0026rsquo;association \u0026ldquo;Fabrication Humaine\u0026rdquo; ainsi qu\u0026rsquo;un lien redirigeant vers ladite information officielle.\ndoc.huc.fr.eu.org huc.fr.eu.org ebnh.fr.eu.org Je n\u0026rsquo;ai jamais intégré l\u0026rsquo;IA dans mon processus créatif, que ce soit du code informatique, ou du texte, des images ; et je ne compte pas actuellement et dans un futur immédiat, et éloigné, utiliser ce processus informatique autonome.\nSi je mets plus de temps à définir puis créer ? Assurément, mais cela fait partie du processus créatif humain. Cela fait partie des joies et des frustrations liées au processus cognitif ; l\u0026rsquo;empirisme de celui-ci m\u0026rsquo;importe, m\u0026rsquo;apporte ces sentiments nécessaires… cette onde pulsée, nourrie de l\u0026rsquo;être que je suis, qui s\u0026rsquo;abreuve de l\u0026rsquo;entourage proche, éloigné, des ressentis, du moment, de ce qui m\u0026rsquo;influence et que je ne peux pas analyser, de ce que je suis capable d\u0026rsquo;analyser, des influences que j\u0026rsquo;accepte, celles que je rejette, de manière innée ou acquise. Bref… tout ce que je suis.\nNous en avons besoin !\nD\u0026rsquo;ailleurs, d\u0026rsquo;un point de vue code informatique, depuis moults mois, sur les deux premiers sites cités de mon cru, les yeux les plus avertis auront remarqué le \u0026ldquo;bandeau défilant\u0026rdquo; en haut à droite, et la mention en bas de page \u0026ldquo;0% IA ; 100% humain\u0026rdquo; qui l\u0026rsquo;écho de la valeur réelle, véritable de mon processus créatif auxquels je croie instinctivement. Je n\u0026rsquo;ai pas la prétention de dire que mes œuvres sont du meilleur cru, ce n\u0026rsquo;est ni la lie, ni la crème de la production humaine ; c\u0026rsquo;est ni plus ni moins, l\u0026rsquo;expression de mon processus cognitif créatif. C\u0026rsquo;est tout ce qui importe, du moins m\u0026rsquo;importe !\nDe même, pour ceux qui ne les auraient pas remarqués… c\u0026rsquo;est voulu, c\u0026rsquo;est mon fait exprès, car je n\u0026rsquo;estime pas cela primordial, nécessaire mais pas hautement important ; cette mention n\u0026rsquo;a pas à avoir la primauté de l\u0026rsquo;information. C\u0026rsquo;est une \u0026ldquo;définition\u0026rdquo;, mais pas l\u0026rsquo;essence même de l\u0026rsquo;œuvre.\n\u0026ldquo;À bon entendeur…\u0026rdquo; Voilà !\nRemerciements Stéphane Bortmeyer, qui a repoueté @Aemarielle : https://framapiaf.org/@aemarielle@piaille.fr/116922163418422789 German Huc, l\u0026rsquo;auteur de l\u0026rsquo;article Le Serpent à Plume adhère au label Frabrication Humaine ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eAu cours de cette journée du 15 juillet 2026, au fil de mes pérégrinations sur Internet, ou plutôt dans le consensus de ma veille informatique, une information a retenu mon attention :\u003c/p\u003e\n\u003cp\u003eIl existe depuis 2024, une association qui regroupe tout type d\u0026rsquo;auteurs, d\u0026rsquo;artistes et d\u0026rsquo;acteurs qui revendiquent l\u0026rsquo;\u003cstrong\u003eesprit humain en tant que processus créatif d\u0026rsquo;une œuvre\u003c/strong\u003e, et ne reconnaît l\u0026rsquo;œuvre qu\u0026rsquo;au-travers de ce process, refusant la reconnaissance, dans l\u0026rsquo;état actuel, d\u0026rsquo;une œuvre faite par IA. Il n\u0026rsquo;exclut pas l\u0026rsquo;usage de l\u0026rsquo;IA, mais ne lui reconnaît pas de processus cognitif à la création.\u003c/p\u003e\n\u003cp\u003eCette association a créé un label, et un logo dont le but est d\u0026rsquo;informer le \u0026ldquo;lecteur\u0026rdquo; de ce processus qui tient à cœur des créateurs adhérants. À ce propos, l\u0026rsquo;adhésion est formellement gratuite, les logos tout autant.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.fabricationhumaine.org/\" rel=\"external\"\u003e\u003cstrong\u003eFabrication Humaine\u003c/strong\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePrésentation de l\u0026rsquo;association : \u003ca href=\"https://www.fabricationhumaine.org/#Association\" rel=\"external\"\u003ehttps://www.fabricationhumaine.org/#Association\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eManifeste\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eJe reproduis la prime partie du manifeste :\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNous sommes une association d’artistes, lecteurs, auditeurs, spectateurs, experts en IA, éditeurs, producteurs, galeristes, libraires, journalistes, simples citoyens, concernés par l’impact actuel et potentiel de l’intelligence artificielle (IA) dans notre société. Nous alertons sur ses effets dans le domaine culturel : il sera de plus en plus difficile de reconnaître une œuvre artistique d’un produit généré par l’IA. Le public doit pouvoir être informé des conditions de réalisation d’une œuvre et si son auteur a utilisé ou non l’IA dans son processus créatif.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003ecf: \u003ca href=\"https://www.fabricationhumaine.org/#Manifeste\" rel=\"external\"\u003ehttps://www.fabricationhumaine.org/#Manifeste\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eCharte\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLa charte est accessible : \u003ca href=\"https://www.fabricationhumaine.org/Charte\" rel=\"external\"\u003ehttps://www.fabricationhumaine.org/Charte\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eLogo\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eDeux logos existent :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNoir :\n\n    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/svg/fabricationhumaine/04_FH_LOGO_230126_NOIR.svg\"\u003e\n        \n            \u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003csvg id=\"Calque_1\" data-name=\"Calque 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 595.28 595.28\"\u003e\n  \u003cdefs\u003e\n    \u003cstyle\u003e\n      .cls-1 {\n        fill: none;\n      }\n\n      .cls-2 {\n        fill: #222221;\n      }\n    \u003c/style\u003e\n  \u003c/defs\u003e\n  \u003cpath class=\"cls-2\" d=\"M296.66,525.37c-125.04,0-226.77-101.73-226.77-226.77s101.73-226.77,226.77-226.77,226.77,101.73,226.77,226.77-101.73,226.77-226.77,226.77ZM296.66,80.05c-120.51,0-218.55,98.04-218.55,218.54s98.04,218.55,218.55,218.55,218.55-98.04,218.55-218.55-98.04-218.54-218.55-218.54Z\"/\u003e\n  \u003cg\u003e\n    \u003cpolygon class=\"cls-2\" points=\"203.52 426.73 194.16 438.18 180.64 427.13 190.01 415.67 182.42 409.47 156.71 440.91 164.3 447.12 175.06 433.96 188.58 445.01 177.82 458.17 185.41 464.38 211.12 432.94 203.52 426.73\"/\u003e\n    \u003cpath class=\"cls-2\" d=\"M235.64,444.67l-11.23,24.08c-.87,1.86-2.06,3.14-3.58,3.83-1.52.7-3.28.58-5.28-.35-1.96-.92-3.17-2.18-3.61-3.79-.44-1.62-.23-3.35.64-5.21l11.23-24.08-8.89-4.14-11.52,24.71c-1.08,2.31-1.64,4.51-1.69,6.57-.05,2.07.35,3.97,1.18,5.7.83,1.73,2.02,3.3,3.54,4.69,1.53,1.39,3.32,2.57,5.39,3.54,2.07.96,4.14,1.59,6.2,1.87,2.07.28,4.03.18,5.9-.29s3.57-1.4,5.13-2.76c1.55-1.36,2.87-3.21,3.95-5.52l11.52-24.71-8.89-4.14Z\"/\u003e\n    \u003cpolygon class=\"cls-2\" points=\"250.66 448.78 236.34 489.48 246.49 491.39 252.71 471.48 260.47 490.18 274.55 475.59 273.11 496.39 283.26 498.3 284.7 455.18 263.07 476.32 250.66 448.78\"/\u003e\n    \u003cpath class=\"cls-2\" d=\"M287.81,498.27l11.06-.69,3.29-8.05,12.92-.81,4.28,7.58,11.12-.69-24.05-41.75-18.62,44.41ZM312.69,481.38l-9.02.56,3.85-10.65,5.17,10.08Z\"/\u003e\n    \u003crect class=\"cls-2\" x=\"330.89\" y=\"452.39\" width=\"9.98\" height=\"40.61\" transform=\"translate(-95.28 84.94) rotate(-12.64)\"/\u003e\n    \u003cpolygon class=\"cls-2\" points=\"377.41 435.88 368.75 439.68 377.95 460.61 342.28 449.1 359.44 488.14 368.04 484.36 358.85 463.43 394.57 474.92 377.41 435.88\"/\u003e\n    \u003cpolygon class=\"cls-2\" points=\"409.97 452.01 404.26 444.61 417.26 434.58 412.44 428.33 399.44 438.36 395.01 432.62 408.93 421.88 404 415.5 387.78 428.01 387.78 428.01 382.64 431.98 407.45 464.13 412.6 460.16 412.6 460.16 428.81 447.65 423.88 441.27 409.97 452.01\"/\u003e\n    \u003cpolygon class=\"cls-2\" points=\"145.19 210.01 152.71 197.58 145.96 193.5 138.44 205.93 131.59 201.79 139.4 188.86 132.2 184.51 124.39 197.44 124.39 197.44 119.57 205.4 154.33 226.41 159.14 218.45 145.19 210.01\"/\u003e\n    \u003cpath class=\"cls-2\" d=\"M172.58,198.46l-3.23-8.06,8.68-9.44,8.31,2.53,7.47-8.12-46.12-13.62,17.47,44.78,7.43-8.08ZM171.22,177.3l-6.05,6.58-4.63-10.31,10.68,3.73Z\"/\u003e\n    \u003cpath class=\"cls-2\" d=\"M209.81,165.25c2.65-1.75,4.73-3.6,6.25-5.55,1.51-1.95,2.34-3.97,2.5-6.07.15-2.1-.52-4.27-2.01-6.53-1.13-1.71-2.47-2.92-4.02-3.64-1.55-.71-3.21-1.05-4.98-1.02-1.19.02-2.38.2-3.57.5.95-1.54,1.54-3.12,1.71-4.73.21-1.95-.28-3.8-1.45-5.58-1.28-1.94-2.86-3.2-4.74-3.79-1.88-.59-3.92-.61-6.1-.07-2.19.54-4.45,1.58-6.78,3.13l-12.32,8.14,22.39,33.88,13.13-8.68ZM207.39,151.48c.72,1.1,1.05,2.13.97,3.08-.08.96-.44,1.85-1.09,2.67-.65.82-1.5,1.58-2.55,2.28l-4.12,2.72-5.53-8.37,4.12-2.72c.8-.53,1.57-.94,2.33-1.22.75-.29,1.49-.44,2.21-.45.72-.01,1.4.14,2.03.47.63.33,1.18.85,1.65,1.55ZM189.93,138.82c1.4-.93,2.68-1.36,3.83-1.28,1.15.07,2.11.69,2.88,1.85.51.77.77,1.54.77,2.31,0,.76-.23,1.51-.69,2.23-.46.72-1.16,1.39-2.08,2l-3.35,2.22-4.7-7.12,3.36-2.22Z\"/\u003e\n    \u003cpath class=\"cls-2\" d=\"M233.53,152.43l-5.21-13.1,2.76-1.1,13.23,9.91,10.57-4.2-15.4-10.36c.29-.27.56-.54.82-.82,1.72-1.89,2.76-3.98,3.13-6.27.37-2.29.07-4.64-.89-7.05-.97-2.44-2.38-4.37-4.22-5.78-1.84-1.41-4.03-2.21-6.58-2.41-2.55-.19-5.42.35-8.63,1.62l-4.59,1.83h0s-9.02,3.59-9.02,3.59l15.01,37.74,9.02-3.59ZM225.53,120.83c1.21-.48,2.33-.7,3.36-.65,1.03.05,1.92.35,2.68.9.76.55,1.34,1.35,1.76,2.39.41,1.04.54,2.02.37,2.94-.17.92-.62,1.74-1.34,2.47-.72.72-1.69,1.33-2.9,1.81l-3.95,1.57-3.93-9.87,3.95-1.57Z\"/\u003e\n    \u003crect class=\"cls-2\" x=\"254.4\" y=\"102.78\" width=\"9.88\" height=\"40.61\" transform=\"translate(-19.83 56.23) rotate(-11.92)\"/\u003e\n    \u003cpath class=\"cls-2\" d=\"M271.08,128.95c1.21,2.53,2.83,4.69,4.88,6.49,2.05,1.79,4.46,3.12,7.22,3.98,2.77.86,5.76,1.21,8.97,1.04,2.94-.15,5.35-.65,7.23-1.48,1.87-.83,3.58-1.93,5.12-3.29l-.55-10.54c-.83.97-1.8,1.89-2.91,2.77-1.11.87-2.37,1.6-3.8,2.17-1.43.58-3.1.92-5.01,1.02-2.18.11-4.2-.25-6.07-1.08-1.87-.83-3.4-2.12-4.6-3.86-1.2-1.74-1.87-3.84-2-6.32-.13-2.51.31-4.68,1.33-6.52,1.02-1.83,2.41-3.26,4.18-4.29,1.77-1.02,3.74-1.59,5.92-1.7,1.91-.1,3.61.05,5.09.46,1.48.41,2.81,1,4,1.77,1.19.77,2.25,1.6,3.18,2.48l-.55-10.54c-1.67-1.19-3.48-2.1-5.43-2.74-1.95-.63-4.4-.88-7.34-.72-3.21.17-6.15.82-8.81,1.97-2.66,1.15-4.92,2.72-6.77,4.71-1.85,1.99-3.25,4.31-4.18,6.96-.94,2.64-1.32,5.55-1.16,8.72.17,3.17.85,6.02,2.06,8.55Z\"/\u003e\n    \u003cpath class=\"cls-2\" d=\"M323.17,133.64l12.57,2.51,2.16,8.42,10.82,2.16-12.34-46.48-29.17,38.2,10.76,2.15,5.21-6.95ZM335.33,128.44l-8.77-1.75,6.4-9.31,2.37,11.06Z\"/\u003e\n    \u003cpolygon class=\"cls-2\" points=\"362.44 153.63 374.74 124.25 384.96 128.52 388.35 120.44 358.99 108.16 355.61 116.24 365.78 120.5 353.49 149.88 362.44 153.63\"/\u003e\n    \u003crect class=\"cls-2\" x=\"367.46\" y=\"139.11\" width=\"40.61\" height=\"9.88\" transform=\"translate(66.46 404.58) rotate(-59.42)\"/\u003e\n    \u003cpath class=\"cls-2\" d=\"M396.9,148.26c-2.04,2.38-3.52,4.91-4.43,7.59-.91,2.68-1.26,5.39-1.05,8.11.21,2.73.97,5.35,2.29,7.88,1.31,2.53,3.18,4.82,5.59,6.89,2.38,2.04,4.93,3.52,7.62,4.43,2.7.91,5.41,1.26,8.14,1.05,2.73-.21,5.34-.97,7.86-2.28,2.51-1.31,4.79-3.16,6.82-5.54,2.04-2.38,3.49-4.9,4.37-7.57.87-2.67,1.18-5.35.93-8.06-.25-2.71-1.04-5.31-2.36-7.79-1.33-2.49-3.16-4.74-5.52-6.76-2.33-1.99-4.83-3.46-7.5-4.4-2.67-.94-5.37-1.33-8.08-1.16-2.72.17-5.33.88-7.85,2.14-2.52,1.26-4.79,3.08-6.83,5.45ZM401.64,160.69c.48-2.01,1.51-3.92,3.07-5.74,1.56-1.82,3.29-3.12,5.2-3.91,1.91-.78,3.85-1.02,5.82-.7,1.97.31,3.83,1.22,5.58,2.72,1.77,1.52,2.96,3.22,3.56,5.11.6,1.89.65,3.83.15,5.82-.5,1.99-1.53,3.9-3.09,5.72-1.56,1.82-3.29,3.12-5.2,3.91s-3.85,1.02-5.82.7c-1.97-.32-3.82-1.21-5.53-2.68-1.74-1.49-2.92-3.19-3.54-5.09-.62-1.9-.68-3.86-.2-5.86Z\"/\u003e\n    \u003cpolygon class=\"cls-2\" points=\"471.21 199.76 465.85 192.08 447.1 205.15 451.65 168.16 416.67 192.55 421.99 200.18 440.74 187.11 436.22 224.15 471.21 199.76\"/\u003e\n  \u003c/g\u003e\n  \u003cg\u003e\n    \u003cpath class=\"cls-1\" d=\"M275.19,306.88s.01-.04.02-.06c-1.87,3.13-7.03,13.87-11.21,25.94,0,0-3.08,5.98-3.08,11.81,0,.31-.11.61-.31.85-3.39,4.03-4.92,4.12-5.14,5.07-.16.77-.48,2.09-.88,3.44-.13.45-.5.8-.96.91-.21.05-.43.05-.64,0-2.62,2.6-10.88,11.15-13.17,17.53-.32,1.5-4.69,21.69-6.2,25.65,0,0-1.26,3.85-2.45,5.54-.15.22-.37.38-.61.48-.28.11-1.19.52-.99,1.32.15.61-.15,1.24-.72,1.51-.75.35-1.4.6-1.97.77-.12.03-.23.05-.35.05-.59,0-3.54.17-4.59,3.19.01.05.03.12.08.16.02.02.08.04.14.06.51.12.91.53,1,1.05.06.21.44.46,1.34.59.27.04.53.16.73.35.11.11.32.26.68.43.4.09.74.36.9.75.03.08.17.3.64.57.27-.37.71-.58,1.19-.54.61.06,1.1.53,1.18,1.13,0,.07.02.11.03.14.27.71,1.75,1.43,3.13,1.78l1.87-.95c1.46-1.47.83-4.48.59-5.38-.14-.56.1-1.16.59-1.46.95-.57,1.99-2.14,2.48-3.01v-6.6c0-.22.05-.43.15-.62,2.02-3.79,7.25-11.38,7.84-12.23.05-.07.11-.14.17-.2.35-.34,3.47-3.36,5.59-6.16,1.69-2.24,5.96-13.15,8.21-19.25.12-.33.38-.6.7-.75,4.14-1.84,5.28-4.64,5.47-5.19.09-.25.25-.47.46-.63,3.2-2.35,5.69-6.57,6.9-8.88.17-.32.47-.5.8-.6.08-.16.17-.31.25-.47-.13-1.59-.23-3.18-.36-4.75-.39-7.04-.41-14.06-.16-21.11-.63-3.31-.67-8.05.54-11.88-.25.53-.45,1.06-.45,1.06.17-.63.36-1.07.54-1.38ZM254.74,353.92c.11-.6.78-.83,1.33-.97.05.44.15.8.24,1.19-.39.84-.48,1.8-.52,2.73-.06.55.69,1.14.52,1.67l-.53,1.14c-.07.08-.02.22-.17.27-.34.2-.69.39-1.06.55-.12-.39-.19-.78-.26-1.16-.05-.14.08-.19.1-.3l.45-.97\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M297.16,419.35l-1.72-7c-.6-2.7-5.68-26.31-2.72-34.41.81-3.21,1.61-7.72,1.21-9.92-.02-.13-.14-1.22-.1-3.12-.05.1-.11.21-.17.31-.06,1.12-.28,3.17-1.12,4.68-.14.91-.56,2.65-1.77,4.22-.59,3.07-1.19,6.44-1.26,7.31-.11,1.26-.05,4.95.8,7.71.21.64,1.99,6.52.47,12.32-.05,1.16-.35,8.91,1.14,14.24,1.14,1.32,3.85,4.87,3.36,8.55.03.4.24,1.75,1.63,3.07.52-1.58.45-4.47.38-5.49l-.12-2.47Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M314.76,238.52c.21.22.39.47.54.74.11-.05.21-.09.32-.14,6.19-1.62,12.64.1,18.41,2.48,2.45-.05,4.89.04,7.32.26.1-.29.28-.54.56-.7,3.49-1.99,10.15-4.75,10.9-5.05.15-.06.32-.1.48-.1,2.63-.04,8.34-1.73,10.13-2.33.03-.01.06-.02.1-.03,4.29-1.07,15.31-8.73,21.15-13.08.22-.16.48-.25.75-.26.2,0,.42-.01.64-.02,1.37-.03,3.07-.06,4.16-.76l5.1-4.39c.26-.25,1.8-1.75,3.42-2.98.05-.04.1-.07.15-.1,1.42-.79,1.88-1.24,2.01-1.39.01-.1.04-.19.08-.28-.18-.32-.22-.7-.11-1.05.14-.43.49-.77.94-.88l.52-.13c.13-.07.24-.12.32-.17-.25-.25-.4-.6-.39-.96.01-.53.31-1.01.8-1.21.27-.11.46-.23.61-.33-.19-.03-.47-.04-.87-.04-.47,0-.93.05-1.23.08-.21.02-.42,0-.62-.08-.34-.13-1.85-.5-6.8.25-.92.6-2.66,1.8-3.38,2.31-.06.04-.14.09-.21.12-5.76,2.67-6.79,4.97-6.94,5.41-.12.36-.39.65-.75.79l-8.65,3.56c-1.86.82-6.07,2.07-8.28,2.35-1.61.21-4.07,1.08-5.15,1.52-6.29,2.79-9.36,5.07-9.76,5.38-1.7,1.71-3.11,2.28-3.5,2.41-.08.03-.15.04-.23.06-6.74.98-13.5,4.19-14.78,4.83-.33.16-.71.18-1.05.05-1.16-.44-7.19-2.39-12.28,1.86-.24.2-.54.31-.85.31h-.93c-.21,0-.4,0-.58.02-.36.02-.72-.1-.98-.35-.33-.31-.58-.64-.79-.97-.07.06-.1.15-.18.2-.18.93-.98,1.62-1.92,1.62,0,0-.06,0-.13-.01-.11.06-.23.05-.34.09.17.08.34.17.51.25.57.27,1.16.51,1.78.86ZM392.79,209.57c-1.36.65-2.85.75-4.35.91,1.22-.93,2.39-1.91,3.86-2.36.95-.18,1.94-.24,2.9-.4.75-.12,1.94-.29,2.64-.5.57-.14,1,.41,1.16.88.27.79-.4,1.58-.89,1.92-1.46.98-3.06,1.42-4.7,1.87-.04.22-.11.41-.19.62-.58,1.36-1.78,2.44-3.11,2.95-1,.25-2.01.35-3.03.33.57-.35,1.13-.68,1.64-1.05,1.19-1.01,3.08-1.7,3.21-3.43,0-.36.24-.67.57-.76,1.43-.4,2.99-.81,4.29-1.55-1.33.25-2.67.4-4,.57Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M251.96,241.78c2.08-.15,4.16-.23,6.25-.18,5.77-2.38,12.21-4.1,18.41-2.48.56.26,1.13.49,1.72.71.15-.53.48-1.06.89-1.46.62-.32,1.19-.52,1.75-.76.15-.06.29-.14.44-.21-.09-.03-.21-.03-.29-.07-1.09,0-1.9-.69-2.07-1.62-.15-.1-.19-.28-.3-.41-.35.37-.88.64-1.77.67.8.08,1.41-.1,1.84-.43,0,0,0,0,0,0-.72,1.17-2.19,1.26-2.8,1.28-.01,0-.07,0-.09,0h-.95c-.31,0-.61-.11-.85-.31-5.09-4.26-11.12-2.3-12.28-1.86-.34.13-.72.11-1.05-.05-1.29-.64-8.04-3.85-14.78-4.83-.08-.01-.16-.03-.24-.06-.39-.13-1.81-.71-3.54-2.45-.45-.34-3.54-2.6-9.76-5.36-1.12-.45-3.51-1.29-5.09-1.49-2.21-.28-6.42-1.54-8.32-2.37l-8.61-3.54c-.35-.14-.62-.43-.75-.79-.15-.43-1.18-2.73-6.94-5.41-.07-.03-.14-.07-.2-.11-1.96-1.36-2.92-2-3.39-2.31-4.75-.72-6.32-.41-6.78-.24-.2.07-.41.1-.62.07-.98-.12-1.7-.1-2.13-.04.14.11.34.22.61.33.49.2.81.67.82,1.19,0,.37-.14.72-.4.97.08.05.19.1.31.17l.52.13c.44.11.8.44.94.88.11.35.07.73-.11,1.05.03.09.05.19.07.28.13.15.59.6,2.02,1.4.05.03.1.06.15.1,1.49,1.13,2.91,2.48,3.45,3.01l5.11,4.4c1.04.66,2.74.7,4.1.72.22,0,.44,0,.64.02.27,0,.53.1.75.26,5.84,4.36,16.85,12.01,21.11,13.07.03,0,.06.02.09.03,2.44.79,7.71,2.3,10.17,2.34.17,0,.33.04.48.1.75.31,7.43,3.08,10.9,5.05.25.14.44.37.55.62ZM204.02,215.82c-1.32-.52-2.53-1.6-3.11-2.95-.08-.21-.14-.4-.19-.62-1.64-.45-3.24-.89-4.7-1.87-.49-.35-1.16-1.13-.89-1.92.15-.47.61-1.03,1.15-.88.69.21,1.89.38,2.64.5.96.16,1.95.22,2.9.4,1.47.45,2.64,1.43,3.86,2.36-1.5-.16-2.99-.26-4.35-.91-1.36-.17-2.73-.32-4.08-.58.34.2.74.37,1.08.53,1.05.43,2.18.74,3.28,1.04.35.1.57.42.57.76.13,1.73,2.01,2.42,3.21,3.43.52.36,1.07.7,1.64,1.05-1.02.02-2.03-.08-3.03-.33Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M294.33,359.32c.15-.97.33-2.01.56-3.11-.03-.44-.19-1.73-.83-3.47,0-.01-.01-.04-.02-.08-.17,2.08-.25,4.06-.15,5.36.12.28.29.73.44,1.3Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M199.47,249.56c-1.61.06-3.46-.51-4.43-1.89-1.68.27-3.32.53-5.05.25-.36-.11-.73-.16-1.17-.56-.61-.49-.63-1.9.26-2.11.72-.1,1.88-.44,2.61-.64.94-.25,1.86-.61,2.8-.84,1.52-.2,2.99.21,4.48.55-1.42.48-2.82,1-4.32.98-1.32.41-2.64.85-3.98,1.17.92.13,2.01-.04,2.9-.13.81.03,2.12-.76,2.57.25.03.07.19.33.36.47,1.05,1.01,2.56.88,3.92,1.27.62.12,1.26.19,1.92.27-.91.44-1.87.77-2.88.95ZM283.62,262.3c-.66,0-1.27-.42-1.51-1.02.14-.28.34-.5.64-.62.31.11.55.12.77.05.02.06.1.09.15.04.05-.08.41.1.8-.09,1.36.52.05,1.67-.86,1.64ZM285.4,373.44c-.14-.53-.59-.68-.99-.91-.17-.04-.17-.21-.29-.3-.38-.45-.8-.82-1.31-1.26-1.25-.99-1.45-2.89-.65-4.27.05-.63.03-1.33-.01-2.02,0-.37-.13-.73.09-1.12.13-.39.3-.78.48-1.18.5.67,1.04,1.38.96,2.22,0,.85.19,1.83-.1,2.7-.52.8-.57,1.87.25,2.52.56.52,1.39,1.12,1.77,1.86.14.55.27,1.34-.2,1.75ZM298.49,294.34c-.02.22,0,.77,0,1,0,.22,0,.79,0,1-.23.11-.46.22-.76.33-.31-.11-.53-.22-.76-.33,0-.21,0-.78,0-1,0-.23,0-.77,0-1,.23-.11.45-.22.77-.33.32.11.54.22.77.33ZM301.96,214.72c1.18-.15,2.21.64,2.73,1.63-.03,0-.06,0-.09,0-.59-.12-1.31-.2-2.05-.25.04.11.08.22.08.34,0,.58-.52,1.04-1.18,1.04s-1.18-.46-1.18-1.04c0-.14.03-.28.09-.4-.37,0-.71,0-.99.01-.34-.13-.67-.31-.88-.62,1.23-.23,2.25-.62,3.48-.71ZM291.13,216.43c0-.16.05-.31.12-.44-.51.03-1.03.07-1.5.13-.1.01-.21.03-.3.04-.28.06-.56.13-.84.18,0,0,.01-.01.02-.02.59-.77,1.43-1.48,2.48-1.5.4,0,1.71.05,2.14.06.37,0,.94,0,1.23-.09l.3-.08c.24-.04.48.11.67.21.49.25.87.85.77,1.42.14.69-.13,1.52-.76,1.76.14.97.22,1.92.64,2.78.11.23.05.49-.12.65-.16.13-.32.29-.46.47.21.03.39.11.52.27.28.33.71.63,1.19.48.44-.13.91-.17,1.38-.22.07-.27.13-.54.22-.81.12.36.22.72.3,1.08.02.09-.02.17-.09.22-.45.27-.91.52-1.38.74l.09-.04c-.21.13-.45.25-.73.3-.67.13-1.31-.11-1.83-.53-.74.03-1.71.11-1.61-.89.15-.76.57-1.39,1.19-1.82-.11-.9.07-1.81.44-2.63-.07,0-.15.02-.23.01.59-.42.55-1.07.18-1.6l-.04-.31c-.03-.06-.05-.04-.08-.04.02-.08.03-.15.04-.24,0,0-.72-.03-1.7-.04.09.15.15.31.15.49,0,.58-.52,1.04-1.18,1.04s-1.18-.46-1.18-1.04ZM292.91,226.58c.28-.35.55-.7.9-.92.27-.16.54-.31.82-.44l-.15.07c.71-.47,1.55-.44,2.29-.17.74-.26,1.57-.28,2.27.19l-.15-.07c.31.14.6.34.91.49.23.27.47.53.67.85-.38-.03-.72-.12-1.06-.21l.09.04c-.36-.03-.75.03-1.08-.12-.12.02-.43,0-.59.06-.33.05-.68.31-1.03.33-.5-.02-.93-.38-1.43-.36-.09-.01-.25.02-.25-.01-.33.15-.72.11-1.08.13l.08-.03c-.39.08-.78.16-1.2.16ZM294.3,227.17h5.02c-.96,1.86-3.93,1.62-5.02,0ZM299.28,428.47s-.02.05-.03.08c-.01.03-.21.49-.33,1.3-.07.51-.44.93-.94,1.08-.12.03-.24.05-.37.05-.38,0-.75-.16-1-.46-.12-.14-.22-.24-.27-.3-3.45-2.36-3.69-5.42-3.71-6.02,0-.08,0-.16.02-.23.46-2.96-2.55-6.37-2.89-6.75-.13-.15-.23-.32-.29-.51-1.77-5.97-1.37-14.58-1.32-15.54,0-.09.02-.18.04-.27,1.41-5.2-.33-10.74-.4-10.98-1.05-3.43-1.01-7.55-.91-8.72.11-1.33,1.07-6.39,1.36-7.91.04-.22.14-.43.29-.6,1.11-1.31,1.37-2.92,1.43-3.38.02-.2.09-.39.2-.55.59-.93.84-2.72.88-3.97,0-.24.08-.47.21-.67,1.44-2.25.39-4.71.17-5.18-.07-.14-.11-.28-.12-.43-.37-3.62.68-11.46.9-12.99.03-.2.1-.38.21-.55.16-.23.39-.4.65-.51.5-.88,1-1.76,1.34-2.73,1.2-3.84,1.5-8.51,2.04-12.61,1.31,5.23.66,10.95-1.88,15.74.11.13.23.26.28.43.96,3.68,1.64,6.21,1.74,6.59.85,2.3.97,3.94.99,4.39,0,.11,0,.22-.03.33-1.47,6.85-.99,11-.98,11.04.6,3.22-.82,9.24-1.27,11-.01.06-.03.12-.05.17-2.24,5.95.85,24.16,2.79,32.96l1.75,7.09c.02.08.03.17.04.25l.12,2.57c.01.14.33,4.38-.63,6.82ZM301.36,429.81c-.53,0-.98-.51-1.06-.97-.35-1.51.31-2.66.47-4.07,0-.05.01-.11,0-.16.17-.29.44-.53.69-.83.27.28.54.59.66.93-.04.12-.06.44-.08.57-.16,1.14-.62,1.84-.49,3.08,0,.08.03.18.05.23.03.04-.09-.11-.19-.09,0-.07-.03.03.02.07.24.14.48.14.79.17-.07.43-.31,1.12-.87,1.07ZM302.51,369.51c.4.49.79.97,1.15,1.51.49.84,1.49,1.92.27,2.63-.3-.22-.56-.31-.81-.38-.16-.49-.43-.94-.73-1.39-.32-.46-.67-.94-1.06-1.36.05-.29.09-.59.19-.95.37-.07.68-.06.99-.05ZM311.88,261.8c-.29.31-.73.5-1.16.49-.91.03-2.22-1.13-.86-1.64.39.18.75,0,.8.09.02.02.04.03.06.03.21-.13.39.08.86-.11.31.12.51.34.64.62-.08.2-.2.38-.34.53ZM329.62,363.55c.57.27,1.13.54,1.67.86.8.55,2.16,1.1,1.35,2.25-.37-.07-.63-.04-.9,0-.34-.37-.77-.66-1.23-.93-.49-.28-1-.56-1.52-.77-.08-.29-.17-.57-.24-.94.3-.22.58-.35.86-.47ZM404.21,247.92c-1.73.29-3.36.02-5.03-.24-.13.18-.26.32-.41.48-1.07,1-2.62,1.49-4.04,1.41-1.01-.18-1.97-.51-2.88-.95.66-.08,1.3-.16,1.92-.27,1.49-.42,3.49-.27,4.3-1.79.15-.34.5-.52.84-.47,1.48.23,3.09.53,4.58.38-1.34-.33-2.65-.76-3.95-1.17-1.5.03-2.9-.5-4.32-.98,1.49-.34,2.96-.75,4.48-.55.94.23,1.86.59,2.8.84.73.2,1.89.54,2.61.64.57.11.74.77.7,1.26-.06.84-1,1.29-1.6,1.4Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M316.25,235.97c-.3-.29-.53-.64-.72-1,0,0,0,0-.01.01.2.36.44.7.73.98,0,0,0,0,0,0Z\"/\u003e\n    \u003cpath d=\"M295.12,226.31s.16,0,.25.01c.49-.02.93.34,1.43.36.36-.02.7-.28,1.03-.33.17-.06.47-.04.59-.06.33.15.72.09,1.08.12l-.09-.04c.34.09.68.18,1.06.21-.2-.32-.44-.58-.67-.85-.31-.16-.6-.35-.91-.49l.15.07c-.7-.47-1.53-.45-2.27-.19-.74-.27-1.58-.31-2.29.17l.15-.07c-.28.13-.55.28-.82.44-.35.23-.62.58-.9.92.43,0,.81-.08,1.2-.16l-.08.03c.36-.03.75.02,1.08-.13Z\"/\u003e\n    \u003cpath d=\"M299.32,227.17h-5.02c1.09,1.62,4.06,1.86,5.02,0Z\"/\u003e\n    \u003cpath d=\"M300.35,216.03c-.06.12-.09.26-.09.4,0,.58.52,1.04,1.18,1.04s1.18-.46,1.18-1.04c0-.12-.03-.23-.08-.34.73.05,1.46.12,2.05.25.03,0,.06,0,.09,0-.51-.99-1.55-1.78-2.73-1.63-1.23.08-2.25.47-3.48.71.21.31.53.49.88.62.28,0,.62-.01.99-.01Z\"/\u003e\n    \u003cpath d=\"M293.5,216.43c0-.18-.06-.34-.15-.49.99,0,1.7.04,1.7.04-.01.08-.03.16-.04.24.03,0,.05-.01.08.04l.04.31c.37.53.42,1.18-.18,1.6.08,0,.15,0,.23-.01-.37.82-.54,1.73-.44,2.63-.61.43-1.04,1.07-1.19,1.82-.1,1,.87.93,1.61.89.52.42,1.15.65,1.83.53.27-.05.51-.17.73-.3l-.09.04c.47-.22.93-.47,1.38-.74.07-.04.11-.13.09-.22-.08-.36-.18-.72-.3-1.08-.09.27-.16.54-.22.81-.46.05-.94.08-1.38.22-.48.15-.91-.15-1.19-.48-.12-.16-.31-.24-.52-.27.14-.17.3-.33.46-.47.18-.16.23-.43.12-.65-.42-.86-.5-1.82-.64-2.78.63-.24.9-1.06.76-1.76.1-.56-.28-1.17-.77-1.42-.19-.09-.42-.25-.67-.21l-.3.08c-.29.08-.86.09-1.23.09-.42-.01-1.74-.05-2.14-.06-1.05.02-1.89.73-2.48,1.5,0,0-.01.01-.02.02.28-.06.56-.12.84-.18.1-.01.2-.03.3-.04.47-.06.99-.1,1.5-.13-.07.13-.12.28-.12.44,0,.58.52,1.04,1.18,1.04s1.18-.46,1.18-1.04Z\"/\u003e\n    \u003cpath d=\"M299.79,419.09c0-.09-.02-.17-.04-.25l-1.75-7.09c-1.95-8.8-5.03-27-2.79-32.96.02-.06.04-.11.05-.17.45-1.76,1.86-7.78,1.27-11,0-.04-.49-4.19.98-11.04.02-.11.03-.22.03-.33-.02-.45-.14-2.09-.99-4.39-.1-.37-.78-2.91-1.74-6.59-.05-.17-.17-.3-.28-.43,2.55-4.79,3.2-10.51,1.88-15.74-.54,4.09-.84,8.76-2.04,12.61-.34.97-.84,1.85-1.34,2.73-.26.11-.49.27-.65.51-.11.16-.18.35-.21.55-.22,1.53-1.27,9.37-.9,12.99.02.15.06.3.12.43.22.47,1.27,2.93-.17,5.18-.13.2-.2.43-.21.67-.04,1.25-.29,3.03-.88,3.97-.11.17-.17.36-.2.55-.05.46-.32,2.08-1.43,3.38-.15.17-.25.38-.29.6-.29,1.52-1.25,6.58-1.36,7.91-.1,1.17-.14,5.29.91,8.72.07.23,1.81,5.78.4,10.98-.02.09-.04.18-.04.27-.05.96-.46,9.57,1.32,15.54.06.19.15.36.29.51.34.38,3.35,3.79,2.89,6.75-.01.08-.02.16-.02.23.02.59.26,3.66,3.71,6.02.06.06.15.16.27.3.25.3.62.46,1,.46.12,0,.25-.02.37-.05.5-.14.86-.57.94-1.08.12-.82.32-1.28.33-1.3.01-.03.02-.05.03-.08.96-2.44.64-6.68.63-6.82l-.12-2.57ZM294.03,352.66s.02.06.02.08c.65,1.75.8,3.03.83,3.47-.23,1.11-.42,2.15-.56,3.11-.15-.56-.32-1.01-.44-1.3-.11-1.3-.02-3.29.15-5.36ZM296.9,427.31c-1.39-1.32-1.6-2.68-1.63-3.07.49-3.68-2.21-7.23-3.36-8.55-1.49-5.32-1.19-13.08-1.14-14.24,1.52-5.8-.26-11.67-.47-12.32-.85-2.76-.91-6.45-.8-7.71.07-.87.68-4.24,1.26-7.31,1.21-1.57,1.63-3.3,1.77-4.22.83-1.51,1.06-3.56,1.12-4.68.06-.1.12-.21.17-.31-.04,1.9.08,2.99.1,3.12.41,2.2-.39,6.71-1.21,9.92-2.96,8.1,2.12,31.71,2.72,34.41l1.72,7,.12,2.47c.08,1.02.14,3.9-.38,5.49Z\"/\u003e\n    \u003cpath d=\"M391.93,211.31c-.13,1.73-2.02,2.42-3.21,3.43-.52.36-1.07.7-1.64,1.05,1.02.02,2.03-.08,3.03-.33,1.32-.52,2.53-1.6,3.11-2.95.08-.21.14-.4.19-.62,1.64-.45,3.24-.89,4.7-1.87.5-.35,1.16-1.13.89-1.92-.16-.48-.59-1.02-1.16-.88-.69.21-1.89.38-2.64.5-.96.16-1.94.22-2.9.4-1.47.45-2.64,1.43-3.86,2.36,1.5-.16,2.99-.26,4.35-.91,1.33-.17,2.68-.32,4-.57-1.3.74-2.86,1.15-4.29,1.55-.33.1-.57.4-.57.76Z\"/\u003e\n    \u003cpath d=\"M405.11,245.25c-.72-.1-1.88-.43-2.61-.64-.94-.25-1.86-.61-2.8-.84-1.52-.2-2.99.21-4.48.55,1.42.48,2.82,1,4.32.98,1.31.41,2.61.84,3.95,1.17-1.49.15-3.1-.15-4.58-.38-.35-.05-.7.13-.84.47-.81,1.52-2.81,1.37-4.3,1.79-.62.12-1.26.19-1.92.27.91.44,1.87.77,2.88.95,1.42.08,2.96-.4,4.04-1.41.15-.16.29-.3.41-.48,1.67.27,3.31.53,5.03.24.59-.11,1.54-.56,1.6-1.4.04-.5-.13-1.16-.7-1.26Z\"/\u003e\n    \u003cpath d=\"M202.19,211.68c0-.35-.22-.66-.57-.76-1.11-.29-2.23-.61-3.28-1.04-.35-.15-.74-.32-1.08-.53,1.35.26,2.72.41,4.08.58,1.36.65,2.85.75,4.35.91-1.22-.93-2.39-1.91-3.86-2.36-.95-.18-1.94-.24-2.9-.4-.75-.12-1.95-.29-2.64-.5-.55-.14-1.01.41-1.15.88-.27.79.4,1.58.89,1.92,1.46.98,3.06,1.42,4.7,1.87.04.22.11.41.19.62.58,1.36,1.78,2.44,3.11,2.95,1,.25,2.01.35,3.03.33-.57-.35-1.13-.69-1.64-1.05-1.19-1.01-3.08-1.7-3.21-3.43Z\"/\u003e\n    \u003cpath d=\"M196.5,247.06c-.17-.14-.33-.41-.36-.47-.45-1-1.76-.22-2.57-.25-.9.08-1.98.26-2.9.13,1.35-.33,2.67-.76,3.98-1.17,1.5.03,2.9-.5,4.32-.98-1.49-.34-2.96-.75-4.48-.55-.94.23-1.86.59-2.8.84-.73.2-1.9.54-2.61.64-.89.21-.87,1.62-.26,2.11.43.39.8.45,1.17.56,1.73.29,3.38.02,5.05-.25.97,1.39,2.83,1.95,4.43,1.89,1.01-.18,1.96-.51,2.88-.95-.66-.08-1.3-.16-1.92-.27-1.36-.39-2.87-.26-3.92-1.27Z\"/\u003e\n    \u003cpath d=\"M283.83,369.82c-.82-.65-.77-1.72-.25-2.52.29-.87.1-1.85.1-2.7.08-.84-.47-1.55-.96-2.22-.18.4-.35.79-.48,1.18-.22.39-.09.75-.09,1.12.04.69.06,1.38.01,2.02-.8,1.38-.61,3.28.65,4.27.51.44.93.81,1.31,1.26.12.09.12.26.29.3.4.23.85.39.99.91.46-.41.33-1.2.2-1.75-.38-.74-1.21-1.35-1.77-1.86Z\"/\u003e\n    \u003cpath d=\"M330.51,365.73c.46.27.89.56,1.23.93.26-.04.53-.07.9,0,.81-1.15-.55-1.7-1.35-2.25-.55-.33-1.11-.59-1.67-.86-.28.12-.56.25-.86.47.07.37.15.65.24.94.52.21,1.04.49,1.52.77Z\"/\u003e\n    \u003cpath d=\"M301.34,370.51c.39.42.73.89,1.06,1.36.3.45.57.9.73,1.39.26.08.51.17.81.38,1.22-.71.21-1.79-.27-2.63-.36-.53-.75-1.01-1.15-1.51-.31,0-.62-.02-.99.05-.1.36-.14.66-.19.95Z\"/\u003e\n    \u003cpath d=\"M301.41,428.49c.1-.02.21.13.19.09-.02-.04-.05-.15-.05-.23-.12-1.25.33-1.94.49-3.08.02-.13.04-.45.08-.57-.11-.34-.39-.65-.66-.93-.25.3-.52.55-.69.83.02.06,0,.11,0,.16-.16,1.41-.82,2.56-.47,4.07.08.47.53.97,1.06.97.56.05.79-.64.87-1.07-.31-.03-.55-.03-.79-.17-.05-.05-.03-.14-.02-.07Z\"/\u003e\n    \u003cpath d=\"M256.86,354.14c-.09-.4-.19-.75-.24-1.19-.54.15-1.21.37-1.33.97-.45,1.34-.53,2.75-.44,4.14l-.45.97c-.02.11-.15.16-.1.3.06.39.14.78.26,1.16.37-.16.72-.35,1.06-.55.14-.05.1-.19.17-.27l.53-1.14c.17-.53-.03-1.12.03-1.67.04-.93.13-1.89.52-2.73Z\"/\u003e\n    \u003cpath d=\"M296.94,294.34c.02.22,0,.76,0,1,0,.22,0,.79,0,1,.23.11.46.22.76.33.31-.11.53-.22.76-.33,0-.21,0-.78,0-1,0-.23,0-.78,0-1-.23-.11-.45-.22-.77-.33-.32.11-.54.22-.77.33Z\"/\u003e\n    \u003cpath d=\"M311.58,260.65c-.47.2-.65-.01-.86.11-.02,0-.04,0-.06-.03-.05-.08-.41.09-.8-.09-1.36.52-.05,1.67.86,1.64.43,0,.87-.18,1.16-.49.15-.15.27-.33.34-.53-.14-.28-.34-.5-.64-.62Z\"/\u003e\n    \u003cpath d=\"M284.48,260.65c-.39.18-.75,0-.8.09-.05.05-.13.03-.15-.04-.22.07-.47.06-.77-.05-.31.12-.51.34-.64.62.24.6.85,1.03,1.51,1.02.91.03,2.22-1.13.86-1.64Z\"/\u003e\n    \u003cpath d=\"M410.59,243.43c-1.13-1.09-3.67-2.19-7.57-3.29-.26-.07-.53-.09-.79-.05-1.1.16-3.46.59-4.16.72-5.81.06-8.56,1.4-9.81,2.45l-8.8-.33c-1.83-.03-5.94-.61-7.79-1.18-2.21-.69-5.59-.85-6.02-.87-7.89-.07-11.82.94-11.86.95-.05.01-.1.03-.14.05-1.56.61-2.59.63-2.92.62-1.2-.34-2.48-.64-3.84-.89,2.8-1.32,5.78-2.57,6.7-2.95,3.51-.15,9.99-2.23,10.61-2.44,5.49-1.4,18.37-10.79,21.7-13.26h.2c1.65-.04,3.91-.08,5.65-1.26.04-.03.08-.06.12-.09l5.19-4.47s.05-.04.07-.06c.02-.01,1.53-1.51,3.11-2.73,2.04-1.15,2.97-2.01,3.21-2.96.02-.07.03-.13.04-.2.06-.18.1-.35.12-.53,1.92-1.01,2.09-2.2,1.86-3.05.7-.6.96-1.21,1.04-1.46.05-.17.08-.35.09-.53.01-.63-.22-1.23-.67-1.68-.83-.84-2.13-.94-3.19-.92-.44,0-.85.03-1.19.07-.79-.24-2.73-.57-7.99.24-.26.04-.51.13-.73.27-.88.56-2.68,1.81-3.52,2.39-5.29,2.47-7.25,4.84-7.98,6.31l-8.18,3.36c-1.68.74-5.66,1.92-7.59,2.16-2.31.29-5.45,1.55-5.84,1.71-7.27,3.22-10.42,5.78-10.45,5.8-.04.03-.07.06-.1.1-1.19,1.21-2.14,1.66-2.43,1.78-6.45.96-12.82,3.81-14.93,4.81-2.17-.7-8.44-2.13-13.97,2.19h-.57c-.23-.32-.94-.49-1.61-.63,0-.01,0-.03-.01-.04-.32-.55-.49-1.15-.48-1.79v-.02s0-.03,0-.05c.01-.59.18-1.21.58-1.87,1.32-1.06,2.17-2.16,2.54-3.28.02-.07.04-.15.04-.22,0-.03,0-.07,0-.1.05-.09.09-.19.1-.29.06-.36.06-.71,0-1.04-.03-.18.04-.36.17-.47.38-.31.65-.68.83-1.11.03-.09.06-.18.06-.27.1-2.24-1-4.41-2-5.9,0-.03-.01-.05-.02-.08-.06-.16-.04-.33.08-.5.11-.15.17-.33.17-.52-.02-.66-.17-1.36-.44-2.02.03-.11.05-.44.03-.55l.4-1.47c.02-.08.03-.17.03-.26-.05-1.08-.31-2.07-.77-2.93-.03-.06-.07-.12-.12-.17-1.05-1.14-2.56-1.42-3-1.48-.19-.02-.34-.15-.4-.33l-.31-.88c-.04-.12-.16-.24-.3-.34-.15-1.08-.5-2.1-1.12-3.14-2.06-2.4-5.83-2.88-6.94-2.98-.12,0-.24-.07-.33-.17-1.06-1.21-2.21-1.99-3.42-2.3-.18-.05-.39-.03-.56.05-.28.13-.56.26-1.08.22-.58-.05-1.17-.02-1.76.07-.09.01-.17.04-.25.08-.25.13-.45.25-.58.34-.12.09-.27.11-.42.06-.18-.05-.38-.04-.55.03-.08.03-.16.07-.24.1-1.41-.69-2.86-.93-4.3-.74-.1.01-.2.04-.28.09-.36.2-.69.43-.97.67-.15.13-.23.2-.26.39l-.53.39c-.18.2-.31.38-.39.49-.09.13-.24.2-.4.2h-.95c-5.75.41-7.23,4.49-8.1,6.95-.2.1-.34.27-.41.48-.05.15-.16.26-.3.31-.55.19-1.05.43-1.63.82-.63.64-1.09,1.37-1.38,2.17-.13.36-.21.71-.26,1.05-.01.08-.01.16,0,.24.1.7.34,1.27.48,1.54.07.13.07.29,0,.43-.09.2-.16.4-.21.64-.03.14-.02.3.03.44l.03.08c-.03.12-.05.24-.07.36-.02.1-.02.2,0,.3.08.46.24.82.36,1.04.07.13.08.27.03.4-.03.07-.05.14-.07.21-.47.27-.52.83-.54,1.29-.5.57-.6,1.09-.7,1.58-.03.15-.06.32-.12.52-.03.13-.06.27-.09.49-.01.08-.01.17,0,.25.07.45,0,.85-.06,1.21-.08.5-.18,1.06.2,1.54.12.14.14.34.07.51-.13.28-.21.53-.29.79-.04.13,0,.34.06.54-.34,1.55.93,2.52,1.88,3.24.45.34.92.7,1.1,1.01.27.49.5.98.67,1.46.07.17.13.34.15.41,0,.05.01.16.02.21.07.32.08.6.07.87,0,.07-.02.14-.03.21-.03.23-.09.45-.19.62-.13.2-.11.43-.04.65-.64-.05-1.54-.3-1.54-.2-.11.04-.3.08-.52.08-.02,0-.11,0-.14,0h-.47c-5.54-4.33-11.8-2.89-13.97-2.19-2.11-1.01-8.48-3.85-14.93-4.81-.3-.12-1.26-.59-2.49-1.84-.04-.04-.08-.08-.12-.11-.13-.11-3.36-2.63-10.43-5.76-.35-.14-3.51-1.39-5.78-1.68-1.92-.24-5.91-1.43-7.62-2.18l-8.14-3.35c-.72-1.47-2.68-3.84-7.98-6.31-2.11-1.46-3.08-2.11-3.51-2.39-.22-.14-.47-.24-.73-.28-3.8-.59-6.4-.66-7.92-.23-2.07-.22-3.52.03-4.33.75-.51.46-.8,1.11-.78,1.79,0,.18.04.35.1.55.08.23.34.84,1.03,1.44-.22.85-.05,2.04,1.87,3.05.02.17.06.35.12.53,0,.07.02.14.04.2.23.95,1.16,1.81,3.21,2.96,1.39,1.06,2.74,2.36,3.13,2.74.02.02.06.06.08.08l5.22,4.49s.08.07.12.09c1.68,1.13,3.85,1.18,5.59,1.21h.19c3.34,2.48,16.22,11.87,21.67,13.26.92.3,7.21,2.3,10.64,2.45.92.38,3.91,1.64,6.7,2.95-1.36.25-2.64.55-3.84.89-.33,0-1.39-.02-3-.64-.05-.02-.1-.04-.16-.05-.16-.04-4.12-1.01-11.84-.92-.38.02-3.75.19-5.95.87-1.85.58-5.97,1.15-7.83,1.18l-8.76.33c-1.26-1.04-4-2.39-9.81-2.45-.61-.11-3.04-.56-4.17-.72-.26-.04-.52-.02-.77.05-3.81,1.08-6.33,2.17-7.5,3.25-2.03,1.17-2.95,2.64-2.54,4.06.08.44.3.84.63,1.15.08.08.17.15.26.21,0,.05,0,.09.02.13.13.88.75,1.93,2.94,2.06.09.14.19.28.31.42.04.06.08.12.12.18.6.77,1.8,1.17,4.13,1.38,1.69.39,3.44,1.01,3.95,1.2.03,0,.08.03.11.04l6.56,1.93c.05.01.1.03.15.04,2,.33,3.99-.53,5.59-1.22l.18-.08c3.34.72,15.65,3.29,22.4,3.29,1.08,0,1.96-.06,2.68-.19.69-.08,7.43-.87,10.7-2.19,5.34-.19,11.39-.15,13.05.34.1.03.2.05.31.06,1.07.13,10.35,1.22,14.9,1.45.84.71,3.11,3.04,3.69,7.78.83,6.86,2.01,10.7,2.76,11.89.23.61-.12,3.75.47,7.44.03.22.11.42.17.55,0,0,.68,10.37-1.13,13.13-2.03,3.09-3.68,8.95-3.96,9.85-1.21,1.96-5.05,10.13-9.74,23.65-.11.33-2.28,6.08-3.22,12.17-2.37,2.83-4.95,3.93-5.39,5.84-.1.47-.26,1.16-.46,1.92-.16.06-.32.15-.46.28-.48.46-11.79,11.25-14.67,19.43-.02.05-.03.11-.05.16-.04.21-4.64,21.51-6.12,25.41-.28.84-1.17,3.35-1.93,4.61-1.19.58-2.19,1.66-2.3,3.08-.21.09-.41.16-.6.22-2.51.08-5.75,1.47-6.94,5.16-.05.16-.08.32-.09.48-.01.22-.02,1.38.9,2.26.19.18.39.33.62.45.38.75,1.19,1.55,2.92,1.89.28.21.6.41.96.58.57.82,1.58,1.47,3.07,1.97.18.06.37.08.56.06,1.37,1.34,3.56,1.92,4.33,2.09.44.1.91.04,1.28-.16l2.21-1.12c.17-.08.32-.19.43-.3,2.17-2,1.99-5.24,1.62-7.17,1.37-1.19,2.41-3,2.74-3.6.15-.27.22-.58.22-.9v-6.46c1.98-3.62,6.62-10.38,7.45-11.58.66-.64,3.66-3.6,5.77-6.38,2.15-2.84,7.02-15.72,8.39-19.42,4.1-1.99,5.69-4.82,6.23-6.11,2.14-1.66,3.96-3.95,5.39-6.16.68,4.34,1.61,7.69,2.77,9.99-.36,2.1-1.44,8.54-1.8,13-.72,1.26-2.43,4.72-3.12,10.31-.97,7.85.43,16.53,4.15,25.8.02.04.03.08.05.12l5.78,11.14c0,.27-.03,1.14-.57,3.13-.44.81-1.45,3-1.14,5.53.03.27.13.53.27.76l.92,1.47c.05.38.19.84.5,1.31.25.38.58.73,1,1.03.01,0,.02.02.04.03.62.44,1.41.79,2.37,1.01.71.45,1.6.7,2.58.74.22.02.48,0,.69-.07.48.09.97.1,1.52.04.01,0,.02,0,.04,0,.85.39,1.87.39,3.1-.08.62.33,1.34.5,2.13.5,1.29,0,2.41-.44,2.64-.53.08-.03.15-.07.23-.12.13-.08.24-.16.36-.25.76.15,1.83.27,3.31.27,1.05,0,2.2-.06,3.41-.19.4-.04.78-.22,1.08-.48.05-.04,1.14-.95,3.36-.45.91.27,7.02,1.97,10.71.41l2.09.54c.09.02.18.04.28.05,1.46.15,4.4-.22,6.19-2.58.44-.57.51-1.33.19-1.98l-.51-1.04c-.3-.62-.92-1.02-1.6-1.06l-1.91-.1c-.96-.7-2.96-1.72-6.13-1.45l-1.5-.35c-1.07-.96-3.18-2.12-6.15-3.38-.91-.54-2.17-1.68-2.23-2.41l-.25-3.44c.08-2.27.55-27.71.75-38.65,0-.16-.02-.33-.06-.49-.89-3.6.23-6.61.44-7.13,1.93-3.88,1.2-9.08,1.08-9.81-.22-3.68.9-6.02.98-6.19.58-1.37,1.11-2.75,1.58-4.12.45.46.72.72.73.73.15.15.33.27.5.35.83.4,1.43,1.61,1.65,2.24,1.63,7.26,3.96,11.06,4.1,11.29,1.28,1.81,2.44,6.23,3.05,9.49.7,8.6,15.17,27.75,16.81,29.9.07.09.14.17.21.24,4.31,4.08,5.43,7.65,5.66,8.58-.3,2.8.58,4.81.93,5.48.19.47.8,1.79,2.33,3.6.31.44,1.08,1.34,2.43,1.63,1.26.26,2.65-.11,3.91-1.03.29-.19,2.79-1.85,3.83-4.15.05,0,.1,0,.15.01.1.01.21.02.36.01,1.05-.06,4.6-.38,6.16-2.01.05-.05.09-.1.13-.16.2-.09.4-.19.58-.31.01,0,.03-.02.04-.03,1.15-.22,2.06-.82,2.6-1.39.46-.42.82-.94,1.05-1.53.97-.28,2.38-.91,2.6-2.45.07-.51,0-.96-.18-1.36.37-.39.49-.98.24-1.49-1.07-2.2-3.91-2.15-4.95-2.06-2.02-.13-4.1.79-5.23,1.4-1.75-.33-3.12-.34-4.08-.02-.98-.05-1.81-.46-2.16-.65-1.35-1.72-1.67-2.86-1.7-2.98-.17-.52-13.99-31.94-15.57-35.52-.07-.16-.16-.3-.26-.43-2.48-3.08-2.58-6.59-2.58-6.59h0c.14-4.3-2.69-8.74-3.12-9.39-1.4-3.23-1.7-5.83-1.7-6.02-2.48-12.87-4.51-18.54-8.4-25.63-1.5-2.73-2.23-5.71-2.74-7.69-.59-9.7-2.01-11.44-2.98-15.31-1.05-4.21-2.44-10.14-2.07-13.47.02-.19-.03.19,0,0,.59-3.7.98-6.84,1.21-7.45,1.01-1.64,2.09-6.27,2.77-11.89.57-4.71,2.79-7.02,3.69-7.78,4.78-.25,14.79-1.44,14.9-1.45.1-.01.2-.03.3-.06,1.65-.49,7.7-.52,13.04-.33,3.26,1.32,9.99,2.11,10.66,2.19.73.13,1.62.2,2.71.2,6.76,0,19.08-2.56,22.41-3.28l.18.08c1.52.66,3.6,1.56,5.67,1.21.05,0,.1-.02.15-.04l6.53-1.93s.06-.02.09-.03c.02,0,2.01-.75,3.93-1.19,2.33-.21,3.53-.61,4.13-1.39.04-.06.08-.11.12-.17.12-.13.22-.27.31-.41,2.19-.13,2.81-1.18,2.94-2.06,0-.04.01-.09.02-.13.09-.06.18-.13.26-.21.33-.31.55-.72.63-1.15.25-.88.17-2.46-2.46-4.01ZM315.53,234.97c.2.36.42.71.72,1,0,0,0,0,0,0-.3-.29-.54-.62-.73-.98,0,0,0,0,.01-.01ZM312.8,237.32c.07,0,.13.01.13.01.93,0,1.74-.69,1.92-1.62.08-.05.11-.14.18-.2.21.33.46.66.79.97.27.25.62.36.98.35.18-.01.38-.02.58-.02h.93c.31,0,.61-.11.85-.31,5.09-4.25,11.12-2.3,12.28-1.86.34.13.72.11,1.05-.05,1.29-.64,8.04-3.85,14.78-4.83.08-.01.16-.03.23-.06.39-.13,1.8-.7,3.5-2.41.4-.3,3.47-2.59,9.76-5.38,1.08-.44,3.54-1.31,5.15-1.52,2.21-.28,6.42-1.53,8.28-2.35l8.65-3.56c.35-.14.62-.43.75-.79.15-.43,1.18-2.74,6.94-5.41.07-.03.14-.07.21-.12.73-.51,2.46-1.71,3.38-2.31,4.95-.75,6.46-.38,6.8-.25.2.08.41.1.62.08.3-.03.75-.07,1.23-.08.41,0,.68.02.87.04-.14.11-.34.22-.61.33-.49.2-.79.68-.8,1.21,0,.36.14.7.39.96-.09.05-.19.11-.32.17l-.52.13c-.44.11-.8.44-.94.88-.11.36-.07.74.11,1.05-.04.09-.06.18-.08.28-.13.15-.59.6-2.01,1.39-.05.03-.1.06-.15.1-1.62,1.23-3.16,2.72-3.42,2.98l-5.1,4.39c-1.09.7-2.79.74-4.16.76-.22,0-.43,0-.64.02-.27,0-.53.1-.75.26-5.83,4.36-16.85,12.01-21.15,13.08-.03,0-.06.02-.1.03-1.79.59-7.49,2.29-10.13,2.33-.17,0-.33.04-.48.1-.75.31-7.41,3.07-10.9,5.05-.28.16-.46.41-.56.7-2.43-.22-4.87-.31-7.32-.26-5.77-2.38-12.22-4.1-18.41-2.48-.1.05-.21.09-.32.14-.15-.26-.33-.52-.54-.74-.62-.36-1.21-.6-1.78-.86-.17-.08-.34-.17-.51-.25.11-.04.23-.03.34-.09ZM240.51,236.11c-.15-.06-.32-.1-.48-.1-2.46-.03-7.73-1.55-10.17-2.34-.03,0-.06-.02-.09-.03-4.26-1.06-15.27-8.71-21.11-13.07-.22-.16-.48-.25-.75-.26-.2,0-.42-.01-.64-.02-1.37-.03-3.06-.06-4.1-.72l-5.11-4.4c-.54-.53-1.96-1.88-3.45-3.01-.05-.04-.1-.07-.15-.1-1.43-.8-1.89-1.25-2.02-1.4-.02-.1-.04-.2-.07-.28.18-.32.22-.7.11-1.05-.14-.43-.49-.77-.94-.88l-.52-.13c-.13-.06-.23-.12-.31-.17.26-.25.41-.6.4-.97-.01-.52-.33-.99-.82-1.19-.27-.11-.46-.23-.61-.33.43-.06,1.15-.08,2.13.04.21.02.42,0,.62-.07.46-.17,2.03-.48,6.78.24.48.31,1.44.95,3.39,2.31.06.04.13.08.2.11,5.76,2.67,6.79,4.97,6.94,5.41.12.36.39.65.75.79l8.61,3.54c1.9.83,6.11,2.08,8.32,2.37,1.58.2,3.97,1.05,5.09,1.49,6.22,2.76,9.32,5.02,9.76,5.36,1.74,1.74,3.15,2.32,3.54,2.45.08.03.16.05.24.06,6.74.98,13.5,4.19,14.78,4.83.33.16.71.18,1.05.05,1.16-.43,7.19-2.39,12.28,1.86.24.2.54.31.85.31h.95s.07,0,.09,0c.61-.02,2.08-.11,2.8-1.28,0,0,0,0,0,0-.43.33-1.04.51-1.84.43.89-.03,1.42-.3,1.77-.67.12.13.15.32.3.41.17.93.98,1.62,2.07,1.62.08.04.2.04.29.07-.15.06-.29.14-.44.21-.56.24-1.13.44-1.75.76-.42.41-.75.93-.89,1.46-.59-.22-1.16-.45-1.72-.71-6.19-1.62-12.64.1-18.41,2.48-2.09-.04-4.17.03-6.25.18-.11-.26-.3-.48-.55-.62-3.47-1.97-10.15-4.75-10.9-5.05ZM409.39,247.35c-.16.31-.17.68-.06,1-.1.01-.22.02-.37.02l-.51-.1c-.45-.08-.91.07-1.22.41-.25.28-.37.65-.34,1.01-.07.07-.13.14-.18.23-.19.08-.79.3-2.38.43-.06,0-.12.01-.18.03-1.96.45-3.95,1.16-4.31,1.3l-6.41,1.89c-1.28.19-2.84-.49-4.11-1.04l-.59-.25c-.25-.11-.52-.13-.79-.07-1.54.35-15.31,3.31-22.26,3.31-.93,0-1.7-.05-2.27-.16-.03,0-.07-.01-.1-.02-1.51-.16-7.67-.99-10.17-2.09-.15-.07-.32-.1-.48-.11-2.63-.09-11.36-.34-14.06.41-.85.1-10.75,1.27-15.06,1.45-.26.01-.51.1-.72.25-.71.51-4.27,3.38-5.05,9.83-.78,6.41-1.89,10.05-2.43,10.89-.55.91-1.21,6.37-1.51,8.23,0,0-.53,5.83,2.05,14.46l.2,1.15c.04.26.16.5.34.68.36.38,1.99,3.97,2.4,13.28,0,.09.02.18.04.26.15.59,1.51,5.41,3.28,8.84,3.2,6.18,5.44,13.23,7.81,23.98,0,.35.47,4.69,2.04,7.31.02.04.05.09.08.13.03.04,2.82,4.17,2.7,7.91,0,.04.04,4.34,3.1,8.21,4.68,10.63,14.87,33.83,15.44,35.2.15.51.68,1.99,2.3,3.99.09.11.19.2.3.27.43.28,1.97,1.19,3.99,1.19.19,0,.38-.04.55-.12.03-.01.8-.35,3.24.17.32.07.66.01.94-.15,1.1-.65,2.68-1.3,3.95-1.3h.04c.08.57.53,1.04,1.13,1.13.28.04.52.09.73.16.33.19.63.45.73.61-.07.06-.23.15-.57.26-.14-.05-.3-.07-.45-.06-.64.02-1.17.51-1.26,1.14-.07.48-.24.84-.54,1.1-.04.04-.08.08-.12.12-.21.24-.77.64-1.56.65-.43,0-.82.22-1.06.57-.07.02-.14.03-.21.05-.49.09-.89.44-1.03.91,0,.02-.01.04-.02.07-.91.44-2.49.74-3.78.82-.96-.11-1.91.12-2.75.69-.4.27-.62.74-.58,1.22.01.11.03.22.07.32-.76,1.08-1.97,2.01-2.51,2.36-.71.52-1.36.73-1.87.62-.51-.11-.79-.52-.82-.57-.03-.04-.06-.09-.1-.13-1.46-1.73-1.91-2.85-1.96-2.97-.02-.06-.05-.11-.08-.17-.1-.18-.95-1.82-.64-4.19.02-.14.01-.29-.02-.43-.17-.83-1.27-5.2-6.43-10.11-5.44-7.13-15.8-22.2-16.26-28.53,0-.06-.01-.12-.03-.18-.33-1.79-1.57-7.85-3.45-10.5-.02-.03-2.2-3.59-3.74-10.47-.01-.05-.03-.1-.04-.15-.16-.48-1.02-2.76-2.91-3.76-.24-.23-1.02-1.01-2.09-2.16,0,0,0,0-.01,0,1.16-4.33,1.81-8.89,1.37-13.39-.13-1.46-.48-3.05-.79-4.43-.46-2.75-.19-5.74.29-8.55,1.01-2.35,1.97-6.56,2-9.67-.12-3.32-.63-6.64-1.76-9.75.78,4.79.49,9.69-.33,14.43-.29,1.58-.82,3.1-1.38,4.6-.31,1.54-.47,3.07-.55,4.62-.18,2.21.16,4.63.7,6.78.4,2.13.51,4.29.39,6.46-.1,2.65-.57,5.28-1.24,7.85-3.46-3.87-6.62-8.07-8.83-12.74-1.11-1.91-2.03-3.96-2.34-6.22l-.05.09c-.28,2.28.27,4.61.98,6.77,2.4,5,5.74,9.4,9.45,13.49-.03.07-.1.12-.12.19-.62,1.97-1.35,3.98-2.17,5.92-.25.51-1.47,3.26-1.21,7.5,0,.05,0,.1.02.15,0,0,.02.14.04.33,0,.33-.03.66-.01,1,.13.92.11,1.88.11,2.84-.1,1.39-.38,2.91-1.02,4.19-.18.41-1.72,4.15-.62,8.74-.21,11.13-.69,36.91-.75,38.57,0,.05,0,.1,0,.15l.25,3.52c.21,2.58,3.49,4.46,3.63,4.54.04.02.09.05.14.07,4.36,1.84,5.45,2.88,5.62,3.07.18.2.41.34.67.4l2.07.48c.14.03.29.04.44.03,2.86-.29,4.35.77,4.74,1.1.22.19.5.3.79.32l1.89.09.1.2c-1.28,1.3-3.2,1.23-3.48,1.22l-2.49-.64c-.32-.08-.67-.04-.96.12-2.32,1.26-7.45.15-9.24-.39-.03,0-.05-.02-.08-.02-3.08-.71-4.96.43-5.57.89-1.04.1-2.02.15-2.91.15-1.85,0-2.88-.22-3.34-.35-.51-.15-1.05.02-1.38.43-.09.1-.17.18-.26.25-.3.12-.94.3-1.55.3-.48,0-.86-.12-1.13-.35-.24-.21-.55-.33-.87-.33-.2,0-.39.04-.58.13-.74.36-1.14.41-1.32.41-.2,0-.26-.05-.3-.08-.04-.03-.07-.08-.1-.16-.25-.6-.91-.93-1.55-.77-.36.09-.65.33-.82.63-.3-.07-.62-.02-.89.12-.52-.05-.93-.18-1.2-.38-.15-.11-.33-.19-.51-.23-.69-.15-1.25-.36-1.62-.62,0,0-.02-.01-.02-.02-.16-.12-.28-.24-.36-.35-.09-.14-.11-.25-.11-.32,0-.24-.07-.48-.2-.69l-.99-1.59c-.18-1.92.79-3.69.91-3.88.06-.1.1-.2.13-.31.66-2.39.86-4.01.59-4.82-.03-.1-.05-.16-.11-.25l-5.82-11.22c-8.41-20.99-1.82-32.7-1.04-33.97.11-.18.18-.38.19-.59.35-4.72,1.62-12.07,1.87-13.49.05-.29,0-.6-.14-.86-.61-1.11-1.13-2.62-1.61-4.39-.27-1.63-.49-3.27-.81-4.89-.26-1.75-.45-3.51-.63-5.28.05-.1.09-.19.14-.29.96-2.56,2.43-5.04,4.37-6.94.82-.36,3.59-1.95,4.85-3.24,2.35-2.62,4.43-5.26,6.2-8.31,1.11-2.18,2.01-4.47,2.87-6.77-.68.98-3.59,5.01-4.21,5.97-1.56,2.91-3.77,5.57-5.93,8.03-1.26,1.24-2.99,2.16-4.66,3.09-1.65,1.53-2.93,3.35-3.9,5.34-.57-7.67-.51-15.41-.29-23.08-.44-3.96-.88-8.26-.76-12.25-.08.14-.15.29-.23.44-1.21,3.83-1.17,8.57-.54,11.88-.26,7.04-.24,14.07.16,21.11.13,1.57.24,3.16.36,4.75-.08.16-.17.31-.25.47-.33.1-.64.28-.8.6-1.2,2.31-3.7,6.53-6.9,8.88-.22.16-.38.38-.46.63-.19.54-1.34,3.35-5.47,5.19-.33.14-.58.41-.7.75-2.25,6.1-6.51,17.01-8.21,19.25-2.12,2.8-5.24,5.83-5.59,6.16-.06.06-.12.13-.17.2-.59.85-5.82,8.44-7.84,12.23-.1.19-.15.4-.15.62v6.6c-.49.88-1.53,2.44-2.48,3.01-.5.3-.74.89-.59,1.46.23.9.86,3.9-.59,5.38l-1.87.95c-1.38-.35-2.87-1.08-3.13-1.78-.01-.03-.02-.07-.03-.14-.08-.61-.57-1.08-1.18-1.13-.48-.04-.92.17-1.19.54-.47-.27-.6-.49-.64-.57-.16-.39-.51-.65-.9-.75-.36-.17-.56-.32-.68-.43-.2-.19-.45-.31-.73-.35-.9-.13-1.28-.39-1.34-.59-.1-.52-.49-.93-1-1.05-.07-.02-.12-.04-.14-.06-.04-.04-.07-.11-.08-.16,1.05-3.02,4-3.19,4.59-3.19.12,0,.24-.02.35-.05.57-.16,1.21-.41,1.97-.77.57-.27.87-.9.72-1.51-.2-.8.71-1.21.99-1.32.25-.09.46-.26.61-.48,1.19-1.69,2.45-5.54,2.45-5.54,1.51-3.96,5.87-24.15,6.2-25.65,2.29-6.38,10.55-14.93,13.17-17.53.21.05.43.06.64,0,.46-.11.82-.45.96-.91.4-1.35.72-2.67.88-3.44.22-.95,1.74-1.04,5.14-5.07.2-.24.27-.54.31-.85.87-5.99,3.08-11.81,3.08-11.81,4.18-12.06,10.12-23.65,10.16-23.71.06-.1.11-.2.14-.31.11-.35.55-5.47,3.15-8.95,2.89-3.85,1.3-15.58,1.3-15.58-.3-1.85-.23-7.33-.8-8.28-.35-.53-1.54-3.66-2.41-10.84-.78-6.5-4.35-9.34-5.06-9.84-.21-.15-.45-.23-.71-.24-4.21-.18-13.76-1.3-15.07-1.45-2.71-.75-11.43-.51-14.06-.41-.17,0-.33.04-.48.11-2.41,1.05-8.19,1.87-10.22,2.09-.03,0-.06,0-.1.01-.56.11-1.32.16-2.24.16-6.94,0-20.7-2.98-22.25-3.32-.26-.06-.54-.03-.79.07l-.59.25c-1.26.54-2.83,1.22-4.04,1.05l-6.42-1.89c-.7-.26-2.54-.9-4.35-1.31-.06-.01-.12-.02-.18-.03-1.61-.14-2.21-.35-2.39-.44-.05-.08-.11-.16-.17-.23.03-.36-.09-.73-.34-1.01-.31-.34-.77-.5-1.22-.41l-.51.1c-.15,0-.27-.01-.36-.02.11-.33.09-.69-.06-1.01-.19-.4-.57-.67-1.01-.73.19-.23.6-.61,1.32-1.01.12-.06.22-.15.31-.24.26-.27,1.49-1.27,6.31-2.64,1.01.15,2.97.51,4.01.7.08.01.15.02.23.02,6.31.04,8.17,1.71,8.48,2.04.26.28.61.43,1.02.42l9.28-.35c2.06-.03,6.41-.64,8.54-1.3,1.92-.6,5.15-.75,5.24-.75,6.78-.07,10.51.71,11.05.83.11.04.19.06.29.09.05.02.09.03.14.04,2.02.69,3.4.66,3.79.63.08,0,.16-.02.24-.05,2.25-.66,4.84-1.14,7.7-1.43.24-.02.43-.14.62-.27,2.27-.19,4.55-.27,6.81-.22,2.9-1.06,5.92-2.22,9.02-2.71,2.91-.5,5.96-.63,8.81.16,1.14.6,2.24.93,3.39,1.26,3.54.78,7.27.51,10.8-.11-1.09,0-2.47-.04-3.56-.12-2.66-.23-5.44-.73-7.99-1.61.39-.17.76-.26,1.16-.28.47-.24,1.05-.46,1.62-.7.64-.29,1.46-.65,2.33-1.07.07,0,.12.03.19.04,2.09-.16,3.25-1.19,3.86-2.03.28-.39.43-.82.59-1.25.8-.94,1.27-1.99,1-3.18-.22.22-.36.35-.51.49-.02-.86-.12-1.55-.16-1.69,0-.01,0-.02,0-.04,0,0,0,0,0-.01-.3-1.18-.32-2.24-.32-2.24,0-.48-.19-.94-.5-1.29.5-1.27.52-2.87-.72-4.18-.1-.11-.24-.23-.37-.31-.02-.01-.51-.35-.52-1.24.02-.15,0-.31-.04-.46.17-.13.29-.33.32-.56.02-.2.18-.58.3-.88.22-.53.41-.99.36-1.43l-.04-.34c0-.11-.04-.21-.09-.31.19-.48.37-1.12.26-2.01.32-.39.49-.88.46-1.39-.06-.96.82-1.32.97-1.38.84-.28,1.39-1.1,1.35-2,0-.08-.01-.16-.03-.23.29-.26.5-.6.58-.98.1-.47.06-.92-.13-1.29.27-.32.93-.75,2.4-.65.8.22,1.61.39,2.39.49,2.03.26,3.93.1,5.45-.44,1.37-.13,2.08.18,2.42.46-.25.41-.33.91-.22,1.44.08.37.28.71.58.97-.01.07-.02.15-.03.22-.06.89.48,1.71,1.31,2.01.18.06,1.06.43,1,1.39-.03.51.13,1,.45,1.39-.16.95-.16,1.83.02,2.62.07.31.19.6.37.86.22.34.44.78.35,1.51-.27.93-.41,1.44-.27,1.75l-.16.79c-.04.07-.07.15-.09.24-.02.09-.02.17,0,.26-.01.06-.02.11-.03.17-.26.36-.55.71-.84,1.03-.38.99-.73,1.99-1.07,2.99-3.12,5.67-6.48,6.37-6.48,6.37.36.02.73.03,1.09.01,2.56-.73,4.39-2.82,6.04-4.84-.04.38-.1.87-.21,1.34-.02.05-.04.1-.06.16,0,.02-.01.04-.02.06-.06.26-.19,1.05-.17,2.01-.35-.27-.69-.54-1.1-.81-.06,1.43.7,2.56,1.74,3.5.14.31.23.63.45.93.61.84,1.77,1.87,4,2.03.04,0,.08-.03.13-.03,1.27.64,2.59,1.23,3.82,1.86-2.69,1-5.65,1.55-8.48,1.79-1.06.08-2.46.11-3.55.12,3.54.62,7.26.89,10.8.11,1.15-.34,2.24-.66,3.39-1.26,2.85-.79,5.9-.66,8.81-.16,3.1.49,6.11,1.65,9.02,2.71,2.69-.06,5.42.03,8.12.32.13.06.24.16.39.17,2.86.29,5.45.78,7.7,1.43.08.02.16.04.24.05.42.04,1.93.11,4.16-.74.5-.12,4.21-.92,11.05-.85.14,0,3.38.16,5.31.75,2.13.66,6.47,1.27,8.5,1.3l9.32.35c.41.01.76-.14,1.02-.42.31-.33,2.17-2,8.48-2.04.08,0,.16,0,.23-.02.48-.09,2.82-.52,4.01-.7,3.92,1.12,5.85,2.1,6.35,2.65.09.11.21.19.33.26.73.41,1.12.79,1.29.98-.44.05-.82.34-1.02.74Z\"/\u003e\n  \u003c/g\u003e\n\u003c/svg\u003e\n        \n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBlanc :\n\n    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/svg/fabricationhumaine/04_FH_LOGO_230126_BLANC.svg\"\u003e\n        \n            \u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003csvg id=\"Calque_1\" data-name=\"Calque 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 595.28 595.28\"\u003e\n  \u003cdefs\u003e\n    \u003cstyle\u003e\n      .cls-1 {\n        fill: #fff;\n      }\n    \u003c/style\u003e\n  \u003c/defs\u003e\n  \u003cpath class=\"cls-1\" d=\"M296.66,525.37c-125.04,0-226.77-101.73-226.77-226.77s101.73-226.77,226.77-226.77,226.77,101.73,226.77,226.77-101.73,226.77-226.77,226.77ZM296.66,80.05c-120.51,0-218.55,98.04-218.55,218.54s98.04,218.55,218.55,218.55,218.55-98.04,218.55-218.55-98.04-218.54-218.55-218.54Z\"/\u003e\n  \u003cg\u003e\n    \u003cpolygon class=\"cls-1\" points=\"203.52 426.73 194.16 438.18 180.64 427.13 190.01 415.67 182.42 409.47 156.71 440.91 164.3 447.12 175.06 433.96 188.58 445.01 177.82 458.17 185.41 464.38 211.12 432.94 203.52 426.73\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M235.64,444.67l-11.23,24.08c-.87,1.86-2.06,3.14-3.58,3.83-1.52.7-3.28.58-5.28-.35-1.96-.92-3.17-2.18-3.61-3.79-.44-1.62-.23-3.35.64-5.21l11.23-24.08-8.89-4.14-11.52,24.71c-1.08,2.31-1.64,4.51-1.69,6.57-.05,2.07.35,3.97,1.18,5.7.83,1.73,2.02,3.3,3.54,4.69,1.53,1.39,3.32,2.57,5.39,3.54,2.07.96,4.14,1.59,6.2,1.87,2.07.28,4.03.18,5.9-.29s3.57-1.4,5.13-2.76c1.55-1.36,2.87-3.21,3.95-5.52l11.52-24.71-8.89-4.14Z\"/\u003e\n    \u003cpolygon class=\"cls-1\" points=\"250.66 448.78 236.34 489.48 246.49 491.39 252.71 471.48 260.47 490.18 274.55 475.59 273.11 496.39 283.26 498.3 284.7 455.18 263.07 476.32 250.66 448.78\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M287.81,498.27l11.06-.69,3.29-8.05,12.92-.81,4.28,7.58,11.12-.69-24.05-41.75-18.62,44.41ZM312.69,481.38l-9.02.56,3.85-10.65,5.17,10.08Z\"/\u003e\n    \u003crect class=\"cls-1\" x=\"330.89\" y=\"452.39\" width=\"9.98\" height=\"40.61\" transform=\"translate(-95.28 84.94) rotate(-12.64)\"/\u003e\n    \u003cpolygon class=\"cls-1\" points=\"377.41 435.88 368.75 439.68 377.95 460.61 342.28 449.1 359.44 488.14 368.04 484.36 358.85 463.43 394.57 474.92 377.41 435.88\"/\u003e\n    \u003cpolygon class=\"cls-1\" points=\"409.97 452.01 404.26 444.61 417.26 434.58 412.44 428.33 399.44 438.36 395.01 432.62 408.93 421.88 404 415.5 387.78 428.01 387.78 428.01 382.64 431.98 407.45 464.13 412.6 460.16 412.6 460.16 428.81 447.65 423.88 441.27 409.97 452.01\"/\u003e\n    \u003cpolygon class=\"cls-1\" points=\"145.19 210.01 152.71 197.58 145.96 193.5 138.44 205.93 131.59 201.79 139.4 188.86 132.2 184.51 124.39 197.44 124.39 197.44 119.57 205.4 154.33 226.41 159.14 218.45 145.19 210.01\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M172.58,198.46l-3.23-8.06,8.68-9.44,8.31,2.53,7.47-8.12-46.12-13.62,17.47,44.78,7.43-8.08ZM171.22,177.3l-6.05,6.58-4.63-10.31,10.68,3.73Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M209.81,165.25c2.65-1.75,4.73-3.6,6.25-5.55,1.51-1.95,2.34-3.97,2.5-6.07.15-2.1-.52-4.27-2.01-6.53-1.13-1.71-2.47-2.92-4.02-3.64-1.55-.71-3.21-1.05-4.98-1.02-1.19.02-2.38.2-3.57.5.95-1.54,1.54-3.12,1.71-4.73.21-1.95-.28-3.8-1.45-5.58-1.28-1.94-2.86-3.2-4.74-3.79-1.88-.59-3.92-.61-6.1-.07-2.19.54-4.45,1.58-6.78,3.13l-12.32,8.14,22.39,33.88,13.13-8.68ZM207.39,151.48c.72,1.1,1.05,2.13.97,3.08-.08.96-.44,1.85-1.09,2.67-.65.82-1.5,1.58-2.55,2.28l-4.12,2.72-5.53-8.37,4.12-2.72c.8-.53,1.57-.94,2.33-1.22.75-.29,1.49-.44,2.21-.45.72-.01,1.4.14,2.03.47.63.33,1.18.85,1.65,1.55ZM189.93,138.82c1.4-.93,2.68-1.36,3.83-1.28,1.15.07,2.11.69,2.88,1.85.51.77.77,1.54.77,2.31,0,.76-.23,1.51-.69,2.23-.46.72-1.16,1.39-2.08,2l-3.35,2.22-4.7-7.12,3.36-2.22Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M233.53,152.43l-5.21-13.1,2.76-1.1,13.23,9.91,10.57-4.2-15.4-10.36c.29-.27.56-.54.82-.82,1.72-1.89,2.76-3.98,3.13-6.27.37-2.29.07-4.64-.89-7.05-.97-2.44-2.38-4.37-4.22-5.78-1.84-1.41-4.03-2.21-6.58-2.41-2.55-.19-5.42.35-8.63,1.62l-4.59,1.83h0s-9.02,3.59-9.02,3.59l15.01,37.74,9.02-3.59ZM225.53,120.83c1.21-.48,2.33-.7,3.36-.65,1.03.05,1.92.35,2.68.9.76.55,1.34,1.35,1.76,2.39.41,1.04.54,2.02.37,2.94-.17.92-.62,1.74-1.34,2.47-.72.72-1.69,1.33-2.9,1.81l-3.95,1.57-3.93-9.87,3.95-1.57Z\"/\u003e\n    \u003crect class=\"cls-1\" x=\"254.4\" y=\"102.78\" width=\"9.88\" height=\"40.61\" transform=\"translate(-19.83 56.23) rotate(-11.92)\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M271.08,128.95c1.21,2.53,2.83,4.69,4.88,6.49,2.05,1.79,4.46,3.12,7.22,3.98,2.77.86,5.76,1.21,8.97,1.04,2.94-.15,5.35-.65,7.23-1.48,1.87-.83,3.58-1.93,5.12-3.29l-.55-10.54c-.83.97-1.8,1.89-2.91,2.77-1.11.87-2.37,1.6-3.8,2.17-1.43.58-3.1.92-5.01,1.02-2.18.11-4.2-.25-6.07-1.08-1.87-.83-3.4-2.12-4.6-3.86-1.2-1.74-1.87-3.84-2-6.32-.13-2.51.31-4.68,1.33-6.52,1.02-1.83,2.41-3.26,4.18-4.29,1.77-1.02,3.74-1.59,5.92-1.7,1.91-.1,3.61.05,5.09.46,1.48.41,2.81,1,4,1.77,1.19.77,2.25,1.6,3.18,2.48l-.55-10.54c-1.67-1.19-3.48-2.1-5.43-2.74-1.95-.63-4.4-.88-7.34-.72-3.21.17-6.15.82-8.81,1.97-2.66,1.15-4.92,2.72-6.77,4.71-1.85,1.99-3.25,4.31-4.18,6.96-.94,2.64-1.32,5.55-1.16,8.72.17,3.17.85,6.02,2.06,8.55Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M323.17,133.64l12.57,2.51,2.16,8.42,10.82,2.16-12.34-46.48-29.17,38.2,10.76,2.15,5.21-6.95ZM335.33,128.44l-8.77-1.75,6.4-9.31,2.37,11.06Z\"/\u003e\n    \u003cpolygon class=\"cls-1\" points=\"362.44 153.63 374.74 124.25 384.96 128.52 388.35 120.44 358.99 108.16 355.61 116.24 365.78 120.5 353.49 149.88 362.44 153.63\"/\u003e\n    \u003crect class=\"cls-1\" x=\"367.46\" y=\"139.11\" width=\"40.61\" height=\"9.88\" transform=\"translate(66.46 404.58) rotate(-59.42)\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M396.9,148.26c-2.04,2.38-3.52,4.91-4.43,7.59-.91,2.68-1.26,5.39-1.05,8.11.21,2.73.97,5.35,2.29,7.88,1.31,2.53,3.18,4.82,5.59,6.89,2.38,2.04,4.93,3.52,7.62,4.43,2.7.91,5.41,1.26,8.14,1.05,2.73-.21,5.34-.97,7.86-2.28,2.51-1.31,4.79-3.16,6.82-5.54,2.04-2.38,3.49-4.9,4.37-7.57.87-2.67,1.18-5.35.93-8.06-.25-2.71-1.04-5.31-2.36-7.79-1.33-2.49-3.16-4.74-5.52-6.76-2.33-1.99-4.83-3.46-7.5-4.4-2.67-.94-5.37-1.33-8.08-1.16-2.72.17-5.33.88-7.85,2.14-2.52,1.26-4.79,3.08-6.83,5.45ZM401.64,160.69c.48-2.01,1.51-3.92,3.07-5.74,1.56-1.82,3.29-3.12,5.2-3.91,1.91-.78,3.85-1.02,5.82-.7,1.97.31,3.83,1.22,5.58,2.72,1.77,1.52,2.96,3.22,3.56,5.11.6,1.89.65,3.83.15,5.82-.5,1.99-1.53,3.9-3.09,5.72-1.56,1.82-3.29,3.12-5.2,3.91s-3.85,1.02-5.82.7c-1.97-.32-3.82-1.21-5.53-2.68-1.74-1.49-2.92-3.19-3.54-5.09-.62-1.9-.68-3.86-.2-5.86Z\"/\u003e\n    \u003cpolygon class=\"cls-1\" points=\"471.21 199.76 465.85 192.08 447.1 205.15 451.65 168.16 416.67 192.55 421.99 200.18 440.74 187.11 436.22 224.15 471.21 199.76\"/\u003e\n  \u003c/g\u003e\n  \u003cg\u003e\n    \u003cpath class=\"cls-1\" d=\"M316.25,235.97c-.3-.29-.53-.64-.72-1,0,0,0,0-.01.01.2.36.44.7.73.98,0,0,0,0,0,0Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M295.12,226.31s.16,0,.25.01c.49-.02.93.34,1.43.36.36-.02.7-.28,1.03-.33.17-.06.47-.04.59-.06.33.15.72.09,1.08.12l-.09-.04c.34.09.68.18,1.06.21-.2-.32-.44-.58-.67-.85-.31-.16-.6-.35-.91-.49l.15.07c-.7-.47-1.53-.45-2.27-.19-.74-.27-1.58-.31-2.29.17l.15-.07c-.28.13-.55.28-.82.44-.35.23-.62.58-.9.92.43,0,.81-.08,1.2-.16l-.08.03c.36-.03.75.02,1.08-.13Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M299.32,227.17h-5.02c1.09,1.62,4.06,1.86,5.02,0Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M300.35,216.03c-.06.12-.09.26-.09.4,0,.58.52,1.04,1.18,1.04s1.18-.46,1.18-1.04c0-.12-.03-.23-.08-.34.73.05,1.46.12,2.05.25.03,0,.06,0,.09,0-.51-.99-1.55-1.78-2.73-1.63-1.23.08-2.25.47-3.48.71.21.31.53.49.88.62.28,0,.62-.01.99-.01Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M293.5,216.43c0-.18-.06-.34-.15-.49.99,0,1.7.04,1.7.04-.01.08-.03.16-.04.24.03,0,.05-.01.08.04l.04.31c.37.53.42,1.18-.18,1.6.08,0,.15,0,.23-.01-.37.82-.54,1.73-.44,2.63-.61.43-1.04,1.07-1.19,1.82-.1,1,.87.93,1.61.89.52.42,1.15.65,1.83.53.27-.05.51-.17.73-.3l-.09.04c.47-.22.93-.47,1.38-.74.07-.04.11-.13.09-.22-.08-.36-.18-.72-.3-1.08-.09.27-.16.54-.22.81-.46.05-.94.08-1.38.22-.48.15-.91-.15-1.19-.48-.12-.16-.31-.24-.52-.27.14-.17.3-.33.46-.47.18-.16.23-.43.12-.65-.42-.86-.5-1.82-.64-2.78.63-.24.9-1.06.76-1.76.1-.56-.28-1.17-.77-1.42-.19-.09-.42-.25-.67-.21l-.3.08c-.29.08-.86.09-1.23.09-.42-.01-1.74-.05-2.14-.06-1.05.02-1.89.73-2.48,1.5,0,0-.01.01-.02.02.28-.06.56-.12.84-.18.1-.01.2-.03.3-.04.47-.06.99-.1,1.5-.13-.07.13-.12.28-.12.44,0,.58.52,1.04,1.18,1.04s1.18-.46,1.18-1.04Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M299.79,419.09c0-.09-.02-.17-.04-.25l-1.75-7.09c-1.95-8.8-5.03-27-2.79-32.96.02-.06.04-.11.05-.17.45-1.76,1.86-7.78,1.27-11,0-.04-.49-4.19.98-11.04.02-.11.03-.22.03-.33-.02-.45-.14-2.09-.99-4.39-.1-.37-.78-2.91-1.74-6.59-.05-.17-.17-.3-.28-.43,2.55-4.79,3.2-10.51,1.88-15.74-.54,4.09-.84,8.76-2.04,12.61-.34.97-.84,1.85-1.34,2.73-.26.11-.49.27-.65.51-.11.16-.18.35-.21.55-.22,1.53-1.27,9.37-.9,12.99.02.15.06.3.12.43.22.47,1.27,2.93-.17,5.18-.13.2-.2.43-.21.67-.04,1.25-.29,3.03-.88,3.97-.11.17-.17.36-.2.55-.05.46-.32,2.08-1.43,3.38-.15.17-.25.38-.29.6-.29,1.52-1.25,6.58-1.36,7.91-.1,1.17-.14,5.29.91,8.72.07.23,1.81,5.78.4,10.98-.02.09-.04.18-.04.27-.05.96-.46,9.57,1.32,15.54.06.19.15.36.29.51.34.38,3.35,3.79,2.89,6.75-.01.08-.02.16-.02.23.02.59.26,3.66,3.71,6.02.06.06.15.16.27.3.25.3.62.46,1,.46.12,0,.25-.02.37-.05.5-.14.86-.57.94-1.08.12-.82.32-1.28.33-1.3.01-.03.02-.05.03-.08.96-2.44.64-6.68.63-6.82l-.12-2.57ZM294.03,352.66s.02.06.02.08c.65,1.75.8,3.03.83,3.47-.23,1.11-.42,2.15-.56,3.11-.15-.56-.32-1.01-.44-1.3-.11-1.3-.02-3.29.15-5.36ZM296.9,427.31c-1.39-1.32-1.6-2.68-1.63-3.07.49-3.68-2.21-7.23-3.36-8.55-1.49-5.32-1.19-13.08-1.14-14.24,1.52-5.8-.26-11.67-.47-12.32-.85-2.76-.91-6.45-.8-7.71.07-.87.68-4.24,1.26-7.31,1.21-1.57,1.63-3.3,1.77-4.22.83-1.51,1.06-3.56,1.12-4.68.06-.1.12-.21.17-.31-.04,1.9.08,2.99.1,3.12.41,2.2-.39,6.71-1.21,9.92-2.96,8.1,2.12,31.71,2.72,34.41l1.72,7,.12,2.47c.08,1.02.14,3.9-.38,5.49Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M391.93,211.31c-.13,1.73-2.02,2.42-3.21,3.43-.52.36-1.07.7-1.64,1.05,1.02.02,2.03-.08,3.03-.33,1.32-.52,2.53-1.6,3.11-2.95.08-.21.14-.4.19-.62,1.64-.45,3.24-.89,4.7-1.87.5-.35,1.16-1.13.89-1.92-.16-.48-.59-1.02-1.16-.88-.69.21-1.89.38-2.64.5-.96.16-1.94.22-2.9.4-1.47.45-2.64,1.43-3.86,2.36,1.5-.16,2.99-.26,4.35-.91,1.33-.17,2.68-.32,4-.57-1.3.74-2.86,1.15-4.29,1.55-.33.1-.57.4-.57.76Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M405.11,245.25c-.72-.1-1.88-.43-2.61-.64-.94-.25-1.86-.61-2.8-.84-1.52-.2-2.99.21-4.48.55,1.42.48,2.82,1,4.32.98,1.31.41,2.61.84,3.95,1.17-1.49.15-3.1-.15-4.58-.38-.35-.05-.7.13-.84.47-.81,1.52-2.81,1.37-4.3,1.79-.62.12-1.26.19-1.92.27.91.44,1.87.77,2.88.95,1.42.08,2.96-.4,4.04-1.41.15-.16.29-.3.41-.48,1.67.27,3.31.53,5.03.24.59-.11,1.54-.56,1.6-1.4.04-.5-.13-1.16-.7-1.26Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M202.19,211.68c0-.35-.22-.66-.57-.76-1.11-.29-2.23-.61-3.28-1.04-.35-.15-.74-.32-1.08-.53,1.35.26,2.72.41,4.08.58,1.36.65,2.85.75,4.35.91-1.22-.93-2.39-1.91-3.86-2.36-.95-.18-1.94-.24-2.9-.4-.75-.12-1.95-.29-2.64-.5-.55-.14-1.01.41-1.15.88-.27.79.4,1.58.89,1.92,1.46.98,3.06,1.42,4.7,1.87.04.22.11.41.19.62.58,1.36,1.78,2.44,3.11,2.95,1,.25,2.01.35,3.03.33-.57-.35-1.13-.69-1.64-1.05-1.19-1.01-3.08-1.7-3.21-3.43Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M196.5,247.06c-.17-.14-.33-.41-.36-.47-.45-1-1.76-.22-2.57-.25-.9.08-1.98.26-2.9.13,1.35-.33,2.67-.76,3.98-1.17,1.5.03,2.9-.5,4.32-.98-1.49-.34-2.96-.75-4.48-.55-.94.23-1.86.59-2.8.84-.73.2-1.9.54-2.61.64-.89.21-.87,1.62-.26,2.11.43.39.8.45,1.17.56,1.73.29,3.38.02,5.05-.25.97,1.39,2.83,1.95,4.43,1.89,1.01-.18,1.96-.51,2.88-.95-.66-.08-1.3-.16-1.92-.27-1.36-.39-2.87-.26-3.92-1.27Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M283.83,369.82c-.82-.65-.77-1.72-.25-2.52.29-.87.1-1.85.1-2.7.08-.84-.47-1.55-.96-2.22-.18.4-.35.79-.48,1.18-.22.39-.09.75-.09,1.12.04.69.06,1.38.01,2.02-.8,1.38-.61,3.28.65,4.27.51.44.93.81,1.31,1.26.12.09.12.26.29.3.4.23.85.39.99.91.46-.41.33-1.2.2-1.75-.38-.74-1.21-1.35-1.77-1.86Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M330.51,365.73c.46.27.89.56,1.23.93.26-.04.53-.07.9,0,.81-1.15-.55-1.7-1.35-2.25-.55-.33-1.11-.59-1.67-.86-.28.12-.56.25-.86.47.07.37.15.65.24.94.52.21,1.04.49,1.52.77Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M301.34,370.51c.39.42.73.89,1.06,1.36.3.45.57.9.73,1.39.26.08.51.17.81.38,1.22-.71.21-1.79-.27-2.63-.36-.53-.75-1.01-1.15-1.51-.31,0-.62-.02-.99.05-.1.36-.14.66-.19.95Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M301.41,428.49c.1-.02.21.13.19.09-.02-.04-.05-.15-.05-.23-.12-1.25.33-1.94.49-3.08.02-.13.04-.45.08-.57-.11-.34-.39-.65-.66-.93-.25.3-.52.55-.69.83.02.06,0,.11,0,.16-.16,1.41-.82,2.56-.47,4.07.08.47.53.97,1.06.97.56.05.79-.64.87-1.07-.31-.03-.55-.03-.79-.17-.05-.05-.03-.14-.02-.07Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M256.86,354.14c-.09-.4-.19-.75-.24-1.19-.54.15-1.21.37-1.33.97-.45,1.34-.53,2.75-.44,4.14l-.45.97c-.02.11-.15.16-.1.3.06.39.14.78.26,1.16.37-.16.72-.35,1.06-.55.14-.05.1-.19.17-.27l.53-1.14c.17-.53-.03-1.12.03-1.67.04-.93.13-1.89.52-2.73Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M296.94,294.34c.02.22,0,.76,0,1,0,.22,0,.79,0,1,.23.11.46.22.76.33.31-.11.53-.22.76-.33,0-.21,0-.78,0-1,0-.23,0-.78,0-1-.23-.11-.45-.22-.77-.33-.32.11-.54.22-.77.33Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M311.58,260.65c-.47.2-.65-.01-.86.11-.02,0-.04,0-.06-.03-.05-.08-.41.09-.8-.09-1.36.52-.05,1.67.86,1.64.43,0,.87-.18,1.16-.49.15-.15.27-.33.34-.53-.14-.28-.34-.5-.64-.62Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M284.48,260.65c-.39.18-.75,0-.8.09-.05.05-.13.03-.15-.04-.22.07-.47.06-.77-.05-.31.12-.51.34-.64.62.24.6.85,1.03,1.51,1.02.91.03,2.22-1.13.86-1.64Z\"/\u003e\n    \u003cpath class=\"cls-1\" d=\"M410.59,243.43c-1.13-1.09-3.67-2.19-7.57-3.29-.26-.07-.53-.09-.79-.05-1.1.16-3.46.59-4.16.72-5.81.06-8.56,1.4-9.81,2.45l-8.8-.33c-1.83-.03-5.94-.61-7.79-1.18-2.21-.69-5.59-.85-6.02-.87-7.89-.07-11.82.94-11.86.95-.05.01-.1.03-.14.05-1.56.61-2.59.63-2.92.62-1.2-.34-2.48-.64-3.84-.89,2.8-1.32,5.78-2.57,6.7-2.95,3.51-.15,9.99-2.23,10.61-2.44,5.49-1.4,18.37-10.79,21.7-13.26h.2c1.65-.04,3.91-.08,5.65-1.26.04-.03.08-.06.12-.09l5.19-4.47s.05-.04.07-.06c.02-.01,1.53-1.51,3.11-2.73,2.04-1.15,2.97-2.01,3.21-2.96.02-.07.03-.13.04-.2.06-.18.1-.35.12-.53,1.92-1.01,2.09-2.2,1.86-3.05.7-.6.96-1.21,1.04-1.46.05-.17.08-.35.09-.53.01-.63-.22-1.23-.67-1.68-.83-.84-2.13-.94-3.19-.92-.44,0-.85.03-1.19.07-.79-.24-2.73-.57-7.99.24-.26.04-.51.13-.73.27-.88.56-2.68,1.81-3.52,2.39-5.29,2.47-7.25,4.84-7.98,6.31l-8.18,3.36c-1.68.74-5.66,1.92-7.59,2.16-2.31.29-5.45,1.55-5.84,1.71-7.27,3.22-10.42,5.78-10.45,5.8-.04.03-.07.06-.1.1-1.19,1.21-2.14,1.66-2.43,1.78-6.45.96-12.82,3.81-14.93,4.81-2.17-.7-8.44-2.13-13.97,2.19h-.57c-.23-.32-.94-.49-1.61-.63,0-.01,0-.03-.01-.04-.32-.55-.49-1.15-.48-1.79v-.02s0-.03,0-.05c.01-.59.18-1.21.58-1.87,1.32-1.06,2.17-2.16,2.54-3.28.02-.07.04-.15.04-.22,0-.03,0-.07,0-.1.05-.09.09-.19.1-.29.06-.36.06-.71,0-1.04-.03-.18.04-.36.17-.47.38-.31.65-.68.83-1.11.03-.09.06-.18.06-.27.1-2.24-1-4.41-2-5.9,0-.03-.01-.05-.02-.08-.06-.16-.04-.33.08-.5.11-.15.17-.33.17-.52-.02-.66-.17-1.36-.44-2.02.03-.11.05-.44.03-.55l.4-1.47c.02-.08.03-.17.03-.26-.05-1.08-.31-2.07-.77-2.93-.03-.06-.07-.12-.12-.17-1.05-1.14-2.56-1.42-3-1.48-.19-.02-.34-.15-.4-.33l-.31-.88c-.04-.12-.16-.24-.3-.34-.15-1.08-.5-2.1-1.12-3.14-2.06-2.4-5.83-2.88-6.94-2.98-.12,0-.24-.07-.33-.17-1.06-1.21-2.21-1.99-3.42-2.3-.18-.05-.39-.03-.56.05-.28.13-.56.26-1.08.22-.58-.05-1.17-.02-1.76.07-.09.01-.17.04-.25.08-.25.13-.45.25-.58.34-.12.09-.27.11-.42.06-.18-.05-.38-.04-.55.03-.08.03-.16.07-.24.1-1.41-.69-2.86-.93-4.3-.74-.1.01-.2.04-.28.09-.36.2-.69.43-.97.67-.15.13-.23.2-.26.39l-.53.39c-.18.2-.31.38-.39.49-.09.13-.24.2-.4.2h-.95c-5.75.41-7.23,4.49-8.1,6.95-.2.1-.34.27-.41.48-.05.15-.16.26-.3.31-.55.19-1.05.43-1.63.82-.63.64-1.09,1.37-1.38,2.17-.13.36-.21.71-.26,1.05-.01.08-.01.16,0,.24.1.7.34,1.27.48,1.54.07.13.07.29,0,.43-.09.2-.16.4-.21.64-.03.14-.02.3.03.44l.03.08c-.03.12-.05.24-.07.36-.02.1-.02.2,0,.3.08.46.24.82.36,1.04.07.13.08.27.03.4-.03.07-.05.14-.07.21-.47.27-.52.83-.54,1.29-.5.57-.6,1.09-.7,1.58-.03.15-.06.32-.12.52-.03.13-.06.27-.09.49-.01.08-.01.17,0,.25.07.45,0,.85-.06,1.21-.08.5-.18,1.06.2,1.54.12.14.14.34.07.51-.13.28-.21.53-.29.79-.04.13,0,.34.06.54-.34,1.55.93,2.52,1.88,3.24.45.34.92.7,1.1,1.01.27.49.5.98.67,1.46.07.17.13.34.15.41,0,.05.01.16.02.21.07.32.08.6.07.87,0,.07-.02.14-.03.21-.03.23-.09.45-.19.62-.13.2-.11.43-.04.65-.64-.05-1.54-.3-1.54-.2-.11.04-.3.08-.52.08-.02,0-.11,0-.14,0h-.47c-5.54-4.33-11.8-2.89-13.97-2.19-2.11-1.01-8.48-3.85-14.93-4.81-.3-.12-1.26-.59-2.49-1.84-.04-.04-.08-.08-.12-.11-.13-.11-3.36-2.63-10.43-5.76-.35-.14-3.51-1.39-5.78-1.68-1.92-.24-5.91-1.43-7.62-2.18l-8.14-3.35c-.72-1.47-2.68-3.84-7.98-6.31-2.11-1.46-3.08-2.11-3.51-2.39-.22-.14-.47-.24-.73-.28-3.8-.59-6.4-.66-7.92-.23-2.07-.22-3.52.03-4.33.75-.51.46-.8,1.11-.78,1.79,0,.18.04.35.1.55.08.23.34.84,1.03,1.44-.22.85-.05,2.04,1.87,3.05.02.17.06.35.12.53,0,.07.02.14.04.2.23.95,1.16,1.81,3.21,2.96,1.39,1.06,2.74,2.36,3.13,2.74.02.02.06.06.08.08l5.22,4.49s.08.07.12.09c1.68,1.13,3.85,1.18,5.59,1.21h.19c3.34,2.48,16.22,11.87,21.67,13.26.92.3,7.21,2.3,10.64,2.45.92.38,3.91,1.64,6.7,2.95-1.36.25-2.64.55-3.84.89-.33,0-1.39-.02-3-.64-.05-.02-.1-.04-.16-.05-.16-.04-4.12-1.01-11.84-.92-.38.02-3.75.19-5.95.87-1.85.58-5.97,1.15-7.83,1.18l-8.76.33c-1.26-1.04-4-2.39-9.81-2.45-.61-.11-3.04-.56-4.17-.72-.26-.04-.52-.02-.77.05-3.81,1.08-6.33,2.17-7.5,3.25-2.03,1.17-2.95,2.64-2.54,4.06.08.44.3.84.63,1.15.08.08.17.15.26.21,0,.05,0,.09.02.13.13.88.75,1.93,2.94,2.06.09.14.19.28.31.42.04.06.08.12.12.18.6.77,1.8,1.17,4.13,1.38,1.69.39,3.44,1.01,3.95,1.2.03,0,.08.03.11.04l6.56,1.93c.05.01.1.03.15.04,2,.33,3.99-.53,5.59-1.22l.18-.08c3.34.72,15.65,3.29,22.4,3.29,1.08,0,1.96-.06,2.68-.19.69-.08,7.43-.87,10.7-2.19,5.34-.19,11.39-.15,13.05.34.1.03.2.05.31.06,1.07.13,10.35,1.22,14.9,1.45.84.71,3.11,3.04,3.69,7.78.83,6.86,2.01,10.7,2.76,11.89.23.61-.12,3.75.47,7.44.03.22.11.42.17.55,0,0,.68,10.37-1.13,13.13-2.03,3.09-3.68,8.95-3.96,9.85-1.21,1.96-5.05,10.13-9.74,23.65-.11.33-2.28,6.08-3.22,12.17-2.37,2.83-4.95,3.93-5.39,5.84-.1.47-.26,1.16-.46,1.92-.16.06-.32.15-.46.28-.48.46-11.79,11.25-14.67,19.43-.02.05-.03.11-.05.16-.04.21-4.64,21.51-6.12,25.41-.28.84-1.17,3.35-1.93,4.61-1.19.58-2.19,1.66-2.3,3.08-.21.09-.41.16-.6.22-2.51.08-5.75,1.47-6.94,5.16-.05.16-.08.32-.09.48-.01.22-.02,1.38.9,2.26.19.18.39.33.62.45.38.75,1.19,1.55,2.92,1.89.28.21.6.41.96.58.57.82,1.58,1.47,3.07,1.97.18.06.37.08.56.06,1.37,1.34,3.56,1.92,4.33,2.09.44.1.91.04,1.28-.16l2.21-1.12c.17-.08.32-.19.43-.3,2.17-2,1.99-5.24,1.62-7.17,1.37-1.19,2.41-3,2.74-3.6.15-.27.22-.58.22-.9v-6.46c1.98-3.62,6.62-10.38,7.45-11.58.66-.64,3.66-3.6,5.77-6.38,2.15-2.84,7.02-15.72,8.39-19.42,4.1-1.99,5.69-4.82,6.23-6.11,2.14-1.66,3.96-3.95,5.39-6.16.68,4.34,1.61,7.69,2.77,9.99-.36,2.1-1.44,8.54-1.8,13-.72,1.26-2.43,4.72-3.12,10.31-.97,7.85.43,16.53,4.15,25.8.02.04.03.08.05.12l5.78,11.14c0,.27-.03,1.14-.57,3.13-.44.81-1.45,3-1.14,5.53.03.27.13.53.27.76l.92,1.47c.05.38.19.84.5,1.31.25.38.58.73,1,1.03.01,0,.02.02.04.03.62.44,1.41.79,2.37,1.01.71.45,1.6.7,2.58.74.22.02.48,0,.69-.07.48.09.97.1,1.52.04.01,0,.02,0,.04,0,.85.39,1.87.39,3.1-.08.62.33,1.34.5,2.13.5,1.29,0,2.41-.44,2.64-.53.08-.03.15-.07.23-.12.13-.08.24-.16.36-.25.76.15,1.83.27,3.31.27,1.05,0,2.2-.06,3.41-.19.4-.04.78-.22,1.08-.48.05-.04,1.14-.95,3.36-.45.91.27,7.02,1.97,10.71.41l2.09.54c.09.02.18.04.28.05,1.46.15,4.4-.22,6.19-2.58.44-.57.51-1.33.19-1.98l-.51-1.04c-.3-.62-.92-1.02-1.6-1.06l-1.91-.1c-.96-.7-2.96-1.72-6.13-1.45l-1.5-.35c-1.07-.96-3.18-2.12-6.15-3.38-.91-.54-2.17-1.68-2.23-2.41l-.25-3.44c.08-2.27.55-27.71.75-38.65,0-.16-.02-.33-.06-.49-.89-3.6.23-6.61.44-7.13,1.93-3.88,1.2-9.08,1.08-9.81-.22-3.68.9-6.02.98-6.19.58-1.37,1.11-2.75,1.58-4.12.45.46.72.72.73.73.15.15.33.27.5.35.83.4,1.43,1.61,1.65,2.24,1.63,7.26,3.96,11.06,4.1,11.29,1.28,1.81,2.44,6.23,3.05,9.49.7,8.6,15.17,27.75,16.81,29.9.07.09.14.17.21.24,4.31,4.08,5.43,7.65,5.66,8.58-.3,2.8.58,4.81.93,5.48.19.47.8,1.79,2.33,3.6.31.44,1.08,1.34,2.43,1.63,1.26.26,2.65-.11,3.91-1.03.29-.19,2.79-1.85,3.83-4.15.05,0,.1,0,.15.01.1.01.21.02.36.01,1.05-.06,4.6-.38,6.16-2.01.05-.05.09-.1.13-.16.2-.09.4-.19.58-.31.01,0,.03-.02.04-.03,1.15-.22,2.06-.82,2.6-1.39.46-.42.82-.94,1.05-1.53.97-.28,2.38-.91,2.6-2.45.07-.51,0-.96-.18-1.36.37-.39.49-.98.24-1.49-1.07-2.2-3.91-2.15-4.95-2.06-2.02-.13-4.1.79-5.23,1.4-1.75-.33-3.12-.34-4.08-.02-.98-.05-1.81-.46-2.16-.65-1.35-1.72-1.67-2.86-1.7-2.98-.17-.52-13.99-31.94-15.57-35.52-.07-.16-.16-.3-.26-.43-2.48-3.08-2.58-6.59-2.58-6.59h0c.14-4.3-2.69-8.74-3.12-9.39-1.4-3.23-1.7-5.83-1.7-6.02-2.48-12.87-4.51-18.54-8.4-25.63-1.5-2.73-2.23-5.71-2.74-7.69-.59-9.7-2.01-11.44-2.98-15.31-1.05-4.21-2.44-10.14-2.07-13.47.02-.19-.03.19,0,0,.59-3.7.98-6.84,1.21-7.45,1.01-1.64,2.09-6.27,2.77-11.89.57-4.71,2.79-7.02,3.69-7.78,4.78-.25,14.79-1.44,14.9-1.45.1-.01.2-.03.3-.06,1.65-.49,7.7-.52,13.04-.33,3.26,1.32,9.99,2.11,10.66,2.19.73.13,1.62.2,2.71.2,6.76,0,19.08-2.56,22.41-3.28l.18.08c1.52.66,3.6,1.56,5.67,1.21.05,0,.1-.02.15-.04l6.53-1.93s.06-.02.09-.03c.02,0,2.01-.75,3.93-1.19,2.33-.21,3.53-.61,4.13-1.39.04-.06.08-.11.12-.17.12-.13.22-.27.31-.41,2.19-.13,2.81-1.18,2.94-2.06,0-.04.01-.09.02-.13.09-.06.18-.13.26-.21.33-.31.55-.72.63-1.15.25-.88.17-2.46-2.46-4.01ZM315.53,234.97c.2.36.42.71.72,1,0,0,0,0,0,0-.3-.29-.54-.62-.73-.98,0,0,0,0,.01-.01ZM312.8,237.32c.07,0,.13.01.13.01.93,0,1.74-.69,1.92-1.62.08-.05.11-.14.18-.2.21.33.46.66.79.97.27.25.62.36.98.35.18-.01.38-.02.58-.02h.93c.31,0,.61-.11.85-.31,5.09-4.25,11.12-2.3,12.28-1.86.34.13.72.11,1.05-.05,1.29-.64,8.04-3.85,14.78-4.83.08-.01.16-.03.23-.06.39-.13,1.8-.7,3.5-2.41.4-.3,3.47-2.59,9.76-5.38,1.08-.44,3.54-1.31,5.15-1.52,2.21-.28,6.42-1.53,8.28-2.35l8.65-3.56c.35-.14.62-.43.75-.79.15-.43,1.18-2.74,6.94-5.41.07-.03.14-.07.21-.12.73-.51,2.46-1.71,3.38-2.31,4.95-.75,6.46-.38,6.8-.25.2.08.41.1.62.08.3-.03.75-.07,1.23-.08.41,0,.68.02.87.04-.14.11-.34.22-.61.33-.49.2-.79.68-.8,1.21,0,.36.14.7.39.96-.09.05-.19.11-.32.17l-.52.13c-.44.11-.8.44-.94.88-.11.36-.07.74.11,1.05-.04.09-.06.18-.08.28-.13.15-.59.6-2.01,1.39-.05.03-.1.06-.15.1-1.62,1.23-3.16,2.72-3.42,2.98l-5.1,4.39c-1.09.7-2.79.74-4.16.76-.22,0-.43,0-.64.02-.27,0-.53.1-.75.26-5.83,4.36-16.85,12.01-21.15,13.08-.03,0-.06.02-.1.03-1.79.59-7.49,2.29-10.13,2.33-.17,0-.33.04-.48.1-.75.31-7.41,3.07-10.9,5.05-.28.16-.46.41-.56.7-2.43-.22-4.87-.31-7.32-.26-5.77-2.38-12.22-4.1-18.41-2.48-.1.05-.21.09-.32.14-.15-.26-.33-.52-.54-.74-.62-.36-1.21-.6-1.78-.86-.17-.08-.34-.17-.51-.25.11-.04.23-.03.34-.09ZM240.51,236.11c-.15-.06-.32-.1-.48-.1-2.46-.03-7.73-1.55-10.17-2.34-.03,0-.06-.02-.09-.03-4.26-1.06-15.27-8.71-21.11-13.07-.22-.16-.48-.25-.75-.26-.2,0-.42-.01-.64-.02-1.37-.03-3.06-.06-4.1-.72l-5.11-4.4c-.54-.53-1.96-1.88-3.45-3.01-.05-.04-.1-.07-.15-.1-1.43-.8-1.89-1.25-2.02-1.4-.02-.1-.04-.2-.07-.28.18-.32.22-.7.11-1.05-.14-.43-.49-.77-.94-.88l-.52-.13c-.13-.06-.23-.12-.31-.17.26-.25.41-.6.4-.97-.01-.52-.33-.99-.82-1.19-.27-.11-.46-.23-.61-.33.43-.06,1.15-.08,2.13.04.21.02.42,0,.62-.07.46-.17,2.03-.48,6.78.24.48.31,1.44.95,3.39,2.31.06.04.13.08.2.11,5.76,2.67,6.79,4.97,6.94,5.41.12.36.39.65.75.79l8.61,3.54c1.9.83,6.11,2.08,8.32,2.37,1.58.2,3.97,1.05,5.09,1.49,6.22,2.76,9.32,5.02,9.76,5.36,1.74,1.74,3.15,2.32,3.54,2.45.08.03.16.05.24.06,6.74.98,13.5,4.19,14.78,4.83.33.16.71.18,1.05.05,1.16-.43,7.19-2.39,12.28,1.86.24.2.54.31.85.31h.95s.07,0,.09,0c.61-.02,2.08-.11,2.8-1.28,0,0,0,0,0,0-.43.33-1.04.51-1.84.43.89-.03,1.42-.3,1.77-.67.12.13.15.32.3.41.17.93.98,1.62,2.07,1.62.08.04.2.04.29.07-.15.06-.29.14-.44.21-.56.24-1.13.44-1.75.76-.42.41-.75.93-.89,1.46-.59-.22-1.16-.45-1.72-.71-6.19-1.62-12.64.1-18.41,2.48-2.09-.04-4.17.03-6.25.18-.11-.26-.3-.48-.55-.62-3.47-1.97-10.15-4.75-10.9-5.05ZM409.39,247.35c-.16.31-.17.68-.06,1-.1.01-.22.02-.37.02l-.51-.1c-.45-.08-.91.07-1.22.41-.25.28-.37.65-.34,1.01-.07.07-.13.14-.18.23-.19.08-.79.3-2.38.43-.06,0-.12.01-.18.03-1.96.45-3.95,1.16-4.31,1.3l-6.41,1.89c-1.28.19-2.84-.49-4.11-1.04l-.59-.25c-.25-.11-.52-.13-.79-.07-1.54.35-15.31,3.31-22.26,3.31-.93,0-1.7-.05-2.27-.16-.03,0-.07-.01-.1-.02-1.51-.16-7.67-.99-10.17-2.09-.15-.07-.32-.1-.48-.11-2.63-.09-11.36-.34-14.06.41-.85.1-10.75,1.27-15.06,1.45-.26.01-.51.1-.72.25-.71.51-4.27,3.38-5.05,9.83-.78,6.41-1.89,10.05-2.43,10.89-.55.91-1.21,6.37-1.51,8.23,0,0-.53,5.83,2.05,14.46l.2,1.15c.04.26.16.5.34.68.36.38,1.99,3.97,2.4,13.28,0,.09.02.18.04.26.15.59,1.51,5.41,3.28,8.84,3.2,6.18,5.44,13.23,7.81,23.98,0,.35.47,4.69,2.04,7.31.02.04.05.09.08.13.03.04,2.82,4.17,2.7,7.91,0,.04.04,4.34,3.1,8.21,4.68,10.63,14.87,33.83,15.44,35.2.15.51.68,1.99,2.3,3.99.09.11.19.2.3.27.43.28,1.97,1.19,3.99,1.19.19,0,.38-.04.55-.12.03-.01.8-.35,3.24.17.32.07.66.01.94-.15,1.1-.65,2.68-1.3,3.95-1.3h.04c.08.57.53,1.04,1.13,1.13.28.04.52.09.73.16.33.19.63.45.73.61-.07.06-.23.15-.57.26-.14-.05-.3-.07-.45-.06-.64.02-1.17.51-1.26,1.14-.07.48-.24.84-.54,1.1-.04.04-.08.08-.12.12-.21.24-.77.64-1.56.65-.43,0-.82.22-1.06.57-.07.02-.14.03-.21.05-.49.09-.89.44-1.03.91,0,.02-.01.04-.02.07-.91.44-2.49.74-3.78.82-.96-.11-1.91.12-2.75.69-.4.27-.62.74-.58,1.22.01.11.03.22.07.32-.76,1.08-1.97,2.01-2.51,2.36-.71.52-1.36.73-1.87.62-.51-.11-.79-.52-.82-.57-.03-.04-.06-.09-.1-.13-1.46-1.73-1.91-2.85-1.96-2.97-.02-.06-.05-.11-.08-.17-.1-.18-.95-1.82-.64-4.19.02-.14.01-.29-.02-.43-.17-.83-1.27-5.2-6.43-10.11-5.44-7.13-15.8-22.2-16.26-28.53,0-.06-.01-.12-.03-.18-.33-1.79-1.57-7.85-3.45-10.5-.02-.03-2.2-3.59-3.74-10.47-.01-.05-.03-.1-.04-.15-.16-.48-1.02-2.76-2.91-3.76-.24-.23-1.02-1.01-2.09-2.16,0,0,0,0-.01,0,1.16-4.33,1.81-8.89,1.37-13.39-.13-1.46-.48-3.05-.79-4.43-.46-2.75-.19-5.74.29-8.55,1.01-2.35,1.97-6.56,2-9.67-.12-3.32-.63-6.64-1.76-9.75.78,4.79.49,9.69-.33,14.43-.29,1.58-.82,3.1-1.38,4.6-.31,1.54-.47,3.07-.55,4.62-.18,2.21.16,4.63.7,6.78.4,2.13.51,4.29.39,6.46-.1,2.65-.57,5.28-1.24,7.85-3.46-3.87-6.62-8.07-8.83-12.74-1.11-1.91-2.03-3.96-2.34-6.22l-.05.09c-.28,2.28.27,4.61.98,6.77,2.4,5,5.74,9.4,9.45,13.49-.03.07-.1.12-.12.19-.62,1.97-1.35,3.98-2.17,5.92-.25.51-1.47,3.26-1.21,7.5,0,.05,0,.1.02.15,0,0,.02.14.04.33,0,.33-.03.66-.01,1,.13.92.11,1.88.11,2.84-.1,1.39-.38,2.91-1.02,4.19-.18.41-1.72,4.15-.62,8.74-.21,11.13-.69,36.91-.75,38.57,0,.05,0,.1,0,.15l.25,3.52c.21,2.58,3.49,4.46,3.63,4.54.04.02.09.05.14.07,4.36,1.84,5.45,2.88,5.62,3.07.18.2.41.34.67.4l2.07.48c.14.03.29.04.44.03,2.86-.29,4.35.77,4.74,1.1.22.19.5.3.79.32l1.89.09.1.2c-1.28,1.3-3.2,1.23-3.48,1.22l-2.49-.64c-.32-.08-.67-.04-.96.12-2.32,1.26-7.45.15-9.24-.39-.03,0-.05-.02-.08-.02-3.08-.71-4.96.43-5.57.89-1.04.1-2.02.15-2.91.15-1.85,0-2.88-.22-3.34-.35-.51-.15-1.05.02-1.38.43-.09.1-.17.18-.26.25-.3.12-.94.3-1.55.3-.48,0-.86-.12-1.13-.35-.24-.21-.55-.33-.87-.33-.2,0-.39.04-.58.13-.74.36-1.14.41-1.32.41-.2,0-.26-.05-.3-.08-.04-.03-.07-.08-.1-.16-.25-.6-.91-.93-1.55-.77-.36.09-.65.33-.82.63-.3-.07-.62-.02-.89.12-.52-.05-.93-.18-1.2-.38-.15-.11-.33-.19-.51-.23-.69-.15-1.25-.36-1.62-.62,0,0-.02-.01-.02-.02-.16-.12-.28-.24-.36-.35-.09-.14-.11-.25-.11-.32,0-.24-.07-.48-.2-.69l-.99-1.59c-.18-1.92.79-3.69.91-3.88.06-.1.1-.2.13-.31.66-2.39.86-4.01.59-4.82-.03-.1-.05-.16-.11-.25l-5.82-11.22c-8.41-20.99-1.82-32.7-1.04-33.97.11-.18.18-.38.19-.59.35-4.72,1.62-12.07,1.87-13.49.05-.29,0-.6-.14-.86-.61-1.11-1.13-2.62-1.61-4.39-.27-1.63-.49-3.27-.81-4.89-.26-1.75-.45-3.51-.63-5.28.05-.1.09-.19.14-.29.96-2.56,2.43-5.04,4.37-6.94.82-.36,3.59-1.95,4.85-3.24,2.35-2.62,4.43-5.26,6.2-8.31,1.11-2.18,2.01-4.47,2.87-6.77-.68.98-3.59,5.01-4.21,5.97-1.56,2.91-3.77,5.57-5.93,8.03-1.26,1.24-2.99,2.16-4.66,3.09-1.65,1.53-2.93,3.35-3.9,5.34-.57-7.67-.51-15.41-.29-23.08-.44-3.96-.88-8.26-.76-12.25-.08.14-.15.29-.23.44-1.21,3.83-1.17,8.57-.54,11.88-.26,7.04-.24,14.07.16,21.11.13,1.57.24,3.16.36,4.75-.08.16-.17.31-.25.47-.33.1-.64.28-.8.6-1.2,2.31-3.7,6.53-6.9,8.88-.22.16-.38.38-.46.63-.19.54-1.34,3.35-5.47,5.19-.33.14-.58.41-.7.75-2.25,6.1-6.51,17.01-8.21,19.25-2.12,2.8-5.24,5.83-5.59,6.16-.06.06-.12.13-.17.2-.59.85-5.82,8.44-7.84,12.23-.1.19-.15.4-.15.62v6.6c-.49.88-1.53,2.44-2.48,3.01-.5.3-.74.89-.59,1.46.23.9.86,3.9-.59,5.38l-1.87.95c-1.38-.35-2.87-1.08-3.13-1.78-.01-.03-.02-.07-.03-.14-.08-.61-.57-1.08-1.18-1.13-.48-.04-.92.17-1.19.54-.47-.27-.6-.49-.64-.57-.16-.39-.51-.65-.9-.75-.36-.17-.56-.32-.68-.43-.2-.19-.45-.31-.73-.35-.9-.13-1.28-.39-1.34-.59-.1-.52-.49-.93-1-1.05-.07-.02-.12-.04-.14-.06-.04-.04-.07-.11-.08-.16,1.05-3.02,4-3.19,4.59-3.19.12,0,.24-.02.35-.05.57-.16,1.21-.41,1.97-.77.57-.27.87-.9.72-1.51-.2-.8.71-1.21.99-1.32.25-.09.46-.26.61-.48,1.19-1.69,2.45-5.54,2.45-5.54,1.51-3.96,5.87-24.15,6.2-25.65,2.29-6.38,10.55-14.93,13.17-17.53.21.05.43.06.64,0,.46-.11.82-.45.96-.91.4-1.35.72-2.67.88-3.44.22-.95,1.74-1.04,5.14-5.07.2-.24.27-.54.31-.85.87-5.99,3.08-11.81,3.08-11.81,4.18-12.06,10.12-23.65,10.16-23.71.06-.1.11-.2.14-.31.11-.35.55-5.47,3.15-8.95,2.89-3.85,1.3-15.58,1.3-15.58-.3-1.85-.23-7.33-.8-8.28-.35-.53-1.54-3.66-2.41-10.84-.78-6.5-4.35-9.34-5.06-9.84-.21-.15-.45-.23-.71-.24-4.21-.18-13.76-1.3-15.07-1.45-2.71-.75-11.43-.51-14.06-.41-.17,0-.33.04-.48.11-2.41,1.05-8.19,1.87-10.22,2.09-.03,0-.06,0-.1.01-.56.11-1.32.16-2.24.16-6.94,0-20.7-2.98-22.25-3.32-.26-.06-.54-.03-.79.07l-.59.25c-1.26.54-2.83,1.22-4.04,1.05l-6.42-1.89c-.7-.26-2.54-.9-4.35-1.31-.06-.01-.12-.02-.18-.03-1.61-.14-2.21-.35-2.39-.44-.05-.08-.11-.16-.17-.23.03-.36-.09-.73-.34-1.01-.31-.34-.77-.5-1.22-.41l-.51.1c-.15,0-.27-.01-.36-.02.11-.33.09-.69-.06-1.01-.19-.4-.57-.67-1.01-.73.19-.23.6-.61,1.32-1.01.12-.06.22-.15.31-.24.26-.27,1.49-1.27,6.31-2.64,1.01.15,2.97.51,4.01.7.08.01.15.02.23.02,6.31.04,8.17,1.71,8.48,2.04.26.28.61.43,1.02.42l9.28-.35c2.06-.03,6.41-.64,8.54-1.3,1.92-.6,5.15-.75,5.24-.75,6.78-.07,10.51.71,11.05.83.11.04.19.06.29.09.05.02.09.03.14.04,2.02.69,3.4.66,3.79.63.08,0,.16-.02.24-.05,2.25-.66,4.84-1.14,7.7-1.43.24-.02.43-.14.62-.27,2.27-.19,4.55-.27,6.81-.22,2.9-1.06,5.92-2.22,9.02-2.71,2.91-.5,5.96-.63,8.81.16,1.14.6,2.24.93,3.39,1.26,3.54.78,7.27.51,10.8-.11-1.09,0-2.47-.04-3.56-.12-2.66-.23-5.44-.73-7.99-1.61.39-.17.76-.26,1.16-.28.47-.24,1.05-.46,1.62-.7.64-.29,1.46-.65,2.33-1.07.07,0,.12.03.19.04,2.09-.16,3.25-1.19,3.86-2.03.28-.39.43-.82.59-1.25.8-.94,1.27-1.99,1-3.18-.22.22-.36.35-.51.49-.02-.86-.12-1.55-.16-1.69,0-.01,0-.02,0-.04,0,0,0,0,0-.01-.3-1.18-.32-2.24-.32-2.24,0-.48-.19-.94-.5-1.29.5-1.27.52-2.87-.72-4.18-.1-.11-.24-.23-.37-.31-.02-.01-.51-.35-.52-1.24.02-.15,0-.31-.04-.46.17-.13.29-.33.32-.56.02-.2.18-.58.3-.88.22-.53.41-.99.36-1.43l-.04-.34c0-.11-.04-.21-.09-.31.19-.48.37-1.12.26-2.01.32-.39.49-.88.46-1.39-.06-.96.82-1.32.97-1.38.84-.28,1.39-1.1,1.35-2,0-.08-.01-.16-.03-.23.29-.26.5-.6.58-.98.1-.47.06-.92-.13-1.29.27-.32.93-.75,2.4-.65.8.22,1.61.39,2.39.49,2.03.26,3.93.1,5.45-.44,1.37-.13,2.08.18,2.42.46-.25.41-.33.91-.22,1.44.08.37.28.71.58.97-.01.07-.02.15-.03.22-.06.89.48,1.71,1.31,2.01.18.06,1.06.43,1,1.39-.03.51.13,1,.45,1.39-.16.95-.16,1.83.02,2.62.07.31.19.6.37.86.22.34.44.78.35,1.51-.27.93-.41,1.44-.27,1.75l-.16.79c-.04.07-.07.15-.09.24-.02.09-.02.17,0,.26-.01.06-.02.11-.03.17-.26.36-.55.71-.84,1.03-.38.99-.73,1.99-1.07,2.99-3.12,5.67-6.48,6.37-6.48,6.37.36.02.73.03,1.09.01,2.56-.73,4.39-2.82,6.04-4.84-.04.38-.1.87-.21,1.34-.02.05-.04.1-.06.16,0,.02-.01.04-.02.06-.06.26-.19,1.05-.17,2.01-.35-.27-.69-.54-1.1-.81-.06,1.43.7,2.56,1.74,3.5.14.31.23.63.45.93.61.84,1.77,1.87,4,2.03.04,0,.08-.03.13-.03,1.27.64,2.59,1.23,3.82,1.86-2.69,1-5.65,1.55-8.48,1.79-1.06.08-2.46.11-3.55.12,3.54.62,7.26.89,10.8.11,1.15-.34,2.24-.66,3.39-1.26,2.85-.79,5.9-.66,8.81-.16,3.1.49,6.11,1.65,9.02,2.71,2.69-.06,5.42.03,8.12.32.13.06.24.16.39.17,2.86.29,5.45.78,7.7,1.43.08.02.16.04.24.05.42.04,1.93.11,4.16-.74.5-.12,4.21-.92,11.05-.85.14,0,3.38.16,5.31.75,2.13.66,6.47,1.27,8.5,1.3l9.32.35c.41.01.76-.14,1.02-.42.31-.33,2.17-2,8.48-2.04.08,0,.16,0,.23-.02.48-.09,2.82-.52,4.01-.7,3.92,1.12,5.85,2.1,6.35,2.65.09.11.21.19.33.26.73.41,1.12.79,1.29.98-.44.05-.82.34-1.02.74Z\"/\u003e\n  \u003c/g\u003e\n\u003c/svg\u003e\n        \n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ergo-sum\"\u003eErgo sum\u003c/h2\u003e\n\u003cp\u003e\u0026ldquo;Ergo sum\u0026rdquo; : \u0026ldquo;je suis\u0026rdquo; ; à la base, la citation complète est \u0026ldquo;Cogito Ergo sum\u0026rdquo;… qui une fois traduit signifie : \u0026ldquo;Je pense donc je suis\u0026rdquo; (\u003cem\u003ecitation attribuée au mathématicien, philosophe René Descartes\u003c/em\u003e)\u003c/p\u003e\n\u003cp\u003eCette citation, à laquelle j\u0026rsquo;adhère profondément, résume bien la situation. \u003cbr\u003e\nPersonnellement, j\u0026rsquo;adhère à la démarche. Je ne suis pas contre l\u0026rsquo;IA, l\u0026rsquo;Informatique Automatique existante actuelle — \u003cem\u003equelqu\u0026rsquo;un me crie dans l\u0026rsquo;oreille que la définition de l\u0026rsquo;IA n\u0026rsquo;est pas celà\u003c/em\u003e ! \u003cbr\u003e\nAhhh bon… : Informatique Autonome ? Encore moins… du moins pas actuellement. \u003cbr\u003e\nIntelligence Artificielle. Hummm… où est l\u0026rsquo;intelligence actuellement derrière ce processus informatique ?!\u003c/p\u003e\n\u003cp\u003eLe marché qui lui est artificiellement gonflé au point des impacts non négligeables sur plus d\u0026rsquo;un pan de la société humaine, et pas que matériel ou cognitif, définit l\u0026rsquo;abréviation pour faire assimiler dans la pensée commune, globalisante, ce que n\u0026rsquo;est pas… ce processus informatique.\u003c/p\u003e\n\u003cp\u003eIl n\u0026rsquo;est pas créateur, ni créatif ; oui, il peut aider à la production d\u0026rsquo;œuvres, et parfois sublimant l\u0026rsquo;esprit créatif humain, voire en faisant mieux, mais ce n\u0026rsquo;est pas \u0026ldquo;ex-nihilo\u0026rdquo;, autrement dit, à partir de rien. Il doit être \u0026ldquo;prompté\u0026rdquo;, acté. Ce processus informatique peut faire parfois de belles choses, créé de belles œuvres, mais pas, là encore actuellement, de son propre processus cognitif, car il n\u0026rsquo;en a tout simplement pas.\u003c/p\u003e\n\u003cp\u003eDe même, un auteur qui utilise l\u0026rsquo;IA complètement pour la création totale de son œuvre en faisant croire que c\u0026rsquo;est lui et lui seul qui la crée, est une abérration intellectuelle, une manipulation mensongère. Il est l\u0026rsquo;auteur, certes, mais ce n\u0026rsquo;est pas l\u0026rsquo;IA qui l\u0026rsquo;est. Cacher le fait est de la manipulation intellectuelle. Un processus cognitif malsain ! \u003cbr\u003e\n\u003cem\u003eMais cet aspect est un autre domaine…\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eBref… \u003cbr\u003e\nD\u0026rsquo;où la raison pour laquelle sur mes trois sites, vous retrouverez en bas de page le logo officiel de l\u0026rsquo;association \u0026ldquo;Fabrication Humaine\u0026rdquo; ainsi qu\u0026rsquo;un lien redirigeant vers ladite information officielle.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edoc.huc.fr.eu.org\u003c/li\u003e\n\u003cli\u003ehuc.fr.eu.org\u003c/li\u003e\n\u003cli\u003eebnh.fr.eu.org\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eJe n\u0026rsquo;ai jamais intégré l\u0026rsquo;IA dans mon processus créatif, que ce soit du code informatique, ou du texte, des images ; et je ne compte pas actuellement et dans un futur immédiat, et éloigné, utiliser ce processus informatique autonome.\u003c/p\u003e\n\u003cp\u003eSi je mets plus de temps à définir puis créer ? \u003cbr\u003e\nAssurément, mais cela fait partie du processus créatif humain. Cela fait partie des joies et des frustrations liées au processus cognitif ; l\u0026rsquo;empirisme de celui-ci m\u0026rsquo;importe, m\u0026rsquo;apporte ces sentiments nécessaires… cette onde pulsée, nourrie de l\u0026rsquo;être que je suis, qui s\u0026rsquo;abreuve de l\u0026rsquo;entourage proche, éloigné, des ressentis, du moment, de ce qui m\u0026rsquo;influence et que je ne peux pas analyser, de ce que je suis capable d\u0026rsquo;analyser, des influences que j\u0026rsquo;accepte, celles que je rejette, de manière innée ou acquise. \u003cbr\u003e\nBref… tout ce que je suis.\u003c/p\u003e\n\u003cp\u003eNous en avons besoin !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eD\u0026rsquo;ailleurs, d\u0026rsquo;un point de vue code informatique, depuis moults mois, sur les deux premiers sites cités de mon cru, les yeux les plus avertis auront remarqué le \u0026ldquo;bandeau défilant\u0026rdquo; en haut à droite, et la mention en bas de page \u0026ldquo;0% IA ; 100% humain\u0026rdquo; qui l\u0026rsquo;écho de la valeur réelle, véritable de mon processus créatif auxquels je croie instinctivement. \u003cbr\u003e\nJe n\u0026rsquo;ai pas la prétention de dire que mes œuvres sont du meilleur cru, ce n\u0026rsquo;est ni la lie, ni la crème de la production humaine ; c\u0026rsquo;est ni plus ni moins, l\u0026rsquo;expression de mon processus cognitif créatif. C\u0026rsquo;est tout ce qui importe, du moins m\u0026rsquo;importe !\u003c/p\u003e\n\u003cp\u003eDe même, pour ceux qui ne les auraient pas remarqués… c\u0026rsquo;est voulu, c\u0026rsquo;est mon fait exprès, car je n\u0026rsquo;estime pas cela primordial, nécessaire mais pas hautement important ; cette mention n\u0026rsquo;a pas à avoir la primauté de l\u0026rsquo;information. C\u0026rsquo;est une \u0026ldquo;définition\u0026rdquo;, mais pas l\u0026rsquo;essence même de l\u0026rsquo;œuvre.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u0026ldquo;À bon entendeur…\u0026rdquo; \u003cbr\u003e\nVoilà !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eStéphane Bortmeyer, qui a repoueté @Aemarielle : \u003ca href=\"https://framapiaf.org/@aemarielle@piaille.fr/116922163418422789\" rel=\"external\"\u003ehttps://framapiaf.org/@aemarielle@piaille.fr/116922163418422789\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eGerman Huc, l\u0026rsquo;auteur de l\u0026rsquo;article \u003ca href=\"https://decaille-deplume.fr/le-serpent-a-plume-adhere-au-label-frabrication-humaine/\" rel=\"external\"\u003e\u003cstrong\u003eLe Serpent à Plume adhère au label Frabrication Humaine\u003c/strong\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","summary":"'Fabrication humaine' est le slogan d'une génération de créateurs… humains ; leur propos étant la valorisation de l'œuvre humaine. ","date_published":"2026-07-15T14:41:28+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-06-13:/fr/post/linux-elite-dangerous/#c83375269a8ebbef88cc9ed982365bff9f045136ead3623abfa2a5d3e33b0c18","url":"https://it-log.fr.eu.org/fr/post/linux-elite-dangerous/","title":"(Linux) Elite Dangerous : des outils complémentaires","author":{"name":"Stéphane HUC"},"content_text":"Description Environnement : Steam / Debian Sid / Xfce Jeu : Elite Dangerous ; DLC : Odyssey Compatibilité : aucun outil de compatibilité Steam Play spécifique ; néanmoins ED fonctionne très bien avec les versions 9.0.4, 10.0-4 mais ne fonctionne pas avec les versions supérieures. o7, CMDR : Le jeu est fonctionnel sans soucis particulier…\nConfiguration Dossier d\u0026rsquo;installation du jeu : steam/steamapps/common/Elite Dangerous/ ; celui-ci se trouve facilement dans Steam, clic D sur le jeu, puis \u0026ldquo;Propriétés\u0026rdquo; ; menu \u0026ldquo;Fichiers installés \u0026quot; ; puis clic sur le bouton [ Parcourir… ] qui ouvrira le répertoire en question.\nChemin vers le binaire EliteDangerous64.exe : steam/steamapps/common/Elite Dangerous/Products/elite-dangerous-odyssey-64/\nDossier des données \u0026ldquo;windows\u0026rdquo; du jeu : steam/steamapps/compatdata/359320/pfx/drive_c/users/steamuser/AppData/Local/Frontier Developments/Elite Dangerous/\nDossier de sauvegarde du jeu : steam/steamapps/compatdata/359320/pfx/drive_c/users/steamuser/Saved Games/Frontier Developments/Elite Dangerous/\nKeybinding Configurer la gestion des touches clavier n\u0026rsquo;est pas une partie de plaisirs.\nIl faut créer un répertoire nommé \u0026ldquo;Bindings\u0026rdquo; dans le sous-répertoire \u0026ldquo;Options\u0026rdquo; du dossier des données \u0026ldquo;windows\u0026rdquo; du jeu, tel que : steam/steamapps/compatdata/359320/pfx/drive_c/users/steamuser/AppData/Local/Frontier Developments/Elite Dangerous/Options/Bindings/.\n⇒ Des profils sont disponibles principalement sur EDRefCard.\nVoici ma version : Custom.4.2.binds ; enlevez l\u0026rsquo;extension .txt ;)\nRelancez le jeu et changez le profil dans les Options du jeu \u0026gt; Commandes ; puis choisir de modifier les pré-réglages. Raccourci bureau Steam Il est possible que Steam ait créé un lanceur de bureau du jeu ; mais dans les faits, cela ne fonctionnera pas.\nFaites un clic droit sur le lanceur pour \u0026ldquo;Modifier le lanceur\u0026rdquo;, puis dans le champ \u0026ldquo;Commande\u0026rdquo;, remplissez le chemin absolu vers l\u0026rsquo;exécutable Steam, tel que (sous Debian) : /usr/games/steam steam://…\nPour trouver où se situe le chemin absolu vers le binaire Steam, dans une console, exécutez la commande suivante :\n:$ command -v steam Cette modification étant faite, le lanceur bureau lancera bel et bien le jeu.\nAutorisations d\u0026rsquo;exécution Il faut autoriser le fichier à être exécuté comme un fichier .desktop.\nSi lors du premier lancement, vous avez refusé, ce n\u0026rsquo;est pas grave ; faites un clic droit sur le lanceur :\nchoisissez \u0026ldquo;Propriétés…\u0026rdquo;,\npuis cliquez sur l\u0026rsquo;onglet \u0026ldquo;Lanceur\u0026rdquo; et dans la section \u0026ldquo;Sécurité\u0026rdquo;, cliquez sur les cases à cocher devant :\nAutoriser ce fichier à être exécuté comme un fichier .desktop Définir ce fichier comme approuvé Outils Tous les outils ci-dessous fonctionnent sous Linux, moyennant certaines configurations.\nCe n\u0026rsquo;est pas pour autant qu\u0026rsquo;il faut tous les installer ; quoiqu\u0026rsquo;il en soit, veiller à ce que soit un seul outil qui fasse les remonter des journaux auprès des différents sites, (Inara, EDSM, etc), tel EDMarketConnector ou EDDiscovery par exemple.\nPour certains, l\u0026rsquo;utilisation de l\u0026rsquo;outil protontricks sera nécessaire ; heureusement dans bien des distributions, dont Debian, il est fourni en tant que paquet ; installez-le !\nEDHM-UI EDHM-UI v3 est un outil pour modifier l\u0026rsquo;interface graphique.\nSite officiel : https://bluemystical.github.io/edhm-api/\nDepôt : https://github.com/BlueMystical/EDHM_UI\nVersion testée : 3.0.67, 3.0.70\nUne fois installé :\nFichiers de configuration : $HOME/.local/share/EDHM-UI-V3/ Dans le dépôt, il faut aller sur la section Release puis télécharger :\nl\u0026rsquo;archive edhm-ui-v3-linux-x64.zip le script shell linux_installer.sh Une fois l\u0026rsquo;archive téléchargée, décompressez-la et copiez dedans le script installer. Donnez des droits d\u0026rsquo;exécution au script et exécutez-le.\nL\u0026rsquo;outil est accessible depuis le menu système ; avec Xfce, dans le menu \u0026ldquo;Accessoires\u0026rdquo;.\nPar défaut, l\u0026rsquo;outil cherche à communiquer avec le jeu pour le paramétrage correct ; il faut restituer le chemin absolu du répertoire \u0026ldquo;elite-dangerous-odyssey-64\u0026rdquo; ; si vous avez loupé quelque chose dans l\u0026rsquo;étape, choississez le menu \u0026ldquo;Main menu\u0026rdquo; \u0026gt; \u0026ldquo;Settings\u0026rdquo;.\nEDMarketConnector EDMarketConnector est un outil python pour \u0026ldquo;améliorer\u0026rdquo; le commerce dans Elite Dangerous, principalement, bien qu\u0026rsquo;il soit à-même d\u0026rsquo;utiliser des fonctionnalités secondaires au-travers de plugins.\nDeux versions existent : une via flatpak, et l\u0026rsquo;autre au-travers des sources du dépôt.\nDepôt : https://github.com/EDCD/EDMarketConnector\nVersion testée : 6.1.2\nFichiers de configuration :\nvia flatpak : $HOME/.var/app/io.edcd.EDMarketConnector/ via git : $HOME/.local/share/EDMarketConnector/ Le fichier de configuration principal : config.toml.\n⇒ L\u0026rsquo;installation depuis les sources se fait assez facilement :\n:$ git clone https://github.com/EDCD/EDMarketConnector.git :$ cd EDMarketConnector EDMarketConnector :$ python3 -m venv venv EDMarketConnector :$ source venv/bin/activate EDMarketConnector :$ pip3 install -r requirements.txt EDMarketConnector :$ python3 EDMarketConnector.py Étant donné que l\u0026rsquo;outil doit être lancé dans un environnement python, je me suis créé un lanceur shell :\n#!/bin/bash dir=\u0026#34;~/Games/EDMarketConnector/\u0026#34; cd \u0026#34;${dir}\u0026#34; source venv/bin/activate python3 EDMarketConnector.py Puis un lanceur de bureau qui pointe vers le script shell, tout en paramètrant l\u0026rsquo;icône avec celle de l\u0026rsquo;outil qui se trouve à la racine. (Bien choisir \u0026ldquo;Fichiers images\u0026rdquo;). Si l\u0026rsquo;icône n\u0026rsquo;est pas dans l\u0026rsquo;archive, vous la trouverez dans le dépôt.\nPS : Personnellement, j\u0026rsquo;utilise la version flatpak, car c\u0026rsquo;est la plus simple à utiliser.\nLes plugins fonctionnels - que j\u0026rsquo;utilise… : ⇒ BGS-Tally\n⇒ cargo-manifest : il semble nécessaire de modifier le nom du répertoire principal ; de cargo-manifest en cargo_manifest. Avec cette légère modification, le plugin est fonctionnel !\n⇒ docking-denied-raison\n⇒ EDMC-Bioscan nécessite ExploData qui nécessite sqlalchemy.\nSi vous utilisez la version flatpak d\u0026rsquo;EDMC, téléchargez la version nommée ExploData-***-db-***-flatpak.zip car elle embarque sqlalchemy.\nSi vous utilisez la version du dépôt d\u0026rsquo;EDMC, il vous faudra installer slqalchemy dans l\u0026rsquo;environnement python3 dédié !\n⇒ EDMCHotKeys\n⇒ EDMCModerOverlay\n⇒ EDMC-NavRoute\n⇒ EDMC-NeutronDancer\n⇒ EDMC-Pioneer\n⇒ EDMC-Screenshot-Linux\n⇒ UpdateTD\nD\u0026rsquo;autres plugins existent ; ils devraient fonctionner…\nEDDiscovery EDDiscovery est un tableau de bord complet pour gérer tous les aspects qu\u0026rsquo;offre le jeu.\nDépôt : https://github.com/EDDiscovery/EDDiscovery/\nVersion testée : 19.1.9.0\nSteam:\noption de compatibilité forcée : Proton 9.0-4 option de lancement : aucune Depuis la section \u0026lsquo;Release\u0026rsquo; du dépôt, téléchargez l\u0026rsquo;archive Portable zip ; décompressez-la où vous le voulez.\nDans Steam :\ncliquez sur le menu \u0026ldquo;Jeux\u0026rdquo; \u0026gt; \u0026ldquo;Ajouter un jeu nom Steam à ma bibliothèque…\u0026rdquo;, choisissez le binaire EDDiscovery.exe qui se trouve dans l\u0026rsquo;archive décompressée. clic droit pour avec les propriétés du \u0026ldquo;jeu\u0026rdquo;, et forcez la compatibilité - actuellement, j\u0026rsquo;utilise la version \u0026ldquo;Proton 9.0-4\u0026rdquo;. clic droit à nouveau pour le menu \u0026ldquo;Gérer\u0026rdquo; \u0026gt; \u0026ldquo;Créer un raccourci sur le bureau\u0026rdquo;. Toutes les remarques faites dans le chapitre Raccourci bureau Steam sont à effectuer !\nUne fois EDD ouvert, allez sur l\u0026rsquo;onglet \u0026ldquo;Paramètres\u0026rdquo; :\nDans la section \u0026ldquo;Paramètres\u0026rdquo;, cliquer sur le bouton [ Ajouter ], une nouvelle fenêtre s\u0026rsquo;ouvre nommée \u0026ldquo;CommanderForm\u0026rdquo;. Dans la section \u0026ldquo;Information du journal\u0026rdquo; : Écrivez le nom de votre Commandeur, dans le champ \u0026ldquo;Nom du commandant\u0026rdquo; cliquer sur le bouton [ Parcourir ] pour aller sélectionner le répertoire de sauvegarde du jeu. faites toute autre configuration désirée cliquer sur le bouton [ OK ] pour valider la configuration. supprimer le profil nommé \u0026ldquo;Jameson (Default)\u0026rdquo;. Revenez sur l\u0026rsquo;onglet \u0026ldquo;History\u0026rdquo;, vous retrouverez la remontée d\u0026rsquo;informations lié au commandeur utilisé dans le jeu.\nPour pouvoir paramètrer les icônes, et du lanceur de bureau, et dans l\u0026rsquo;app Steam, il faut décompresser l\u0026rsquo;archive eddwebsite.zip situé à la racine de l\u0026rsquo;archive Portable. L\u0026rsquo;image à utiliser principalement est dans le sous-répertoire \u0026ldquo;Images\u0026rdquo; et se nomme \u0026ldquo;EdLogo600.png\u0026rdquo;.\nNote : Certains plugins, tels ceux pour afficher les sites Inara, EDSM ne fonctionnent pas car il manque un outil nommé WebView2.\nElite Dangerous Monitor Daemon Elite Dangerous Monitor Daemon alias EDMD est un autre tableau de bord complet pour monitorer en temps réel la session de jeu, fait pour Linux nativement (interface GTK4, CLI).\nDépôt : https://github.com/Maldor/EDMD Une fois installé :\nFichiers de configuration : $HOME/.config/EDMD/config.toml ED Odyssey Materials Helper Elite Dangerous Odyssey Materials Helper est L\u0026rsquo;outil qui révolutionne l\u0026rsquo;acquisition des matériaux nécessaires dans les relations avec les ingénieurs. Il vous montre ce que vous avez, ce qui vous manque, la relation avec tel ingénieur, et bien plus encore…\nSite web : https://edomh.nl/ Dépôt : https://github.com/jixxed/ed-odyssey-materials-helper/ Discord: https://discord.gg/M8Rgz4AmmA Version testée : 3.13.8, 3.13.12 Depuis la section \u0026lsquo;Release\u0026rsquo;, téléchargez à minima l\u0026rsquo;archive zip, mais préfèrez la version auto-updater du paquet .deb, .rpm.\nDepuis le binaire, tout s\u0026rsquo;installe dans le système où il le faut et devient accessible depuis le menu système ; sous Xfce, menu \u0026ldquo;Autres\u0026rdquo; \u0026gt; \u0026ldquo;Elite Dangerous Odyssey Materials Helper\u0026rdquo;.\nUne fois l\u0026rsquo;application ouverte, :\ncliquez sur le menu \u0026ldquo;Settings\u0026rdquo; puis concernant la ligne \u0026ldquo;Journal Folder\u0026rdquo;, cliquez sur le bouton [ Select Directory ] et allez choisir le chemin absolu lié au répertoire de sauvegarde du jeu. Ensuite, faites toutes les autres configurations, tel la langue, puis utilisez l\u0026rsquo;outil.\nMin ED Launcher Min ED Launcher n\u0026rsquo;est pas un outil à proprement parler. Il remplace le lanceur officiel, tout en étant très léger, ce qui est pratique sous Linux, et a d\u0026rsquo;autres aspects pratiques, dont l\u0026rsquo;exécution d\u0026rsquo;outil tiers, tel SRVSurvey.\nDépôt : https://github.com/Rfvgyhn/min-ed-launcher/\nVersion testée : 0.13.0\nSteam :\noption de compatibilité forcée : aucune option de lancement : oui ; lire les explications ci-dessous. Une fois installé :\nFichier de configuration : $HOME/.config/min-ed-launcher/settings.json Journaux : $HOME/.local/state/min-ed-launcher/min-ed-launcher.log Depuis la section \u0026lsquo;Release\u0026rsquo;, téléchargez l\u0026rsquo;archive zip pour Linux, puis décompressez-la.\nCopiez le binaire MinEdLauncher dans le dossier d\u0026rsquo;installation du jeu ED. ⇒ Dans Steam :\nfaites un clic droit pour ouvrir les propriétés du jeu dans les options de lancement, écrivez à minima : Pour Gnome : gnome-terminal -- ./MinEdLauncher %command% /autorun /autoquit \\ ce qui fonctionne pour moi : gnome-terminal --hide-menubar -t \u0026quot;Min ED Launcher\u0026quot; -- ./MinEdLauncher %command% /autorun /autoquit waitForExit fonctionnel aussi sous Xfce4 ! Pour Xfce4 : xfce4-terminal --disable-server -x ./MinEdLauncher %command% /autorun /autoquit waitForExit ce que j\u0026rsquo;utilise : xfce4-terminal --disable-server --hide-menubar --hide-scrollbar --hide-toolbar -T \u0026quot;Min ED Launcher\u0026quot; -x ./MinEdLauncher %command% /autorun /autoquit waitForExit (Il est possible d\u0026rsquo;utiliser d\u0026rsquo;autre terminal dans les options de lancement ; merci de lire les infos du dépôt).\n⇒ Dans l\u0026rsquo;archive, il est fourni un lanceur de bureau et une icône. Il est possible de copier le lanceur de bureau sur votre bureau. Puis faites un clic droit pour modifier la commande, tel que : /usr/games/steam steam://rungameid/359320 /edo Ce qui exécutera le lancement de la version Odyssey du jeu directement.\n⇒ Toutes les remarques faites dans le chapitre Raccourci bureau Steam sont à effectuer !\n⇒ Il est impératif que les options de lancement soient écrites dans les propriétés général du jeu ; cf ci-dessus !\nNote :\nIl est important que les deux couches réseaux IPv4 ET IPv6 soient fonctionnelles, autrement cela ne fonctionnera pas. OD Explorer OD Explorer est vraiment LE companion à Elite Dangerous, pour nous aider dans l\u0026rsquo;exploration et la recherche exobiologie.\nNote : Cet outil est conçu pour bien fonctionner avec la langue anglaise du jeu Elite Dangerous, dans les autres langues du jeu, il ne sera pas capable de tout faire remonter correctement. Mais si vous comprenez assez bien la langue anglaise : \u0026ldquo;go!\u0026rdquo;\nDepôt : https://github.com/WarmedxMints/OD-Explorer\nVersion testée : 2.0.14, 2.0.15\nSteam :\noption de compatibilité forcée : Proton 9.0-4 option de lancement : aucune Le Logo est disponible depuis le dépôt dans le sous-répertoire Resources/ et se nomme Astronaut.png.\nDepuis la section \u0026lsquo;Release\u0026rsquo; du dépôt, téléchargez la version ODExplorer-Portable.zip.\nDécompressez-la, de telle manière par exemple à l\u0026rsquo;avoir : ~/Games/ODExplorer-Portable\nEnsuite, il faut utiliser l\u0026rsquo;outil protontricks.\nCeci étant fait, dans Steam :\ncliquez sur le menu \u0026ldquo;Jeux\u0026rdquo; \u0026gt; \u0026ldquo;Ajouter un jeu nom Steam à ma bibliothèque…\u0026rdquo;. clic droit pour avec les propriétés du \u0026ldquo;jeu\u0026rdquo;, et forcez la compatibilité - actuellement, j\u0026rsquo;utilise la version \u0026ldquo;Proton 9.0-4\u0026rdquo;. Cliquez sur le bouton [ Jouer ]…\nLors du premier lancement, une fenêtre va s\u0026rsquo;ouvrir demandant l\u0026rsquo;installation du \u0026ldquo;runtime v8.0\u0026rdquo; de Microsoft Windows. Refusez !\nEnsuite, ouvrez le runtime avec Protontricks et ciblez \u0026ldquo;Non-Steam shortcut: ODExplorer.exe: …\u0026rdquo;, pour installer à terme le composant dotnetdesktop8.\nUne fois l\u0026rsquo;installation terminée, avant d\u0026rsquo;exécuter à nouveau le binaire depuis Steam, faites un clic droit à nouveau puis choisissez le menu \u0026ldquo;Gérer\u0026rdquo; \u0026gt; \u0026ldquo;Créer un raccourci sur le bureau\u0026rdquo;.\nLes remarques faites pour le raccourci bureau Steam du jeu sont exactement les mêmes pour ce raccourci ; donc faites les mêmes modifications.\nPS: Bien que nous ayons mono installable sous Linux, l\u0026rsquo;utilisation de mono ODExplorer.exe ne fonctionne pas.\nSRV Survey SRV Survey est un compagnon utile d\u0026rsquo;assistance en affichant des données à l\u0026rsquo;écran du jeu, pendant une session de jeu ; il est utile pour les scans organiques lors de l\u0026rsquo;exploration, pour traquer la position du joueur, et utile sur les sites des \u0026ldquo;Guardians\u0026rdquo;.\nDepôt : https://github.com/njthomson/SrvSurvey Version testée : 2.0.95.23 Voici le mode opératoire pour faire fonctionner cet outil :\nMin ED Launcher est nécessaire puis l\u0026rsquo;installation de SRV Survey, et d\u0026rsquo;un script complémentaire puis l\u0026rsquo;utilisation de protontricks. ⇒ 1. Téléchargez l\u0026rsquo;archive zip depuis la section \u0026ldquo;Releases\u0026rdquo;, actuellement la version 2.0.95.23.\nDécompresser l\u0026rsquo;archive Dirigez vous vers le répertoire \u0026ldquo;Application Files\u0026rdquo; Copier le répertoire nommé SrvSurvey_numero-version dans le répertoire d\u0026rsquo;installation du jeu ED Renommer le répertoire en SrvSurvey, pour simplifier la configuration. Télécharger le script shell SRV_Survey.sh, fourni par Maldor, l\u0026rsquo;auteur d\u0026rsquo;EDMD. Modifier le script shell SRV_Survey.sh et copier le dans le répertoire \u0026ldquo;SrvSurvey\u0026rdquo;, précédemment copié, renommé dans le répertoire d\u0026rsquo;installation du jeu. ⇒ Concernant Min ED Launcher : quelque soit votre configuration, il faut rajouter une déclaration de processus ; modifiez la clé processes pour ajouter une déclaration similaire :\n\u0026#34;processes\u0026#34;: [ { \u0026#34;fileName\u0026#34;: \u0026#34;/home/userid/.local/share/steam/steamapps/common/Elite Dangerous/SrvSurvey/SRV_Survey.sh\u0026#34; } ], Modifiez impérativement et littéralement l\u0026rsquo;écriture de \u0026ldquo;/home/userid\u0026rdquo; par votre propre chemin personnel !\n⇒ SRV Survey nécessite l\u0026rsquo;installation du Windows Desktop Runtime 9.0 pour fonctionner. C\u0026rsquo;est là qu\u0026rsquo;intervient l\u0026rsquo;usage de l\u0026rsquo;outil protontricks :\nune fois protontricks exécuté :\nsélectionnez la ligne correspondant au jeu \u0026ldquo;Elite Dangerous : 359320\u0026rdquo;, puis cliquez sur le bouton [ Valider ]. différentes fenêtres de messages d\u0026rsquo;erreurs relatifs à winetricks apparaissent, cliquez sur [ Valider ].\nla fenêtre \u0026ldquo;Winetricks - choose a wineprefix\u0026rdquo; finit par apparaître : sélectionnez, si ce n\u0026rsquo;est pas le cas, le choix \u0026ldquo;( ) Select the default wineprefix\u0026rdquo;, puis cliquez sur le bouton [ Valider ]. la fenêtre \u0026ldquo;Winetricks - current prefix\u0026rdquo; s\u0026rsquo;ouvre, choisissez \u0026ldquo;( ) Install a Windows DLL or component\u0026rdquo;, puis cliquez sur le bouton [ Valider ]. une nouvelle fenêtre \u0026ldquo;Winetricks - current prefix\u0026rdquo; s\u0026rsquo;ouvre et demande quel paquet est à installer ; faites défiler jusqu\u0026rsquo;à trouver le choix \u0026ldquo;[ ] dotnetdesktop9 MS .NET Desktop Runtime 9.0 LTS\u0026rdquo;, puis cliquez sur le bouton [ Valider ]. Une fois installé, cliquez sur les boutons [ Annuler ] jusqu\u0026rsquo;à ce que l\u0026rsquo;outil protontricks se ferme.\n⇒ Si SRV_Survey ne se lance pas réellement, alors que Min Ed Launcher informe qu\u0026rsquo;il le lance, merci de lire cette section : Proton version\nAvec toutes ces modifications, SRV Survey devrait enfin fonctionner !\nGardez à l\u0026rsquo;esprit que certaines fonctionnalités pourraient planter le logiciel. Si c\u0026rsquo;est le cas, fermez le jeu, et relancez-le pour que Min ED Launcher ouvre à nouveau les deux applications.\nRemerciements :\nhttps://github.com/njthomson/SrvSurvey/discussions/524 Squadron Manager Squadron Manager est l\u0026rsquo;outil pour gérer son escadron ou participer à un escadron. Il est possible de faire fonctionner l\u0026rsquo;application Windows sous Linux, par le biais de protontricks et de Steam.\nIl est nécessaire de s\u0026rsquo;être inscrit sur le site web d\u0026rsquo;abord !\nDepôt : https://github.com/SquadronManager/App/\nLogo : https://squadronmanager.comtac-fr.space/logos/logo2.png\nSite : https://squadronmanager.comtac-fr.space/\nVersion testée : 3.5.6\nSteam:\noption de compatibilité forcée : Proton 9.0-4 option de lancement : aucune Une fois, téléchargée, cliquez sur l\u0026rsquo;exécutable pour le lancer avec protontricks.\nDonnez-lui le préfixe wine relatif à Elite Dangerous Finissez l\u0026rsquo;installation. Le répertoire d\u0026rsquo;installation se trouve être dans : steamapps/compatdata/359320/pfx/drive_c/users/steamuser/AppData/Local/Programs/Squadron Manager/\n⇒ Ouvrez Steam pour exécuter le binaire Squadron Manager.exe en tant que jeu non Steam, puis dans les propriétés de configuration, forcez la compatibilité.\nPuis, clic droit sur le binaire dans Steam \u0026gt; Gérer \u0026gt; Créer un raccourci sur le bureau, pour créer le lanceur de bureau.\nIl est nécessaire de faire les modifications mentionnées dans le chapitre Raccourci bureau Steam. Pour l\u0026rsquo;icône, copiez celle du site web dont l\u0026rsquo;URL est donnée ci-dessus.\nIl semble nécessaire d\u0026rsquo;installer un outil tiers, en Python, à EDMC, qui se nomme Michelle pour communiquer correctement entre ces deux applications.\nDépôt : https://github.com/taloche1/Michelle/ Version testée : 3.86 à installer dans le répertoire plugins d\u0026rsquo;EDMC.\nElite Intel Elite Intel est un assistant IA Vocal dédié à Elite Dangerous, basé sur le modèle NVIDIA Parakeet, et utilisant au choix localement ou à distance différents LLM.\nversion actuelle : 1.0\nrecommandation matérielle GPU : 12 Go VRAM minimum\nsite officiel : https://www.elite-intel.org/fr/index.html\nDépôt : https://github.com/SudoKrondor/EliteIntel\nDépannage Proton version ⇒ Une mention à-propos de SRV_Survey et de la version de Proton :\nNote : Attention à la version de Proton, veillez à bien utiliser celle détectée par l\u0026rsquo;outil Min ED Launcher, qui utilise celle d\u0026rsquo;ED.\nSRV_Survey doit fonctionner avec la même version de Proton que celle d\u0026rsquo;ED, si ce n\u0026rsquo;est pas le cas, il ne sera pas lancé…\nScript SRV_Survey.sh modifié : #!/bin/bash sleep 10s export STEAM_COMPAT_DATA_PATH=\u0026#34;$HOME/.steam/steam/steamapps/compatdata/359320\u0026#34; export STEAM_COMPAT_CLIENT_INSTALL_PATH=\u0026#34;$HOME/.steam/steam\u0026#34; \u0026#34;$HOME/.steam/steam/steamapps/common/Proton - Experimental/proton\u0026#34; run $HOME/steam/steamapps/common/Elite Dangerous/SrvSurvey/SRV_survey/SrvSurvey.exe Dans mon cas, j\u0026rsquo;ai dû changer la ligne d\u0026rsquo;appel au binaire proton, tel que : \u0026quot;$HOME/.steam/steam/steamapps/common/Proton 9.0 (Beta)/proton\u0026quot;\nAutrement, il se pourrait que Min ED Launcher affirme lancer correctement le script SRV_Survey.sh mais que le binaire ne soit pas exécuté vraiment.\nLe journal de Min ED Launcher informe dès le début quels arguments il utilise, tel que :\n---------- 2026-06-21 11:38:57.294 +02:00 [INF] Elite Dangerous: Minimal Launcher - v0.13.0+6e50d0e0 2026-06-21 11:38:57.385 +02:00 [DBG] Args: [|\u0026#34;/home/myusername/.steam/debian-installation/ubuntu12_32/steam-launch-wrapper\u0026#34;; \u0026#34;--\u0026#34;; \u0026#34;/home/myusername/.steam/debian-installation/ubuntu12_32/reaper\u0026#34;; \u0026#34;SteamLaunch\u0026#34;; \u0026#34;AppId=359320\u0026#34;; \u0026#34;--\u0026#34;; \u0026#34;/home/myusername/.steam/debian-installation/steamapps/common/SteamLinuxRuntime_sniper/_v2-entry-point\u0026#34;; \u0026#34;--verb=waitforexitandrun\u0026#34;; \u0026#34;--\u0026#34;; \u0026#34;/home/myusername/Games/Steam/steamapps/common/Proton 9.0 (Beta)/proton\u0026#34;; \u0026#34;waitforexitandrun\u0026#34;; \u0026#34;/run/media/myusername/games/SteamLibrary/steamapps/common/Elite Dangerous/EDLaunch.exe\u0026#34;; \u0026#34;/Steam\u0026#34;; \u0026#34;/novr\u0026#34;; \u0026#34;/autorun\u0026#34;; \u0026#34;/autoquit\u0026#34;; \u0026#34;waitForExit\u0026#34;|] OS: Linux64 Env: STEAM_COMPAT_DATA_PATH=/run/media/myusername/games/SteamLibrary/steamapps/compatdata/359320 (…) cf la sixième ligne… \u0026quot;/home/myusername/Games/Steam/steamapps/common/Proton 9.0 (Beta)/proton\u0026quot;; ;-)\nParce que ED est lancée avec cette version (nativement) !\nNo such file or directory ⇒ Une mention à-propos de SRV_Survey et Min Ed Launcher :\nSi dans le fichier journal de Min Ed Launcher, vous lisez le genre d\u0026rsquo;erreur suivant : 2026-08-01 21:07:05.623 -05:00 [INF] Starting process $HOME/.steam/steam/steamapps/common/Elite Dangerous/SrvSurvey/SRV_Survey.sh 2026-08-01 21:07:05.629 -05:00 [FTL] Unable to start process $HOME/.steam/steam/steamapps/common/Elite Dangerous/SrvSurvey/SRV_Survey.sh HRESULT: 0x80004005 Win32 Error Code: 2\nSystem.ComponentModel.Win32Exception (2): ErrorStartingProcess, $HOME/.steam/steam/steamapps/common/Elite Dangerous/SrvSurvey/SRV_Survey.sh, $HOME/.steam/steam/steamapps/common/Elite Dangerous/SrvSurvey, No such file or directory\nCorrigez le fichier JSON de configuration de Min Ed Launcher. Très certainement, vous avez écrit littéralement $HOME dans celui-ci ; or $HOME est une variable shell, JSON ne sait pas quoi en faire, comment l\u0026rsquo;utiliser !\nModifiez pour écrire littéralement le chemin de votre répertoire personnel, tel que /home/michael. (seulement dans le fichier de configuration JSON)\nEOF Voilà !\n\u0026ldquo;Fly safe, or fly trouble… it\u0026rsquo;s up to you! or not…\u0026rdquo; o7\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEnvironnement : Steam / Debian Sid / Xfce\u003c/li\u003e\n\u003cli\u003eJeu : Elite Dangerous ; DLC : Odyssey\u003c/li\u003e\n\u003cli\u003eCompatibilité : aucun outil de compatibilité Steam Play spécifique ; \u003cem\u003enéanmoins ED fonctionne très bien avec les versions 9.0.4, 10.0-4 mais ne fonctionne pas avec les versions supérieures\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eo7, CMDR : Le jeu est fonctionnel sans soucis particulier…\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDossier d\u0026rsquo;installation du jeu : \u003ccode\u003esteam/steamapps/common/Elite Dangerous/\u003c/code\u003e ; \u003cem\u003ecelui-ci se trouve facilement dans Steam, clic D sur le jeu, puis \u0026ldquo;Propriétés\u0026rdquo; ; menu \u0026ldquo;Fichiers installés \u0026quot; ; puis clic sur le bouton [ Parcourir… ] qui ouvrira le répertoire en question\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChemin vers le binaire \u003ccode\u003eEliteDangerous64.exe\u003c/code\u003e : \u003ccode\u003esteam/steamapps/common/Elite Dangerous/Products/elite-dangerous-odyssey-64/\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDossier des données \u0026ldquo;windows\u0026rdquo; du jeu : \u003ccode\u003esteam/steamapps/compatdata/359320/pfx/drive_c/users/steamuser/AppData/Local/Frontier Developments/Elite Dangerous/\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDossier de sauvegarde du jeu : \u003ccode\u003esteam/steamapps/compatdata/359320/pfx/drive_c/users/steamuser/Saved Games/Frontier Developments/Elite Dangerous/\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"keybinding\"\u003eKeybinding\u003c/h3\u003e\n\u003cp\u003eConfigurer la gestion des touches clavier n\u0026rsquo;est pas une partie de plaisirs.\u003c/p\u003e\n\u003cp\u003eIl faut créer un répertoire nommé \u0026ldquo;Bindings\u0026rdquo; dans le sous-répertoire \u0026ldquo;Options\u0026rdquo; du dossier des données \u0026ldquo;windows\u0026rdquo; du jeu, tel que : \u003cbr\u003e\n\u003ccode\u003esteam/steamapps/compatdata/359320/pfx/drive_c/users/steamuser/AppData/Local/Frontier Developments/Elite Dangerous/Options/Bindings/\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Des profils sont disponibles principalement sur \u003ca href=\"https://edrefcard.info/\" rel=\"external\"\u003eEDRefCard\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eVoici ma version : \u003ca href=\"/share/Custom.4.2.binds.txt\"\u003eCustom.4.2.binds\u003c/a\u003e ; enlevez l\u0026rsquo;extension \u003ccode\u003e.txt\u003c/code\u003e ;)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRelancez le jeu et changez le profil dans les Options du jeu \u0026gt; Commandes ; puis choisir de modifier les pré-réglages.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"raccourci-bureau-steam\"\u003eRaccourci bureau Steam\u003c/h3\u003e\n\u003cp\u003eIl est possible que Steam ait créé un lanceur de bureau du jeu ; mais dans les faits, cela ne fonctionnera pas.\u003c/p\u003e\n\u003cp\u003eFaites un clic droit sur le lanceur pour \u0026ldquo;Modifier le lanceur\u0026rdquo;, puis dans le champ \u0026ldquo;Commande\u0026rdquo;, remplissez le chemin absolu vers l\u0026rsquo;exécutable Steam, tel que (sous Debian) : \u003cbr\u003e\n\u003ccode\u003e/usr/games/steam steam://…\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour trouver où se situe le chemin absolu vers le binaire Steam, dans une console, exécutez la commande suivante :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ command -v steam\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCette modification étant faite, le lanceur bureau lancera bel et bien le jeu.\u003c/p\u003e\n\u003ch3 id=\"autorisations-dexécution\"\u003eAutorisations d\u0026rsquo;exécution\u003c/h3\u003e\n\u003cp\u003eIl faut autoriser le fichier à être exécuté comme un fichier .desktop.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eSi lors du premier lancement, vous avez refusé, ce n\u0026rsquo;est pas grave\u003c/em\u003e ; faites un clic droit sur le lanceur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003echoisissez \u0026ldquo;Propriétés…\u0026rdquo;,\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epuis cliquez sur l\u0026rsquo;onglet \u0026ldquo;Lanceur\u0026rdquo; et dans la section \u0026ldquo;Sécurité\u0026rdquo;, cliquez sur les cases à cocher devant :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Autoriser ce fichier à être exécuté comme un fichier .desktop\u003c/li\u003e\n\u003cli\u003e\u003cinput disabled=\"\" type=\"checkbox\"\u003e Définir ce fichier comme approuvé\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"outils\"\u003eOutils\u003c/h2\u003e\n\u003cp\u003eTous les outils ci-dessous fonctionnent sous Linux, moyennant certaines configurations.\u003c/p\u003e\n\u003cp\u003eCe n\u0026rsquo;est pas pour autant qu\u0026rsquo;il faut tous les installer ; quoiqu\u0026rsquo;il en soit, veiller à ce que soit un seul outil qui fasse les remonter des journaux auprès des différents sites, (Inara, EDSM, etc), tel \u003ca href=\"/fr/post/linux-elite-dangerous/#edmarketconnector\"\u003eEDMarketConnector\u003c/a\u003e ou \u003ca href=\"/fr/post/linux-elite-dangerous/#eddiscovery\"\u003eEDDiscovery\u003c/a\u003e par exemple.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePour certains, l\u0026rsquo;utilisation de l\u0026rsquo;outil \u003ccode\u003eprotontricks\u003c/code\u003e sera nécessaire ; heureusement dans bien des distributions, dont Debian, il est fourni en tant que paquet ; installez-le !\u003c/p\u003e\n\u003ch3 id=\"edhm-ui\"\u003eEDHM-UI\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eEDHM-UI\u003c/strong\u003e v3 est un outil pour modifier l\u0026rsquo;interface graphique.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSite officiel : \u003ca href=\"https://bluemystical.github.io/edhm-api/\" rel=\"external\"\u003ehttps://bluemystical.github.io/edhm-api/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDepôt : \u003ca href=\"https://github.com/BlueMystical/EDHM_UI\" rel=\"external\"\u003ehttps://github.com/BlueMystical/EDHM_UI\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVersion testée : \u003cdel\u003e3.0.67\u003c/del\u003e, 3.0.70\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne fois installé :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFichiers de configuration : \u003ccode\u003e$HOME/.local/share/EDHM-UI-V3/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eDans le dépôt, il faut aller sur la section \u003ca href=\"https://github.com/BlueMystical/EDHM_UI/releases\" rel=\"external\"\u003eRelease\u003c/a\u003e puis télécharger :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;archive \u003cstrong\u003eedhm-ui-v3-linux-x64.zip\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ele script shell \u003cstrong\u003elinux_installer.sh\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne fois l\u0026rsquo;archive téléchargée, décompressez-la et copiez dedans le script installer.\nDonnez des droits d\u0026rsquo;exécution au script et exécutez-le.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;outil est accessible depuis le menu système ; avec Xfce, dans le menu \u0026ldquo;Accessoires\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003ePar défaut, l\u0026rsquo;outil cherche à communiquer avec le jeu pour le paramétrage correct ; il faut restituer le chemin absolu du répertoire \u0026ldquo;elite-dangerous-odyssey-64\u0026rdquo; ; si vous avez loupé quelque chose dans l\u0026rsquo;étape, choississez le menu \u0026ldquo;Main menu\u0026rdquo; \u0026gt; \u0026ldquo;Settings\u0026rdquo;.\u003c/p\u003e\n\u003ch3 id=\"edmarketconnector\"\u003eEDMarketConnector\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eEDMarketConnector\u003c/strong\u003e est un outil python pour \u0026ldquo;améliorer\u0026rdquo; le commerce dans Elite Dangerous, principalement, bien qu\u0026rsquo;il soit à-même d\u0026rsquo;utiliser des fonctionnalités secondaires au-travers de plugins.\u003c/p\u003e\n\u003cp\u003eDeux versions existent : une via \u003ca href=\"https://flathub.org/fr/apps/io.edcd.EDMarketConnector\" rel=\"external\"\u003eflatpak\u003c/a\u003e, et l\u0026rsquo;autre au-travers des sources du dépôt.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDepôt : \u003ca href=\"https://github.com/EDCD/EDMarketConnector\" rel=\"external\"\u003ehttps://github.com/EDCD/EDMarketConnector\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVersion testée : 6.1.2\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFichiers de configuration :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003evia flatpak : \u003ccode\u003e$HOME/.var/app/io.edcd.EDMarketConnector/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003evia git : \u003ccode\u003e$HOME/.local/share/EDMarketConnector/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe fichier de configuration principal : \u003ccode\u003econfig.toml\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ L\u0026rsquo;installation depuis les sources se fait assez facilement :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ git clone https://github.com/EDCD/EDMarketConnector.git\n\n:$ cd EDMarketConnector\nEDMarketConnector :$ python3 -m venv venv\nEDMarketConnector :$ source venv/bin/activate\nEDMarketConnector :$ pip3 install -r requirements.txt\nEDMarketConnector :$ python3 EDMarketConnector.py\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eÉtant donné que l\u0026rsquo;outil doit être lancé dans un environnement python, je me suis créé un lanceur shell :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\n\ndir=\u0026#34;~/Games/EDMarketConnector/\u0026#34;\n\ncd \u0026#34;${dir}\u0026#34;\n\nsource venv/bin/activate\n\npython3 EDMarketConnector.py\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuis un lanceur de bureau qui pointe vers le script shell, tout en paramètrant l\u0026rsquo;icône avec celle de l\u0026rsquo;outil qui se trouve à la racine. (Bien choisir \u0026ldquo;Fichiers images\u0026rdquo;). \u003cbr\u003e\n\u003cem\u003eSi l\u0026rsquo;icône n\u0026rsquo;est pas dans l\u0026rsquo;archive, vous la trouverez dans le dépôt.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003ePS : Personnellement, j\u0026rsquo;utilise la version flatpak, car c\u0026rsquo;est la plus simple à utiliser.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eLes plugins fonctionnels - \u003cem\u003eque j\u0026rsquo;utilise…\u003c/em\u003e :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eBGS-Tally\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003ecargo-manifest\u003c/strong\u003e : il semble nécessaire de modifier le nom du répertoire principal ; de \u003ccode\u003ecargo-manifest\u003c/code\u003e en \u003ccode\u003ecargo_manifest\u003c/code\u003e. \u003cbr\u003e\nAvec cette légère modification, le plugin est fonctionnel !\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003edocking-denied-raison\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEDMC-Bioscan\u003c/strong\u003e nécessite \u003cstrong\u003eExploData\u003c/strong\u003e qui nécessite \u003ccode\u003esqlalchemy\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSi vous utilisez la version flatpak d\u0026rsquo;EDMC, téléchargez la version nommée \u003ccode\u003eExploData-***-db-***-flatpak.zip\u003c/code\u003e car elle embarque sqlalchemy.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi vous utilisez la version du dépôt d\u0026rsquo;EDMC, il vous faudra installer slqalchemy dans l\u0026rsquo;environnement python3 dédié !\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEDMCHotKeys\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEDMCModerOverlay\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEDMC-NavRoute\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEDMC-NeutronDancer\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEDMC-Pioneer\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEDMC-Screenshot-Linux\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eUpdateTD\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eD\u0026rsquo;autres plugins existent ; ils devraient fonctionner…\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"eddiscovery\"\u003eEDDiscovery\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eEDDiscovery\u003c/strong\u003e est un tableau de bord complet pour gérer tous les aspects qu\u0026rsquo;offre le jeu.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDépôt : \u003ca href=\"https://github.com/EDDiscovery/EDDiscovery/\" rel=\"external\"\u003ehttps://github.com/EDDiscovery/EDDiscovery/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVersion testée : 19.1.9.0\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSteam:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eoption de compatibilité forcée : Proton 9.0-4\u003c/li\u003e\n\u003cli\u003eoption de lancement : aucune\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eDepuis la section \u0026lsquo;Release\u0026rsquo; du dépôt, téléchargez l\u0026rsquo;archive Portable zip ; décompressez-la où vous le voulez.\u003c/p\u003e\n\u003cp\u003eDans Steam :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecliquez sur le menu \u0026ldquo;Jeux\u0026rdquo; \u0026gt; \u0026ldquo;Ajouter un jeu nom Steam à ma bibliothèque…\u0026rdquo;, choisissez le binaire \u003ccode\u003eEDDiscovery.exe\u003c/code\u003e qui se trouve dans l\u0026rsquo;archive décompressée.\u003c/li\u003e\n\u003cli\u003eclic droit pour avec les propriétés du \u0026ldquo;jeu\u0026rdquo;, et forcez la compatibilité - \u003cem\u003eactuellement, j\u0026rsquo;utilise la version \u0026ldquo;Proton 9.0-4\u0026rdquo;\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eclic droit à nouveau pour le menu \u0026ldquo;Gérer\u0026rdquo; \u0026gt; \u0026ldquo;Créer un raccourci sur le bureau\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eToutes les remarques faites dans le chapitre \u003ca href=\"/fr/post/linux-elite-dangerous/#raccourci-bureau-steam\"\u003eRaccourci bureau Steam\u003c/a\u003e sont à effectuer !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eUne fois EDD ouvert, allez sur l\u0026rsquo;onglet \u0026ldquo;Paramètres\u0026rdquo; :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDans la section \u0026ldquo;Paramètres\u0026rdquo;, cliquer sur le bouton [ Ajouter ], une nouvelle fenêtre s\u0026rsquo;ouvre nommée \u0026ldquo;CommanderForm\u0026rdquo;.\n\u003cul\u003e\n\u003cli\u003eDans la section \u0026ldquo;Information du journal\u0026rdquo; :\n\u003cul\u003e\n\u003cli\u003eÉcrivez le nom de votre Commandeur, dans le champ \u0026ldquo;Nom du commandant\u0026rdquo;\u003c/li\u003e\n\u003cli\u003ecliquer sur le bouton [ Parcourir ] pour aller sélectionner le répertoire de sauvegarde du jeu.\u003c/li\u003e\n\u003cli\u003efaites toute autre configuration désirée\u003c/li\u003e\n\u003cli\u003ecliquer sur le bouton [ OK ] pour valider la configuration.\u003c/li\u003e\n\u003cli\u003esupprimer le profil nommé \u0026ldquo;Jameson (Default)\u0026rdquo;.\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\u003eRevenez sur l\u0026rsquo;onglet \u0026ldquo;History\u0026rdquo;, vous retrouverez la remontée d\u0026rsquo;informations lié au commandeur utilisé dans le jeu.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePour pouvoir paramètrer les icônes, et du lanceur de bureau, et dans l\u0026rsquo;app Steam, il faut décompresser l\u0026rsquo;archive \u003ccode\u003eeddwebsite.zip\u003c/code\u003e situé à la racine de l\u0026rsquo;archive Portable. L\u0026rsquo;image à utiliser principalement est dans le sous-répertoire \u0026ldquo;Images\u0026rdquo; et se nomme \u0026ldquo;EdLogo600.png\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eNote : Certains plugins, tels ceux pour afficher les sites Inara, EDSM ne fonctionnent pas car il manque un outil nommé WebView2\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"elite-dangerous-monitor-daemon\"\u003eElite Dangerous Monitor Daemon\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eElite Dangerous Monitor Daemon\u003c/strong\u003e alias \u003cem\u003eEDMD\u003c/em\u003e est un autre tableau de bord complet pour monitorer en temps réel la session de jeu, fait pour Linux nativement (interface GTK4, CLI).\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDépôt : \u003ca href=\"https://github.com/Maldor/EDMD\" rel=\"external\"\u003ehttps://github.com/Maldor/EDMD\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne fois installé :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFichiers de configuration : \u003ccode\u003e$HOME/.config/EDMD/config.toml\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ed-odyssey-materials-helper\"\u003eED Odyssey Materials Helper\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eElite Dangerous Odyssey Materials Helper\u003c/strong\u003e est L\u0026rsquo;outil qui révolutionne l\u0026rsquo;acquisition des matériaux nécessaires dans les relations avec les ingénieurs. Il vous montre ce que vous avez, ce qui vous manque, la relation avec tel ingénieur, et bien plus encore…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web : \u003ca href=\"https://edomh.nl/\" rel=\"external\"\u003ehttps://edomh.nl/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDépôt : \u003ca href=\"https://github.com/jixxed/ed-odyssey-materials-helper/\" rel=\"external\"\u003ehttps://github.com/jixxed/ed-odyssey-materials-helper/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDiscord: \u003ca href=\"https://discord.gg/M8Rgz4AmmA\" rel=\"external\"\u003ehttps://discord.gg/M8Rgz4AmmA\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVersion testée : \u003cdel\u003e3.13.8\u003c/del\u003e, 3.13.12\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDepuis la section \u0026lsquo;Release\u0026rsquo;, téléchargez à minima l\u0026rsquo;archive zip, mais préfèrez la version auto-updater du paquet .deb, .rpm.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eDepuis le binaire, tout s\u0026rsquo;installe dans le système où il le faut et devient accessible depuis le menu système ; sous Xfce, menu \u0026ldquo;Autres\u0026rdquo; \u0026gt; \u0026ldquo;Elite Dangerous Odyssey Materials Helper\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eUne fois l\u0026rsquo;application ouverte, :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecliquez sur le menu \u0026ldquo;Settings\u0026rdquo;\u003c/li\u003e\n\u003cli\u003epuis concernant la ligne \u0026ldquo;Journal Folder\u0026rdquo;, cliquez sur le bouton [ Select Directory ] et allez choisir le chemin absolu lié au répertoire de sauvegarde du jeu.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEnsuite, faites toutes les autres configurations, tel la langue, puis utilisez l\u0026rsquo;outil.\u003c/p\u003e\n\u003ch3 id=\"min-ed-launcher\"\u003eMin ED Launcher\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eMin ED Launcher\u003c/strong\u003e n\u0026rsquo;est pas un outil à proprement parler. Il remplace le lanceur officiel, tout en étant très léger, ce qui est pratique sous Linux, et a d\u0026rsquo;autres aspects pratiques, \u003cem\u003edont l\u0026rsquo;exécution d\u0026rsquo;outil tiers, tel \u003ca href=\"/fr/post/linux-elite-dangerous/#srv-survey\"\u003eSRVSurvey\u003c/a\u003e\u003c/em\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDépôt : \u003ca href=\"https://github.com/Rfvgyhn/min-ed-launcher/\" rel=\"external\"\u003ehttps://github.com/Rfvgyhn/min-ed-launcher/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVersion testée : 0.13.0\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSteam :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eoption de compatibilité forcée : aucune\u003c/li\u003e\n\u003cli\u003eoption de lancement : oui ; \u003cem\u003e\u003cstrong\u003elire les explications ci-dessous\u003c/strong\u003e\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne fois installé :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFichier de configuration : \u003ccode\u003e$HOME/.config/min-ed-launcher/settings.json\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eJournaux : \u003ccode\u003e$HOME/.local/state/min-ed-launcher/min-ed-launcher.log\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eDepuis la section \u0026lsquo;Release\u0026rsquo;, téléchargez l\u0026rsquo;archive zip pour Linux, puis décompressez-la.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCopiez le binaire \u003ccode\u003eMinEdLauncher\u003c/code\u003e dans le dossier d\u0026rsquo;installation du jeu ED.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Dans Steam :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003efaites un clic droit pour ouvrir les propriétés du jeu\u003c/li\u003e\n\u003cli\u003edans les options de lancement, écrivez à minima :\n\u003cul\u003e\n\u003cli\u003ePour Gnome : \u003cbr\u003e\n\u003ccode\u003egnome-terminal -- ./MinEdLauncher %command% /autorun /autoquit\u003c/code\u003e \\\n\u003cul\u003e\n\u003cli\u003ece qui fonctionne pour moi : \u003cbr\u003e\n\u003ccode\u003egnome-terminal --hide-menubar -t \u0026quot;Min ED Launcher\u0026quot; -- ./MinEdLauncher %command% /autorun /autoquit waitForExit\u003c/code\u003e \u003cbr\u003e\n\u003cem\u003efonctionnel aussi sous Xfce4 !\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ePour Xfce4 : \u003cbr\u003e\n\u003ccode\u003exfce4-terminal --disable-server -x ./MinEdLauncher %command% /autorun /autoquit waitForExit\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003ece que j\u0026rsquo;utilise : \u003cbr\u003e\n\u003ccode\u003exfce4-terminal --disable-server --hide-menubar --hide-scrollbar --hide-toolbar -T \u0026quot;Min ED Launcher\u0026quot; -x ./MinEdLauncher %command% /autorun /autoquit waitForExit\u003c/code\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(\u003cem\u003eIl est possible d\u0026rsquo;utiliser d\u0026rsquo;autre terminal dans les options de lancement ; merci de lire les infos du dépôt\u003c/em\u003e).\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Dans l\u0026rsquo;archive, il est fourni un lanceur de bureau et une icône. Il est possible de copier le lanceur de bureau sur votre bureau. Puis faites un clic droit pour modifier la commande, tel que : \u003cbr\u003e\n\u003ccode\u003e/usr/games/steam steam://rungameid/359320 /edo\u003c/code\u003e \u003cbr\u003e\nCe qui exécutera le lancement de la version Odyssey du jeu directement.\u003c/p\u003e\n\u003cp\u003e⇒ Toutes les remarques faites dans le chapitre \u003ca href=\"/fr/post/linux-elite-dangerous/#raccourci-bureau-steam\"\u003eRaccourci bureau Steam\u003c/a\u003e sont à effectuer !\u003c/p\u003e\n\u003cp\u003e⇒ Il est impératif que les options de lancement soient écrites dans les propriétés général du jeu ; cf ci-dessus !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eNote :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIl est important que les deux couches réseaux IPv4 ET IPv6 soient fonctionnelles, autrement cela ne fonctionnera pas.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"od-explorer\"\u003eOD Explorer\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eOD Explorer\u003c/strong\u003e est vraiment LE companion à Elite Dangerous, pour nous aider dans l\u0026rsquo;exploration et la recherche exobiologie.\u003c/p\u003e\n\u003cp\u003eNote : Cet outil est conçu pour bien fonctionner avec la langue anglaise du jeu Elite Dangerous, dans les autres langues du jeu, il ne sera pas capable de tout faire remonter correctement. Mais si vous comprenez assez bien la langue anglaise : \u0026ldquo;go!\u0026rdquo;\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDepôt : \u003ca href=\"https://github.com/WarmedxMints/OD-Explorer\" rel=\"external\"\u003ehttps://github.com/WarmedxMints/OD-Explorer\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVersion testée : \u003cdel\u003e2.0.14\u003c/del\u003e, 2.0.15\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSteam :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eoption de compatibilité forcée : Proton 9.0-4\u003c/li\u003e\n\u003cli\u003eoption de lancement : aucune\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLe Logo est disponible depuis le dépôt dans le sous-répertoire \u003ccode\u003eResources/\u003c/code\u003e et se nomme \u003ccode\u003eAstronaut.png\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eDepuis la section \u0026lsquo;Release\u0026rsquo; du dépôt, téléchargez la version ODExplorer-Portable.zip.\u003c/p\u003e\n\u003cp\u003eDécompressez-la, de telle manière par exemple à l\u0026rsquo;avoir : \u003ccode\u003e~/Games/ODExplorer-Portable\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eEnsuite, il faut utiliser l\u0026rsquo;outil \u003ccode\u003eprotontricks\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eCeci étant fait, dans Steam :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecliquez sur le menu \u0026ldquo;Jeux\u0026rdquo; \u0026gt; \u0026ldquo;Ajouter un jeu nom Steam à ma bibliothèque…\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eclic droit pour avec les propriétés du \u0026ldquo;jeu\u0026rdquo;, et forcez la compatibilité - actuellement, j\u0026rsquo;utilise la version \u0026ldquo;Proton 9.0-4\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCliquez sur le bouton [ Jouer ]…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eLors du premier lancement, une fenêtre va s\u0026rsquo;ouvrir demandant l\u0026rsquo;installation du \u0026ldquo;runtime v8.0\u0026rdquo; de Microsoft Windows. Refusez !\u003c/p\u003e\n\u003cp\u003eEnsuite, ouvrez le runtime avec Protontricks et ciblez \u0026ldquo;Non-Steam shortcut: ODExplorer.exe: …\u0026rdquo;, pour installer à terme le composant \u003ccode\u003edotnetdesktop8\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/elite-dangerous/protontricks-odexplorer-line.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/protontricks-odexplorer-line_hu_b779dc657a4504d9.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/protontricks-odexplorer-line_hu_570c924189cf8aed.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Protontricks - select Steam app; line ‘ODExplorer.exe: …’\"\n                    height=\"200\"\n                    id=\"img_images_post_elite-dangerous_protontricks-odexplorer-line.png_0\"\n                    src=\"/images/post/elite-dangerous/protontricks-odexplorer-line.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/elite-dangerous/winetricks-wineprefix-install-component.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/winetricks-wineprefix-install-component_hu_50b7b595ff9e578b.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/winetricks-wineprefix-install-component_hu_dafe7b8ead8209b6.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Winetricks - wineprefix; install component\"\n                    height=\"147\"\n                    id=\"img_images_post_elite-dangerous_winetricks-wineprefix-install-component.png_1\"\n                    src=\"/images/post/elite-dangerous/winetricks-wineprefix-install-component.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/elite-dangerous/winetricks-package-dotnetdesktop8.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/winetricks-package-dotnetdesktop8_hu_7efb317f3429eaeb.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/winetricks-package-dotnetdesktop8_hu_ecb7e6a984cc476c.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Winetricks - wineprefix; choose dotnetdesktop8\"\n                    height=\"147\"\n                    id=\"img_images_post_elite-dangerous_winetricks-package-dotnetdesktop8.png_2\"\n                    src=\"/images/post/elite-dangerous/winetricks-package-dotnetdesktop8.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003eUne fois l\u0026rsquo;installation terminée, avant d\u0026rsquo;exécuter à nouveau le binaire depuis Steam, faites un clic droit à nouveau puis choisissez le menu \u0026ldquo;Gérer\u0026rdquo; \u0026gt; \u0026ldquo;Créer un raccourci sur le bureau\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eLes remarques faites pour le \u003ca href=\"/fr/post/linux-elite-dangerous/#raccourci-bureau-steam\"\u003eraccourci bureau Steam\u003c/a\u003e du jeu sont exactement les mêmes pour ce raccourci ; donc faites les mêmes modifications.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003ePS: Bien que nous ayons mono installable sous Linux, l\u0026rsquo;utilisation de \u003ccode\u003emono ODExplorer.exe\u003c/code\u003e ne fonctionne pas\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"srv-survey\"\u003eSRV Survey\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSRV Survey\u003c/strong\u003e est un compagnon utile d\u0026rsquo;assistance en affichant des données à l\u0026rsquo;écran du jeu, pendant une session de jeu ; il est utile pour les scans organiques lors de l\u0026rsquo;exploration, pour traquer la position du joueur, et utile sur les sites des \u0026ldquo;Guardians\u0026rdquo;.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDepôt : \u003ca href=\"https://github.com/njthomson/SrvSurvey\" rel=\"external\"\u003ehttps://github.com/njthomson/SrvSurvey\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVersion testée : 2.0.95.23\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoici le mode opératoire pour faire fonctionner cet outil :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/post/linux-elite-dangerous/#min-ed-launcher\"\u003e\u003cstrong\u003eMin ED Launcher\u003c/strong\u003e\u003c/a\u003e est nécessaire\u003c/li\u003e\n\u003cli\u003epuis l\u0026rsquo;installation de SRV Survey, et d\u0026rsquo;un script complémentaire\u003c/li\u003e\n\u003cli\u003epuis l\u0026rsquo;utilisation de \u003ccode\u003eprotontricks\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ 1. Téléchargez l\u0026rsquo;archive zip depuis la section \u0026ldquo;Releases\u0026rdquo;, actuellement la version 2.0.95.23.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDécompresser l\u0026rsquo;archive\u003c/li\u003e\n\u003cli\u003eDirigez vous vers le répertoire \u0026ldquo;Application Files\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eCopier le répertoire nommé \u003cstrong\u003eSrvSurvey_numero-version\u003c/strong\u003e dans le répertoire d\u0026rsquo;installation du jeu ED\u003c/li\u003e\n\u003cli\u003eRenommer le répertoire en \u003ccode\u003eSrvSurvey\u003c/code\u003e, \u003cem\u003epour simplifier la configuration\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eTélécharger le script shell \u003ca href=\"https://github.com/user-attachments/files/23442962/SRV_Survey.sh\" rel=\"external\"\u003eSRV_Survey.sh\u003c/a\u003e, \u003cem\u003efourni par Maldor, l\u0026rsquo;auteur d\u0026rsquo;\u003ca href=\"/fr/post/linux-elite-dangerous/#elite-dangerous-monitor-daemon\"\u003eEDMD\u003c/a\u003e\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eModifier le script shell \u003ccode\u003eSRV_Survey.sh\u003c/code\u003e et copier le dans le répertoire \u0026ldquo;SrvSurvey\u0026rdquo;, \u003cem\u003eprécédemment copié, renommé dans le répertoire d\u0026rsquo;installation du jeu\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Concernant \u003cstrong\u003eMin ED Launcher\u003c/strong\u003e : quelque soit votre configuration, il faut rajouter une déclaration de processus ; modifiez la clé \u003ccode\u003eprocesses\u003c/code\u003e pour ajouter une déclaration similaire :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e    \u0026#34;processes\u0026#34;: [\n        { \u0026#34;fileName\u0026#34;: \u0026#34;/home/userid/.local/share/steam/steamapps/common/Elite Dangerous/SrvSurvey/SRV_Survey.sh\u0026#34; }\n    ],\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003e\u003cstrong\u003eModifiez impérativement et littéralement l\u0026rsquo;écriture de \u0026ldquo;\u003ccode\u003e/home/userid\u003c/code\u003e\u0026rdquo; par votre propre chemin personnel !\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eSRV Survey\u003c/strong\u003e nécessite l\u0026rsquo;installation du \u003cstrong\u003eWindows Desktop Runtime 9.0\u003c/strong\u003e pour fonctionner. C\u0026rsquo;est là qu\u0026rsquo;intervient l\u0026rsquo;usage de l\u0026rsquo;outil \u003ccode\u003eprotontricks\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eune fois protontricks exécuté :\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003esélectionnez la ligne correspondant au jeu \u0026ldquo;Elite Dangerous : 359320\u0026rdquo;, puis cliquez sur le bouton [ Valider ].\n\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/elite-dangerous/protontricks-elite-dangerous-line.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/protontricks-elite-dangerous-line_hu_fe8028f5e87282b5.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/protontricks-elite-dangerous-line_hu_bcddff3cea275678.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Protontricks - select Steam app ; ligne ‘Elite Dangerous: 359320’\"\n                    height=\"200\"\n                    id=\"img_images_post_elite-dangerous_protontricks-elite-dangerous-line.png_3\"\n                    src=\"/images/post/elite-dangerous/protontricks-elite-dangerous-line.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003edifférentes fenêtres de messages d\u0026rsquo;erreurs relatifs à winetricks apparaissent, cliquez sur [ Valider ].\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela fenêtre \u0026ldquo;Winetricks - choose a wineprefix\u0026rdquo; finit par apparaître : sélectionnez, \u003cem\u003esi ce n\u0026rsquo;est pas le cas\u003c/em\u003e, le choix \u0026ldquo;( ) Select the default wineprefix\u0026rdquo;, puis cliquez sur le bouton [ Valider ].\n\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/elite-dangerous/winetricks-choose-a-wineprefix.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/winetricks-choose-a-wineprefix_hu_18e4a6fe9ada839c.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/winetricks-choose-a-wineprefix_hu_e9155a2c43739cf0.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Winetricks - choose a prefix; select default\"\n                    height=\"148\"\n                    id=\"img_images_post_elite-dangerous_winetricks-choose-a-wineprefix.png_4\"\n                    src=\"/images/post/elite-dangerous/winetricks-choose-a-wineprefix.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela fenêtre \u0026ldquo;Winetricks - current prefix\u0026rdquo; s\u0026rsquo;ouvre, choisissez \u0026ldquo;( ) Install a Windows DLL or component\u0026rdquo;, puis cliquez sur le bouton [ Valider ].\n\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/elite-dangerous/winetricks-current-prefix-install-component.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/winetricks-current-prefix-install-component_hu_aea1df8afbdd035c.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/winetricks-current-prefix-install-component_hu_cbba97991fa98119.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Winetricks - current prefix; install DLL or component\"\n                    height=\"147\"\n                    id=\"img_images_post_elite-dangerous_winetricks-current-prefix-install-component.png_5\"\n                    src=\"/images/post/elite-dangerous/winetricks-current-prefix-install-component.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eune nouvelle fenêtre \u0026ldquo;Winetricks - current prefix\u0026rdquo; s\u0026rsquo;ouvre et demande quel paquet est à installer ; faites défiler jusqu\u0026rsquo;à trouver le choix \u0026ldquo;[ ] dotnetdesktop9   MS .NET Desktop Runtime 9.0 LTS\u0026rdquo;, puis cliquez sur le bouton [ Valider ].\n\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/elite-dangerous/winetricks-current-prefix-which-package.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/winetricks-current-prefix-which-package_hu_d2a939ab6cbdf6.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/elite-dangerous/winetricks-current-prefix-which-package_hu_3de2ee4286015ba1.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Winetricks - current prefix; choose dotnetdesktop9\"\n                    height=\"145\"\n                    id=\"img_images_post_elite-dangerous_winetricks-current-prefix-which-package.png_6\"\n                    src=\"/images/post/elite-dangerous/winetricks-current-prefix-which-package.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUne fois installé, cliquez sur les boutons [ Annuler ] jusqu\u0026rsquo;à ce que l\u0026rsquo;outil protontricks se ferme.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ \u003cem\u003eSi SRV_Survey ne se lance pas réellement, alors que Min Ed Launcher informe qu\u0026rsquo;il le lance, merci de lire cette section\u003c/em\u003e : \u003ca href=\"/fr/post/linux-elite-dangerous/#proton-version\"\u003eProton version\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAvec toutes ces modifications, \u003cstrong\u003eSRV Survey\u003c/strong\u003e devrait enfin fonctionner !\u003c/p\u003e\n\u003cp\u003eGardez à l\u0026rsquo;esprit que certaines fonctionnalités pourraient planter le logiciel. Si c\u0026rsquo;est le cas, fermez le jeu, et relancez-le pour que \u003cstrong\u003eMin ED Launcher\u003c/strong\u003e ouvre à nouveau les deux applications.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eRemerciements :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/njthomson/SrvSurvey/discussions/524\" rel=\"external\"\u003ehttps://github.com/njthomson/SrvSurvey/discussions/524\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"squadron-manager\"\u003eSquadron Manager\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSquadron Manager\u003c/strong\u003e est l\u0026rsquo;outil pour gérer son escadron ou participer à un escadron. Il est possible de faire fonctionner l\u0026rsquo;application Windows sous Linux, par le biais de protontricks et de Steam.\u003c/p\u003e\n\u003cp\u003eIl est nécessaire de s\u0026rsquo;être inscrit sur le site web d\u0026rsquo;abord !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDepôt : \u003ca href=\"https://github.com/SquadronManager/App/\" rel=\"external\"\u003ehttps://github.com/SquadronManager/App/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLogo : \u003ca href=\"https://squadronmanager.comtac-fr.space/logos/logo2.png\" rel=\"external\"\u003ehttps://squadronmanager.comtac-fr.space/logos/logo2.png\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSite : \u003ca href=\"https://squadronmanager.comtac-fr.space/\" rel=\"external\"\u003ehttps://squadronmanager.comtac-fr.space/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVersion testée : 3.5.6\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSteam:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eoption de compatibilité forcée : Proton 9.0-4\u003c/li\u003e\n\u003cli\u003eoption de lancement : aucune\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eUne fois, téléchargée, cliquez sur l\u0026rsquo;exécutable pour le lancer avec \u003cstrong\u003eprotontricks\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDonnez-lui le préfixe wine relatif à Elite Dangerous\u003c/li\u003e\n\u003cli\u003eFinissez l\u0026rsquo;installation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLe répertoire d\u0026rsquo;installation se trouve être dans : \u003cbr\u003e\n\u003ccode\u003esteamapps/compatdata/359320/pfx/drive_c/users/steamuser/AppData/Local/Programs/Squadron Manager/\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Ouvrez Steam pour exécuter le binaire \u003ccode\u003eSquadron Manager.exe\u003c/code\u003e en tant que jeu non Steam, puis dans les propriétés de configuration, forcez la compatibilité.\u003c/p\u003e\n\u003cp\u003ePuis, clic droit sur le binaire dans Steam \u0026gt; Gérer \u0026gt; Créer un raccourci sur le bureau, pour créer le lanceur de bureau.\u003c/p\u003e\n\u003cp\u003eIl est nécessaire de faire les modifications mentionnées dans le chapitre \u003ca href=\"/fr/post/linux-elite-dangerous/#raccourci-bureau-steam\"\u003eRaccourci bureau Steam\u003c/a\u003e. Pour l\u0026rsquo;icône, copiez celle du site web dont l\u0026rsquo;URL est donnée ci-dessus.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eIl semble nécessaire d\u0026rsquo;installer un outil tiers, en Python, à \u003ca href=\"/fr/post/linux-elite-dangerous/#edmarketconnector\"\u003eEDMC\u003c/a\u003e, qui se nomme \u003cstrong\u003eMichelle\u003c/strong\u003e pour communiquer correctement entre ces deux applications.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDépôt : \u003ca href=\"https://github.com/taloche1/Michelle/\" rel=\"external\"\u003ehttps://github.com/taloche1/Michelle/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVersion testée : 3.86\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eà installer dans le répertoire \u003ccode\u003eplugins\u003c/code\u003e d\u0026rsquo;EDMC.\u003c/p\u003e\n\u003ch3 id=\"elite-intel\"\u003eElite Intel\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eElite Intel\u003c/strong\u003e est un assistant IA Vocal dédié à Elite Dangerous, basé sur le modèle NVIDIA Parakeet, et utilisant au choix localement ou à distance différents LLM.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eversion actuelle : 1.0\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003erecommandation matérielle GPU : 12 Go VRAM minimum\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003esite officiel : \u003ca href=\"https://www.elite-intel.org/fr/index.html\" rel=\"external\"\u003ehttps://www.elite-intel.org/fr/index.html\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDépôt : \u003ca href=\"https://github.com/SudoKrondor/EliteIntel\" rel=\"external\"\u003ehttps://github.com/SudoKrondor/EliteIntel\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"proton-version\"\u003eProton version\u003c/h3\u003e\n\u003cp\u003e⇒ Une mention à-propos de SRV_Survey et de la version de Proton :\u003c/p\u003e\n\u003cp\u003eNote : \u003cstrong\u003eAttention à la version de Proton\u003c/strong\u003e, veillez à bien utiliser celle détectée par l\u0026rsquo;outil \u003ca href=\"/fr/post/linux-elite-dangerous/#min-ed-launcher\"\u003e\u003cstrong\u003eMin ED Launcher\u003c/strong\u003e\u003c/a\u003e, qui utilise celle d\u0026rsquo;ED.\u003c/p\u003e\n\u003cp\u003eSRV_Survey doit fonctionner avec la même version de Proton que celle d\u0026rsquo;ED, si ce n\u0026rsquo;est pas le cas, il ne sera pas lancé…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eScript SRV_Survey.sh \u003cem\u003emodifié\u003c/em\u003e :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\nsleep 10s\nexport STEAM_COMPAT_DATA_PATH=\u0026#34;$HOME/.steam/steam/steamapps/compatdata/359320\u0026#34;\nexport STEAM_COMPAT_CLIENT_INSTALL_PATH=\u0026#34;$HOME/.steam/steam\u0026#34;\n \u0026#34;$HOME/.steam/steam/steamapps/common/Proton - Experimental/proton\u0026#34; run $HOME/steam/steamapps/common/Elite Dangerous/SrvSurvey/SRV_survey/SrvSurvey.exe\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cbr\u003e\n\u003cem\u003eDans mon cas, j\u0026rsquo;ai dû changer la ligne d\u0026rsquo;appel au binaire \u003ccode\u003eproton\u003c/code\u003e, tel que\u003c/em\u003e : \u003cbr\u003e\n\u003ccode\u003e\u0026quot;$HOME/.steam/steam/steamapps/common/Proton 9.0 (Beta)/proton\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAutrement, il se pourrait que \u003cstrong\u003eMin ED Launcher\u003c/strong\u003e affirme lancer correctement le script SRV_Survey.sh mais que le binaire ne soit pas exécuté vraiment.\u003c/p\u003e\n\u003cp\u003eLe journal de \u003cstrong\u003eMin ED Launcher\u003c/strong\u003e informe dès le début quels arguments il utilise, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e----------\n2026-06-21 11:38:57.294 +02:00 [INF] Elite Dangerous: Minimal Launcher - v0.13.0+6e50d0e0\n2026-06-21 11:38:57.385 +02:00 [DBG]\n    Args: [|\u0026#34;/home/myusername/.steam/debian-installation/ubuntu12_32/steam-launch-wrapper\u0026#34;; \u0026#34;--\u0026#34;;\n  \u0026#34;/home/myusername/.steam/debian-installation/ubuntu12_32/reaper\u0026#34;; \u0026#34;SteamLaunch\u0026#34;;\n  \u0026#34;AppId=359320\u0026#34;; \u0026#34;--\u0026#34;;\n  \u0026#34;/home/myusername/.steam/debian-installation/steamapps/common/SteamLinuxRuntime_sniper/_v2-entry-point\u0026#34;;\n  \u0026#34;--verb=waitforexitandrun\u0026#34;; \u0026#34;--\u0026#34;;\n  \u0026#34;/home/myusername/Games/Steam/steamapps/common/Proton 9.0 (Beta)/proton\u0026#34;;\n  \u0026#34;waitforexitandrun\u0026#34;;\n  \u0026#34;/run/media/myusername/games/SteamLibrary/steamapps/common/Elite Dangerous/EDLaunch.exe\u0026#34;;\n  \u0026#34;/Steam\u0026#34;; \u0026#34;/novr\u0026#34;; \u0026#34;/autorun\u0026#34;; \u0026#34;/autoquit\u0026#34;; \u0026#34;waitForExit\u0026#34;|]\n    OS: Linux64\n    Env: STEAM_COMPAT_DATA_PATH=/run/media/myusername/games/SteamLibrary/steamapps/compatdata/359320\n\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ecf la sixième ligne… \u003ccode\u003e\u0026quot;/home/myusername/Games/Steam/steamapps/common/Proton 9.0 (Beta)/proton\u0026quot;;\u003c/code\u003e ;-)\u003c/p\u003e\n\u003cp\u003eParce que ED est lancée avec cette version (nativement) !\u003c/p\u003e\n\u003ch3 id=\"no-such-file-or-directory\"\u003eNo such file or directory\u003c/h3\u003e\n\u003cp\u003e⇒ Une mention à-propos de SRV_Survey et Min Ed Launcher :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi dans le fichier journal de Min Ed Launcher, vous lisez le genre d\u0026rsquo;erreur suivant :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e2026-08-01 21:07:05.623 -05:00 [INF] Starting process $HOME/.steam/steam/steamapps/common/Elite Dangerous/SrvSurvey/SRV_Survey.sh\n2026-08-01 21:07:05.629 -05:00 [FTL] Unable to start process $HOME/.steam/steam/steamapps/common/Elite Dangerous/SrvSurvey/SRV_Survey.sh\nHRESULT: 0x80004005\nWin32 Error Code: 2\u003c/p\u003e\n\u003cp\u003eSystem.ComponentModel.Win32Exception (2): ErrorStartingProcess, $HOME/.steam/steam/steamapps/common/Elite Dangerous/SrvSurvey/SRV_Survey.sh, $HOME/.steam/steam/steamapps/common/Elite Dangerous/SrvSurvey, No such file or directory\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eCorrigez le fichier JSON de configuration de Min Ed Launcher.\u003c/strong\u003e Très certainement, vous avez écrit littéralement \u003ccode\u003e$HOME\u003c/code\u003e dans celui-ci ; or \u003ccode\u003e$HOME\u003c/code\u003e est une variable shell, JSON ne sait pas quoi en faire, comment l\u0026rsquo;utiliser !\u003c/p\u003e\n\u003cp\u003eModifiez pour écrire littéralement le chemin de votre répertoire personnel, tel que \u003ccode\u003e/home/michael\u003c/code\u003e. \u003cem\u003e(seulement dans le fichier de configuration JSON)\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"eof\"\u003eEOF\u003c/h2\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u0026ldquo;Fly safe, or fly trouble… it\u0026rsquo;s up to you! or not…\u0026rdquo;\u003c/em\u003e o7\u003c/p\u003e\n","summary":"Installation et configuration d'outils additionnels pour jouer à Elite Dangerous (Steam) sous Linux","tags":["Jeux","Steam","Linux"],"date_published":"2026-06-13T02:16:42+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-06-10:/fr/post/linux-forza-horizon/#6b37cde0f5465b08d33d25bc525b69e4576fc9cf384f92ac662fe0b26c93ec3e","url":"https://it-log.fr.eu.org/fr/post/linux-forza-horizon/","title":"(Linux) Forza Horizon : dépannages","author":{"name":"Stéphane HUC"},"content_text":"Description Environnement : Steam Linux / Debian Sid Jeu : Forza Horizon 5 Non ce petit article n\u0026rsquo;est pas pour promouvoir ni apprendre à jouer à l\u0026rsquo;un quelconque des Forza Horizon.\nDépannage Connexion obligatoire Lors de l\u0026rsquo;ouverture du jeu, une fenêtre empêche de jouer en affirmant qu\u0026rsquo;une connexion obligatoire est nécessaire.\nConnexion obligatoire Vous ne pouvez pas continuer sans être connecté à un profil. [ OK ] Arrêter le jeu\nAller dans le dossier d\u0026rsquo;installation du jeu, accessible depuis le menu \u0026lsquo;Propriétés…\u0026rsquo;, puis direction le menu \u0026lsquo;Fichiers installés\u0026rsquo; et cliquer sur le bouton [ Parcourir… ] pour ouvrir le navigateur de fichiers au dossier d\u0026rsquo;installation du jeu.\ndirigez-vous vers SteamLibrary/steamapps/compatdata/1551360/pfx/. Il faut remonter de deux dossiers pour arriver dans le dossier steamapps depuis le répertoire d\u0026rsquo;installation du jeu. Ouvrez le fichier user.reg.\nChercher la clé Xbl|DeviceKey ; qui devrait se situer aux alentours de la ligne 2040.\nSupprimer le bloc entier correspondant à l\u0026rsquo;équivalent de ce qui suit :\n[Software\\\\Wine\\\\Credential Manager\\\\Generic: Xbl|DeviceKey] 1781126654 #time=1dcf91f7c643250 @=\u0026#34;Xbl|DeviceKey\u0026#34; \u0026#34;Comment\u0026#34;=\u0026#34;{3F754FAD-C788-48B1-A0F4-0F6279924F2A}|00000000|1\u0026#34; \u0026#34;Flags\u0026#34;=dword:00000000 \u0026#34;LastWritten\u0026#34;=hex:eb,2e,64,7c,1f,f9,dc,01 \u0026#34;Password\u0026#34;=hex:(…) \u0026#34;Persist\u0026#34;=dword:00000002 \u0026#34;Type\u0026#34;=dword:00000001 Enregistrer Relancer le jeu ; normalement la fenêtre de connexion Microsoft doit s\u0026rsquo;ouvrir et permettre la connexion (souvent en ayant déjà le nom utilisateur rempli). Une fois validé, le jeu s\u0026rsquo;ouvrira. ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEnvironnement : Steam Linux / Debian Sid\u003c/li\u003e\n\u003cli\u003eJeu : Forza Horizon 5\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eNon ce petit article n\u0026rsquo;est pas pour promouvoir ni apprendre à jouer à l\u0026rsquo;un quelconque des Forza Horizon.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"connexion-obligatoire\"\u003eConnexion obligatoire\u003c/h3\u003e\n\u003cp\u003eLors de l\u0026rsquo;ouverture du jeu, une fenêtre empêche de jouer en affirmant qu\u0026rsquo;une connexion obligatoire est nécessaire.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eConnexion obligatoire\n\nVous ne pouvez pas continuer sans être connecté à un profil.\n\n[ OK ]\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eArrêter le jeu\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAller dans le dossier d\u0026rsquo;installation du jeu, accessible depuis le menu \u0026lsquo;Propriétés…\u0026rsquo;, puis direction le menu \u0026lsquo;Fichiers installés\u0026rsquo; et cliquer sur le bouton [ Parcourir… ] pour ouvrir le navigateur de fichiers au dossier d\u0026rsquo;installation du jeu.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edirigez-vous vers \u003ccode\u003eSteamLibrary/steamapps/compatdata/1551360/pfx/\u003c/code\u003e. \u003cem\u003eIl faut remonter de deux dossiers pour arriver dans le dossier \u003ccode\u003esteamapps\u003c/code\u003e depuis le répertoire d\u0026rsquo;installation du jeu\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOuvrez le fichier \u003ccode\u003euser.reg\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChercher la clé \u003ccode\u003eXbl|DeviceKey\u003c/code\u003e ; qui devrait se situer aux alentours de la ligne 2040.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupprimer le bloc entier correspondant à l\u0026rsquo;équivalent de ce qui suit :\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[Software\\\\Wine\\\\Credential Manager\\\\Generic: Xbl|DeviceKey] 1781126654\n#time=1dcf91f7c643250\n@=\u0026#34;Xbl|DeviceKey\u0026#34;\n\u0026#34;Comment\u0026#34;=\u0026#34;{3F754FAD-C788-48B1-A0F4-0F6279924F2A}|00000000|1\u0026#34;\n\u0026#34;Flags\u0026#34;=dword:00000000\n\u0026#34;LastWritten\u0026#34;=hex:eb,2e,64,7c,1f,f9,dc,01\n\u0026#34;Password\u0026#34;=hex:(…)\n\u0026#34;Persist\u0026#34;=dword:00000002\n\u0026#34;Type\u0026#34;=dword:00000001\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003eEnregistrer\u003c/li\u003e\n\u003cli\u003eRelancer le jeu ; normalement la fenêtre de connexion Microsoft doit s\u0026rsquo;ouvrir et permettre la connexion (\u003cem\u003esouvent en ayant déjà le nom utilisateur rempli\u003c/em\u003e). \u003cbr\u003e\nUne fois validé, le jeu s\u0026rsquo;ouvrira.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"astuces pour le fonctionnement du jeu Forza Horizon (5) sous Linux","tags":["Jeux","Steam"],"date_published":"2026-06-10T23:34:26+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-06-08:/fr/post/gmail-detect-error/#5a71c607b8f04bbafb199a08998818dcddfc6f2cf78205ea815c322f711b9bc7","url":"https://it-log.fr.eu.org/fr/post/gmail-detect-error/","title":"Gmail detect Error 550-5.7.1 (gsmtp)","author":{"name":"Stéphane HUC"},"content_text":"Impitoyable La \u0026ldquo;communication\u0026rdquo; avec les services Gmail semble tout sauf un exemple de bonne communication !\nDans la série \u0026ldquo;Gmail, ton univers impitoyable…\u0026rdquo; :\nDescription À titre personnel, je possède deux noms de domaines, un gratuit et l\u0026rsquo;autre payant. Je gère mes zones DNS (sous OpenBSD, avec nsd), quant aux serveurs MX, ils sont gérés par un ami (sous OpenBSD, géré par OpenSMTPD).\nLes zones DNS pour les deux domaines en questions ont bien des enregistrements DKIM, DMARC, SPF, tel que :\n$ grep -E \u0026#39;dkim|dmarc|spf\u0026#39; /etc/ns/huc.fr.eu.org dkimpubkey._domainkey IN TXT ( \u0026#34;v=DKIM1; k=rsa; t=s; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8zDa4/c/HZYbd2NwouHXwgWoUVtRnmc89gjH4xYfVICd8n74Ojr7UVHSz80xiqsQEzEq+UM0FLPqt6IMgCb3\u0026#34; \u0026#34;1zZIF2CJqIa1U2esJi50+Kl50aho3e9bOL76uXMiY0VinrjeWbRU1gQ/ZEhYJdMeQZj60CULXXphVeBqOItNXoXGlJ/lBZZZHZ1Fv/PB8aLwU3fG1CsL9xiY9/PGclhOubwXUUbSgrKJQFAawvgpYp6DZIoZnbDun/uJCwR/1Q+jXGJ56ps45XGeRfZbx17B\u0026#34; \u0026#34;X9ldnQ3iliKpWl9jLSWJ/mR/GdqGIuYeLuzZW7CxrNjd+TGEg9j0Poqf+MGzRpwLOwIDAQAB\u0026#34;) _dmarc IN TXT \u0026#34;v=DMARC1; p=reject; sp=reject;\u0026#34; @ IN TXT \u0026#34;v=spf1 a mx ~all\u0026#34; $ grep -E \u0026#39;dkim|dmarc|spf\u0026#39; /etc/ns/stephane-huc.net dkimpubkey._domainkey IN TXT ( \u0026#34;v=DKIM1; k=rsa; t=s; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8zDa4/c/HZYbd2NwouHXwgWoUVtRnmc89gjH4xYfVICd8n74Ojr7UVHSz80xiqsQEzEq+UM0FLPqt6IMgCb3\u0026#34; \u0026#34;1zZIF2CJqIa1U2esJi50+Kl50aho3e9bOL76uXMiY0VinrjeWbRU1gQ/ZEhYJdMeQZj60CULXXphVeBqOItNXoXGlJ/lBZZZHZ1Fv/PB8aLwU3fG1CsL9xiY9/PGclhOubwXUUbSgrKJQFAawvgpYp6DZIoZnbDun/uJCwR/1Q+jXGJ56ps45XGeRfZbx17B\u0026#34; \u0026#34;X9ldnQ3iliKpWl9jLSWJ/mR/GdqGIuYeLuzZW7CxrNjd+TGEg9j0Poqf+MGzRpwLOwIDAQAB\u0026#34;) _dmarc IN TXT \u0026#34;v=DMARC1; p=reject; sp=reject;\u0026#34; @ IN TXT \u0026#34;v=spf1 a mx ~all\u0026#34; Le site mailt-tester.com, à date de ce jour m\u0026rsquo;informe d\u0026rsquo;une note \u0026ldquo;Perfect\u0026rdquo; relative à la configuration. Concernant :\nun mail envoyé depuis mon domaine huc.fr.eu.org: https://mail-tester.com/test-loynfonhr un mail envoyé depuis mon domaine stephane-huc.net : https://mail-tester.com/test-7b231r0vz Franchement il est difficile de faire mieux, pas impossible mais…\nFaire des requêtes DNS pour savoir si l\u0026rsquo;enregistrement PTR est bon, retourne les résultats corrects, tels que :\n:$ dig mx.huc.fr.eu.org +short 89.234.141.148 :$ dig mx.huc.fr.eu.org AAAA +short 2a00:5881:8110:1e00::2 :$ dig -x 89.234.141.148 +short mx.vinishor.xyz. :$ dig -x 2a00:5881:8110:1e00::2 +short mx.vinishor.xyz. Idem pour le second domaine.\nL\u0026rsquo;envoi depuis les boites mails relatives me servent principalement pour la réception ; je dois envoyer en moyenne, un ou deux mails, dans de rare cas, une dizaine ; et je n\u0026rsquo;ai JAMAIS pratiqué de l\u0026rsquo;envoi de masses, ou mécanique similaire.\nPourtant : dès que j\u0026rsquo;envoie vers une adresse Gmail depuis une adresse courriel relative au domaine huc…, c\u0026rsquo;est assurèment un refus de réception suivi du mail bloqué !\nHi! This is the MAILER-DAEMON, please DO NOT REPLY to this email. An error has occurred while attempting to deliver a message for the following list of recipients: stephane.huc@gmail.com: 550-5.7.1 [89.234.141.148 12] Gmail has detected that this message is likely unsolicited mail. To reduce the amount of spam sent to Gmail, this message has been blocked. For more information, go to https://support.google.com/mail/?p=UnsolicitedMessage Error ffacd0b85a97d-4601f38a6f1si30466498f8f.340 - gsmtp Below is a copy of the original message: Reporting-MTA: dns; mx.vinishor.xyz Final-Recipient: rfc822; stephane.huc@gmail.com Action: failed Status: 5.0.0 Il fut un temps, les messages arrivaient dans les dossiers SPAMs, maintenant ce n\u0026rsquo;est même plus le cas. C\u0026rsquo;est un refus net catégorique, du fait d\u0026rsquo;être \u0026ldquo;non désiré\u0026rdquo;. Mais de quel droit ?!\nMais envoyer un message vers gmail depuis une adresse (re)liée à mon domaine stephane-huc.net fonctionne, sans soucis.\nComme vous le voyez, j\u0026rsquo;ai aussi une boite mail / Gmail.\nBref, cela me semble insoluble pour communiquer avec des utilisateurs possédant des adresses Gmail.\nEhlo ⇒ Impossible de dialoguer avec un véritable professionnel faisant partie de l\u0026rsquo;équipe, quitte à payer le service. Essayez donc depuis le site support ! Ils se défaussent vers la communauté.\n⇒ Décrire le problème sur le site web du support Google est assurèment refusé, avec écrit en rouge : \u0026lsquo;Échec de la publication. Le contenu enfreint le Règlement de la communauté\u0026rsquo;.\nLe contenu que j\u0026rsquo;ai cherché à poster par le biais du site web du support est ni plus ni moins celui qui est écrit ici dans le chapitre description, au point près. Qu\u0026rsquo;y a-t-il dans ce contenu qui peut enfreindre le règlement ?!\nBref, c\u0026rsquo;est une situation inextricable… Gmail, Helo?\n","content_html":"\u003ch2 id=\"impitoyable\"\u003eImpitoyable\u003c/h2\u003e\n\u003cp\u003eLa \u0026ldquo;communication\u0026rdquo; avec les services Gmail semble tout sauf un exemple de bonne communication !\u003c/p\u003e\n\u003cp\u003eDans la série \u0026ldquo;Gmail, ton univers impitoyable…\u0026rdquo; :\u003c/p\u003e\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eÀ titre personnel, je possède deux noms de domaines, un gratuit et l\u0026rsquo;autre payant.\nJe gère mes zones DNS (sous OpenBSD, avec nsd), quant aux serveurs MX, ils sont gérés par un ami (sous OpenBSD, géré par OpenSMTPD).\u003c/p\u003e\n\u003cp\u003eLes zones DNS pour les deux domaines en questions ont bien des enregistrements DKIM, DMARC, SPF, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ grep -E \u0026#39;dkim|dmarc|spf\u0026#39; /etc/ns/huc.fr.eu.org\ndkimpubkey._domainkey    IN TXT    ( \u0026#34;v=DKIM1; k=rsa; t=s; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8zDa4/c/HZYbd2NwouHXwgWoUVtRnmc89gjH4xYfVICd8n74Ojr7UVHSz80xiqsQEzEq+UM0FLPqt6IMgCb3\u0026#34; \u0026#34;1zZIF2CJqIa1U2esJi50+Kl50aho3e9bOL76uXMiY0VinrjeWbRU1gQ/ZEhYJdMeQZj60CULXXphVeBqOItNXoXGlJ/lBZZZHZ1Fv/PB8aLwU3fG1CsL9xiY9/PGclhOubwXUUbSgrKJQFAawvgpYp6DZIoZnbDun/uJCwR/1Q+jXGJ56ps45XGeRfZbx17B\u0026#34; \u0026#34;X9ldnQ3iliKpWl9jLSWJ/mR/GdqGIuYeLuzZW7CxrNjd+TGEg9j0Poqf+MGzRpwLOwIDAQAB\u0026#34;)\n_dmarc IN TXT \u0026#34;v=DMARC1; p=reject; sp=reject;\u0026#34;\n@       IN TXT  \u0026#34;v=spf1 a mx ~all\u0026#34;\n\n$ grep -E \u0026#39;dkim|dmarc|spf\u0026#39; /etc/ns/stephane-huc.net\ndkimpubkey._domainkey    IN TXT    ( \u0026#34;v=DKIM1; k=rsa; t=s; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8zDa4/c/HZYbd2NwouHXwgWoUVtRnmc89gjH4xYfVICd8n74Ojr7UVHSz80xiqsQEzEq+UM0FLPqt6IMgCb3\u0026#34; \u0026#34;1zZIF2CJqIa1U2esJi50+Kl50aho3e9bOL76uXMiY0VinrjeWbRU1gQ/ZEhYJdMeQZj60CULXXphVeBqOItNXoXGlJ/lBZZZHZ1Fv/PB8aLwU3fG1CsL9xiY9/PGclhOubwXUUbSgrKJQFAawvgpYp6DZIoZnbDun/uJCwR/1Q+jXGJ56ps45XGeRfZbx17B\u0026#34; \u0026#34;X9ldnQ3iliKpWl9jLSWJ/mR/GdqGIuYeLuzZW7CxrNjd+TGEg9j0Poqf+MGzRpwLOwIDAQAB\u0026#34;)\n_dmarc IN TXT \u0026#34;v=DMARC1; p=reject; sp=reject;\u0026#34;\n@       IN TXT  \u0026#34;v=spf1 a mx ~all\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLe site mailt-tester.com, à date de ce jour m\u0026rsquo;informe d\u0026rsquo;une note \u0026ldquo;Perfect\u0026rdquo; relative à la configuration. Concernant :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eun mail envoyé depuis mon domaine \u003ccode\u003ehuc.fr.eu.org\u003c/code\u003e: \u003ca href=\"https://mail-tester.com/test-loynfonhr\" rel=\"external\"\u003ehttps://mail-tester.com/test-loynfonhr\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eun mail envoyé depuis mon domaine \u003ccode\u003estephane-huc.net\u003c/code\u003e : \u003ca href=\"https://mail-tester.com/test-7b231r0vz\" rel=\"external\"\u003ehttps://mail-tester.com/test-7b231r0vz\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFranchement il est difficile de faire mieux, pas impossible mais…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eFaire des requêtes DNS pour savoir si l\u0026rsquo;enregistrement PTR est bon, retourne les résultats corrects, tels que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ dig mx.huc.fr.eu.org +short\n89.234.141.148\n:$ dig mx.huc.fr.eu.org AAAA +short\n2a00:5881:8110:1e00::2\n\n:$ dig -x 89.234.141.148 +short\nmx.vinishor.xyz.\n:$ dig -x 2a00:5881:8110:1e00::2 +short\nmx.vinishor.xyz.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIdem pour le second domaine.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;envoi depuis les boites mails relatives me servent principalement pour la réception ; je dois envoyer en moyenne, un ou deux mails, dans de rare cas, une dizaine ; et je n\u0026rsquo;ai JAMAIS pratiqué de l\u0026rsquo;envoi de masses, ou mécanique similaire.\u003c/p\u003e\n\u003cp\u003ePourtant : dès que j\u0026rsquo;envoie vers une adresse Gmail depuis une adresse courriel relative au domaine \u003ccode\u003ehuc…\u003c/code\u003e, c\u0026rsquo;est assurèment un refus de réception suivi du mail bloqué !\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eHi! This is the MAILER-DAEMON, please DO NOT REPLY to this email. An error has occurred while attempting to deliver a message for the following list of recipients: stephane.huc@gmail.com: 550-5.7.1 [89.234.141.148 12] Gmail has detected that this message is likely unsolicited mail. To reduce the amount of spam sent to Gmail, this message has been blocked. For more information, go to https://support.google.com/mail/?p=UnsolicitedMessage\nError ffacd0b85a97d-4601f38a6f1si30466498f8f.340 - gsmtp Below is a copy of the original message:\n\nReporting-MTA: dns; mx.vinishor.xyz\n Final-Recipient: rfc822; stephane.huc@gmail.com\nAction: failed\nStatus: 5.0.0\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIl fut un temps, les messages arrivaient dans les dossiers SPAMs, maintenant ce n\u0026rsquo;est même plus le cas. C\u0026rsquo;est un refus net catégorique, du fait d\u0026rsquo;être \u0026ldquo;non désiré\u0026rdquo;. Mais de quel droit ?!\u003c/p\u003e\n\u003cp\u003eMais envoyer un message vers gmail depuis une adresse (re)liée à mon domaine \u003ccode\u003estephane-huc.net\u003c/code\u003e fonctionne, sans soucis.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eComme vous le voyez, j\u0026rsquo;ai aussi une boite mail / Gmail.\u003c/p\u003e\n\u003cp\u003eBref, cela me semble insoluble pour communiquer avec des utilisateurs possédant des adresses Gmail.\u003c/p\u003e\n\u003ch2 id=\"ehlo\"\u003eEhlo\u003c/h2\u003e\n\u003cp\u003e⇒ Impossible de dialoguer avec un véritable professionnel faisant partie de l\u0026rsquo;équipe, quitte à payer le service. Essayez donc depuis le site support ! \u003cbr\u003e\nIls se défaussent vers la communauté.\u003c/p\u003e\n\u003cp\u003e⇒ Décrire le problème sur le site web du support Google est assurèment refusé, avec écrit en rouge : \u0026lsquo;Échec de la publication. Le contenu enfreint le \u003ca href=\"https://support.google.com/communities/answer/7425194\" rel=\"external\"\u003eRèglement de la communauté\u003c/a\u003e\u0026rsquo;.\u003c/p\u003e\n\u003cp\u003eLe contenu que j\u0026rsquo;ai cherché à poster par le biais du site web du support est ni plus ni moins celui qui est écrit ici dans le chapitre \u003ca href=\"/fr/post/gmail-detect-error/#description\"\u003edescription\u003c/a\u003e, au point près. Qu\u0026rsquo;y a-t-il dans ce contenu qui peut enfreindre le règlement ?!\u003c/p\u003e\n\u003cp\u003eBref, c\u0026rsquo;est une situation inextricable… \u003cbr\u003e\nGmail, Helo?\u003c/p\u003e\n\u003chr\u003e\n","summary":"Au secours, Gmail (gsmtp) ! Ton support et ta reconnaissance de mails est insupportable… Tu ne joue pas le jeu, malgré des enregistrements DKIM, DMARC, SPF et PTR corrects !","tags":["gmail","erreur"],"date_published":"2026-06-08T13:03:09+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-05-24:/fr/post/gemini-vger-gmid/#c56c99419f585c55b363c06b2331136822814dcd6119479b8f1e1c8406ea8f0c","url":"https://it-log.fr.eu.org/fr/post/gemini-vger-gmid/","title":"Gemini : Voyager de Vger à gmid","author":{"name":"Stéphane HUC"},"content_text":"Description Note : merci de ne pas confondre le protocol Gemini avec l\u0026rsquo;assistant IA de G*** !\nVger et gmid sont tous deux principalement des serveurs pour le protocol Gemini, sous OpenBSD, utilisant tous les deux les mécanismes sécurisés systèmes.\nVger Pendant plusieurs années, j\u0026rsquo;ai utilisé Vger, parce que je \u0026ldquo;cotoyais\u0026rdquo; Solene Rapenne, dans le petit monde de la communauté francophone autour d\u0026rsquo;OpenBSD. Elle est la créatrice de ce logiciel, qui utilise les verroux de sécurité système d\u0026rsquo;OpenBSD, pour publier sur le protocol Gemini.\nVger fonctionne très bien, sans soucis particulier, mais il nécessite deux, trois configurations qui personnellement me déplaisent :\nl\u0026rsquo;utilisation du service inetd. l\u0026rsquo;utilisation d\u0026rsquo;un proxy, que ce soit relayd ou nginx la gestion du multi-hosting que je trouve bizarre. inetd En effet, Vger nécessite l\u0026rsquo;utilisation du démon inetd ; il faut veiller à ce qu\u0026rsquo;inetd n\u0026rsquo;écoute que localhost.\nPour rappel, le service inetd est configuré ainsi :\n127.0.0.1:1965 stream tcp nowait _vger /usr/local/bin/vger vger -d /var/gemini -v [::1]:1965 stream tcp6 nowait _vger /usr/local/bin/vger vger -d /var/gemini -v L\u0026rsquo;option -v est l\u0026rsquo;option de vger qui permet de cibler les domaines selon les noms de répertoires dédiés, qui doivent absolument être correspondants.\nproxy Dans le contexte de proxy avec nginx, cela nécessite d\u0026rsquo;utiliser la directive stream pour \u0026ldquo;encapsuler\u0026rdquo; le flux à destination du serveur Gemini et le relayer vers le service d\u0026rsquo;écoute locale.\nLa problèmatique à laquelle j\u0026rsquo;ai été confronté dans le contexte de multi-hébergements de domaine, c\u0026rsquo;est la gestion des certificats TLS. Même en utilisant les directives proxy_ssl* pour cibler les certificats, le nom de serveur, etc, les domaines interrogés sur le protocole répondaient avec le certificat lié au premier nom de domaine trouvé dans la configuration.\nAinsi la configuration des directives server suivantes :\nserver { listen addresse_ipv4:1965 ssl; listen [addresse_ipv6]:1965 ssl; server_name domaine1.net; access_log logs/domaine1.net/access.gemini.log basic; ssl_certificate /etc/letsencrypt/live/domaine1.net/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domaine1.net/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/domaine1.net/chain.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; proxy_ssl on; proxy_ssl_certificate /etc/letsencrypt/live/domaine1.net/fullchain.pem; proxy_ssl_certificate_key /etc/letsencrypt/live/domaine1.net/privkey.pem; proxy_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; proxy_ssl_protocols TLSv1.2 TLSv1.3; proxy_ssl_server_name on; proxy_ssl_trusted_certificate /etc/letsencrypt/live/domaine1.net/chain.pem; proxy_ssl_verify on; } server { listen addresse_ipv4:1965 ssl; listen [addresse_ipv6]:1965 ssl; server_name domaine2.com; access_log logs/domaine2.com/access.gemini.log basic; ssl_certificate /etc/letsencrypt/live/domaine2.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domaine2.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/domaine2.com/chain.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; proxy_ssl on; proxy_ssl_certificate /etc/letsencrypt/live/domaine2.com/fullchain.pem; proxy_ssl_certificate_key /etc/letsencrypt/live/domaine2.com/privkey.pem; proxy_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; proxy_ssl_protocols TLSv1.2 TLSv1.3; proxy_ssl_server_name on; proxy_ssl_trusted_certificate /etc/letsencrypt/live/domaine2.com/chain.pem; proxy_ssl_verify on; } Ne fonctionne pas comme attendu :\nles logs ne sont écrits que selon la directive écrite dans le premier domaine, jamais relativement à celle liée au domaine le certificat retourné est celui du premier domaine. Du fait de la configuration de vger, quand un domaine est appelé, c\u0026rsquo;est bien les fichiers déposés dans le répertoire au nom du domaine, qui sont envoyés.\nJ\u0026rsquo;ai certainement loupé quelque chose dans la configuration de nginx, en tant que proxy…\nJ\u0026rsquo;aurais pu m\u0026rsquo;attarder plus sur celle de relayd, qui aurait certainement été fonctionnelle \u0026ldquo;dès le premier coup\u0026rdquo;.\nJ\u0026rsquo;imagine qu\u0026rsquo;une configuration de relayd pourrait fonctionner, tel que :\nlog connection table \u0026lt;localhost\u0026gt; { 127.0.0.1, ::1 } tcp protocol \u0026#34;gemini4dom1\u0026#34; { tls keypair domain1.tld } tcp protocol \u0026#34;gemini4dom2\u0026#34; { tls keypair domaine2.com } relay \u0026#34;gem4dom1\u0026#34; { listen on domain1.tld port 1965 tls protocol \u0026#34;gemini4dom1\u0026#34; forward to \u0026lt;localhost\u0026gt; port 1965 } relay \u0026#34;gem4dom2\u0026#34; { listen on domaine2.com port 1965 tls protocol \u0026#34;gemini4dom2\u0026#34; forward to \u0026lt;localhost\u0026gt; port 1965 } ou pas.\nBref, Vger est fonctionnel… mais compliqué à gérer ! De plus, 3 services/démons exécutés pour un serveur ; même si ces services consomment peu de ressources systèmes, je trouve que ça en fait… deux de trop !\nGmid Et puis, j\u0026rsquo;ai découvert gmid et ses fonctionnalités natives dont la configuration est aussi aisé que relayd ou httpd sous OpenBSD, et l\u0026rsquo;usage du démon aussi simple.\nDonc, j\u0026rsquo;ai créé une configuration pour les différents domaines (et sous-domaines que je gère) qui m\u0026rsquo;a pris moins de 5 minutes à faire, et à être fonctionnel, tout en restant aussi sécurisé que vger.\nEt au moins avec gmid, je n\u0026rsquo;ai qu\u0026rsquo;un seul service à l\u0026rsquo;écoute, et une facilité accrue de configuration.\nSi vous voulez en savoir plus sur la configuration et l\u0026rsquo;utilisation de gmid, merci de lire l\u0026rsquo;article dédié : gmid ;-)\nVoilà !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eNote : merci de ne pas confondre le protocol Gemini avec l\u0026rsquo;assistant IA de G*** !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVger\u003c/strong\u003e et \u003cstrong\u003egmid\u003c/strong\u003e sont tous deux principalement des serveurs pour le protocol Gemini, sous OpenBSD, utilisant tous les deux les mécanismes sécurisés systèmes.\u003c/p\u003e\n\u003ch2 id=\"vger\"\u003eVger\u003c/h2\u003e\n\u003cp\u003ePendant plusieurs années, j\u0026rsquo;ai utilisé Vger, parce que je \u0026ldquo;cotoyais\u0026rdquo; Solene Rapenne, dans le petit monde de la communauté francophone autour d\u0026rsquo;OpenBSD.  Elle est la créatrice de ce logiciel, qui utilise les verroux de sécurité système d\u0026rsquo;OpenBSD, pour publier sur le protocol Gemini.\u003c/p\u003e\n\u003cp\u003eVger fonctionne très bien, sans soucis particulier, mais il nécessite deux, trois configurations qui personnellement me déplaisent :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;utilisation du service inetd.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;utilisation d\u0026rsquo;un proxy, que ce soit relayd ou nginx\u003c/li\u003e\n\u003cli\u003ela gestion du \u003ca href=\"/fr/sys/openbsd/vger-gemini-multihosts\"\u003emulti-hosting\u003c/a\u003e que je trouve bizarre.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"inetd\"\u003einetd\u003c/h3\u003e\n\u003cp\u003eEn effet, Vger nécessite l\u0026rsquo;utilisation du démon inetd ; il faut veiller à ce qu\u0026rsquo;inetd n\u0026rsquo;écoute que localhost.\u003c/p\u003e\n\u003cp\u003ePour rappel, le service inetd est configuré 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\"\u003e127.0.0.1:1965 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\"\u003e[::1]:1965 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\u003cp\u003eL\u0026rsquo;option \u003ccode\u003e-v\u003c/code\u003e est l\u0026rsquo;option de vger qui permet de cibler les domaines selon les noms de répertoires dédiés, qui doivent absolument être correspondants.\u003c/p\u003e\n\u003ch3 id=\"proxy\"\u003eproxy\u003c/h3\u003e\n\u003cp\u003eDans le contexte de proxy avec nginx, cela nécessite d\u0026rsquo;utiliser la directive \u003ccode\u003estream\u003c/code\u003e pour \u0026ldquo;encapsuler\u0026rdquo; le flux à destination du serveur Gemini et le relayer vers le service d\u0026rsquo;écoute locale.\u003c/p\u003e\n\u003cp\u003eLa problèmatique à laquelle j\u0026rsquo;ai été confronté dans le contexte de multi-hébergements de domaine, c\u0026rsquo;est la gestion des certificats TLS. Même en utilisant les directives \u003ccode\u003eproxy_ssl\u003c/code\u003e* pour cibler les certificats, le nom de serveur, etc, les domaines interrogés sur le protocole répondaient avec le certificat lié au premier nom de domaine trouvé dans la configuration.\u003c/p\u003e\n\u003cp\u003eAinsi la configuration des directives \u003ccode\u003eserver\u003c/code\u003e 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-ini\" data-lang=\"ini\"\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\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\"\u003eserver_name domaine1.net;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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/domaine1.net/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\"\u003essl_certificate /etc/letsencrypt/live/domaine1.net/fullchain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003essl_certificate_key /etc/letsencrypt/live/domaine1.net/privkey.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003essl_trusted_certificate /etc/letsencrypt/live/domaine1.net/chain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \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        \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        \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        \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\"\u003eproxy_ssl on;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_certificate /etc/letsencrypt/live/domaine1.net/fullchain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_certificate_key /etc/letsencrypt/live/domaine1.net/privkey.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_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;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_protocols TLSv1.2 TLSv1.3;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_server_name on;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_trusted_certificate /etc/letsencrypt/live/domaine1.net/chain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_verify on;\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 {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 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\"\u003eserver_name domaine2.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\"\u003eaccess_log logs/domaine2.com/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\"\u003essl_certificate /etc/letsencrypt/live/domaine2.com/fullchain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003essl_certificate_key /etc/letsencrypt/live/domaine2.com/privkey.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003essl_trusted_certificate /etc/letsencrypt/live/domaine2.com/chain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \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        \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        \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        \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\"\u003eproxy_ssl on;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_certificate /etc/letsencrypt/live/domaine2.com/fullchain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_certificate_key /etc/letsencrypt/live/domaine2.com/privkey.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_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;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_protocols TLSv1.2 TLSv1.3;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_server_name on;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_trusted_certificate /etc/letsencrypt/live/domaine2.com/chain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_ssl_verify on;\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\u003eNe fonctionne pas comme attendu :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles logs ne sont écrits que selon la directive écrite dans le premier domaine, jamais relativement à celle liée au domaine\u003c/li\u003e\n\u003cli\u003ele certificat retourné est celui du premier domaine.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDu fait de la configuration de vger, quand un domaine est appelé, c\u0026rsquo;est bien les fichiers déposés dans le répertoire au nom du domaine, qui sont envoyés.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai certainement loupé quelque chose dans la configuration de nginx, en tant que proxy…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eJ\u0026rsquo;aurais pu m\u0026rsquo;attarder plus sur celle de relayd, qui aurait certainement été fonctionnelle \u0026ldquo;dès le premier coup\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;imagine qu\u0026rsquo;une configuration de relayd pourrait fonctionner, 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-ini\" data-lang=\"ini\"\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etcp protocol \u0026#34;gemini4dom1\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 domain1.tld\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\"\u003etcp protocol \u0026#34;gemini4dom2\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 domaine2.com\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;gem4dom1\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 domain1.tld 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;gemini4dom1\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\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;gem4dom2\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 domaine2.com 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;gemini4dom2\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\u003eou pas.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eBref, Vger est fonctionnel… mais compliqué à gérer ! \u003cbr\u003e\nDe plus, 3 services/démons exécutés pour un serveur ; même si ces services consomment peu de ressources systèmes, je trouve que ça en fait… deux de trop !\u003c/p\u003e\n\u003ch2 id=\"gmid\"\u003eGmid\u003c/h2\u003e\n\u003cp\u003eEt puis, j\u0026rsquo;ai découvert \u003cstrong\u003egmid\u003c/strong\u003e et ses fonctionnalités natives dont la configuration est aussi aisé que \u003cstrong\u003erelayd\u003c/strong\u003e ou \u003cstrong\u003ehttpd\u003c/strong\u003e sous OpenBSD, et l\u0026rsquo;usage du démon aussi simple.\u003c/p\u003e\n\u003cp\u003eDonc, j\u0026rsquo;ai créé une configuration pour les différents domaines (et sous-domaines que je gère) qui m\u0026rsquo;a pris moins de 5 minutes à faire, et à être fonctionnel, tout en restant aussi sécurisé que vger.\u003c/p\u003e\n\u003cp\u003eEt au moins avec gmid, je n\u0026rsquo;ai qu\u0026rsquo;un seul service à l\u0026rsquo;écoute, et une facilité accrue de configuration.\u003c/p\u003e\n\u003cp\u003eSi vous voulez en savoir plus sur la configuration et l\u0026rsquo;utilisation de gmid, merci de lire l\u0026rsquo;article dédié : \u003ca href=\"/fr/sys/openbsd/gmid\"\u003egmid\u003c/a\u003e ;-)\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n","summary":"Les considérations qui m'ont poussé à migrer de Vger vers gmid pour publier sur le protocol Gemini.","tags":["Gemini","Vger","gmid"],"date_published":"2026-05-24T17:58:30+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-05-24:/fr/sys/openbsd/gmid/#e77dd0531a90f070172b3eb4acd412c147565ae33ef14506dcc36e28f83d5132","url":"https://it-log.fr.eu.org/fr/sys/openbsd/gmid/","title":"gmid : un serveur Gemini / OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"Description gmid est un serveur Gemini, disponible en tant que paquet sous OpenBSD, supportant toutes les fonctionnalités du protocol Gemini, et utilisant les \u0026ldquo;verroux\u0026rdquo; de sécurité disponible sur OpenBSD.\nSon propos est de servir des fichiers statiques… mais il peut aussi servir de proxy CGI.\nLa configuration respecte la syntaxe riche que l\u0026rsquo;on retrouve sous OpenBSD, tel que celles des autres services, comme httpd, relayd, etc…\nLe service gmid s\u0026rsquo;utilise comme tout autre service sous OpenBSD et est géré par l\u0026rsquo;outil rcctl et ses différentes options. Il faudra activer puis démarrer le service ad hoc, une fois la configuration faite.\nLe projet fournit aussi un client gemini, délicatement nommé gg, un client pour le protocole Titan, nommé idéalement titan.\nSite web officiel : https://gmid.omarpolo.com/ Installation Installez le paquet gmid.\nversion : 2.1.1 OpenBSD : 7.9 Lors de l\u0026rsquo;installation seront créés :\nun utilisateur _gmid, sans login, et sans répertoire personnel. un script rc.d gmid, permettant l\u0026rsquo;utilisation en tant que service un fichier de configuration d\u0026rsquo;exemple dans le répertoire /etc Système Au cas où l\u0026rsquo;installation ne l\u0026rsquo;aura pas fait, il faudra créer le répertoire /var/gemini. Laissez les droits root:wheel dessus !\nEnsuite créer les répertoires nécessaires à la gestion de vos domaines, dans le répertoire parent dédié, et n\u0026rsquo;oubliez pas d\u0026rsquo;attribuer dessus les droits à l\u0026rsquo;utilisateur _gmid, tel que :\n:$ doas mkdir /var/gemini/domaine1.tld :$ doas chown _gmid:_gmid /var/gemini/domaine1.tld Configuration Le fichier de configuration principal : /etc/gmid.conf Bien sûr, il est possible de le nommer autrement, mais dans ce cas il faudra le préciser dans les options de lancement, avec l\u0026rsquo;option -c.\nJe n\u0026rsquo;aborde pas la configuration d\u0026rsquo;un seul serveur ; l\u0026rsquo;exemple créé et fourni par défaut parle de soit, vraiment.\nMulti-hosting Voici un fichier exemple :\nuser \u0026#34;_gmid\u0026#34; chroot \u0026#34;/var/gemini\u0026#34; dir_certs = \u0026#34;/etc/letsencrypt/live\u0026#34; log { access \u0026#34;/logs/access.log\u0026#34; style combined syslog off } types { include \u0026#34;/usr/share/misc/mime.types\u0026#34; } server \u0026#34;domaine1.tld\u0026#34; { listen on * port 1965 cert $dir_certs \u0026#34;/domaine1.tld/fullchain.pem\u0026#34; key $dir_certs \u0026#34;/domaine1.tld/privkey.pem\u0026#34; root \u0026#34;/domaine1.tld\u0026#34; lang \u0026#34;en\u0026#34; log on } server \u0026#34;fr.domaine1.tld\u0026#34; { listen on * port 1965 cert $dir_certs \u0026#34;/fr.domaine1.tld/fullchain.pem\u0026#34; key $dir_certs \u0026#34;/fr.domaine1.tld/privkey.pem\u0026#34; root \u0026#34;/sous-dom.domaine1.tld\u0026#34; lang \u0026#34;fr\u0026#34; log off } server \u0026#34;domaine2.tld\u0026#34; { listen on * port 1965 cert $dir_certs \u0026#34;/domaine2.tld/fullchain.pem\u0026#34; key $dir_certs \u0026#34;/domaine2.tld/privkey.pem\u0026#34; root \u0026#34;/domaine2\u0026#34; lang \u0026#34;en,fr\u0026#34; log on location \u0026#34;/en/*\u0026#34; { lang \u0026#34;en\u0026#34; } location \u0026#34;/fr/*\u0026#34; { lang \u0026#34;fr\u0026#34; } } Explications :\n⇒ Dans la directive globale :\nla variable dir_certs est en réalité une macro ; elle est dans cet exemple utilisée dans les directives cert et key pour spécifier le chemin vers le répertoire principale des certificats TLS — dans ce cas, générés avec certbot. - cf: Macros -\nSi vous utilisez acme pour générer vos certificats TLS, préciser le chemin du répertoire /etc/ssl/acme, par exemple. la directive logs permet de spécifier les options de journalisation - cf: log -\nla directive access est le chemin relatif depuis le chroot du futur fichier de log. Cela peut directement dans le répertoire du chroot, tel que /access.log, ou dans tout autre répertoire dédié. la directive style permet de modifier le style de journalisation ; par défaut, le format legacy est très simple de lecture la directive syslog autorise ou non l\u0026rsquo;enregistrement dans les journaux systèmes. Par défaut, sa valeur est on ; utiliser off désactive l\u0026rsquo;enregistrement dans les journaux /var/log/daemon et `/var/log/messages la directive types permet de spécifier les mimes types ; soit en les spécifiant manuellement, soit en ciblant le fichier système. Les deux peuvent être utilisés. - cf: Types -\nToutes ces options sont facultatives !\n⇒ Dans les directives server :\nla directive listen écoute toutes les adresses IPv4 et IPv6 disponibles, de par l\u0026rsquo;utilisation du symbole * ; il est possible d\u0026rsquo;écrire la règle en précisant l\u0026rsquo;adresse IPv(4|6) - dans le cas de l\u0026rsquo;adresse IPv6, il ne faut pas l\u0026rsquo;encadrer des symboles [, ].\nla directive root cible le répertoire lié au domaine, c\u0026rsquo;est un chemin relatif au chroot ; il n\u0026rsquo;est pas obligé de porter le nom du domaine ; par convention, faites-le.\nun dernier détail à-propos de la directive lang : elle peut être utilisée de manière globale dans la directive server et/ou spécifiquement dans des directives locations ciblant des répertoires linguistiques.\nVoilà !\nEn quelques minutes une configuration fonctionnelle pour du multi-hébergements de caspule Gemini sous OpenBSD…\nEt n\u0026rsquo;oubliez pas de lire les man pages dédiés, disponible autant sur le système dès lors l\u0026rsquo;installation faite, que depuis le site officiel, dont les liens sont écrits dans la section Documentation ci-dessous.\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 Logs Il peut être utile de modifier le fichier /etc/newsyslog pour générer une rotation des logs, tel que - exemple à confirmer - :\n/var/gemini/logs/access.log root:_gmid 644 4 * $W0 Z \u0026#34;pkill -USR1 -u root -U root -x gmid\u0026#34; Documentation ⇒ les man pages officiels, disponible sur HTTP :\nhttps://gmid.omarpolo.com/gmid.8.html - gestion du serveur https://gmid.omarpolo.com/gmid.conf.5.html - gestion du fichier de configuration https://gmid.omarpolo.com/gg.1.html - utilisation du client Gemini gg https://gmid.omarpolo.com/titan.1.html - utilisation du client titan ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003egmid\u003c/strong\u003e est un serveur Gemini, disponible en tant que paquet sous OpenBSD, supportant toutes les fonctionnalités du protocol Gemini, et utilisant les \u0026ldquo;verroux\u0026rdquo; de sécurité disponible sur OpenBSD.\u003c/p\u003e\n\u003cp\u003eSon propos est de servir des fichiers statiques… mais il peut aussi servir de proxy CGI.\u003c/p\u003e\n\u003cp\u003eLa configuration respecte la syntaxe riche que l\u0026rsquo;on retrouve sous OpenBSD, tel que celles des autres services, comme \u003ccode\u003ehttpd\u003c/code\u003e, \u003ccode\u003erelayd\u003c/code\u003e, etc…\u003c/p\u003e\n\u003cp\u003eLe service \u003ccode\u003egmid\u003c/code\u003e s\u0026rsquo;utilise comme tout autre service sous OpenBSD et est géré par l\u0026rsquo;outil \u003ccode\u003ercctl\u003c/code\u003e et ses différentes options. Il faudra activer puis démarrer le service ad hoc, une fois la configuration faite.\u003c/p\u003e\n\u003cp\u003eLe projet fournit aussi un client gemini, délicatement nommé \u003ccode\u003egg\u003c/code\u003e, un client pour le protocole Titan, nommé idéalement \u003ccode\u003etitan\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web officiel : \u003ca href=\"https://gmid.omarpolo.com/\" rel=\"external\"\u003ehttps://gmid.omarpolo.com/\u003c/a\u003e\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 paquet \u003ccode\u003egmid\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eversion : 2.1.1\u003c/li\u003e\n\u003cli\u003eOpenBSD : 7.9\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLors de l\u0026rsquo;installation seront créés :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eun utilisateur \u003ccode\u003e_gmid\u003c/code\u003e, sans login, et sans répertoire personnel.\u003c/li\u003e\n\u003cli\u003eun script rc.d \u003ccode\u003egmid\u003c/code\u003e, permettant l\u0026rsquo;utilisation en tant que service\u003c/li\u003e\n\u003cli\u003eun fichier de configuration d\u0026rsquo;exemple dans le répertoire \u003ccode\u003e/etc\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"système\"\u003eSystème\u003c/h3\u003e\n\u003cp\u003eAu cas où l\u0026rsquo;installation ne l\u0026rsquo;aura pas fait, il faudra créer le répertoire \u003ccode\u003e/var/gemini\u003c/code\u003e.\nLaissez les droits \u003ccode\u003eroot:wheel\u003c/code\u003e dessus !\u003c/p\u003e\n\u003cp\u003eEnsuite créer les répertoires nécessaires à la gestion de vos domaines, dans le répertoire parent dédié, et n\u0026rsquo;oubliez pas d\u0026rsquo;attribuer dessus les droits à l\u0026rsquo;utilisateur \u003ccode\u003e_gmid\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:$ doas mkdir /var/gemini/domaine1.tld\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas chown _gmid:_gmid /var/gemini/domaine1.tld\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration principal : \u003ccode\u003e/etc/gmid.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBien sûr, il est possible de le nommer autrement, mais dans ce cas il faudra le préciser dans les options de lancement, avec l\u0026rsquo;option \u003ccode\u003e-c\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eJe n\u0026rsquo;aborde pas la configuration d\u0026rsquo;un seul serveur ; l\u0026rsquo;exemple créé et fourni par défaut parle de soit, vraiment.\u003c/p\u003e\n\u003ch3 id=\"multi-hosting\"\u003eMulti-hosting\u003c/h3\u003e\n\u003cp\u003eVoici un fichier exemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003euser \u0026#34;_gmid\u0026#34;\nchroot \u0026#34;/var/gemini\u0026#34;\ndir_certs = \u0026#34;/etc/letsencrypt/live\u0026#34;\n\nlog {\n    access \u0026#34;/logs/access.log\u0026#34;\n    style combined\n    syslog off\n}\n\ntypes {\n    include \u0026#34;/usr/share/misc/mime.types\u0026#34;\n}\n\nserver \u0026#34;domaine1.tld\u0026#34; {\n    listen on * port 1965\n    cert $dir_certs \u0026#34;/domaine1.tld/fullchain.pem\u0026#34;\n    key  $dir_certs \u0026#34;/domaine1.tld/privkey.pem\u0026#34;\n    root \u0026#34;/domaine1.tld\u0026#34;\n\n    lang \u0026#34;en\u0026#34;\n    log on\n\n}\n\nserver \u0026#34;fr.domaine1.tld\u0026#34; {\n    listen on * port 1965\n    cert $dir_certs \u0026#34;/fr.domaine1.tld/fullchain.pem\u0026#34;\n    key  $dir_certs \u0026#34;/fr.domaine1.tld/privkey.pem\u0026#34;\n    root \u0026#34;/sous-dom.domaine1.tld\u0026#34;\n\n    lang \u0026#34;fr\u0026#34;\n    log off\n\n}\n\nserver \u0026#34;domaine2.tld\u0026#34; {\n    listen on * port 1965\n    cert $dir_certs \u0026#34;/domaine2.tld/fullchain.pem\u0026#34;\n    key  $dir_certs \u0026#34;/domaine2.tld/privkey.pem\u0026#34;\n    root \u0026#34;/domaine2\u0026#34;\n\n    lang \u0026#34;en,fr\u0026#34;\n    log on\n\n    location \u0026#34;/en/*\u0026#34; {\n        lang \u0026#34;en\u0026#34;\n    }\n\n    location \u0026#34;/fr/*\u0026#34; {\n        lang \u0026#34;fr\u0026#34;\n    }\n\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eExplications :\u003c/p\u003e\n\u003cp\u003e⇒ Dans la directive globale :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ela variable \u003ccode\u003edir_certs\u003c/code\u003e est en réalité une macro ; elle est dans cet exemple utilisée dans les directives \u003ccode\u003ecert\u003c/code\u003e et \u003ccode\u003ekey\u003c/code\u003e pour spécifier le chemin vers le répertoire principale des certificats TLS — dans ce cas, générés avec \u003ccode\u003ecertbot\u003c/code\u003e. - \u003cem\u003ecf: \u003ca href=\"https://gmid.omarpolo.com/gmid.conf.5.html#Macros~2\" rel=\"external\"\u003eMacros\u003c/a\u003e\u003c/em\u003e -\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi vous utilisez \u003ccode\u003eacme\u003c/code\u003e pour générer vos certificats TLS, préciser le chemin du répertoire \u003ccode\u003e/etc/ssl/acme\u003c/code\u003e, par exemple.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela directive \u003ccode\u003elogs\u003c/code\u003e permet de spécifier les options de journalisation - \u003cem\u003ecf: \u003ca href=\"https://gmid.omarpolo.com/gmid.conf.5.html#log\" rel=\"external\"\u003elog\u003c/a\u003e\u003c/em\u003e -\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela directive \u003ccode\u003eaccess\u003c/code\u003e est le chemin relatif depuis le chroot du futur fichier de log. Cela peut directement dans le répertoire du chroot, tel que \u003ccode\u003e/access.log\u003c/code\u003e, ou dans tout autre répertoire dédié.\u003c/li\u003e\n\u003cli\u003ela directive \u003ccode\u003estyle\u003c/code\u003e permet de modifier le style de journalisation ; par défaut, le format  \u003ccode\u003elegacy\u003c/code\u003e est très simple de lecture\u003c/li\u003e\n\u003cli\u003ela directive \u003ccode\u003esyslog\u003c/code\u003e autorise ou non l\u0026rsquo;enregistrement dans les journaux systèmes. Par défaut, sa valeur est \u003ccode\u003eon\u003c/code\u003e ; utiliser \u003ccode\u003eoff\u003c/code\u003e désactive l\u0026rsquo;enregistrement dans les journaux \u003ccode\u003e/var/log/daemon\u003c/code\u003e et `/var/log/messages\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela directive \u003ccode\u003etypes\u003c/code\u003e permet de spécifier les mimes types ; soit en les spécifiant manuellement, soit en ciblant le fichier système. Les deux peuvent être utilisés. - \u003cem\u003ecf: \u003ca href=\"https://gmid.omarpolo.com/gmid.conf.5.html#Types~2\" rel=\"external\"\u003eTypes\u003c/a\u003e\u003c/em\u003e -\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eToutes ces options sont facultatives !\u003c/p\u003e\n\u003cp\u003e⇒ Dans les directives \u003ccode\u003eserver\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ela directive \u003ccode\u003elisten\u003c/code\u003e écoute toutes les adresses IPv4 et IPv6 disponibles, de par l\u0026rsquo;utilisation du symbole \u003ccode\u003e*\u003c/code\u003e ; il est possible d\u0026rsquo;écrire la règle en précisant l\u0026rsquo;adresse IPv(4|6) - dans le cas de l\u0026rsquo;adresse IPv6, il ne faut pas l\u0026rsquo;encadrer des symboles \u003ccode\u003e[\u003c/code\u003e, \u003ccode\u003e]\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela directive \u003ccode\u003eroot\u003c/code\u003e cible le répertoire lié au domaine, c\u0026rsquo;est un chemin relatif au chroot ; il n\u0026rsquo;est pas obligé de porter le nom du domaine ; \u003cem\u003epar convention, faites-le\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eun dernier détail à-propos de la directive \u003ccode\u003elang\u003c/code\u003e : elle peut être utilisée de manière globale dans la directive \u003ccode\u003eserver\u003c/code\u003e et/ou spécifiquement dans des directives \u003ccode\u003elocations\u003c/code\u003e ciblant des répertoires linguistiques.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003cp\u003eEn quelques minutes une configuration fonctionnelle pour du multi-hébergements de caspule Gemini sous OpenBSD…\u003c/p\u003e\n\u003cp\u003eEt n\u0026rsquo;oubliez pas de lire les man pages dédiés, disponible autant sur le système dès lors l\u0026rsquo;installation faite, que depuis le site officiel, dont les liens sont écrits dans la section \u003ca href=\"/fr/sys/openbsd/gmid/#documentation\"\u003eDocumentation\u003c/a\u003e ci-dessous.\u003c/p\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\u003ch3 id=\"logs\"\u003eLogs\u003c/h3\u003e\n\u003cp\u003eIl peut être utile de modifier le fichier \u003ccode\u003e/etc/newsyslog\u003c/code\u003e pour générer une rotation des logs, tel que - \u003cem\u003eexemple à confirmer\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-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/var/gemini/logs/access.log  root:_gmid  644  4     *    $W0   Z \u0026#34;pkill -USR1 -u root -U root -x gmid\u0026#34;\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\u003e⇒ les man pages officiels, disponible sur HTTP :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://gmid.omarpolo.com/gmid.8.html\" rel=\"external\"\u003ehttps://gmid.omarpolo.com/gmid.8.html\u003c/a\u003e - gestion du serveur\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gmid.omarpolo.com/gmid.conf.5.html\" rel=\"external\"\u003ehttps://gmid.omarpolo.com/gmid.conf.5.html\u003c/a\u003e - gestion du fichier de configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gmid.omarpolo.com/gg.1.html\" rel=\"external\"\u003ehttps://gmid.omarpolo.com/gg.1.html\u003c/a\u003e  - utilisation du client Gemini \u003ccode\u003egg\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gmid.omarpolo.com/titan.1.html\" rel=\"external\"\u003ehttps://gmid.omarpolo.com/titan.1.html\u003c/a\u003e - utilisation du client \u003ccode\u003etitan\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","summary":"Installer et configurer le serveur Gemini nommé gmid, sécurisé sous OpenBSD, et faire facilement du multi-hosting.","tags":["Gemini","gmid","OpenBSD","PF"],"date_published":"2026-05-24T14:50:45+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-05-16:/fr/sys/openbsd/vger-gemini-multihost/#6b83885d29a220d49c8031bc088c9caa4f3f12299a3e4806a569914d1fd5c5b9","url":"https://it-log.fr.eu.org/fr/sys/openbsd/vger-gemini-multihosts/","title":"Vger : faire du multi-hosting (Gemini + nginx / OpenBSD)","author":{"name":"Stéphane HUC"},"content_text":"Description J\u0026rsquo;ai présenté, en Mai 2022, Vger sur cet autre article. Je ne vais pas revenir dessus.\nLe propos de cet article est de démontrer la faisabilité du multi-hosting de capsule Gemini, diffusé par Vger, avec nginx servant de proxy de flux.\nInfoPréférez l\u0026rsquo;utilisation du serveur gmid… Configuration Reprenons rapidement les bases :\nUtilisateur dédié _vger Le but est de créer un utilisateur local, sans droits particulier si ce n\u0026rsquo;est d\u0026rsquo;exécuter le binaire vger et d\u0026rsquo;avoir les droits sur les répertoires de publication :\n$ doas useradd -d /var/gemini -s /sbin/nologin _vger ou tout autre nom d\u0026rsquo;utilisateur…\nModifications systèmes Veillez à créer le répertoire /var/gemini, si ce n\u0026rsquo;est pas déjà fait du fait d\u0026rsquo;avoir déjà configuré Vger.\n:$ doas mkdir /var/gemini/ Vérifiez les droits en lecture/écriture sur 0755 et utilisateur système root:wheel, ce qui devrait être le cas par défaut puisque vous avez créé le répertoire avec des droits administrateurs.\nNe donnez les droits à l\u0026rsquo;utilisateur _vger QUE sur les sous-répertoires dédiés à vos différents domaines, tel pour l\u0026rsquo;exemple :\n/var/gemini/domaine1.net /var/gemini/domaine2.com :$ doas chown _vger /var/gemini/{domaine1.net,domaine2.com} L\u0026rsquo;utilisateur _vger ne doit avoir aucun droit sur le répertoire parent /var/gemini. Cela pourrait empêcher toute connexion SSH, selon la configuration de ce service. La configuration du service SSH n\u0026rsquo;est pas abordé dans cet article.\ninetd inetd écoute les flux entrant sur le protocole TCP sur les adresses de bouclage localhost, sur les protocoles IPv(4|6), avec les droits minimum de l\u0026rsquo;utilisateur _vger afin d\u0026rsquo;utiliser le binaire vger pour servir les données dans le répertoire /var/gemini ajoutant le support des hôtes virtuels, permettant ainsi à ce que chaque domaine puisse répondre, pour autant qu\u0026rsquo;un répertoire dédié ayant le même nom existe :\n127.0.0.1:1965 stream tcp nowait _vger /usr/local/bin/vger vger -d /var/gemini -v [::1]:1965 stream tcp6 nowait _vger /usr/local/bin/vger vger -d /var/gemini -v On ne veut pas qu\u0026rsquo;inetd écoute l\u0026rsquo;extérieur, juste \u0026ldquo;localement\u0026rdquo; !\nCertificats SSL Là non plus, je n\u0026rsquo;aborderais pas la création des certificats SSL ; mais il est nécessaire de les générer si vous voulez utiliser le protocole HTTPS.\nNous admettrons que c\u0026rsquo;est le cas, alors veillez à les générer, puisque la configuration sous-jacente de nginx le fera, sinon à vous de vous adapter.\nnginx Abordons l\u0026rsquo;aspect le plus intéressant : la configuration de nginx pour qu\u0026rsquo;il gère le flux, tout en servant de proxy au serveur Vger. Ce dernier n\u0026rsquo;étant pas exposé directement à Internet.\nIl faut toujours veiller à ce que le module stream de nginx soit chargé, avant la directive http dans le fichier de configuration relatif /etc/nginx/nginx.conf :\nload_module \u0026#34;modules/ngx_stream_module.so\u0026#34;; ce qui signifie que le paquet nginx-stream soit installé !\nPuis le fichier de configuration stream.conf aura les déclarations suivantes :\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/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; server_name domaine1.net; access_log logs/domaine1.net/access.gemini.log basic; ssl_certificate /etc/letsencrypt/live/domaine1.net/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domaine1.net/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/domaine1.net/chain.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_early_data on; \u0026lt;= not allowed on stream context ssl_ecdh_curve X25519:P-521:P-384:P-256; ssl_prefer_server_ciphers on; ssl_protocols TLSv1.3 TLSv1.2; proxy_pass $backend; # proxy_set_header Early-Data $ssl_early_data; \u0026lt;= not allowed on stream context } server { listen addresse_ipv4:1965 ssl; listen [addresse_ipv6]:1965 ssl; server_name domaine2.com; access_log logs/domaine2.com/access.gemini.log basic; ssl_certificate /etc/letsencrypt/live/domaine2.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domaine2.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/domaine2.com/chain.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; } } Lier ce fichier de configuration au fichier de configuration principal, par l\u0026rsquo;ajout d\u0026rsquo;une déclaration tel que :\ninclude /etc/nginx/stream.conf; Explications :\nUn seul fichier de déclaration stream ; si vous essayez d\u0026rsquo;en créer plusieurs, tel un par nom de domaine à gérer, nginx refusera de valider la configuration ! toujours deux directives upstream pour gérer correctement les protocoles IPv(4|6) et mappées de manière à n\u0026rsquo;être appeler que par un seul proxy, celui correspondant au protocole IP concerné. une directive server par nom de domaine à gérer, dans lesquelles configurer les directives d\u0026rsquo;écoutes, de ssl et de proxy nécessaires. attention les logs seront bel et bien dans le répertoire /var/www/logs/ ou les sous-répertoires dédiés si c\u0026rsquo;est votre cas. Et oui, c\u0026rsquo;est le serveur nginx qui écoute frontalement sur les deux protocoles HTTP et Gemini. pour finir, j\u0026rsquo;ai laissé deux lignes en commentaire pour ma mémoire, histoire de me rappeler que les définitions en questions ne sont pas gérées dans un flux ;) Une dernière réflexion à-propos des logs, comme le dit la documentation de nginx, ils peuvent être déclarés à la fois dans le contexte des directives stream que les sous-jacentes server, maintenant il semble qu\u0026rsquo;ils ne soient générés que pour le premier domaine ; si quelqu\u0026rsquo;un a un avis, je suis preneur d\u0026rsquo;informations adéquates.\nPF Un petit rappel concernant une règle PF nécessaire :\nhost = adresse_ipv4 host6 = adresse_ipv6 pass in quick on egress proto tcp from any to { $host $host6 } port 1965 Rechargez le jeu de règles : $ doas pfctl -f /etc/pf.conf.\nLogs Veillez à (ré)éditer le fichier de régénération des logs /etc/newsyslog.conf pour ajouter la rotation des logs, tel que pour l\u0026rsquo;exemple :\n/var/www/logs/domaine1.net/access.gemini.log 664 4 * $W0 Z /var/run/nginx.pid SIGUSR1 C\u0026rsquo;est simple, prend quelques petites minutes à (re)configurer et fonctionnel normalement immédiatement.\nVérifications En admettant que mon domaine principal huc.fr.eu.org et son sous-domaine doc. diffusent tous les deux leurs contenus respectifs :\ninetd ⇒ Pour vérifier que le service inetd écoute en local :\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 (…) :$ printf \u0026#39;%s\\r\\n\u0026#39; \u0026#34;gemini://doc.huc.fr.eu.org\u0026#34; | vger -v -d /var/gemini 20 text/gemini; # Stéphane HUC :: IT Documentation (doc.huc.fr.eu.org) (…) Si la réponse est bien 20 text/gemini; dans chacune des deux interrogations, c\u0026rsquo;est que vger écoute et répond localement. Si la réponse est du type telnet: Unable to connect to remote host: Connection refused, vérifiez le service inetd ; est-il actif et démarré ?! à l\u0026rsquo;écoute ? ⇒ Vérifier que le port 1965 soit ouvert en écoute sur vos adresses IP :\n:$ netstat -an | grep 1965 tcp 0 0 127.0.0.1.1965 *.* LISTEN tcp 0 0 *.1965 *.* LISTEN tcp 0 0 46.23.90.29.1965 *.* LISTEN tcp6 0 0 *.1965 *.* LISTEN tcp6 0 0 ::1.1965 *.* LISTEN tcp6 0 0 2a03:6000:6e65:6.1965 *.* LISTEN CLI Depuis une station, avec un terminal, si vous avez les outils suivants, pour vérifiez que l\u0026rsquo;écoute sur le port 1965 à destination du serveur s\u0026rsquo;exécute bien :\n⇒ avec openssl :\n:$ domain=huc.fr.eu.org :$ printf \u0026#39;%s%s\\r\\n\u0026#39; \u0026#34;gemini://\u0026#34; \u0026#34;${domain}\u0026#34; | openssl s_client -ign_eof -connect \u0026#34;${domain}\u0026#34;:1965 Connecting to 46.23.90.29 CONNECTED(00000003) (…) Verify return code: 0 (ok) --- 20 text/gemini; lang=en,fr (…) closed ⇒ avec gnutls-cli :\n:$ { printf \u0026#39;%s%s\\r\\n\u0026#39; \u0026#34;gemini://\u0026#34; \u0026#34;${domain}\u0026#34; ; cat -; } | gnutls-cli --no-ca-verification \u0026#34;${domain}\u0026#34;:1965 Processed 144 CA certificate(s). Resolving \u0026#39;huc.fr.eu.org:1965\u0026#39;... Connecting to \u0026#39;2a03:6000:6e65:619::29:1965\u0026#39;... Connecting to \u0026#39;46.23.90.29:1965\u0026#39;... (…) - Handshake was completed - Simple Client Mode: 20 text/gemini; lang=en,fr (…) - Peer has closed the GnuTLS connection ^C Voilà !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai présenté, en Mai 2022, Vger sur cet autre \u003ca href=\"/fr/sys/openbsd/vger-voyager-gemini\"\u003earticle\u003c/a\u003e.\nJe ne vais pas revenir dessus.\u003c/p\u003e\n\u003cp\u003eLe propos de cet article est de démontrer la faisabilité du multi-hosting de capsule Gemini, diffusé par Vger, avec nginx servant de proxy de flux.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePréférez l\u0026rsquo;utilisation du serveur \u003ca href=\"/fr/sys/openbsd/gmid\"\u003egmid\u003c/a\u003e…\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eReprenons rapidement les bases :\u003c/p\u003e\n\u003ch3 id=\"utilisateur-dédié-_vger\"\u003eUtilisateur dédié _vger\u003c/h3\u003e\n\u003cp\u003eLe but est de créer un utilisateur local, sans droits particulier si ce n\u0026rsquo;est d\u0026rsquo;exécuter le binaire \u003ccode\u003evger\u003c/code\u003e et d\u0026rsquo;avoir les droits sur les répertoires de publication :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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$ doas useradd -d /var/gemini -s /sbin/nologin _vger\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eou tout autre nom d\u0026rsquo;utilisateur\u003c/em\u003e…\u003c/p\u003e\n\u003ch3 id=\"modifications-systèmes\"\u003eModifications systèmes\u003c/h3\u003e\n\u003cp\u003eVeillez à créer le répertoire \u003ccode\u003e/var/gemini\u003c/code\u003e, si ce n\u0026rsquo;est pas déjà fait du fait d\u0026rsquo;avoir déjà configuré Vger.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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 /var/gemini/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVérifiez les droits en lecture/écriture sur \u003ccode\u003e0755\u003c/code\u003e et utilisateur système \u003ccode\u003eroot:wheel\u003c/code\u003e, ce qui devrait être le cas par défaut puisque vous avez créé le répertoire avec des droits administrateurs.\u003c/p\u003e\n\u003cp\u003eNe donnez \u003cstrong\u003eles droits à l\u0026rsquo;utilisateur \u003ccode\u003e_vger\u003c/code\u003e \u003cem\u003eQUE\u003c/em\u003e sur les sous-répertoires dédiés à vos différents domaines\u003c/strong\u003e, tel pour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/var/gemini/domaine1.net\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/var/gemini/domaine2.com\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:$ doas chown _vger /var/gemini/\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003edomaine1.net,domaine2.com\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\u003e\u003cstrong\u003eL\u0026rsquo;utilisateur \u003ccode\u003e_vger\u003c/code\u003e ne doit avoir aucun droit sur le répertoire parent \u003ccode\u003e/var/gemini\u003c/code\u003e\u003c/strong\u003e\u003c/em\u003e. \u003cbr\u003e\nCela pourrait empêcher toute connexion SSH, selon la configuration de ce service. \u003cem\u003eLa configuration du service SSH n\u0026rsquo;est pas abordé dans cet article\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"inetd\"\u003einetd\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003einetd\u003c/code\u003e écoute les flux entrant sur le protocole TCP sur les adresses de bouclage localhost, sur les protocoles IPv(4|6), avec les droits minimum de l\u0026rsquo;utilisateur \u003ccode\u003e_vger\u003c/code\u003e afin d\u0026rsquo;utiliser le binaire \u003ccode\u003evger\u003c/code\u003e pour servir les données dans le répertoire \u003ccode\u003e/var/gemini\u003c/code\u003e ajoutant le support des hôtes virtuels, permettant ainsi à ce que chaque domaine puisse répondre, pour autant qu\u0026rsquo;un répertoire dédié ayant le même nom existe :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003e127.0.0.1:1965 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\"\u003e[::1]:1965 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\u003cp\u003e\u003cem\u003eOn ne veut pas qu\u0026rsquo;\u003ccode\u003einetd\u003c/code\u003e écoute l\u0026rsquo;extérieur, juste \u0026ldquo;localement\u0026rdquo; !\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"certificats-ssl\"\u003eCertificats SSL\u003c/h3\u003e\n\u003cp\u003eLà non plus, je n\u0026rsquo;aborderais pas la création des certificats SSL ; mais il est nécessaire de les générer si vous voulez utiliser le protocole HTTPS.\u003c/p\u003e\n\u003cp\u003eNous admettrons que c\u0026rsquo;est le cas, alors veillez à les générer, puisque la configuration sous-jacente de nginx le fera, sinon à vous de vous adapter.\u003c/p\u003e\n\u003ch3 id=\"nginx\"\u003enginx\u003c/h3\u003e\n\u003cp\u003eAbordons l\u0026rsquo;aspect le plus intéressant : la configuration de nginx pour qu\u0026rsquo;il gère le flux, tout en servant de proxy au serveur Vger. Ce dernier n\u0026rsquo;étant pas exposé directement à Internet.\u003c/p\u003e\n\u003cp\u003eIl faut toujours veiller à ce que le module \u003ccode\u003estream\u003c/code\u003e de nginx soit chargé, avant la directive \u003ccode\u003ehttp\u003c/code\u003e dans le fichier de configuration relatif \u003ccode\u003e/etc/nginx/nginx.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\"\u003eload_module \u0026#34;modules/ngx_stream_module.so\u0026#34;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003ece qui signifie que le paquet \u003ccode\u003enginx-stream\u003c/code\u003e soit installé !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003ePuis le fichier de configuration \u003ccode\u003estream.conf\u003c/code\u003e aura les déclarations 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\"\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/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        \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        \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        \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    \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\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\"\u003eserver_name domaine1.net;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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/domaine1.net/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\"\u003essl_certificate /etc/letsencrypt/live/domaine1.net/fullchain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003essl_certificate_key /etc/letsencrypt/live/domaine1.net/privkey.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003essl_trusted_certificate /etc/letsencrypt/live/domaine1.net/chain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \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\u003cspan style=\"color:#776e71\"\u003e#       ssl_early_data on;  \u0026lt;= not allowed on stream context\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \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        \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        \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:#776e71\"\u003e#       proxy_set_header Early-Data $ssl_early_data;    \u0026lt;= not allowed on stream context\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 {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 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\"\u003eserver_name domaine2.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\"\u003eaccess_log logs/domaine2.com/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\"\u003essl_certificate /etc/letsencrypt/live/domaine2.com/fullchain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003essl_certificate_key /etc/letsencrypt/live/domaine2.com/privkey.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003essl_trusted_certificate /etc/letsencrypt/live/domaine2.com/chain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \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        \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        \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        \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\u003eLier ce fichier de configuration au fichier de configuration principal, par l\u0026rsquo;ajout d\u0026rsquo;une déclaration 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\"\u003einclude /etc/nginx/stream.conf;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eExplications :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUn seul fichier de déclaration \u003ccode\u003estream\u003c/code\u003e ; \u003cem\u003esi vous essayez d\u0026rsquo;en créer plusieurs, tel un par nom de domaine à gérer, nginx refusera de valider la configuration\u003c/em\u003e !\u003c/li\u003e\n\u003cli\u003etoujours deux directives \u003ccode\u003eupstream\u003c/code\u003e pour gérer correctement les protocoles IPv(4|6) et mappées de manière à n\u0026rsquo;être appeler que par un seul proxy, celui correspondant au protocole IP concerné.\u003c/li\u003e\n\u003cli\u003eune directive \u003ccode\u003eserver\u003c/code\u003e par nom de domaine à gérer, dans lesquelles configurer les directives d\u0026rsquo;écoutes, de ssl et de proxy nécessaires.\u003c/li\u003e\n\u003cli\u003eattention les logs seront bel et bien dans le répertoire \u003ccode\u003e/var/www/logs/\u003c/code\u003e ou les sous-répertoires dédiés si c\u0026rsquo;est votre cas. Et oui, c\u0026rsquo;est le serveur nginx qui écoute frontalement sur les deux protocoles HTTP et Gemini.\u003c/li\u003e\n\u003cli\u003epour finir, j\u0026rsquo;ai laissé deux lignes en commentaire pour ma mémoire, histoire de me rappeler que les définitions en questions ne sont pas gérées dans un flux ;)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eUne dernière réflexion à-propos des logs, comme le dit la \u003ca href=\"https://nginx.org/en/docs/stream/ngx_stream_log_module.html#access_log\" rel=\"external\"\u003edocumentation de nginx\u003c/a\u003e, ils peuvent être déclarés à la fois dans le contexte des directives \u003ccode\u003estream\u003c/code\u003e que les sous-jacentes \u003ccode\u003eserver\u003c/code\u003e, maintenant il semble qu\u0026rsquo;ils ne soient générés que pour le premier domaine ; si quelqu\u0026rsquo;un a un avis, je suis preneur d\u0026rsquo;informations adéquates\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\u003cp\u003eUn petit rappel concernant une règle PF 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:#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\u003eRechargez le jeu de règles : \u003ccode\u003e$ doas pfctl -f /etc/pf.conf\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"logs\"\u003eLogs\u003c/h3\u003e\n\u003cp\u003eVeillez à (ré)éditer le fichier de régénération des logs \u003ccode\u003e/etc/newsyslog.conf\u003c/code\u003e pour ajouter la rotation des logs, 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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/var/www/logs/domaine1.net/access.gemini.log    664 4   *   $W0 Z   /var/run/nginx.pid SIGUSR1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eC\u0026rsquo;est simple, prend quelques petites minutes à (re)configurer et fonctionnel normalement immédiatement.\u003c/p\u003e\n\u003ch2 id=\"vérifications\"\u003eVérifications\u003c/h2\u003e\n\u003cp\u003eEn admettant que mon domaine principal \u003ccode\u003ehuc.fr.eu.org\u003c/code\u003e et son sous-domaine \u003ccode\u003edoc.\u003c/code\u003e diffusent tous les deux leurs contenus respectifs :\u003c/p\u003e\n\u003ch3 id=\"inetd-1\"\u003einetd\u003c/h3\u003e\n\u003cp\u003e⇒ Pour vérifier que le service inetd écoute en local :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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:$ 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\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\\r\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini://doc.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# Stéphane HUC :: IT Documentation (doc.huc.fr.eu.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:#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 bien \u003ccode\u003e20 text/gemini;\u003c/code\u003e dans chacune des deux interrogations, c\u0026rsquo;est que vger écoute et répond localement.\u003c/li\u003e\n\u003cli\u003eSi la réponse est du type \u003ccode\u003etelnet: Unable to connect to remote host: Connection refused\u003c/code\u003e, vérifiez le service \u003ccode\u003einetd\u003c/code\u003e ; est-il actif et démarré ?!\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"à-lécoute-\"\u003eà l\u0026rsquo;écoute ?\u003c/h3\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-shell\" data-lang=\"shell\"\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  127.0.0.1.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  *.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  *.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  ::1.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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"cli\"\u003eCLI\u003c/h3\u003e\n\u003cp\u003eDepuis une station, avec un terminal, si vous avez les outils suivants, pour vérifiez que l\u0026rsquo;écoute sur le port 1965 à destination du serveur s\u0026rsquo;exécute bien :\u003c/p\u003e\n\u003cp\u003e⇒ avec \u003ccode\u003eopenssl\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\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ehuc.fr.eu.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s%s\\r\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini://\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\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | openssl s_client -ign_eof -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:1965\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConnecting to 46.23.90.29\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCONNECTED\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e00000003\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:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eVerify \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e code: \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eok\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:#f99b15\"\u003e20\u003c/span\u003e text/gemini; \u003cspan style=\"color:#ef6155\"\u003elang\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003een,fr\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\u003eclosed\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ avec \u003ccode\u003egnutls-cli\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:#5bc4bf\"\u003e{\u003c/span\u003e printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s%s\\r\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini://\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\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e ; cat -; \u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e | gnutls-cli --no-ca-verification \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:1965\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eProcessed \u003cspan style=\"color:#f99b15\"\u003e144\u003c/span\u003e CA certificate\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\u003eResolving \u003cspan style=\"color:#48b685\"\u003e\u0026#39;huc.fr.eu.org:1965\u0026#39;\u003c/span\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConnecting to \u003cspan style=\"color:#48b685\"\u003e\u0026#39;2a03:6000:6e65:619::29:1965\u0026#39;\u003c/span\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConnecting to \u003cspan style=\"color:#48b685\"\u003e\u0026#39;46.23.90.29:1965\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:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- Handshake was completed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- Simple Client Mode:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e20\u003c/span\u003e text/gemini; \u003cspan style=\"color:#ef6155\"\u003elang\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003een,fr\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- Peer has closed the GnuTLS connection\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e^C\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","summary":"Configurer les serveurs Vger et nginx, en tant que proxy, pour diffuser sur le protocol Gemini, de multiples noms de domaines","tags":["Gemini","Vger","OpenBSD","PF","nginx"],"date_published":"2026-05-16T05:07:59+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-05-15:/fr/trad/petern-n-m-hansteen/opensmtpd-is-mail-server-for-future/#31c497af155818dfc6d0eae2e559632dac126bdc430eb5610e97df61f0b3b80d","url":"https://it-log.fr.eu.org/fr/trad/petern-n-m-hansteen/opensmtpd-is-mail-server-for-future/","title":"OpenSMTPD : le serveur mail du futur","author":{"name":"Stéphane HUC"},"content_text":"Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;OpenSMTPD Is The Mail Server For The Future\u0026rdquo;, écrit par Peter N.M. Hansteen.\nImage crédit: le projet OpenSMTPD\n© 2026 Peter N. M. Hansteen\nLe serveur mail SMTP du 21ème siècle et bien après est OpenSMTPD, qui est développé en tant que partie intégrale d\u0026rsquo;OpenBSD, mais aussi disponible en version portable.\nC\u0026rsquo;est une des choses que j\u0026rsquo;avais vraiment l\u0026rsquo;intention de faire, il y a des années, mais que je n\u0026rsquo;ai finalement mise en œuvre qu\u0026rsquo;une fois la date butoir précise fixée.\nLe temps est venu, et puisqu\u0026rsquo;OpenBSD 7.9 laissera derrière lui le paquet exim, et les utilisateurs devront trouver un remplaçant avant la mise à niveau. Cet article décrit ma transition vers le serveur mail OpenSMTPD sous OpenBSD.\nOpenBSD 7.9 laissera derrière lui le paquet exim, et les utilisateurs d\u0026rsquo;exim devront trouver un remplaçant avant la mise à niveau.\nOpenSMTPD (smptd) est de base dans le système.\nQuand OpenSMTPD a été introduit dans la base du système d\u0026rsquo;OpenBSD depuis OpenBSD 4.6 en Octobre 2009, je gérais déjà depuis des années un service mail.\nÀ l\u0026rsquo;époque, je trouvais pratique de continuer à utiliser exim en tant que serveur de messagerie, protégé par la version spamd d\u0026rsquo;OpenBSD, au niveau du chemin d\u0026rsquo;entrée des messages et en combinaison avec spamassassin et clamav pour filtrer le contenu.\nÀ l\u0026rsquo;époque, j\u0026rsquo;étais très tenté à tester ce nouveau serveur smptd, mais la version initiale de celui-ci n\u0026rsquo;était pas encore tout à fait prête pour être mise en service.\nNote : Cet article est aussi disponible avec des traqueurs, mais joliment formaté ici.\nLe rythme de développement a été assez frénétique au cours des premières années, et lorsque smtpd a remplacé le classique sendmail en tant que serveur mail par défaut dans OpenBSD avec la sortie en Novembre 2014 d\u0026rsquo;OpenBSD 5.6, je venais tout juste de terminer la troisième édition du livre \u0026ldquo;The Book of PF ; le sujet m\u0026rsquo;intéressait, mais la rédaction avait drainé mon énergie.\nBien sûr, je considérais que les configurations du serveur de messagerie, que j\u0026rsquo;utilisais pour mes besoins et mes amis, étaient suffisamment complexes pour que le passage vers une autre solution nécessite pas mal de préparations et de tests. J\u0026rsquo;ai donc décidé de remettre à plus tard l\u0026rsquo;étude sérieuse de ce nouveau logiciel de serveur de messagerie à un autre jour, qui fatalement arriverait, ce dont j\u0026rsquo;étais certain.\nUne vieille installation, maintenue avec beaucoup d\u0026rsquo;amour et de soins Il y a quelques indices sur ce que cette configuration faisait (et fait toujours) dans l\u0026rsquo;article de 2012 intitulé In The Name Of Sane Email: Setting Up OpenBSD\u0026rsquo;s spamd(8) With Secondary MXes In Play - A Full Recipe (aussi avec traqueurs et mis en forme) ; voici les principales fonctionnalités :\nDeux (originellement trois) sites séparés, chacun avec leur propre nom de domaine, où le(s) autre(s) site(s) assure(nt) une fonction de serveur MX secondaire pour les autres, chaque machine fonctionnant sous OpenBSD équipée de spamd ; ce qui constituait la partie de la configuration du service de messagerie exposée à Internet. Les machines sous OpenBSD assumaient le filte de liste et de piège \u0026ldquo;gris\u0026rdquo; de spamd, mais fournissaient aussi le filtrage de contenu pour le compte d\u0026rsquo;un autre ensemble de domaines disposant de leur propre serveurs de messageries, pas nécessairement exposés à Internet, qui recevaient les courriels filtrés transmis par les services de messagerie connectés à Internet. Cette configuration, avec le filtrage greylisting et greytrapping d\u0026rsquo;OpenBSD spamd en première ligne et celui de contenu en suivant avant d\u0026rsquo;être relayé finalement vers les serveurs de mails protégés, fonctionnait si bien que nous avons simplement gardé les systèmes fonctionnels en effectuant au besoin les mises à jours système routinières, des paquets et les ajustements mineurs de configurations nécessaires.\nEn résumé, les domaines à gérer se sont succédés, mais la combinaison de spamd, exim, clamav+spamassassin est restée, sur la plateforme fiable d\u0026rsquo;OpenBSD.\nLe temps de passer à autre chose, d\u0026rsquo;attendre et finalement… Au fil des ans, de nombreuses épisodes de failles de sécurités moyennes à sévères ont été découvertes dans le code source d\u0026rsquo;exim, mais le paquet OpenBSD été généralement bien maintenu et les correctifs à apparaître dans un délai raisonnable.\nDe temps en temps, les développeurs d\u0026rsquo;OpenBSD discuter avec les gestionnaires de ports de la suppression du support d\u0026rsquo;exim et du système de paquets, ce qui s\u0026rsquo;est finalement produit durant l\u0026rsquo;année 2026.\nOpenBSD 7.9 sera livrée sans un paquet exim officiel.\nIl est ainsi venu le temps de passer à autre chose.\nEt bien sûr, un faux départ D\u0026rsquo;autres utilisateurs d\u0026rsquo;OpenBSD n\u0026rsquo;arrêtaient pas de me dire à quel point OpenSMTPD était devenu bon, alors j\u0026rsquo;ai maintenant décidé que c\u0026rsquo;était le temps de m\u0026rsquo;y mettre ; j\u0026rsquo;ai donc ressorti quelques vieilles notes et commencé l\u0026rsquo;expérimentation.\nCes vieilles notes se sont avérées totalement inutiles, et cela pour une raison : la version d\u0026rsquo;OpenSMTPD 6.4 était le résultat d\u0026rsquo;une refonte majeure du code, qui a modifié d\u0026rsquo;importants éléments de syntaxe du fichier smtpd.conf.\nMalheureusement, la plupart des guides qui apparaissent en tête de résultat de recherche utilisent encore l\u0026rsquo;ancienne syntaxe et sont donc inutiles, du moins pour les utilisateurs d\u0026rsquo;OpenBSD, ou d\u0026rsquo;autres plateformes, qui ont maintenu à jour raisonnablement leur code. Une bonne règle à suivre est la suivante : si vous trouvez un guide d\u0026rsquo;OpenSMTPD datant d\u0026rsquo;avant 2020, faites vous une faveur et passez à un document plus récent.\nSi vous trouvez un guide d\u0026rsquo;OpenSMTPD datant d\u0026rsquo;avant 2020, faites vous une faveur et passez à un document plus récent.\nLa tâche à gérer : l\u0026rsquo;Analyse Revenons-en au problème : la configuration que je m\u0026rsquo;apprêtais à convertir devait pouvoir s\u0026rsquo;adapter à gérer :\nles courriels entrants des utilisateurs des domaines locaux, là où nous sommes le principal serveur de messagerie les courriels entrants des utilisateurs des domaines pour lesquels nous sommes serveur de messagerie secondaire les courriels entrants des utilisateurs des domaines là où nous sommes le principal serveur de messagerie avec l\u0026rsquo;extérieur, mais où actuellement nous ne faisons que relayer après le filtrage greylisting et de contenu. les courriels sortants venant des domaines locaux les courriels sortants venant des réseaux auxquels nous avons choisi de leur faire suffisament confiance pour les relayer Les enregistrements du serveur de messagerie (MX) pour tous les domaines concernés étaient déjà en place, ainsi que d\u0026rsquo;autres informations DNS pertinentes, tels les enregistrements SPF, DKIM et DMARC. Les certificats TLS et le système permettant de les gérer étaient déjà en place, utilisant les outils LetsEncrypt.\nCette analyse convertit dans la logique de smtpd.conf devrait être :\nnous gardons le fichier existant /etc/mail/aliases, les formats étant compatibles OpenSMTPD gère des tables de manière très pratique, qui peuvent soit être une liste simple, soit une paire de clés-valeurs. Nos tables sont : domains_local liste les domaines dont nous recevons les courriels à gérer localement. relay-for_domains liste les domaines que nous filtrons seulement puis relayons domain_relays est la liste des domaines et leurs serveurs de messageries de destination finale sous une forme de liste de paires de clés-valeurs. relay_from_ips est la liste des adresses IP et des réseaux que nous nous autorisons à relayer Voici l\u0026rsquo;actuelle implémentation Ainsi je me suis mis au travail en partant de ce cahier des charges, et en fin d\u0026rsquo;après-midi, j\u0026rsquo;en suis arrivé à la conclusion que :\nparamètrer TLS était le plus simple, grâce aux instructions pki simples les instructions listen font maintenant leur travail dans un espace très restreint le routage vers la distribution locale et le transfert est facile grâce à une combinaison de règles action et match. concernant le filtrage, clamav n\u0026rsquo;a pas été très utile pour mes utilisateurs (aucun n\u0026rsquo;était utilisateur Windows) et les options de filtrage utilisées par spamassassin en arrière-plan étaient soit inopérantes, soit trop complexe pour avoir du sens à s\u0026rsquo;en servir. J\u0026rsquo;avais fini par tester un alternative moderne, rspamd, qui était disponible via le système de paquets d\u0026rsquo;OpenBSD. dkimproxy semblait être un bon candidat pour signer les messages sortants, je l\u0026rsquo;ai testé un temps, mais suite au conseil de Martijn van Duren, j\u0026rsquo;ai basculé sur dkimsign, aussi disponible sous OpenBSD en tant que paquet opensmtpd-filter-dkimsign. En supplément de smtpd qui est déjà dans la base, cette configuration requière les paquets opensmtpd-filter-dkimsign and opensmtpd-filter-rspamd.\nL\u0026rsquo;installation des deux paquets se fait via pkg_add qui installe toutes les dépendances requises.\nAvec ces pré-requis en place,\ndisable and stop exim doas rcctl disable exim \u0026amp;\u0026amp; doas rcctl stop exim disable and stop clamav doas rcctl disable clamav \u0026amp;\u0026amp; doas clamav stop clamav disable and stop spamassassin doas rcctl disable spamassassin \u0026amp;\u0026amp; doas rcctl stop spamassassin À ce stade, nous devons supprimer les paquets avec\ndoas pkg_delete packagename et suivre les étapes affichées suite au message de suppression de paquet.\nNe supprimez pas la configuration d\u0026rsquo;exim, avant d\u0026rsquo;avoir copié les parties utiles dans votre nouveau fichier /etc/mail/smtpd.conf.\nJ\u0026rsquo;ai fini par obtenir cette configuration (modifié ici légérement par souci de concision) :\n---- /etc/mail/smtpd.conf\ntable aliases file:/etc/mail/aliases table domains_local { \u0026#34;bsdly.com\u0026#34;, \u0026#34;bsdly.eu\u0026#34;, \u0026#34;bsdly.net\u0026#34;, \u0026#34;bsdly.no\u0026#34;, \u0026#34;bsdly.org\u0026#34;, \u0026#34;bsdly.se\u0026#34;, \u0026#34;nxdomain.no\u0026#34;, # plus a lot of other domains, elided here for brevity } table relay_for_domains { \u0026#34;nuug.no\u0026#34;, \u0026#34;blug.linux.no\u0026#34; # again more domains in the real smtpd.conf, left out here } table domain_relays { \u0026#34;nuug.no\u0026#34; = \u0026#34;smtp://mx1.nuug.no\u0026#34;, \u0026#34;blug.linux.no\u0026#34; = \u0026#34;smtp://mail.lamasti.net\u0026#34; # again more domains in the real smtpd.conf, left out here } table relay_from_ips { 127.0.0.1 ::1 # The rest are fictional, RFC5737 and RFC3849 192.0.2.0/24 198.51.100.0/24 203.0.113.0/24 2001:DB8::/32 } filter \u0026#34;rspamd\u0026#34; proc-exec \u0026#34;filter-rspamd\u0026#34; filter dkimsign_rsa proc-exec \u0026#34;filter-dkimsign -d bsdly.net -s x -k /etc/mail/dkim/private.rsa.key\u0026#34; user _dkimsign group _dkimsign pki skapet.bsdly.net cert \u0026#34;/etc/mail/certificate.pem\u0026#34; pki skapet.bsdly.net key \u0026#34;/etc/mail/privkey.pem\u0026#34; listen on socket listen on all port 25 tls pki skapet.bsdly.net filter \u0026#34;rspamd\u0026#34; listen on all port 465 smtps pki skapet.bsdly.net filter \u0026#34;rspamd\u0026#34; listen on all port submission tls pki skapet.bsdly.net action \u0026#34;local_mail\u0026#34; mbox alias \u0026lt;aliases\u0026gt; action \u0026#34;relay_domain\u0026#34; relay domain \u0026lt;domain_relays\u0026gt; filter \u0026#34;rspamd\u0026#34; action \u0026#34;outbound\u0026#34; relay filter dkimsign_rsa match from local for local action local_mail match from any for domain \u0026lt;domains_local\u0026gt; action local_mail match from any for domain \u0026lt;relay_for_domains\u0026gt; action relay_domain match from src \u0026lt;relay_from_ips\u0026gt; for any action outbound match from local for any action outbound Les noms de domaines et adresses IP spécifiques seront différents pour le site secondaire, comme ce sera votre cas, dans toute configuration que vous mettriez en place.\nAprès l\u0026rsquo;examen des journaux et des messages, j\u0026rsquo;ai également dû apporter de légères modifications à la configuration de rspamd.\n---- /etc/rspamd/local.d/actions.conf\nreject = 10; # final reject discard = 15; add_header = 6; # mark spam greylist = null; # do not greylist, we have spamd for that # Custom action (referenced by force_actions), no own threshold phishing = { flags = [\u0026#34;no_threshold\u0026#34;]; } Voilà l\u0026rsquo;entière configuration. En tenant compte de la longue liste de domaines et de réseaux, la longueur totale de ma configuration est maintenant :\n$ grep -vc \\# /etc/mail/smtpd.conf 104 104 lignes, là où la précédente configuration pour exim, une fois les lignes de commentaires supprimées, était de :\n$ grep -vc \\# /etc/exim/configure 380 380 lignes.\nLe fichier smtpd.conf est aussi lisible que celui de pf.conf, ayant de nombreuses fonctionnalités similaires.\nUne fois les paquets installés et les anciens services désactivés, activez et lancez les nouveaux services.\nAvant de (ré)activer smtpd en tant que serveur de messagerie par défaut après exim, exécutez :\n$ doas /usr/local/sbin/exim-disable pour restaurer le fichier /etc/mailer.conf à son état original.\nSi tout cela échoue, vous pouvez facilement récupèrer une version intacte depuis le CVS d\u0026rsquo;OpenBSD.\nPour activer ces nouveaux services, exécutez\n$ doas rcctl enable smptpd \u0026amp;\u0026amp; doas rcctl start smtpd $ doas rcctl enable redis \u0026amp;\u0026amp; doas rcctl start redis $ doas rcctl enable rspamd \u0026amp;\u0026amp; doas rcctl start rspamd Vous devriez constater une activité assez rapidement en surveillant le fichier /var/log/maillog, tel que :\n$ tail -n 500 -f /var/log/maillog Quand vous serez satisfait du flux de couriels entrants et sortants et qu\u0026rsquo;ils soient relayés là où vous le souhaitez, vous pourrez supprimer les paquets exim, clamav et spamassassin puis suivre les instructions retournées par les messages de pkg_delete pour libérer de l\u0026rsquo;espace disque.\nEt, oui des configurations bien plus complexes sont possibles, tout particulièrement en matière de filtrage.\nMais j\u0026rsquo;ai été agréablement surpris à la fois par la simplicité de cette transition que par la perspective de disposer d\u0026rsquo;une configuration vraiment facile à entretenir et à améliorer.\nLe processus de transition m\u0026rsquo;a montré qu\u0026rsquo;OpenSMTPD est un produit solide, à l\u0026rsquo;image d\u0026rsquo;OpenBSD. Faire le choix d\u0026rsquo;adopter OpenSMTPD en tant que serveur de messagerie par défaut est sans nul doute l\u0026rsquo;une des meilleures décisions prises par le projet OpenBSD, et les récents utilisateurs tel que moi ne peuvent qu\u0026rsquo;applaudir cette décision.\nOpenSMTPD et OpenBSD sont caractéristiques tous deux par la capacité de leurs développeurs à non seulement tirer des leçons des versions précédentes du système d\u0026rsquo;exploitation et du serveur de messagerie inclus, mais aussi à venir proposer de nouvelles approches, parfois radicalement différentes, connues pour résoudre des problèmes, afin d\u0026rsquo;aboutir à un produit plus sûr et plus utilisable. À mon sens, c\u0026rsquo;est là le serveur de messagerie et le système d\u0026rsquo;exploitation pour l\u0026rsquo;avenir.\nSi vous êtes intéressé par la configuration de smtpd avec plus de filtres ou d\u0026rsquo;autres options, il en existe un grand nombre, notamment opensmtpd-filter-dnsbl qui récupère les listes de blocage DNS à partir de sources que vous lui indiquez.\nOpenSMTPD est disponible sur une grande variété de plateformes, incluant de nombreuses distributions Linux et BSD, tel FreeBSD via sa version portable.\nJ\u0026rsquo;ai opté pour une configuration plutôt minimaliste, principalement parce que d\u0026rsquo;expérience les fonctionnalités de greylisting et de greytrapping de spamd sont un bouclier très efficace et nécessitant très peu d\u0026rsquo;entretien pour tout service de messagerie. Si le greytrapping vous intéresse, l\u0026rsquo;article peu souvent mis à jour Eighteen Years of Greytrapping - Is the Weirdness Finally Paying Off? (et sa version avec traqueurs et paginée) fournit plus de lecture via de nombreux liens qui peuvent occuper raisonnablement plus d\u0026rsquo;une de vos soirées.\nSi vous préférez un livre qui couvre plus de sujets réseaux sous OpenBSD et FreeBSD, qui consacre une place importante à spamd, le livre The Book of PF, maintenant dans sa quatrième édition, est à vous.\nBonne nuit, et bonne chance !\nJe désire remercier Martijn van Duren pour son conseil précieux durant l\u0026rsquo;écriture de cet article.\nOpenSMTPD is the Mail Server for the Future © 2026 Peter N. M. Hansteen (publié le 15/05/2026)\nVous pourriez être aussi intéressé par la lecture d\u0026rsquo;articles sélectionnés via That Grumpy BSD Guy: A Short Reading List (aussi ici).\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://nxdomain.no/~peter/time_for_opensmtpd.html\" rel=\"external\"\u003eOpenSMTPD Is The Mail Server For The Future\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit par Peter N.M. Hansteen.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/peter-n-m-hansteen/opensmtpd.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/peter-n-m-hansteen/opensmtpd_hu_c41daede6fab512f.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/peter-n-m-hansteen/opensmtpd_hu_c053001428c2a79a.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"OpenSMTPD: We deliver\"\n                    height=\"210\"\n                    id=\"img_images_peter-n-m-hansteen_opensmtpd.png_0\"\n                    src=\"/images/peter-n-m-hansteen/opensmtpd.png\"\n                    width=\"599\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\n\u003cem\u003eImage crédit: \u003ca href=\"https://www.opensmtpd.org/\" rel=\"external\"\u003ele projet OpenSMTPD\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e© 2026 Peter N. M. Hansteen\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eLe serveur mail SMTP du 21ème siècle et bien après est \u003ca href=\"https://www.opensmtpd.org/\" rel=\"external\"\u003eOpenSMTPD\u003c/a\u003e, qui est développé en tant que partie intégrale d\u0026rsquo;\u003ca href=\"https://www.openbsd.org/\" rel=\"external\"\u003eOpenBSD\u003c/a\u003e, mais aussi disponible en version portable.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est une des choses que j\u0026rsquo;avais vraiment l\u0026rsquo;intention de faire, il y a des années, mais que je n\u0026rsquo;ai finalement mise en œuvre qu\u0026rsquo;une fois la date butoir précise fixée.\u003c/p\u003e\n\u003cp\u003eLe temps est venu, et puisqu\u0026rsquo;\u003cem\u003e\u003ca href=\"https://www.openbsd.org/79.html\" rel=\"external\"\u003eOpenBSD 7.9\u003c/a\u003e\u003c/em\u003e laissera derrière lui le paquet \u003ca href=\"https://exim.org/\" rel=\"external\"\u003eexim\u003c/a\u003e, et les utilisateurs devront trouver un remplaçant avant la mise à niveau. Cet article décrit ma transition vers le serveur mail \u003cem\u003e\u003ca href=\"https://www.opensmtpd.org/\" rel=\"external\"\u003eOpenSMTPD\u003c/a\u003e\u003c/em\u003e sous OpenBSD.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003ca href=\"https://www.openbsd.org/79.html\" rel=\"external\"\u003eOpenBSD 7.9\u003c/a\u003e laissera derrière lui le paquet  \u003ca href=\"https://exim.org/\" rel=\"external\"\u003e\u003ccode\u003eexim\u003c/code\u003e\u003c/a\u003e, et les utilisateurs d\u0026rsquo;\u003ccode\u003eexim\u003c/code\u003e devront trouver un remplaçant avant la mise à niveau.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003ca href=\"https://www.opensmtpd.org/\" rel=\"external\"\u003eOpenSMTPD\u003c/a\u003e (\u003ccode\u003esmptd\u003c/code\u003e) est de base dans le système.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eQuand \u003cem\u003e\u003ca href=\"https://www.opensmtpd.org/\" rel=\"external\"\u003eOpenSMTPD\u003c/a\u003e\u003c/em\u003e a été introduit dans la base du système d\u0026rsquo;\u003cem\u003e\u003ca href=\"https://www.openbsd.org/\" rel=\"external\"\u003eOpenBSD\u003c/a\u003e\u003c/em\u003e depuis \u003cem\u003e\u003ca href=\"https://www.openbsd.org/46.html\" rel=\"external\"\u003eOpenBSD 4.6\u003c/a\u003e\u003c/em\u003e en Octobre 2009, je gérais déjà depuis des années un service mail.\u003c/p\u003e\n\u003cp\u003eÀ l\u0026rsquo;époque, je trouvais pratique de continuer à utiliser \u003ca href=\"https://exim.org/\" rel=\"external\"\u003e\u003ccode\u003eexim\u003c/code\u003e\u003c/a\u003e en tant que serveur de messagerie, protégé par la version \u003ca href=\"https://man.openbsd.org/spamd\" rel=\"external\"\u003e\u003ccode\u003espamd\u003c/code\u003e\u003c/a\u003e d\u0026rsquo;OpenBSD, au niveau du chemin d\u0026rsquo;entrée des messages et en combinaison avec \u003ca href=\"https://en.wikipedia.org/wiki/Apache_SpamAssassin\" rel=\"external\"\u003e\u003ccode\u003espamassassin\u003c/code\u003e\u003c/a\u003e et \u003ca href=\"https://en.wikipedia.org/wiki/ClamAV\" rel=\"external\"\u003e\u003ccode\u003eclamav\u003c/code\u003e\u003c/a\u003e pour filtrer le contenu.\u003c/p\u003e\n\u003cp\u003eÀ l\u0026rsquo;époque, j\u0026rsquo;étais très tenté à tester ce nouveau serveur smptd, mais la version initiale de celui-ci n\u0026rsquo;était pas encore tout à fait prête pour être mise en service.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eNote :\u003c/strong\u003e Cet article est aussi disponible \u003cem\u003eavec\u003c/em\u003e des traqueurs, mais joliment formaté \u003ca href=\"https://bsdly.blogspot.com/2026/05/opensmtpd-is-mail-server-for-future.html\" rel=\"external\"\u003eici\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eLe rythme de développement a été assez frénétique au cours des premières années, et lorsque \u003ca href=\"https://man.openbsd.org/smtpd\" rel=\"external\"\u003e\u003ccode\u003esmtpd\u003c/code\u003e\u003c/a\u003e a remplacé le classique \u003ca href=\"https://en.wikipedia.org/wiki/Sendmail\" rel=\"external\"\u003e\u003ccode\u003esendmail\u003c/code\u003e\u003c/a\u003e en tant que serveur mail par défaut dans OpenBSD avec la sortie en Novembre 2014 d\u0026rsquo;\u003cem\u003e\u003ca href=\"https://www.openbsd.org/56.html\" rel=\"external\"\u003eOpenBSD 5.6\u003c/a\u003e\u003c/em\u003e, je venais tout juste de terminer la \u003cem\u003etroisième\u003c/em\u003e édition du livre \u0026ldquo;\u003ca href=\"https://nostarch.com/book-of-pf-4e\" rel=\"external\"\u003eThe Book of PF\u003c/a\u003e ; le sujet m\u0026rsquo;intéressait, mais la rédaction avait drainé mon énergie.\u003c/p\u003e\n\u003cp\u003eBien sûr, je considérais que les configurations du serveur de messagerie, que j\u0026rsquo;utilisais pour mes besoins et mes amis, étaient suffisamment complexes pour que le passage vers une autre solution nécessite pas mal de préparations et de tests. J\u0026rsquo;ai donc décidé de remettre à plus tard l\u0026rsquo;étude sérieuse de ce nouveau logiciel de serveur de messagerie à un autre jour, qui fatalement arriverait, ce dont j\u0026rsquo;étais certain.\u003c/p\u003e\n\u003ch2 id=\"une-vieille-installation-maintenue-avec-beaucoup-damour-et-de-soins\"\u003eUne vieille installation, maintenue avec beaucoup d\u0026rsquo;amour et de soins\u003c/h2\u003e\n\u003cp\u003eIl y a quelques indices sur ce que cette configuration faisait (et fait toujours) dans l\u0026rsquo;article de 2012 intitulé \u003cem\u003e\u003ca href=\"https://nxdomain.no/~peter/in_the_name_of_sane_email.html\" rel=\"external\"\u003eIn The Name Of Sane Email: Setting Up OpenBSD\u0026rsquo;s spamd(8) With Secondary MXes In Play - A Full Recipe\u003c/a\u003e\u003c/em\u003e (aussi avec \u003cem\u003e\u003ca href=\"https://bsdly.blogspot.com/2012/05/in-name-of-sane-email-setting-up-spamd.html\" rel=\"external\"\u003etraqueurs et mis en forme\u003c/a\u003e\u003c/em\u003e) ; voici les principales fonctionnalités :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDeux (originellement trois) sites séparés, chacun avec leur propre nom de domaine, où le(s) autre(s) site(s) assure(nt) une fonction de serveur MX secondaire pour les autres, chaque machine fonctionnant sous OpenBSD équipée de spamd ; ce qui constituait la partie de la configuration du service de messagerie exposée à Internet.\u003c/li\u003e\n\u003cli\u003eLes machines sous OpenBSD assumaient le filte de liste et de piège \u0026ldquo;gris\u0026rdquo; de spamd, mais fournissaient aussi le filtrage de contenu pour le compte d\u0026rsquo;un autre ensemble de domaines disposant de leur propre serveurs de messageries, pas nécessairement exposés à Internet, qui recevaient les courriels filtrés transmis par les services de messagerie connectés à Internet.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCette configuration, avec le filtrage \u003cem\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Greylisting_(email)\" rel=\"external\"\u003egreylisting\u003c/a\u003e\u003c/em\u003e et \u003cem\u003e\u003ca href=\"https://home.nuug.no/~peter/pf/en/spamd.greytrapping.html\" rel=\"external\"\u003egreytrapping\u003c/a\u003e\u003c/em\u003e d\u0026rsquo;OpenBSD \u003ccode\u003espamd\u003c/code\u003e en première ligne et celui de contenu en suivant avant d\u0026rsquo;être relayé finalement vers les serveurs de mails protégés, fonctionnait si bien que nous avons simplement gardé les systèmes fonctionnels en effectuant au besoin les mises à jours système routinières, des paquets et les ajustements mineurs de configurations nécessaires.\u003c/p\u003e\n\u003cp\u003eEn résumé, les domaines à gérer se sont succédés, mais la combinaison de \u003ccode\u003espamd\u003c/code\u003e, \u003ccode\u003eexim\u003c/code\u003e, \u003ccode\u003eclamav\u003c/code\u003e+\u003ccode\u003espamassassin\u003c/code\u003e est restée, sur la plateforme fiable d\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003ch2 id=\"le-temps-de-passer-à-autre-chose-dattendre-et-finalement\"\u003eLe temps de passer à autre chose, d\u0026rsquo;attendre et finalement…\u003c/h2\u003e\n\u003cp\u003eAu fil des ans, de nombreuses épisodes de failles de sécurités moyennes à sévères ont été découvertes dans le code source d\u0026rsquo;\u003ccode\u003eexim\u003c/code\u003e, mais le paquet OpenBSD été généralement bien maintenu et les correctifs à apparaître dans un délai raisonnable.\u003c/p\u003e\n\u003cp\u003eDe \u003ca href=\"https://marc.info/?l=openbsd-ports\u0026amp;m=169608032618954\u0026amp;w=2\" rel=\"external\"\u003etemps\u003c/a\u003e en \u003ca href=\"https://marc.info/?l=openbsd-ports\u0026amp;m=177625153728067\u0026amp;w=2\" rel=\"external\"\u003etemps\u003c/a\u003e, les développeurs d\u0026rsquo;OpenBSD discuter avec les gestionnaires de ports de la suppression du support d\u0026rsquo;\u003ccode\u003eexim\u003c/code\u003e et du système de paquets, ce qui s\u0026rsquo;est finalement produit durant l\u0026rsquo;année 2026.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003ca href=\"https://www.openbsd.org/79.html\" rel=\"external\"\u003eOpenBSD 7.9\u003c/a\u003e\u003c/em\u003e sera livrée sans un paquet \u003ccode\u003eexim\u003c/code\u003e officiel.\u003c/p\u003e\n\u003cp\u003eIl est ainsi venu le temps de passer à autre chose.\u003c/p\u003e\n\u003ch2 id=\"et-bien-sûr-un-faux-départ\"\u003eEt bien sûr, un faux départ\u003c/h2\u003e\n\u003cp\u003eD\u0026rsquo;autres utilisateurs d\u0026rsquo;OpenBSD n\u0026rsquo;arrêtaient pas de me dire à quel point OpenSMTPD était devenu bon, alors j\u0026rsquo;ai maintenant décidé que c\u0026rsquo;était le temps de m\u0026rsquo;y mettre ; j\u0026rsquo;ai donc ressorti quelques vieilles notes et commencé l\u0026rsquo;expérimentation.\u003c/p\u003e\n\u003cp\u003eCes vieilles notes se sont avérées totalement inutiles, et cela pour une raison : la version d\u0026rsquo;\u003ca href=\"https://www.openbsd.org/64.html\" rel=\"external\"\u003eOpenSMTPD 6.4\u003c/a\u003e était le résultat d\u0026rsquo;une refonte majeure du code, qui a modifié d\u0026rsquo;importants éléments de syntaxe du fichier \u003ca href=\"https://man.openbsd.org/smtpd.conf\" rel=\"external\"\u003e\u003ccode\u003esmtpd.conf\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eMalheureusement, la plupart des guides qui apparaissent en tête de résultat de recherche utilisent encore l\u0026rsquo;ancienne syntaxe et sont donc inutiles, du moins pour les utilisateurs d\u0026rsquo;OpenBSD, ou d\u0026rsquo;autres plateformes, qui ont maintenu à jour raisonnablement leur code. Une bonne règle à suivre est la suivante : si vous trouvez un guide d\u0026rsquo;\u003cem\u003e\u003ca href=\"https://www.opensmtpd.org/\" rel=\"external\"\u003eOpenSMTPD\u003c/a\u003e\u003c/em\u003e datant d\u0026rsquo;avant 2020, faites vous une faveur et passez à un document plus récent.\u003c/p\u003e\n\u003chr\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cem\u003eSi vous trouvez un guide d\u0026rsquo;\u003ca href=\"https://www.opensmtpd.org/\" rel=\"external\"\u003eOpenSMTPD\u003c/a\u003e datant d\u0026rsquo;avant 2020, faites vous une faveur et passez à un document plus récent\u003c/em\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"la-tâche-à-gérer--lanalyse\"\u003eLa tâche à gérer : l\u0026rsquo;Analyse\u003c/h2\u003e\n\u003cp\u003eRevenons-en au problème : la configuration que je m\u0026rsquo;apprêtais à convertir devait pouvoir s\u0026rsquo;adapter à gérer :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles courriels entrants des utilisateurs des domaines locaux, là où nous sommes le principal serveur de messagerie\u003c/li\u003e\n\u003cli\u003eles courriels entrants des utilisateurs des domaines pour lesquels nous sommes serveur de messagerie secondaire\u003c/li\u003e\n\u003cli\u003eles courriels entrants des utilisateurs des domaines là où nous sommes le principal serveur de messagerie avec l\u0026rsquo;extérieur, mais où actuellement nous ne faisons que relayer après le filtrage greylisting et de contenu.\u003c/li\u003e\n\u003cli\u003eles courriels sortants venant des domaines locaux\u003c/li\u003e\n\u003cli\u003eles courriels sortants venant des réseaux auxquels nous avons choisi de leur faire suffisament confiance pour les relayer\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes enregistrements du serveur de messagerie (MX) pour tous les domaines concernés étaient déjà en place, ainsi que d\u0026rsquo;autres informations DNS pertinentes, tels les enregistrements \u003cem\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Sender_Policy_Framework\" rel=\"external\"\u003eSPF\u003c/a\u003e\u003c/em\u003e, \u003cem\u003e\u003ca href=\"https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail\" rel=\"external\"\u003eDKIM\u003c/a\u003e\u003c/em\u003e et \u003cem\u003e\u003ca href=\"https://en.wikipedia.org/wiki/DMARC\" rel=\"external\"\u003eDMARC\u003c/a\u003e\u003c/em\u003e. Les certificats TLS et le système permettant de les gérer étaient déjà en place, utilisant les outils \u003cem\u003e\u003ca href=\"https://letsencrypt.org/\" rel=\"external\"\u003eLetsEncrypt\u003c/a\u003e\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eCette analyse convertit dans la logique de \u003ccode\u003esmtpd.conf\u003c/code\u003e devrait être :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003enous gardons le fichier existant \u003ca href=\"https://man.openbsd.org/aliases\" rel=\"external\"\u003e\u003ccode\u003e/etc/mail/aliases\u003c/code\u003e\u003c/a\u003e, les formats étant compatibles\u003c/li\u003e\n\u003cli\u003eOpenSMTPD gère des tables de manière très pratique, qui peuvent soit être une liste simple, soit une paire de clés-valeurs. Nos tables sont :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edomains_local\u003c/code\u003e liste les domaines dont nous recevons les courriels à gérer localement.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erelay-for_domains\u003c/code\u003e liste les domaines que nous filtrons seulement puis relayons\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edomain_relays\u003c/code\u003e est la liste des domaines et leurs serveurs de messageries de destination finale sous une forme de liste de paires de clés-valeurs.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erelay_from_ips\u003c/code\u003e est la liste des adresses IP et des réseaux que nous nous autorisons à relayer\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"voici-lactuelle-implémentation\"\u003eVoici l\u0026rsquo;actuelle implémentation\u003c/h2\u003e\n\u003cp\u003eAinsi je me suis mis au travail en partant de ce cahier des charges, et en fin d\u0026rsquo;après-midi, j\u0026rsquo;en suis arrivé à la conclusion que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eparamètrer TLS était le plus simple, grâce aux instructions \u003ccode\u003epki\u003c/code\u003e simples\u003c/li\u003e\n\u003cli\u003eles instructions \u003ccode\u003elisten\u003c/code\u003e font maintenant leur travail dans un espace très restreint\u003c/li\u003e\n\u003cli\u003ele routage vers la distribution locale et le transfert est facile grâce à une combinaison de règles \u003ccode\u003eaction\u003c/code\u003e et \u003ccode\u003ematch\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003econcernant le filtrage, \u003ccode\u003eclamav\u003c/code\u003e n\u0026rsquo;a pas été très utile pour mes utilisateurs (aucun n\u0026rsquo;était utilisateur Windows) et les options de filtrage utilisées par \u003ccode\u003espamassassin\u003c/code\u003e en arrière-plan étaient soit inopérantes, soit trop complexe pour avoir du sens à s\u0026rsquo;en servir. \u003cbr\u003e\nJ\u0026rsquo;avais fini par tester un alternative moderne, \u003ca href=\"https://www.rspamd.com/\" rel=\"external\"\u003e\u003ccode\u003erspamd\u003c/code\u003e\u003c/a\u003e, qui était disponible via le système de paquets d\u0026rsquo;OpenBSD.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edkimproxy\u003c/code\u003e semblait être un bon candidat pour signer les messages sortants, je l\u0026rsquo;ai testé un temps, mais suite au conseil de Martijn van Duren, j\u0026rsquo;ai basculé sur \u003ccode\u003edkimsign\u003c/code\u003e, aussi disponible sous OpenBSD en tant que paquet \u003ccode\u003eopensmtpd-filter-dkimsign\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEn supplément de \u003ca href=\"https://man.openbsd.org/smtpd\" rel=\"external\"\u003e\u003ccode\u003esmtpd\u003c/code\u003e\u003c/a\u003e qui est déjà dans la base, cette configuration requière les paquets \u003ccode\u003eopensmtpd-filter-dkimsign\u003c/code\u003e and \u003ccode\u003eopensmtpd-filter-rspamd\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;installation des deux paquets se fait via \u003ca href=\"https://man.openbsd.org/pkg_add\" rel=\"external\"\u003e\u003ccode\u003epkg_add\u003c/code\u003e\u003c/a\u003e qui installe toutes les dépendances requises.\u003c/p\u003e\n\u003cp\u003eAvec ces pré-requis en place,\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\u003edisable and stop exim\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edoas rcctl disable exim \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e doas rcctl stop exim\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edisable and stop clamav\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edoas rcctl disable clamav \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e doas clamav stop clamav\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edisable and stop spamassassin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edoas rcctl disable spamassassin \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e doas rcctl stop spamassassin\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eÀ ce stade, nous devons supprimer les paquets avec\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edoas pkg_delete packagename\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eet suivre les étapes affichées suite au message de suppression de paquet.\u003c/p\u003e\n\u003cp\u003eNe supprimez pas la configuration d\u0026rsquo;\u003ccode\u003eexim\u003c/code\u003e, avant d\u0026rsquo;avoir copié les parties utiles dans votre nouveau fichier \u003ccode\u003e/etc/mail/smtpd.conf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai fini par obtenir cette configuration (modifié ici légérement par souci de concision) :\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e---- /etc/mail/smtpd.conf\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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable aliases file:/etc/mail/aliases\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 domains_local {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;bsdly.com\u0026#34;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;bsdly.eu\u0026#34;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;bsdly.net\u0026#34;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;bsdly.no\u0026#34;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;bsdly.org\u0026#34;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;bsdly.se\u0026#34;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;nxdomain.no\u0026#34;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# plus a lot of other domains, elided here for brevity\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\"\u003etable relay_for_domains {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;nuug.no\u0026#34;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;blug.linux.no\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# again more domains in the real smtpd.conf, left out here\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\"\u003etable domain_relays {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;nuug.no\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;smtp://mx1.nuug.no\u0026#34;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;blug.linux.no\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;smtp://mail.lamasti.net\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# again more domains in the real smtpd.conf, left out here\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\"\u003etable relay_from_ips {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e127.0.0.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e::1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# The rest are fictional, RFC5737 and RFC3849\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\"\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\"\u003e2001:DB8::/32\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\"\u003efilter \u0026#34;rspamd\u0026#34; proc-exec \u0026#34;filter-rspamd\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003efilter dkimsign_rsa proc-exec \u0026#34;filter-dkimsign -d bsdly.net -s x -k /etc/mail/dkim/private.rsa.key\u0026#34; user _dkimsign group _dkimsign\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003epki skapet.bsdly.net cert \u0026#34;/etc/mail/certificate.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epki skapet.bsdly.net key \u0026#34;/etc/mail/privkey.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\"\u003elisten on socket\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 all port 25 tls pki skapet.bsdly.net filter \u0026#34;rspamd\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 all port 465 smtps pki skapet.bsdly.net filter \u0026#34;rspamd\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 all port submission tls pki skapet.bsdly.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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_mail\u0026#34; mbox 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_domain\u0026#34; relay domain \u0026lt;domain_relays\u0026gt; filter \u0026#34;rspamd\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eaction \u0026#34;outbound\u0026#34; relay filter dkimsign_rsa\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 from local for local action local_mail\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ematch from any for domain \u0026lt;domains_local\u0026gt; action local_mail\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ematch from any for domain \u0026lt;relay_for_domains\u0026gt; action relay_domain\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ematch from src \u0026lt;relay_from_ips\u0026gt; for any action outbound\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 outbound\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes noms de domaines et adresses IP spécifiques seront différents pour le site secondaire, comme ce sera votre cas, dans toute configuration que vous mettriez en place.\u003c/p\u003e\n\u003cp\u003eAprès l\u0026rsquo;examen des journaux et des messages, j\u0026rsquo;ai également dû apporter de légères modifications à la configuration de \u003ccode\u003erspamd\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e---- /etc/rspamd/local.d/actions.conf\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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ereject\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e10; # final reject\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ediscard\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e15;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e6; # mark spam\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003egreylist\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003enull; # do not greylist, we have spamd for that\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Custom action (referenced by force_actions), no own threshold\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ephishing\u003c/span\u003e \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\u003cspan style=\"color:#06b6ef\"\u003eflags\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e[\u0026#34;no_threshold\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\u003eVoilà l\u0026rsquo;entière configuration. En tenant compte de la longue liste de domaines et de réseaux, la longueur totale de ma configuration est maintenant :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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 -vc \u003cspan style=\"color:#f99b15\"\u003e\\#\u003c/span\u003e /etc/mail/smtpd.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e104\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e104 lignes, là où la précédente configuration pour \u003ccode\u003eexim\u003c/code\u003e, une fois les lignes de commentaires supprimées, était de :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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 -vc \u003cspan style=\"color:#f99b15\"\u003e\\#\u003c/span\u003e /etc/exim/configure\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e380\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e380 lignes.\u003c/p\u003e\n\u003cp\u003eLe fichier \u003ca href=\"https://man.openbsd.org/smtpd.conf\" rel=\"external\"\u003e\u003ccode\u003esmtpd.conf\u003c/code\u003e\u003c/a\u003e est aussi lisible que celui de \u003ca href=\"https://man.openbsd.org/pf.conf\" rel=\"external\"\u003e\u003ccode\u003epf.conf\u003c/code\u003e\u003c/a\u003e, ayant de nombreuses fonctionnalités similaires.\u003c/p\u003e\n\u003cp\u003eUne fois les paquets installés et les anciens services désactivés, activez et lancez les nouveaux services.\u003c/p\u003e\n\u003cp\u003eAvant de (ré)activer \u003ccode\u003esmtpd\u003c/code\u003e en tant que serveur de messagerie par défaut après \u003ccode\u003eexim\u003c/code\u003e, 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\u003e$ doas /usr/local/sbin/exim-disable\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003epour restaurer le fichier \u003ca href=\"https://man.openbsd.org/mailer.conf\" rel=\"external\"\u003e\u003ccode\u003e/etc/mailer.conf\u003c/code\u003e\u003c/a\u003e à son état original.\u003c/p\u003e\n\u003cp\u003eSi tout cela échoue, vous pouvez facilement récupèrer une version intacte depuis le \u003ca href=\"https://www.openbsd.org/anoncvs.html\" rel=\"external\"\u003eCVS d\u0026rsquo;OpenBSD\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003ePour activer ces nouveaux services, 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\u003e$ doas rcctl enable smptpd \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e doas rcctl start smtpd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas rcctl enable redis \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e doas rcctl start redis\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas rcctl enable rspamd \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e doas rcctl start rspamd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVous devriez constater une activité assez rapidement en surveillant le fichier \u003ccode\u003e/var/log/maillog\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ tail -n 500 -f /var/log/maillog\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eQuand vous serez satisfait du flux de couriels entrants et sortants et qu\u0026rsquo;ils soient relayés là où vous le souhaitez, vous pourrez supprimer les paquets \u003ccode\u003eexim\u003c/code\u003e, \u003ccode\u003eclamav\u003c/code\u003e et \u003ccode\u003espamassassin\u003c/code\u003e puis suivre les instructions retournées par les messages de \u003ca href=\"https://man.openbsd.org/pkg_delete\" rel=\"external\"\u003e\u003ccode\u003epkg_delete\u003c/code\u003e\u003c/a\u003e pour libérer de l\u0026rsquo;espace disque.\u003c/p\u003e\n\u003cp\u003eEt, oui des configurations bien plus complexes sont possibles, tout particulièrement en matière de filtrage.\u003c/p\u003e\n\u003cp\u003eMais j\u0026rsquo;ai été agréablement surpris à la fois par la simplicité de cette transition que par la perspective de disposer d\u0026rsquo;une configuration vraiment facile à entretenir et à améliorer.\u003c/p\u003e\n\u003cp\u003eLe processus de transition m\u0026rsquo;a montré qu\u0026rsquo;OpenSMTPD est un produit solide, à l\u0026rsquo;image d\u0026rsquo;OpenBSD. Faire le choix d\u0026rsquo;adopter OpenSMTPD en tant que serveur de messagerie par défaut est sans nul doute l\u0026rsquo;une des meilleures décisions prises par le projet OpenBSD, et les récents utilisateurs tel que moi ne peuvent qu\u0026rsquo;applaudir cette décision.\u003c/p\u003e\n\u003cp\u003eOpenSMTPD et OpenBSD sont caractéristiques tous deux par la capacité de leurs développeurs à non seulement tirer des leçons des versions précédentes du système d\u0026rsquo;exploitation et du serveur de messagerie inclus, mais aussi à venir proposer de nouvelles approches, parfois radicalement différentes, connues pour résoudre des problèmes, afin d\u0026rsquo;aboutir à un produit plus sûr et plus utilisable. À mon sens, c\u0026rsquo;est là le serveur de messagerie et le système d\u0026rsquo;exploitation pour l\u0026rsquo;avenir.\u003c/p\u003e\n\u003cp\u003eSi vous êtes intéressé par la configuration de \u003ccode\u003esmtpd\u003c/code\u003e avec plus de filtres ou d\u0026rsquo;autres options, il en existe un grand nombre, notamment \u003ccode\u003eopensmtpd-filter-dnsbl\u003c/code\u003e qui récupère les listes de blocage DNS à partir de sources que vous lui indiquez.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.opensmtpd.org/\" rel=\"external\"\u003eOpenSMTPD\u003c/a\u003e est disponible sur une grande variété de plateformes, incluant de nombreuses distributions Linux et BSD, tel \u003ca href=\"https://www.freebsd.org/\" rel=\"external\"\u003eFreeBSD\u003c/a\u003e via sa version portable.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai opté pour une configuration plutôt minimaliste, principalement parce que d\u0026rsquo;expérience les fonctionnalités de greylisting et de greytrapping de \u003ca href=\"https://man.openbsd.org/spamd\" rel=\"external\"\u003e\u003ccode\u003espamd\u003c/code\u003e\u003c/a\u003e sont un bouclier très efficace et nécessitant très peu d\u0026rsquo;entretien pour tout service de messagerie. Si le greytrapping vous intéresse, l\u0026rsquo;article peu souvent mis à jour \u003cem\u003e\u003ca href=\"https://nxdomain.no/~peter/eighteen_years_of_greytrapping.html\" rel=\"external\"\u003eEighteen Years of Greytrapping - Is the Weirdness Finally Paying Off?\u003c/a\u003e\u003c/em\u003e (et sa version avec \u003cem\u003e\u003ca href=\"https://bsdly.blogspot.com/2025/08/eighteen-years-of-greytrapping-is.html\" rel=\"external\"\u003etraqueurs et paginée\u003c/a\u003e\u003c/em\u003e) fournit plus de lecture via de nombreux liens qui peuvent occuper raisonnablement plus d\u0026rsquo;une de vos soirées.\u003c/p\u003e\n\u003cp\u003eSi vous préférez un livre qui couvre plus de sujets réseaux sous OpenBSD et FreeBSD, qui consacre une place importante à \u003ca href=\"https://man.openbsd.org/spamd\" rel=\"external\"\u003e\u003ccode\u003espamd\u003c/code\u003e\u003c/a\u003e, le livre \u003cem\u003e\u003ca href=\"https://nostarch.com/book-of-pf-4e\" rel=\"external\"\u003eThe Book of PF\u003c/a\u003e\u003c/em\u003e, maintenant dans sa \u003cem\u003equatrième\u003c/em\u003e édition, est à vous.\u003c/p\u003e\n\u003cp\u003eBonne nuit, et bonne chance !\u003c/p\u003e\n\u003cp\u003eJe désire remercier \u003cem\u003eMartijn van Duren\u003c/em\u003e pour son conseil précieux durant l\u0026rsquo;écriture de cet article.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eOpenSMTPD is the Mail Server for the Future\u003c/em\u003e © 2026 Peter N. M. Hansteen (publié le 15/05/2026)\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVous pourriez être aussi intéressé par la lecture d\u0026rsquo;articles sélectionnés via \u003cem\u003e\u003ca href=\"https://nxdomain.no/~peter/the_short_reading_list.html\" rel=\"external\"\u003eThat Grumpy BSD Guy: A Short Reading List\u003c/a\u003e\u003c/em\u003e (aussi \u003cem\u003e\u003ca href=\"https://bsdly.blogspot.com/2025/05/that-grumpy-bsd-guy-short-reading-list.html\" rel=\"external\"\u003eici\u003c/a\u003e\u003c/em\u003e).\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eFIN\u003c/strong\u003e\u003c/p\u003e\n","summary":"Traduction de l'article EN → FR 'OpenSMTPD Is The Mail Server For The Future' décrivant la bascule d'exim vers OpenSMTPD définitive dans OpenBSD, depuis la v7.9 — article de Peter N.M. Hansteen","tags":["Traduction","OpenBSD","OpenSMTPD"],"date_published":"2026-05-15T15:43:11+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-05-14:/fr/post/guide-man-page/#172d001ec123874e1010b643bae0b600bd4b4a9767261dc830960b1b0840e0c8","url":"https://it-log.fr.eu.org/fr/post/guide-man-page/","title":"Guide `man` pages : comprendre l'utilisation de `man`.","author":{"name":"Stéphane HUC"},"content_text":"Description Les man pages sont des clés pour mieux comprendre l\u0026rsquo;utilisation du système d\u0026rsquo;exploitation, que ce soit sous Linux ou l\u0026rsquo;un des *BSD.\nmanpages est un raccourci anglophone pour : pages de manuels de référence !\nBien souvent, toute commande utilisable est accompagnée d\u0026rsquo;un man page. Tout ce dont nous avons besoin de comprendre à-propos d\u0026rsquo;une commande y est écrit. C\u0026rsquo;est la première source et LA source d\u0026rsquo;autorité bien connue, normalement complète.\nCertains man sont plus fiables, car ils sont le reflet d\u0026rsquo;un processus de qualité demandé dès la production d\u0026rsquo;un binaire, c\u0026rsquo;est le cas des manpages d\u0026rsquo;OpenBSD, où si le manpage est inexistant ou ne respecte pas des qualités de critères, le paquet dans son ensemble est rejeté. La communauté Debian se donne du mal pour fournir des man de qualité, pour l\u0026rsquo;ensemble des logiciels intégrant le système de paquets. Attention : certaines communautés ne répondront à aucune demande d\u0026rsquo;aide, quelque soit le canal, ou renverront absolument aux man pages, s\u0026rsquo;il est clairement explicite que l\u0026rsquo;effort n\u0026rsquo;a pas été du tout fait pour s\u0026rsquo;informer correctement ; autrement dit, sans lecture de man page, point de salut !\nIl faut voir l\u0026rsquo;ensemble des man pages comme une collection de documentation plus ou moins technique, voire spécialisé, comme une encyclopédie fournie gratuitement pour nous aider à mieux comprendre les arcanes intrinséques à l\u0026rsquo;informatique.\nAlors si jamais quelqu\u0026rsquo;un sur un forum ou dans la vraie vie répond \u0026ldquo;Lis le man relatif\u0026rdquo;, ne le prend pas comme une insanité, ou un reproche ; cette personne cherche à te rendre un service utile, qui t\u0026rsquo;apprend à être opérationnel. Elle ne le fait pas forcèment de la meilleure manière… mais il y a de grande probabilités pour que les usages aient été abordés dans cette documentation.\nCe n\u0026rsquo;est pas forcèment plaisant à lire, mais ô combien pratique et utile. L\u0026rsquo;interface paraît austère mais elle remplit son rôle : être une interface de consultation des manuels de références du système. c\u0026rsquo;est d\u0026rsquo;ailleurs ce qu\u0026rsquo;affiche assurément le man ad hoc.\nLes pages sont structurées pour donner l\u0026rsquo;information la plus fiable de manière la plus concise possible. S\u0026rsquo;y habituer peut prendre un peu de temps, mais l\u0026rsquo;investissement vaut vraiment le coup !\nStructure Un manpage a généralement la structure suivante, différentes sections — comprendre que ce sont des chapitres :\nNAME : reprend le nom de la commmande ainsi qu\u0026rsquo;une description brève\nSYNOPSIS : montre les options, sans explication, de la commande\nDESCRIPTION : décrit l\u0026rsquo;utilité de la commande, ce qu\u0026rsquo;elle fait et comment l\u0026rsquo;utiliser, avec ces options. Elle développe le propos, en affichant ce qu\u0026rsquo; il convient de faire, voire de ne pas faire. La description peut être très longue\nEn plus de ces trois sections, ou chapitres, il peut en comporter d\u0026rsquo;autres, tels :\nEXAMPLES : fournit des examples de comment utiliser la commande, du cas concret d\u0026rsquo;utilisation aux cas plus complexes.\nDIAGNOSTIC : liste les messages de status ou d\u0026rsquo;erreurs retournés par l\u0026rsquo;utilisation de la commande.\nFILES : liste les emplacements des fichiers supplémentaires relatifs ; fichiers de configuration, fichiers d\u0026rsquo;exemples, fichiers de données, etc…\nLIMITS : décrit les limites spécifiques de l\u0026rsquo;utilisation de la commande ; limites indépendantes du système d\u0026rsquo;exploitation et/ou du matériel, qui ne peuvent être appréhendées car ces dernières échappent au contrôle du binaire.\nPORTABILITY : liste les autres systèmes d\u0026rsquo;exploitation où la commande est disponible, ou comment les versions peuvent différer.\nSEE ALSO : renvoie vers d\u0026rsquo;autres man relevant d\u0026rsquo;informations pertinentes.\nHISTORY : donne un bref aperçu de l\u0026rsquo;historique d\u0026rsquo;apparition de la commande\nWARNING : informe d\u0026rsquo;annotations très importantes si nécessaire.\nNOTES : sont des informations importantes à connaître, sans la gravité de la section ci-dessus.\n⇒ Un même man peut différer d\u0026rsquo;un système d\u0026rsquo;exploitation à l\u0026rsquo;autre ; exemple :\nman(1) fourni par Debian et celui fourni par OpenBSD : man(1) ⇒ Ou d\u0026rsquo;une version de système d\u0026rsquo;exploitation à une autre ; exemple :\nle man page actuel de pf.conf(5) d\u0026rsquo;OpenBSD et la version pf.conf(5) d\u0026rsquo;OpenBSD 5.0 Tous les man pages n\u0026rsquo;ont pas l\u0026rsquo;exacte même structure ; certaines sections sont utilisées, d\u0026rsquo;autres non, et certains man ont des sections très spécifiques.\nPour l\u0026rsquo;exemple, allez comparer le man man(1) et celui de pf.conf(5) pour OpenBSD, dont les URL sont données ci-dessus. Celui de pf.conf(5) est extrêmement spécifique et fourmille de sections dédiées, inconnues dans d\u0026rsquo;autres man !\nSections Ce qui est appelé Section est différent des sections/chapitres dans le man.\nLes sections sont une collection référentielle d\u0026rsquo;un ensemble de man, dédié à une catégorie d\u0026rsquo;informations. Elles sont au nombre défini de neuf, pas une de plus, pas une de moins.\n1 : aborde les programmes exécutables et les commandes de l\u0026rsquo;interpréteur shell\n2 : nomme les appels systèmes, les codes d\u0026rsquo;erreurs des services fournis par le noyau\n3 : informe des appels et des fonctions des bibliothèques — section spécifique au développement.\n4 : explique les pilotes et les périphériques systèmes, les fichiers spéciaux /dev.\n5 : précise les formats de fichiers standardisés.\n6 : cible les jeux\n7 : promeut diverses documentations et autres informations\n8 : est la catégorie dédiée aux commandes de maintenance et administration système — section spécifique à l\u0026rsquo;administration système.\n9 : comporte les informations relatives aux interfaces et autres spécifications plus ou moins obscures du noyau — section spécifique aux développeurs, hors celles standardisées.\nLe regroupement des man pages dans ces catégories — ou groupement de pages — permet la recherche plus facile, autant pour l\u0026rsquo;humain que la machine.\nCertaines commandes ne seront lisibles que dans une catégories, d\u0026rsquo;autres dans plusieurs.\nUtilisation L\u0026rsquo;appel à un man page se fait en mode terminal/console suivi d\u0026rsquo;un espace, suivi du nom de la commande à étudier, tel que l\u0026rsquo;exemple ci-dessus :\nman man\n⇒ Le premier man à consulter est : intro(1) dont le propos est d\u0026rsquo;introduire à la compréhension du système ; là, encore, cela dépendra du système d\u0026rsquo;exploitation ; sur Debian, il prend par la main pour aider à donner du sens, pour introduire à l\u0026rsquo;usage…\n⇒ le second serait help(1), mais il n\u0026rsquo;existe pas partout.\n⇒ hier(1) est un exemple célébre pour la description de la hierarchie du système de fichiers, et non pas relative au terme français.\nEt, comme il en existe des milliers, il y a une grande probabilité pour que l\u0026rsquo;un référence le besoin de compréhension informatique recherché.\nHTML De nombreux man pages sont accessibles sur le protocole HTTP, au format HTML ; exemples parmi tant d\u0026rsquo;autres :\nManpages \u0026lsquo;man.cx\u0026rsquo; : https://man.cx/ — près de 230 000 man disponibles, en plusieurs langues, dont le français. l\u0026rsquo;historique man7.org : https://man7.org (minimaliste, quoique…) Debian : https://manpages.debian.org/ — certains sont lisibles en français. OpenBSD : https://man.openbsd.org/ mdoc.su : http://mdoc.su/ qui référence les man des 4 \u0026ldquo;majeurs\u0026rdquo; *BSD Recherche affinée CLI ⇒ L\u0026rsquo;option -f, est similaire à la commande whatis(1), et restitue le mot recherché dans les noms de man page et affiche la ligne d\u0026rsquo;information pour toutes correspondances trouvées. La recherche est insensible à la casse de police de caractères et ne sera faite que sur le mot recherché.\nEn gros, l\u0026rsquo;option affiche une courte description des man pages selon le mot recherché, s\u0026rsquo;il y en a de disponible.\nExemple :\n$ man -f ftp ftp(1) - Internet file transfer program Net::FTP(3p) - FTP Client class Net::FTP::dataconn(3p) - FTP Client data connection class Regexp::Common::URI::ftp(3p) - Returns a pattern for FTP URIs. ftp-proxy(8) - Internet File Transfer Protocol proxy daemon Exemple fait sous OpenBSD, et selon les différents paquets installés ; exemple qui peut différer selon le système d\u0026rsquo;exploitation utilisé ET les paquets installés.\n⇒ L\u0026rsquo;option -k permet de chercher tous les man pages, quelque soit la catégorie, comportant le sujet de recherche, qui est considéré comme un \u0026lsquo;drapeau\u0026rsquo;, ou un \u0026rsquo;tag\u0026rsquo;.\nL\u0026rsquo;utilisation de l\u0026rsquo;option est l\u0026rsquo;équivalent d\u0026rsquo;utiliser la commande apropos(1).\nEssayons man -k man et nous aurons l\u0026rsquo;ensemble complet des manpages existant dans le système d\u0026rsquo;exploitation utilisé.\nReprenons l\u0026rsquo;exemple plus ciblé ; man -k ssh restitue :\n$ man -k ssh authorized_keys (5) - Démon d’OpenSSH debrsign (1) - Signer des fichiers .changes et .dsc Debian à distance avec SSH scp (1) - Copie de fichier sécurisée à l’aide d’OpenSSH sftp (1) - Transfert de fichier sécurisé par OpenSSH ssh (1) - Client de connexion à distance d’OpenSSH ssh-add (1) - Ajouter des identités de clé privée dans l\u0026#39;agent d\u0026#39;authentification d’OpenSSH ssh-agent (1) - Agent d’authentification d’OpenSSH ssh-argv0 (1) - Remplacer un nom de commande ssh par un nom d’hôte ssh-copy-id (1) - Utiliser des clés valables localement pour autoriser les connexions à un hôte distant ssh-keygen (1) - Utilitaire d’OpenSSH pour la gestion des clés d’authentification ssh-keyscan (1) - Collecter des clés publiques SSH auprès des serveurs ssh-keysign (8) - Assistant d’OpenSSH pour l\u0026#39;authentification basée sur l\u0026#39;hôte ssh-pkcs11-helper (8) - Assistant d’OpenSSH pour la prise en charge de PKCS#11 ssh-sk-helper (8) - Assistant d’OpenSSH pour la prise en charge de l’authentificateur FIDO ssh_config (5) - Fichier de configuration du client OpenSSH sshd (8) - Démon d’OpenSSH sshd_config (5) - Fichier de configuration du démon d’OpenSSH systemd-ssh-issue (1) - (sujet inconnu) systemd-ssh-proxy (1) - (sujet inconnu) sshfs (1) - filesystem client based on SSH EVP_KDF-SSHKDF (7ssl) - The SSHKDF EVP_KDF implementation git-shell (1) - Restricted login shell for Git-only SSH access Net::DNS::RR::SSHFP (3pm) - DNS SSHFP resource record rrsync (1) - a script to setup restricted rsync users via ssh logins systemd-ssh-generator (8) - Generator for binding a socket-activated SSH server to local AF_VSOCK and AF_UNIX sockets virt-ssh-helper (8) - libvirt socket proxy yubikey-agent (1) - a seamless ssh-agent for YubiKeys Exemple fait sous Debian, et selon différents paquets installés ; exemple qui peut différer selon le système d\u0026rsquo;exploitation utilisé ET les paquets installés.\nExplications :\nle chiffre entre parenthèses est celui relatif à la catégorie dans lequel le man page en question est écrit. ssh(1) est accessible ainsi ; man ssh retournera le man ssh renfermé dans la Section 1 — section des commandes shell, alors que ssh_config(5) est accessible à la fois par man ssh_config que par man 5 ssh_config, situé dans la Section 5 — Formats des fichiers, mais essayons man 5 ssh : le système devrait informer qu\u0026rsquo;aucune page de manuel n\u0026rsquo;existe. Voilà !\nEOD Bien sûr le man man comporte plein d\u0026rsquo;options utiles, spécifiques au système d\u0026rsquo;exploitation utilisé. Et, dès le départ, j\u0026rsquo;aurais simplement pu vous dire d\u0026rsquo;aller lire man man sans autre forme de procès. ;)\nMaintenant, vous savez quoi faire… prenez le réflexe de le faire AVANT de demander \u0026ldquo;au-secours\u0026rdquo; !\nEt dites-le… n\u0026rsquo;hésitez pas à dire que \u0026ldquo;vous ne comprenez pas telle chose dans tel man\u0026rdquo; ;) ou \u0026ldquo;bizarre, j\u0026rsquo;étais à la recherche de telle option, ou tel usage, mais je ne la trouve pas dans tel man\u0026rdquo;…\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLes man pages sont des clés pour mieux comprendre l\u0026rsquo;utilisation du système d\u0026rsquo;exploitation, que ce soit sous Linux ou l\u0026rsquo;un des *BSD.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emanpages\u003c/strong\u003e est un raccourci anglophone pour : \u003cstrong\u003epages de manuels de référence\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003eBien souvent, toute commande utilisable est accompagnée d\u0026rsquo;un man page. Tout ce dont nous avons besoin de comprendre à-propos d\u0026rsquo;une commande y est écrit. \u003cbr\u003e\nC\u0026rsquo;est la \u003cstrong\u003epremière source\u003c/strong\u003e et LA source \u003cstrong\u003ed\u0026rsquo;autorité\u003c/strong\u003e bien connue, normalement complète.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCertains man sont plus fiables, car ils sont le reflet d\u0026rsquo;un processus de qualité demandé dès la production d\u0026rsquo;un binaire, c\u0026rsquo;est le cas des manpages d\u0026rsquo;OpenBSD, où si le manpage est inexistant ou ne respecte pas des qualités de critères, le paquet dans son ensemble est rejeté\u003c/em\u003e. \u003cbr\u003e\n\u003cem\u003eLa communauté Debian se donne du mal pour fournir des man de qualité, pour l\u0026rsquo;ensemble des logiciels intégrant le système de paquets\u003c/em\u003e.\n\u003cstrong\u003eAttention\u003c/strong\u003e : \u003cem\u003ecertaines communautés ne répondront à aucune demande d\u0026rsquo;aide, quelque soit le canal, ou renverront absolument aux man pages, s\u0026rsquo;il est clairement explicite que l\u0026rsquo;effort n\u0026rsquo;a pas été du tout fait pour s\u0026rsquo;informer correctement ; autrement dit, sans lecture de man page, point de salut !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eIl faut voir l\u0026rsquo;ensemble des man pages comme une collection de documentation plus ou moins technique, voire spécialisé, comme une encyclopédie fournie gratuitement pour nous aider à mieux comprendre les arcanes intrinséques à l\u0026rsquo;informatique.\u003c/p\u003e\n\u003cp\u003eAlors si jamais quelqu\u0026rsquo;un sur un forum ou dans la vraie vie répond \u0026ldquo;Lis le man relatif\u0026rdquo;, ne le prend pas comme une insanité, ou un reproche ; cette personne cherche à te rendre un service utile, qui t\u0026rsquo;apprend à être opérationnel. Elle ne le fait pas forcèment de la meilleure manière… mais il y a de grande probabilités pour que les usages aient été abordés dans cette documentation.\u003c/p\u003e\n\u003cp\u003eCe n\u0026rsquo;est pas forcèment plaisant à lire, mais ô combien pratique et utile. \u003cbr\u003e\nL\u0026rsquo;interface paraît austère mais elle remplit son rôle : être une \u003cstrong\u003einterface de consultation des manuels de références du système\u003c/strong\u003e. \u003cbr\u003e\nc\u0026rsquo;est d\u0026rsquo;ailleurs ce qu\u0026rsquo;affiche assurément le man ad hoc.\u003c/p\u003e\n\u003cp\u003eLes pages sont structurées pour donner l\u0026rsquo;information la plus fiable de manière la plus concise possible. \u003cbr\u003e\nS\u0026rsquo;y habituer peut prendre un peu de temps, mais l\u0026rsquo;investissement vaut vraiment le coup !\u003c/p\u003e\n\u003ch2 id=\"structure\"\u003eStructure\u003c/h2\u003e\n\u003cp\u003eUn manpage a généralement la structure suivante, différentes sections — \u003cem\u003ecomprendre que ce sont des chapitres\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNAME\u003c/strong\u003e : reprend le nom de la commmande ainsi qu\u0026rsquo;une description brève\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSYNOPSIS\u003c/strong\u003e : montre les options, sans explication, de la commande\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eDESCRIPTION\u003c/strong\u003e : décrit l\u0026rsquo;utilité de la commande, ce qu\u0026rsquo;elle fait et comment l\u0026rsquo;utiliser, avec ces options. Elle développe le propos, en affichant ce qu\u0026rsquo; il convient de faire, voire de ne pas faire. La description peut être très longue\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEn plus de ces trois sections, ou chapitres, il peut en comporter d\u0026rsquo;autres, tels :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEXAMPLES\u003c/strong\u003e : fournit des examples de comment utiliser la commande, du cas concret d\u0026rsquo;utilisation aux cas plus complexes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eDIAGNOSTIC\u003c/strong\u003e : liste les messages de status ou d\u0026rsquo;erreurs retournés par l\u0026rsquo;utilisation de la commande.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFILES\u003c/strong\u003e : liste les emplacements des fichiers supplémentaires relatifs ; fichiers de configuration, fichiers d\u0026rsquo;exemples, fichiers de données, etc…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eLIMITS\u003c/strong\u003e : décrit les limites spécifiques de l\u0026rsquo;utilisation de la commande ; limites indépendantes du système d\u0026rsquo;exploitation et/ou du matériel, qui ne peuvent être appréhendées car ces dernières échappent au contrôle du binaire.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003ePORTABILITY\u003c/strong\u003e : liste les autres systèmes d\u0026rsquo;exploitation où la commande est disponible, ou comment les versions peuvent différer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSEE ALSO\u003c/strong\u003e : renvoie vers d\u0026rsquo;autres man relevant d\u0026rsquo;informations pertinentes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eHISTORY\u003c/strong\u003e : donne un bref aperçu de l\u0026rsquo;historique d\u0026rsquo;apparition de la commande\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eWARNING\u003c/strong\u003e : informe d\u0026rsquo;annotations très importantes si nécessaire.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNOTES\u003c/strong\u003e : sont des informations importantes à connaître, sans la gravité de la section ci-dessus.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Un même man peut différer d\u0026rsquo;un système d\u0026rsquo;exploitation à l\u0026rsquo;autre ; exemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://manpages.debian.org/trixie/man-db/man.1.en.html\" rel=\"external\"\u003eman(1)\u003c/a\u003e fourni par Debian\u003c/li\u003e\n\u003cli\u003eet celui fourni par OpenBSD : \u003ca href=\"https://man.openbsd.org/man\" rel=\"external\"\u003eman(1)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Ou d\u0026rsquo;une version de système d\u0026rsquo;exploitation à une autre ; exemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele man page actuel de \u003ca href=\"https://man.openbsd.org/pf.conf\" rel=\"external\"\u003e\u003ccode\u003epf.conf(5)\u003c/code\u003e d\u0026rsquo;OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eet la version \u003ca href=\"https://man.openbsd.org/OpenBSD-5.0/pf.conf\" rel=\"external\"\u003e\u003ccode\u003epf.conf(5)\u003c/code\u003e d\u0026rsquo;OpenBSD 5.0\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTous les man pages n\u0026rsquo;ont pas l\u0026rsquo;exacte même structure ; certaines sections sont utilisées, d\u0026rsquo;autres non, et certains man ont des sections très spécifiques.\u003c/p\u003e\n\u003cp\u003ePour l\u0026rsquo;exemple, allez comparer le man \u003ccode\u003eman(1)\u003c/code\u003e et celui de \u003ccode\u003epf.conf(5)\u003c/code\u003e pour OpenBSD, dont les URL sont données ci-dessus. \u003cbr\u003e\nCelui de \u003ccode\u003epf.conf(5)\u003c/code\u003e est extrêmement spécifique et fourmille de sections dédiées, inconnues dans d\u0026rsquo;autres man  !\u003c/p\u003e\n\u003ch2 id=\"sections\"\u003eSections\u003c/h2\u003e\n\u003cp\u003eCe qui est appelé \u003cstrong\u003eSection\u003c/strong\u003e est différent des sections/chapitres dans le man.\u003c/p\u003e\n\u003cp\u003eLes sections sont une collection référentielle d\u0026rsquo;un ensemble de man, dédié à une catégorie d\u0026rsquo;informations. Elles sont au nombre défini de neuf, pas une de plus, pas une de moins.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e1\u003c/strong\u003e : aborde les programmes exécutables et les commandes de l\u0026rsquo;interpréteur shell\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e2\u003c/strong\u003e : nomme les appels systèmes, les codes d\u0026rsquo;erreurs des services fournis par le noyau\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e3\u003c/strong\u003e : informe des appels et des fonctions des bibliothèques — \u003cem\u003esection spécifique au développement\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e4\u003c/strong\u003e : explique les pilotes et les périphériques systèmes, les fichiers spéciaux \u003ccode\u003e/dev\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e5\u003c/strong\u003e : précise les formats de fichiers standardisés.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e6\u003c/strong\u003e : cible les jeux\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e7\u003c/strong\u003e : promeut diverses documentations et autres informations\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e8\u003c/strong\u003e : est la catégorie dédiée aux commandes de maintenance et administration système — \u003cem\u003esection spécifique à l\u0026rsquo;administration système\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e9\u003c/strong\u003e : comporte les informations relatives aux interfaces et autres spécifications plus ou moins obscures du noyau — \u003cem\u003esection spécifique aux développeurs, hors celles standardisées\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eLe regroupement des man pages dans ces catégories — ou groupement de pages — permet la recherche plus facile, autant pour l\u0026rsquo;humain que la machine.\u003c/p\u003e\n\u003cp\u003eCertaines commandes ne seront lisibles que dans une catégories, d\u0026rsquo;autres dans plusieurs.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;appel à un man page se fait en mode terminal/console suivi d\u0026rsquo;un espace, suivi du nom de la commande à étudier, tel que l\u0026rsquo;exemple ci-dessus :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eman man\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/man/man-man-en.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/man/man-man-en_hu_6ca94b26366988d4.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/man/man-man-en_hu_98a659de84f24f7f.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"man man (en anglais)\"\n                    height=\"267\"\n                    id=\"img_images_post_man_man-man-en.png_0\"\n                    src=\"/images/post/man/man-man-en.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\n\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/man/man-man-fr.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/man/man-man-fr_hu_694da895b05060a1.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/man/man-man-fr_hu_5fad8d243e5fb278.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"man man (en français)\"\n                    height=\"143\"\n                    id=\"img_images_post_man_man-man-fr.png_1\"\n                    src=\"/images/post/man/man-man-fr.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Le premier man à consulter est : \u003ccode\u003eintro(1)\u003c/code\u003e dont le propos est d\u0026rsquo;introduire à la compréhension du système ; là, encore, cela dépendra du système d\u0026rsquo;exploitation ; sur Debian, il prend par la main pour aider à donner du sens, pour \u003cstrong\u003eintroduire à l\u0026rsquo;usage\u003c/strong\u003e…\u003c/p\u003e\n\u003cp\u003e⇒ le second serait \u003ccode\u003ehelp(1)\u003c/code\u003e, \u003cem\u003emais il n\u0026rsquo;existe pas partout\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e⇒ \u003ccode\u003ehier(1)\u003c/code\u003e est un exemple célébre pour la description de la hierarchie du système de fichiers, \u003cem\u003eet non pas relative au terme français\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eEt, comme il en existe des milliers, il y a une grande probabilité pour que l\u0026rsquo;un référence le besoin de compréhension informatique recherché.\u003c/p\u003e\n\u003ch3 id=\"html\"\u003eHTML\u003c/h3\u003e\n\u003cp\u003eDe nombreux man pages sont accessibles sur le protocole HTTP, au format HTML ; exemples parmi tant\nd\u0026rsquo;autres :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eManpages \u0026lsquo;man.cx\u0026rsquo; : \u003ca href=\"https://man.cx/\" rel=\"external\"\u003ehttps://man.cx/\u003c/a\u003e — près de 230 000 man disponibles, en plusieurs langues, dont le français.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;historique man7.org : \u003ca href=\"https://man7.org\" rel=\"external\"\u003ehttps://man7.org\u003c/a\u003e (\u003cem\u003eminimaliste, quoique…\u003c/em\u003e)\u003c/li\u003e\n\u003cli\u003eDebian : \u003ca href=\"https://manpages.debian.org/\" rel=\"external\"\u003ehttps://manpages.debian.org/\u003c/a\u003e — \u003cem\u003ecertains sont lisibles en français\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eOpenBSD : \u003ca href=\"https://man.openbsd.org/\" rel=\"external\"\u003ehttps://man.openbsd.org/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003emdoc.su : \u003ca href=\"http://mdoc.su/\" rel=\"external\"\u003ehttp://mdoc.su/\u003c/a\u003e qui référence les man des 4 \u0026ldquo;majeurs\u0026rdquo; *BSD\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"recherche-affinée-cli\"\u003eRecherche affinée CLI\u003c/h3\u003e\n\u003cp\u003e⇒ L\u0026rsquo;option \u003ccode\u003e-f\u003c/code\u003e, est similaire à  la commande \u003ccode\u003ewhatis(1)\u003c/code\u003e, et restitue le mot recherché dans les noms de man page et affiche la ligne d\u0026rsquo;information pour toutes correspondances trouvées. La recherche est insensible à la casse de police de caractères et ne sera faite que sur le mot recherché.\u003c/p\u003e\n\u003cp\u003eEn gros, l\u0026rsquo;option affiche une courte description des man pages selon le mot recherché, s\u0026rsquo;il y en a de disponible.\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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ man -f ftp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eftp\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - Internet file transfer program\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNet::FTP\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3p\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - FTP Client class\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNet::FTP::dataconn\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3p\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - FTP Client data connection class\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRegexp::Common::URI::ftp\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3p\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - Returns a pattern \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e FTP URIs.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eftp-proxy\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - Internet File Transfer Protocol proxy daemon\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eExemple fait sous OpenBSD, et selon les différents paquets installés ; exemple qui peut différer selon le système d\u0026rsquo;exploitation utilisé ET les paquets installés.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ L\u0026rsquo;option \u003ccode\u003e-k\u003c/code\u003e permet de chercher tous les man pages, quelque soit la catégorie, comportant le sujet de recherche, qui est considéré comme un \u0026lsquo;drapeau\u0026rsquo;, ou un \u0026rsquo;tag\u0026rsquo;.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;utilisation de l\u0026rsquo;option est l\u0026rsquo;équivalent d\u0026rsquo;utiliser la commande \u003ccode\u003eapropos(1)\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eEssayons \u003ccode\u003eman -k man\u003c/code\u003e et nous aurons l\u0026rsquo;ensemble complet des manpages existant dans le système d\u0026rsquo;exploitation utilisé.\u003c/p\u003e\n\u003cp\u003eReprenons l\u0026rsquo;exemple plus ciblé ; \u003ccode\u003eman -k ssh\u003c/code\u003e restitue :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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$ man -k ssh\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eauthorized_keys \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e  - Démon d’OpenSSH\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edebrsign \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e         - Signer des fichiers .changes et .dsc Debian à distance avec SSH\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escp \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e              - Copie de fichier sécurisée à l’aide d’OpenSSH\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esftp \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e             - Transfert de fichier sécurisé par OpenSSH\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e              - Client de connexion à distance d’OpenSSH\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh-add \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e          - Ajouter des identités de clé privée dans l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;agent d\u0026#39;\u003c/span\u003eauthentification d’OpenSSH\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh-agent \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e        - Agent d’authentification d’OpenSSH\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh-argv0 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e        - Remplacer un nom de commande ssh par un nom d’hôte\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh-copy-id \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e      - Utiliser des clés valables localement pour autoriser les connexions à un hôte distant\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh-keygen \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e       - Utilitaire d’OpenSSH pour la gestion des clés d’authentification\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh-keyscan \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e      - Collecter des clés publiques SSH auprès des serveurs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh-keysign \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e      - Assistant d’OpenSSH pour l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;authentification basée sur l\u0026#39;\u003c/span\u003ehôte\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh-pkcs11-helper \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - Assistant d’OpenSSH pour la prise en charge de PKCS#11\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh-sk-helper \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e    - Assistant d’OpenSSH pour la prise en charge de l’authentificateur FIDO\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh_config \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e       - Fichier de configuration du client OpenSSH\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esshd \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e             - Démon d’OpenSSH\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esshd_config \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e      - Fichier de configuration du démon d’OpenSSH\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esystemd-ssh-issue \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esujet inconnu\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esystemd-ssh-proxy \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esujet inconnu\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esshfs \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e            - filesystem client based on SSH\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEVP_KDF-SSHKDF \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e7ssl\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - The SSHKDF EVP_KDF implementation\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit-shell \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e        - Restricted login shell \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e Git-only SSH access\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNet::DNS::RR::SSHFP \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3pm\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - DNS SSHFP resource record\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003errsync \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e           - a script to setup restricted rsync users via ssh logins\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esystemd-ssh-generator \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - Generator \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e binding a socket-activated SSH server to local AF_VSOCK and AF_UNIX sockets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirt-ssh-helper \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e  - libvirt socket proxy\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eyubikey-agent \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e    - a seamless ssh-agent \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e YubiKeys\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eExemple fait sous Debian, et selon différents paquets installés ; exemple qui peut différer selon le système d\u0026rsquo;exploitation utilisé ET les paquets installés.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eExplications :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele chiffre entre parenthèses est celui relatif à la catégorie dans lequel le man page en question est écrit.\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003essh(1)\u003c/code\u003e est accessible ainsi ; \u003ccode\u003eman ssh\u003c/code\u003e retournera le man ssh renfermé dans la Section 1 — \u003cem\u003esection des commandes shell\u003c/em\u003e,\u003c/li\u003e\n\u003cli\u003ealors que \u003ccode\u003essh_config(5)\u003c/code\u003e est accessible à la fois par \u003ccode\u003eman ssh_config\u003c/code\u003e que par \u003ccode\u003eman 5 ssh_config\u003c/code\u003e, situé dans la Section 5 — \u003cem\u003eFormats des fichiers\u003c/em\u003e,\u003c/li\u003e\n\u003cli\u003emais essayons \u003ccode\u003eman 5 ssh\u003c/code\u003e : le système devrait informer qu\u0026rsquo;aucune page de manuel n\u0026rsquo;existe.\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\u003ch2 id=\"eod\"\u003eEOD\u003c/h2\u003e\n\u003cp\u003eBien sûr le man \u003ccode\u003eman\u003c/code\u003e comporte plein d\u0026rsquo;options utiles, spécifiques au système d\u0026rsquo;exploitation utilisé. Et, dès le départ, j\u0026rsquo;aurais simplement pu vous dire d\u0026rsquo;aller lire \u003ccode\u003eman man\u003c/code\u003e sans autre forme de procès. ;)\u003c/p\u003e\n\u003cp\u003eMaintenant, vous savez quoi faire… \u003cbr\u003e\nprenez le réflexe de le faire AVANT de demander \u0026ldquo;au-secours\u0026rdquo; !\u003c/p\u003e\n\u003cp\u003eEt dites-le… \u003cbr\u003e\nn\u0026rsquo;hésitez pas à dire que \u0026ldquo;vous ne comprenez pas telle chose dans tel man\u0026rdquo; ;)\nou \u0026ldquo;bizarre, j\u0026rsquo;étais à la recherche de telle option, ou tel usage, mais je ne la trouve pas dans tel man\u0026rdquo;…\u003c/p\u003e\n","summary":"Petit Guide pour comprendre les manpages, ces pages de manuels de référence — juste pour (sa)voir ce qui est possible à-propos des `man`.","tags":["man","guide"],"date_published":"2026-05-14T15:55:49+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-05-09:/fr/post/vifm/#20be1bb5fca328a6221448bafc9a84561ed0d477076741cc14401e59d8a843e0","url":"https://it-log.fr.eu.org/fr/post/vifm/","title":"Vifm : Vi-file manager","author":{"name":"Stéphane HUC"},"content_text":"Description Vifm est un gestionnaire de fichiers doté d\u0026rsquo;une interface curses, qui offre un environnement similaire à celui de Vim pour la gestion des objets au sein des systèmes de fichiers, enrichi de quelques fonctionnalités utiles issues de mutt.\nSi vous utilisez vi, Vifm vous permet de contrôler entièrement vos fichiers à l\u0026rsquo;aide du clavier, sans avoir à apprendre de nouvelles commandes.\nIl prend en charge une grande étendue de fonctionnalités :\nprise en charge d’UTF-8 ; mappages d’utilisateur (la plupart semblables à ceux de vi) ; intervalles dans les commandes de ligne de commande ; commandes personnalisées (avec prise en charge d’intervalle) ; registres ; annuler/refaire d’opérations ; prise en charge du système de fichiers FUSE ; gestion de la corbeille ; renommage de plusieurs fichiers ; prise en charge de modificateurs de nom de fichier ; prise en charge de schémas de couleurs ; coloration de nom de fichier selon le type ; personnalisation du schéma de couleurs selon le chemin ; signets ; mise en arrière-plan d’opération ; afficheur de fichier personnalisable ; mode de prévisualisation pratique de type less ; filtrage et recherche de fichier avec des expressions rationnelles ; vues dans un ou deux panneaux. Site officiel : https://vifm.info/ Documentation : https://vifm.info/docs/ Thèmes : https://vifm.info/colorschemes Installation Debian : apt install vifm OpenBSD : pkg_add vifm Configuration Les configurations personnalisées se font dans le répertoire ~/.config/vifm\nle fichier principal est : vifmrc Les thèmes proposés par des utilisateurs sont à installer dans le sous-répertoire colors/ ; il faut modifier la valeur colorscheme pour lui donner le nom du fichier de couleurs désiré. Il est même possible de spécifier plusieurs selon des actions possibles. des plugins sont possibles, à poser dans le sous-répertoire plugins/. Utilisation Depuis un terminal/console: vifm tout simplement.\nSi vous êtes un habitué de mc vous ne serez pas déboussolé, par l\u0026rsquo;interface, mais ce sont bien les commandes vi qu\u0026rsquo;il faut utiliser ;)\nVoici l\u0026rsquo;aide mémoire pour l\u0026rsquo;utilisation clavier : https://vifm.info/cheatsheets Voilà !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eVifm\u003c/strong\u003e est un gestionnaire de fichiers doté d\u0026rsquo;une interface curses, qui offre\nun environnement similaire à celui de Vim pour la gestion des objets au sein des\nsystèmes de fichiers, enrichi de quelques fonctionnalités utiles issues de mutt.\u003c/p\u003e\n\u003cp\u003eSi vous utilisez vi, Vifm vous permet de contrôler entièrement vos fichiers à\nl\u0026rsquo;aide du clavier, sans avoir à apprendre de nouvelles commandes.\u003c/p\u003e\n\u003cp\u003eIl prend en charge une grande étendue de fonctionnalités :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eprise en charge d’UTF-8 ;\u003c/li\u003e\n\u003cli\u003emappages d’utilisateur (la plupart semblables à ceux de vi) ;\u003c/li\u003e\n\u003cli\u003eintervalles dans les commandes de ligne de commande ;\u003c/li\u003e\n\u003cli\u003ecommandes personnalisées (avec prise en charge d’intervalle) ;\u003c/li\u003e\n\u003cli\u003eregistres ;\u003c/li\u003e\n\u003cli\u003eannuler/refaire d’opérations ;\u003c/li\u003e\n\u003cli\u003eprise en charge du système de fichiers FUSE ;\u003c/li\u003e\n\u003cli\u003egestion de la corbeille ;\u003c/li\u003e\n\u003cli\u003erenommage de plusieurs fichiers ;\u003c/li\u003e\n\u003cli\u003eprise en charge de modificateurs de nom de fichier ;\u003c/li\u003e\n\u003cli\u003eprise en charge de schémas de couleurs ;\u003c/li\u003e\n\u003cli\u003ecoloration de nom de fichier selon le type ;\u003c/li\u003e\n\u003cli\u003epersonnalisation du schéma de couleurs selon le chemin ;\u003c/li\u003e\n\u003cli\u003esignets ;\u003c/li\u003e\n\u003cli\u003emise en arrière-plan d’opération ;\u003c/li\u003e\n\u003cli\u003eafficheur de fichier personnalisable ;\u003c/li\u003e\n\u003cli\u003emode de prévisualisation pratique de type less ;\u003c/li\u003e\n\u003cli\u003efiltrage et recherche de fichier avec des expressions rationnelles ;\u003c/li\u003e\n\u003cli\u003evues dans un ou deux panneaux.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eSite officiel : \u003ca href=\"https://vifm.info/\" rel=\"external\"\u003ehttps://vifm.info/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDocumentation : \u003ca href=\"https://vifm.info/docs/\" rel=\"external\"\u003ehttps://vifm.info/docs/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eThèmes : \u003ca href=\"https://vifm.info/colorschemes\" rel=\"external\"\u003ehttps://vifm.info/colorschemes\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDebian : \u003ccode\u003eapt install vifm\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eOpenBSD : \u003ccode\u003epkg_add vifm\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLes configurations personnalisées se font dans le répertoire \u003ccode\u003e~/.config/vifm\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele fichier principal est : \u003ccode\u003evifmrc\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLes thèmes proposés par des utilisateurs sont à installer dans le sous-répertoire\n\u003ccode\u003ecolors/\u003c/code\u003e ; \u003cbr\u003e\nil faut modifier la valeur \u003ccode\u003ecolorscheme\u003c/code\u003e pour lui donner le nom\ndu fichier de couleurs désiré. Il est même possible de spécifier plusieurs\nselon des actions possibles.\u003c/li\u003e\n\u003cli\u003edes plugins sont possibles, à poser dans le sous-répertoire \u003ccode\u003eplugins/\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eDepuis un terminal/console: \u003ccode\u003evifm\u003c/code\u003e tout simplement.\u003c/p\u003e\n\u003cp\u003e\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/vifm/vifm-screenshot.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/vifm/vifm-screenshot_hu_174ed790311abdfe.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/vifm/vifm-screenshot_hu_bbea9063187a57ef.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Capture d’écran du gestionnaire de fichiers vifm\"\n                    height=\"144\"\n                    id=\"img_images_post_vifm_vifm-screenshot.png_0\"\n                    src=\"/images/post/vifm/vifm-screenshot.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003eSi vous êtes un habitué de \u003ccode\u003emc\u003c/code\u003e vous ne serez pas déboussolé, par l\u0026rsquo;interface,\nmais ce sont bien les commandes \u003ccode\u003evi\u003c/code\u003e qu\u0026rsquo;il faut utiliser ;)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVoici l\u0026rsquo;aide mémoire pour l\u0026rsquo;utilisation clavier : \u003ca href=\"https://vifm.info/cheatsheets\" rel=\"external\"\u003ehttps://vifm.info/cheatsheets\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://vifm.info/cheatsheets\" rel=\"external\"\u003e\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/vifm/vifm-v0.14-builtin-normal.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/vifm/vifm-v0.14-builtin-normal_hu_62bf0f0d11035928.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/vifm/vifm-v0.14-builtin-normal_hu_406026eb9bd3420c.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"vifm: aide mémoire clavier\"\n                    height=\"210\"\n                    id=\"img_images_post_vifm_vifm-v0.14-builtin-normal.png_1\"\n                    src=\"/images/post/vifm/vifm-v0.14-builtin-normal.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n","summary":"Présentation de l'outil Vifm, alias Vi-file manager, un outil ncurses en mode terminal pour les aficionados de Vi(m).","tags":["Système","outil","terminal","gestionnaire","Introduction"],"date_published":"2026-05-09T18:58:45+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-05-09:/fr/post/landsat-images/#9b9997142e8140741b119a2b826d07f574846eeae1ecd2101c07ea485e7d4526","url":"https://it-log.fr.eu.org/fr/post/landsat-images/","title":"Landsat Images : Ton nom dans les images","author":{"name":"Stéphane HUC"},"content_text":" Landsat est le genre de projet \u0026ldquo;délire\u0026rdquo; qui permet aux utilisateurs de \u0026ldquo;voir\u0026rdquo; leur nom dans un ensemble d\u0026rsquo;images de la nature, capturées depuis l\u0026rsquo;espace, regroupées ensemble.\nC\u0026rsquo;est juste pour le fun et flatte l\u0026rsquo;égo, ni plus ni moins, mais de manière très sérieuse.\nÀ-PROPOS Les images prises par satellite utilisées sont des enregistrements faits au fil du temps depuis plus de 50 ans. Les satellites Landsat capturent des images de la nature, très officiellement par la NASA, l\u0026rsquo;USGS, et l\u0026rsquo;ESA et sont disponibles gratuitement en téléchargement.\nl\u0026rsquo;URL officielle : https://science.nasa.gov/specials/your-name-in-landsat/ ⇒ Il existe un poster officiel pour le \u0026ldquo;Jour de la Terre 2025\u0026rdquo;\n⇒ voici la galerie d\u0026rsquo;images…\nVoilà ! (juste pour le fun)\n","content_html":"\u003cp\u003e\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/landsat/Landsat-StephaneHUC-screenshot.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/landsat/Landsat-StephaneHUC-screenshot_hu_73a1cd8c12db9283.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/landsat/Landsat-StephaneHUC-screenshot_hu_c8e71fd6af834000.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Landsat ‘StephaneHUC’ image\"\n                    height=\"231\"\n                    id=\"img_images_post_landsat_Landsat-StephaneHUC-screenshot.png_0\"\n                    src=\"/images/post/landsat/Landsat-StephaneHUC-screenshot.png\"\n                    width=\"1022\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLandsat\u003c/strong\u003e est le genre de projet \u0026ldquo;délire\u0026rdquo; qui permet aux utilisateurs de \u0026ldquo;voir\u0026rdquo;\nleur nom dans un ensemble d\u0026rsquo;images de la nature, capturées depuis l\u0026rsquo;espace,\nregroupées ensemble.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est juste pour le fun et flatte l\u0026rsquo;égo, ni plus ni moins, mais de manière très\nsérieuse.\u003c/p\u003e\n\u003ch2 id=\"à-propos\"\u003eÀ-PROPOS\u003c/h2\u003e\n\u003cp\u003eLes images prises par satellite utilisées sont des enregistrements faits au fil\ndu temps depuis plus de 50 ans. Les satellites Landsat capturent des images de\nla nature, très officiellement par la NASA, l\u0026rsquo;USGS, et l\u0026rsquo;ESA et sont disponibles\ngratuitement en téléchargement.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;URL officielle : \u003ca href=\"https://science.nasa.gov/specials/your-name-in-landsat/\" rel=\"external\"\u003ehttps://science.nasa.gov/specials/your-name-in-landsat/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Il existe un poster officiel pour le \u0026ldquo;\u003ca href=\"https://science.nasa.gov/multimedia/earth-day-2025-poster/\" rel=\"external\"\u003eJour de la Terre 2025\u003c/a\u003e\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://science.nasa.gov/multimedia/earth-day-2025-poster/\" rel=\"external\"\u003e\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/landsat/nasa-2025-earth-day-hd-1920x1080.jpg\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/landsat/nasa-2025-earth-day-hd-1920x1080_hu_b88e288fe569ea14.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/landsat/nasa-2025-earth-day-hd-1920x1080_hu_82d44d52a82b00bd.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Earth Day 2025\"\n                    height=\"169\"\n                    id=\"img_images_post_landsat_nasa-2025-earth-day-hd-1920x1080.jpg_1\"\n                    src=\"/images/post/landsat/nasa-2025-earth-day-hd-1920x1080.jpg\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e⇒ voici la \u003ca href=\"https://science.nasa.gov/gallery/your-name-in-landsat-gallery/\" rel=\"external\"\u003egalerie d\u0026rsquo;images\u003c/a\u003e…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà ! \u003cbr\u003e\n(\u003cem\u003ejuste pour le fun)\u003c/em\u003e\u003c/p\u003e\n","summary":"ou comment flatter son égo, avec des images prises depuis Landsat, mise à disposition de la Nasa.","tags":[""],"date_published":"2026-05-09T17:45:41+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-05-04:/fr/web/hugo/numero-semaine/#ba4e036770af61d17af4a01853f81171f420b17982ef710ff05cf282525ab174","url":"https://it-log.fr.eu.org/fr/web/hugo/numero-semaine/","title":"Hugo : Obtenir le numéro de semaine dans l'année (astuce)","author":{"name":"Stéphane HUC"},"content_text":"Description S\u0026rsquo;il est une chose que, pour l\u0026rsquo;instant et nativement, le SSG Hugo n\u0026rsquo;est pas capable de fournir, c\u0026rsquo;est bien le numéro d\u0026rsquo;une semaine d\u0026rsquo;année.\nPourtant le langage Go fournit la méthode IsoWeek(). Mais ce n\u0026rsquo;est pas implémentée dans Hugo, c\u0026rsquo;est \u0026ldquo;en cours de réflexion\u0026rdquo; !\nTrouver le numéro de semaine répond à un besoin, certes peu courant, mais utile. Admettons que vous créez une newsletter hebdomadaire ;)\nJe vais vous présenter deux méthodes différentes :\nla fonction getIsoWeek celle nommée getWeekNumber getisoweek Dans un premier temps, création d\u0026rsquo;un modèle partial : /func/getIsoWeek\nVoici le code :\n{{- $date := time . -}} {{- $weekday := $date.Weekday }} {{/* 1. Normalize Weekday (Mon=1 ... Sun=7) */}} {{- $isoDay := cond (eq $weekday 0) 7 (int $weekday) -}} {{/* 2. Find Thursday (ISO Week belongs to the year of its Thursday) */}} {{- $offset := sub 4 $isoDay -}} {{- $thursday := $date.AddDate 0 0 $offset -}} {{/* 3. Calculate Week Number */}} {{- $isoYear := $thursday.Year -}} {{- $isoWeek := add (div (sub $thursday.YearDay 1) 7) 1 -}} {{/* 4. Return the data */}} {{- $str := dict \u0026#34;week\u0026#34; (printf \u0026#34;%02d\u0026#34; $isoWeek) \u0026#34;year\u0026#34; (printf \u0026#34;%04d\u0026#34; $isoYear) -}} {{- $data := dict \u0026#34;week\u0026#34; $isoWeek \u0026#34;year\u0026#34; $isoYear \u0026#34;str\u0026#34; $str -}} {{- return $data -}} L\u0026rsquo;appel se faisant :\n{{- partial \u0026#34;func/getisoweek\u0026#34; .Date -}} Ou toute autre variable faisant appel à Time, tel que now.\n⇒ Remarquez l\u0026rsquo;appel à la \u0026ldquo;fonction\u0026rdquo; getIsoWeek :\nsi je veux les valeurs en entier de la semaine et l\u0026rsquo;année, j\u0026rsquo;appele $data.week et $data.year si je veux les valeurs en chaîne de caractères, j\u0026rsquo;appele $data.str.week et $data.str.year Personnellement, j\u0026rsquo;ai en plus crée un modèle partial nommé utils/formatIsoDate dont le code est le suivant :\n{{- $data := partial \u0026#34;func/getIsoWeek\u0026#34; . -}} {{- return (printf \u0026#34;w%02d-y%04d\u0026#34; $data.week $data.year) -}} Et que je peux ainsi appeler soit depuis le fichier default.md dans l\u0026rsquo;archetypes, soit ailleurs dans les modèles ou les shortcodes, selon l\u0026rsquo;envie, tels :\n{{ partial \u0026quot;utils/formatIsoDate\u0026quot; .Date }} ou {{ partial \u0026quot;utils/formatIsoDate\u0026quot; now }}.\ngetweeknumber Cette deuxième manière d\u0026rsquo;obtenir le numéro de semaine est un peu plus ardu !\nCette fois-ci, j\u0026rsquo;ai deux fichiers principaux.\n⇒ le premier nommé func/splitNameYMO a pour fonction \u0026ldquo;d\u0026rsquo;éclater\u0026rdquo; une date normée (AAAA-MM-DD) en jour, mois, année correspondants et de retourner un dictionnaire.\n{{- $str := split . \u0026#34;-\u0026#34; -}} {{- $d = (int (index $str 2)) -}} {{- $m = (int (index $str 1)) -}} {{- $y = (int (index $str 0)) -}} {{- return (dict \u0026#34;day\u0026#34; $d \u0026#34;month\u0026#34; $m \u0026#34;year\u0026#34; $y) -}} Si j\u0026rsquo;ai créé ce fichier, c\u0026rsquo;est parce qu\u0026rsquo;au-travers de mon code, je le réutilise souvent…\n⇒ le deuxième fichier est la fonction primordiale, nommé func/getWeekNumber\n{{- $date := \u0026#34;\u0026#34; -}} {{- $tz := site.Params.timeZone -}} {{- $week := 0 -}} {{ $type := printf \u0026#34;%T\u0026#34; . }} {{ if eq $type \u0026#34;string\u0026#34; }} {{- $data := partial \u0026#34;func/splitNameYMO\u0026#34; . }} {{- $date = time (printf \u0026#34;%04d-%02d-%02d\u0026#34; $data.year $data.month $data.day) $tz -}} {{ else }} {{- $date = time . $tz -}} {{- end -}} {{/* Calcul \u0026#39;doy: day of the year\u0026#39;, \u0026#39;dow: day of the week\u0026#39; */}} {{- $doy := $date.YearDay -}} {{- $dow := int $date.Weekday -}} {{- $year := $date.Year -}} {{/* calcul week number */}} {{- $week = div (add (sub $doy $dow) 10) 7 -}} {{- if eq $dow 0 -}} {{- $week = sub $week 1 -}} {{- end -}} {{- $str := dict \u0026#34;week\u0026#34; (printf \u0026#34;%02d\u0026#34; $week) \u0026#34;year\u0026#34; (printf \u0026#34;%04d\u0026#34; $year) -}} {{- $data := dict \u0026#34;week\u0026#34; $week \u0026#34;year\u0026#34; $year \u0026#34;str\u0026#34; $str -}} {{- return $data -}} Explications :\nEn premier lieu, je cherche à savoir de quel type est la valeur que j\u0026rsquo;injecte dans l\u0026rsquo;appel du fichier, si c\u0026rsquo;est une string ou autre chose, en l\u0026rsquo;occurence une valeur de temps — gardez à l\u0026rsquo;esprit que Hugo ne sait pas annoncer un type de valeur pour une valeur de temps, néanmoins dans le référentiel, elle est définie à Time.time.\nEnsuite, je cherche à quel jour de l\u0026rsquo;année correspond la date ($doy), quelle est correspondance du jour dans la semaine ($dow) et pour finir l\u0026rsquo;année, bien-sûr.\nLe calcul du numéro de semaine est connu :\nil faut soustraire le jour de la semaine au jour de l\u0026rsquo;année ajouter l\u0026rsquo;entier 10 et diviser le tout par 7. et pour finir si le jour de la semaine est un dimanche, je soustrais 1 au numéro de semaine trouvé — c\u0026rsquo;est relatif à Hugo, dont les semaines commencent le dimanche. Voilà deux manières différentes de faire la même chose : une recherche de numéro de semaine !\nDocumentation https://gohugo.io/quick-reference/methods/#time Remerciement https://discourse.gohugo.io/t/group-content-by-week-number-of-year/11894/6 ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eS\u0026rsquo;il est une chose que, pour l\u0026rsquo;instant et nativement, le SSG Hugo n\u0026rsquo;est pas\ncapable de fournir, c\u0026rsquo;est bien le numéro d\u0026rsquo;une semaine d\u0026rsquo;année.\u003c/p\u003e\n\u003cp\u003ePourtant le langage Go fournit la méthode \u003ca href=\"https://pkg.go.dev/time#Time.ISOWeek\" rel=\"external\"\u003eIsoWeek()\u003c/a\u003e.\nMais ce n\u0026rsquo;est pas implémentée dans Hugo, c\u0026rsquo;est \u0026ldquo;en cours de réflexion\u0026rdquo; !\u003c/p\u003e\n\u003cp\u003eTrouver le numéro de semaine répond à un besoin, certes peu courant, mais utile.\nAdmettons que vous créez une newsletter hebdomadaire ;)\u003c/p\u003e\n\u003cp\u003eJe vais vous présenter deux méthodes différentes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela fonction \u003ca href=\"/fr/web/hugo/numero-semaine/#getisoweek\"\u003e\u003ccode\u003egetIsoWeek\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ecelle nommée \u003ca href=\"/fr/web/hugo/numero-semaine/#getweeknumber\"\u003e\u003ccode\u003egetWeekNumber\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"getisoweek\"\u003egetisoweek\u003c/h2\u003e\n\u003cp\u003eDans un premier temps, création d\u0026rsquo;un modèle partial : \u003ccode\u003e/func/getIsoWeek\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVoici le code :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- $date := time . -}}\n{{- $weekday := $date.Weekday }}\n{{/* 1. Normalize Weekday (Mon=1 ... Sun=7) */}}\n{{- $isoDay := cond (eq $weekday 0) 7 (int $weekday) -}}\n{{/* 2. Find Thursday (ISO Week belongs to the year of its Thursday) */}}\n{{- $offset := sub 4 $isoDay -}}\n{{- $thursday := $date.AddDate 0 0 $offset -}}\n{{/* 3. Calculate Week Number */}}\n{{- $isoYear := $thursday.Year -}}\n{{- $isoWeek := add (div (sub $thursday.YearDay 1) 7) 1 -}}\n{{/* 4. Return the data */}}\n{{- $str := dict \u0026#34;week\u0026#34; (printf \u0026#34;%02d\u0026#34; $isoWeek) \u0026#34;year\u0026#34; (printf \u0026#34;%04d\u0026#34; $isoYear) -}}\n{{- $data := dict \u0026#34;week\u0026#34; $isoWeek \u0026#34;year\u0026#34; $isoYear \u0026#34;str\u0026#34; $str -}}\n{{- return $data -}}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eL\u0026rsquo;appel se faisant :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- partial \u0026#34;func/getisoweek\u0026#34; .Date -}}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOu toute autre variable faisant appel à Time, tel que \u003ccode\u003enow\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e⇒ Remarquez l\u0026rsquo;appel à la \u0026ldquo;fonction\u0026rdquo; \u003ccode\u003egetIsoWeek\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esi je veux les valeurs en entier de la semaine et l\u0026rsquo;année, j\u0026rsquo;appele \u003ccode\u003e$data.week\u003c/code\u003e\net \u003ccode\u003e$data.year\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003esi je veux les valeurs en chaîne de caractères, j\u0026rsquo;appele \u003ccode\u003e$data.str.week\u003c/code\u003e et\n\u003ccode\u003e$data.str.year\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003ePersonnellement, j\u0026rsquo;ai en plus crée un modèle partial nommé \u003ccode\u003eutils/formatIsoDate\u003c/code\u003e\ndont le code est le suivant :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- $data := partial \u0026#34;func/getIsoWeek\u0026#34; . -}}\n{{- return (printf \u0026#34;w%02d-y%04d\u0026#34; $data.week $data.year) -}}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEt que je peux ainsi appeler soit depuis le fichier \u003ccode\u003edefault.md\u003c/code\u003e dans l\u0026rsquo;archetypes,\nsoit ailleurs dans les modèles ou les shortcodes, selon l\u0026rsquo;envie, tels :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e{{ partial \u0026quot;utils/formatIsoDate\u0026quot; .Date }}\u003c/code\u003e ou \u003ccode\u003e{{ partial \u0026quot;utils/formatIsoDate\u0026quot; now }}\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"getweeknumber\"\u003egetweeknumber\u003c/h2\u003e\n\u003cp\u003eCette deuxième manière d\u0026rsquo;obtenir le numéro de semaine est un peu plus ardu !\u003c/p\u003e\n\u003cp\u003eCette fois-ci, j\u0026rsquo;ai deux fichiers principaux.\u003c/p\u003e\n\u003cp\u003e⇒ le premier nommé \u003ccode\u003efunc/splitNameYMO\u003c/code\u003e a pour fonction \u0026ldquo;d\u0026rsquo;éclater\u0026rdquo; une date\nnormée (\u003ccode\u003eAAAA-MM-DD\u003c/code\u003e) en jour, mois, année correspondants et de retourner\nun dictionnaire.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- $str := split . \u0026#34;-\u0026#34; -}}\n{{- $d = (int (index $str 2)) -}}\n{{- $m = (int (index $str 1)) -}}\n{{- $y = (int (index $str 0)) -}}\n{{- return (dict \u0026#34;day\u0026#34; $d \u0026#34;month\u0026#34; $m \u0026#34;year\u0026#34; $y) -}}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003eSi j\u0026rsquo;ai créé ce fichier, c\u0026rsquo;est parce qu\u0026rsquo;au-travers de mon code, je le réutilise\nsouvent…\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e⇒ le deuxième fichier est la fonction primordiale, nommé \u003ccode\u003efunc/getWeekNumber\u003c/code\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- $date := \u0026#34;\u0026#34; -}}\n{{- $tz := site.Params.timeZone -}}\n{{- $week := 0 -}}\n\n{{ $type := printf \u0026#34;%T\u0026#34; . }}\n\n{{ if eq $type \u0026#34;string\u0026#34; }}\n\n    {{- $data := partial \u0026#34;func/splitNameYMO\u0026#34; . }}\n    {{- $date = time (printf \u0026#34;%04d-%02d-%02d\u0026#34; $data.year $data.month $data.day) $tz -}}\n\n{{ else }}\n\n    {{- $date = time . $tz -}}\n\n{{- end -}}\n\n{{/* Calcul \u0026#39;doy: day of the year\u0026#39;, \u0026#39;dow: day of the week\u0026#39; */}}\n{{- $doy := $date.YearDay -}}\n{{- $dow := int $date.Weekday -}}\n{{- $year := $date.Year -}}\n\n{{/* calcul week number */}}\n{{- $week = div (add (sub $doy $dow) 10) 7 -}}\n{{- if eq $dow 0 -}}\n    {{- $week = sub $week 1 -}}\n{{- end -}}\n\n{{- $str := dict \u0026#34;week\u0026#34; (printf \u0026#34;%02d\u0026#34; $week) \u0026#34;year\u0026#34; (printf \u0026#34;%04d\u0026#34; $year) -}}\n{{- $data := dict \u0026#34;week\u0026#34; $week \u0026#34;year\u0026#34; $year \u0026#34;str\u0026#34; $str -}}\n{{- return $data -}}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eExplications :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eEn premier lieu, je cherche à savoir de quel type est la valeur que j\u0026rsquo;injecte\ndans l\u0026rsquo;appel du fichier, si c\u0026rsquo;est une \u003ccode\u003estring\u003c/code\u003e ou autre chose, en l\u0026rsquo;occurence\nune valeur de temps — \u003cem\u003egardez à l\u0026rsquo;esprit que Hugo ne sait pas annoncer un\ntype de valeur pour une valeur de temps, néanmoins dans le référentiel, elle\nest définie à \u003ccode\u003eTime.time\u003c/code\u003e\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEnsuite, je cherche à quel jour de l\u0026rsquo;année correspond la date (\u003ccode\u003e$doy\u003c/code\u003e),\nquelle est correspondance du jour dans la semaine (\u003ccode\u003e$dow\u003c/code\u003e) et pour finir\nl\u0026rsquo;année, bien-sûr.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe calcul du numéro de semaine est \u003ca href=\"https://en.wikipedia.org/wiki/ISO_week_date#Calculating_the_week_number_from_an_ordinal_date\" rel=\"external\"\u003econnu\u003c/a\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eil faut soustraire le jour de la semaine au jour de l\u0026rsquo;année\u003c/li\u003e\n\u003cli\u003eajouter l\u0026rsquo;entier \u003ccode\u003e10\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet diviser le tout par \u003ccode\u003e7\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eet pour finir si le jour de la semaine est un dimanche, je soustrais \u003ccode\u003e1\u003c/code\u003e\nau numéro de semaine trouvé — \u003cem\u003ec\u0026rsquo;est relatif à Hugo, dont les semaines\ncommencent le dimanche\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà \u003cem\u003edeux manières différentes de faire la même chose : une \u003cstrong\u003erecherche de numéro\nde semaine\u003c/strong\u003e\u003c/em\u003e !\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/quick-reference/methods/#time\" rel=\"external\"\u003ehttps://gohugo.io/quick-reference/methods/#time\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciement\"\u003eRemerciement\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://discourse.gohugo.io/t/group-content-by-week-number-of-year/11894/6\" rel=\"external\"\u003ehttps://discourse.gohugo.io/t/group-content-by-week-number-of-year/11894/6\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","summary":"Obtenir le numéro d'une semaine donnée dans l'année !","tags":["Hugo","Time","astuce"],"date_published":"2026-05-04T13:06:25+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-04-30:/fr/sys/debian/rmadison/#c752c768a5e54eb6e95b2bc6a5b060576cdf140655aeedd1986398f1587c54d3","url":"https://it-log.fr.eu.org/fr/sys/debian/rmadison/","title":"rmadison, l'outil CLI pour interroger le dépôt des paquets de Debian","author":{"name":"Stéphane HUC"},"content_text":"Description Le site packages.debian.org nous est utile pour savoir quel(s) paquet(s) est disponible dans les dépôts Debian, et ce soit pour toutes les versions, soit pour une version donnée de Debian.\nEt en mode CLI ?\nL\u0026rsquo;outil rmadison fait partie des outils développeurs disponibles après l\u0026rsquo;installation du paquet devscripts.\nConfiguration /etc/devscripts.conf ~/.devscripts Des variables de configuration peuvent être utilisées :\nRMADISON_ARCHITECTURE= définit l\u0026rsquo;architecture à interroger par défaut. Exemple : RMADISON_ARCHITECTURE=amd64 interrogera par défaut les paquets recherchés pour l\u0026rsquo;architecture amd64. Préférez l\u0026rsquo;usage de all… Bien sûr, ce sont les architectures gérées par le dépôt !\nRMADISON_DEFAULT_URL= définit l\u0026rsquo;URL par défaut à interroger. Exemple : RMADISON_DEFAULT_URL=debian permettra d\u0026rsquo;utiliser le dépôt Debian. Les raccourcis d\u0026rsquo;URL gérés par défaut sont lisibles sur le manpage\ndebian pour l\u0026rsquo;archive officielle Debian ubuntu pour celle de Canonical archive pour savoir si un paquet a été archivé ports pour savoir si un paquet est bien dans les ports actuels. d\u0026rsquo;autres arguments existent ; merci de lire le manpage ad hoc. RMADISON_URL_MAP_*RACCOURCIS*=URL : pour paramètrer une nouvelle URL à interroger.\nle terme RACCOURCIS est le nom du dépôt à interroger. Exemple : RMADISON_URL_MAP_FASTTRACK=https://fasttrack.debian.net/api/madison permettra d\u0026rsquo;interroger le dépôt officiel Fast Track Debian. (cf: Debian Fast Track ) d\u0026rsquo;autres variables de configuration très spécifiques à l\u0026rsquo;utilisation de fichiers de certificats existent… (à vous de lire le manpage)\nInfoNe cherchez pas de variable pour spécifier la version de Debian, elle n\u0026rsquo;existe pas ! Utilisation Les options utiles sont :\n-a pour spécifier une architecture, tel amd64, ou amd64,i386 Souvent il vaudra mieux utiliser all (ou son pendant '*')… -s pour spécifier une version de Debian, tel stable, ou stable,sid -u pour spécifier une URL raccourci pré-enregistrées ou celles d\u0026rsquo;un des fichiers de configuration, tel debian. d\u0026rsquo;autres options existent ; (à vous de lire le manpage) Exemples ⇒ Pour interroger si le paquet xfce4 est dans le dépôt Debian :\n$: rmadison -u debian xfce4 Réponse système :\nxfce4 | 4.16 | oldoldstable | source, all xfce4 | 4.18 | oldstable | source, all xfce4 | 4.20.1 | stable | source, all xfce4 | 4.20.1 | testing | source, all xfce4 | 4.20.1 | unstable | source, all la première colonne reprend le nom du paquet la deuxième informe du numéro de version selon les informations dans les colonnes suivantes la troisième restitue dans quelles versions du dépôt interrogé se trouve le paquet recherché la quatrième restitue l\u0026rsquo;ensemble des architectures pour lequel le paquet est disponible all signifie l\u0026rsquo;ensemble des architectures gérées, quant à source, c\u0026rsquo;est relatif à la disponibilité en tant que paquet source tout autre nom d\u0026rsquo;architecture est signifiant en soi et ne fait référence que dans les cas où le paquet n\u0026rsquo;est pas disponible pour toutes les architectures gérées par le dépôt mais seulement pour l\u0026rsquo;architecture nommée. ⇒ Pour interroger si le paquet tilde est dans le dépôt Debian, en ciblant l\u0026rsquo;architecture amd64 pour la version oldstable :\n$: rmadison -a amd64 -s oldstable -u debian tilde ⇒ Pour interroger si un paquet est dans le dépôt Debian en ciblant certaines versions de Debian :\n$: rmadison -s stable,testing,sid -u debian gnome ⇒ Si vous avez configuré les variables RMADISON_ARCHITECTURE et/ou RMADISON_DEFAULT_URL, il n\u0026rsquo;y aura plus besoin de spécifier par défaut les options :\n$: rmadison xfce4 # restituera l\u0026#39;ensemble des informations selon vos valeurs de configuration $: rmadison -s stable xfce4 # restitue celles pour la stable, en tenant compte de vos valeurs configurées $: rmadison -s stable,testing,sid xfce4 # restitue celles pour les versions demandées Erreurs ⇒ Quand je cible une architecture/version, pourquoi le résultat est vide ?\nSoit parce que le paquet n\u0026rsquo;existe pas pour la cible donnée, soit il est référencé très simplement dans la cible all. Refaites la recherche avec d\u0026rsquo;autres options ! Explications :\nune recherche faite, pour l\u0026rsquo;exemple, sur amd64 pour xfce4 ne retourne rien, mais sur all, donnera l\u0026rsquo;info, parce que le paquet recherché est disponible sur toutes les architectures ou versions Debian gérées.\nmais pour certains paquets, tel par exemple tilde, une recherche sur amd64 ou i386 retournera l\u0026rsquo;info, mais pas sur all car le paquet recherché n\u0026rsquo;a pas été empaqueté sur toutes les architectures ou versions Debian gérées.\n⇒ curl: (3) URL rejected: Malformed input to a URL function Il est probable que vous ayez mal construit votre requête d\u0026rsquo;interrogation ! Concernant le pendant de all, concernant la cible d\u0026rsquo;architecture, encadrer le bien entre quotes, tel que '*' et non pas simplement * — attention c\u0026rsquo;est subtil, mais nécessaire.\n⇒ l\u0026rsquo;interrogation du dépôt ubuntu semble retourner une erreur 503 ; la requête est tout simplement refusée ; réessayer plus tard… ou malheureusement, jamais !\nDocumentation manpage en ligne man rmadison ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe site \u003ca href=\"http://packages.debian.org\" rel=\"external\"\u003epackages.debian.org\u003c/a\u003e nous est utile pour\nsavoir quel(s) paquet(s) est disponible dans les dépôts Debian, et ce soit pour\ntoutes les versions, soit pour une version donnée de Debian.\u003c/p\u003e\n\u003cp\u003eEt en mode CLI ?\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;outil \u003ccode\u003ermadison\u003c/code\u003e fait partie des outils développeurs disponibles après\nl\u0026rsquo;installation du paquet \u003ccode\u003edevscripts\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/etc/devscripts.conf\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e~/.devscripts\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDes variables de configuration peuvent être utilisées :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eRMADISON_ARCHITECTURE=\u003c/code\u003e définit l\u0026rsquo;architecture à interroger par défaut. \u003cbr\u003e\nExemple : \u003ccode\u003eRMADISON_ARCHITECTURE=amd64\u003c/code\u003e interrogera par défaut les paquets\nrecherchés pour l\u0026rsquo;architecture \u003ccode\u003eamd64\u003c/code\u003e. \u003cbr\u003e\nPréférez l\u0026rsquo;usage de \u003ccode\u003eall\u003c/code\u003e… \u003cbr\u003e\nBien sûr, ce sont les architectures gérées par le dépôt !\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eRMADISON_DEFAULT_URL=\u003c/code\u003e définit l\u0026rsquo;URL par défaut à interroger. \u003cbr\u003e\nExemple : \u003ccode\u003eRMADISON_DEFAULT_URL=debian\u003c/code\u003e permettra d\u0026rsquo;utiliser le dépôt Debian. \u003cbr\u003e\nLes raccourcis d\u0026rsquo;URL gérés par défaut sont lisibles sur le \u003ca href=\"https://manpages.debian.org/trixie/devscripts/rmadison.1.fr.html#u\" rel=\"external\"\u003emanpage\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edebian\u003c/code\u003e pour l\u0026rsquo;archive officielle Debian\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eubuntu\u003c/code\u003e pour celle de Canonical\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003earchive\u003c/code\u003e pour savoir si un paquet a été archivé\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eports\u003c/code\u003e pour savoir si un paquet est bien dans les ports actuels.\u003c/li\u003e\n\u003cli\u003e\u003cem\u003ed\u0026rsquo;autres arguments existent ; merci de lire le manpage ad hoc.\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eRMADISON_URL_MAP_*RACCOURCIS*=URL\u003c/code\u003e : pour paramètrer une nouvelle URL à\ninterroger.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele terme \u003cstrong\u003eRACCOURCIS\u003c/strong\u003e est le nom du dépôt à interroger. \u003cbr\u003e\nExemple : \u003ccode\u003eRMADISON_URL_MAP_FASTTRACK=https://fasttrack.debian.net/api/madison\u003c/code\u003e\npermettra d\u0026rsquo;interroger le dépôt officiel Fast Track Debian. \u003cbr\u003e\n\u003cem\u003e(cf: \n\n\u003ca class=\"inside\" href=\"/fr/sys/debian/fast-track/\" title=\"Lien interne vers l\u0026#39;article : 'Debian Fast Track'\"\u003eDebian Fast Track\u003c/a\u003e\n\n)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ed\u0026rsquo;autres variables de configuration très spécifiques à l\u0026rsquo;utilisation de fichiers\nde certificats existent… (\u003cem\u003eà vous de lire le \u003ca href=\"https://manpages.debian.org/trixie/devscripts/rmadison.1.fr.html#VARIABLES_DE_CONFIGURATION\" rel=\"external\"\u003emanpage\u003c/a\u003e)\u003c/em\u003e\u003c/p\u003e\n\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\"\u003eNe cherchez pas de variable pour spécifier la version de Debian, elle n\u0026rsquo;existe\npas !\u003c/div\u003e\n\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eLes options utiles sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-a\u003c/code\u003e pour spécifier une architecture, tel \u003ccode\u003eamd64\u003c/code\u003e, ou \u003ccode\u003eamd64,i386\u003c/code\u003e \u003cbr\u003e\nSouvent il vaudra mieux utiliser \u003ccode\u003eall\u003c/code\u003e \u003cem\u003e(ou son pendant \u003ccode\u003e'*'\u003c/code\u003e)\u003c/em\u003e…\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-s\u003c/code\u003e pour spécifier une version de Debian, tel \u003ccode\u003estable\u003c/code\u003e, ou \u003ccode\u003estable,sid\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-u\u003c/code\u003e pour spécifier une URL raccourci pré-enregistrées ou celles d\u0026rsquo;un des\nfichiers de configuration, tel \u003ccode\u003edebian\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ed\u0026rsquo;autres options existent ; (\u003cem\u003eà vous de lire le \u003ca href=\"https://manpages.debian.org/trixie/devscripts/rmadison.1.fr.html#OPTIONS\" rel=\"external\"\u003emanpage\u003c/a\u003e)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"exemples\"\u003eExemples\u003c/h3\u003e\n\u003cp\u003e⇒ Pour interroger si le paquet \u003ccode\u003exfce4\u003c/code\u003e est dans le dépôt Debian :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$: rmadison -u debian xfce4\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRéponse système :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003exfce4      | 4.16          | oldoldstable | source, all\nxfce4      | 4.18          | oldstable    | source, all\nxfce4      | 4.20.1        | stable       | source, all\nxfce4      | 4.20.1        | testing      | source, all\nxfce4      | 4.20.1        | unstable     | source, all\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003ela première colonne reprend le nom du paquet\u003c/li\u003e\n\u003cli\u003ela deuxième informe du numéro de version selon les informations dans les\ncolonnes suivantes\u003c/li\u003e\n\u003cli\u003ela troisième restitue dans quelles versions du dépôt interrogé se trouve le\npaquet recherché\u003c/li\u003e\n\u003cli\u003ela quatrième restitue l\u0026rsquo;ensemble des architectures pour lequel le paquet est\ndisponible\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eall\u003c/code\u003e signifie l\u0026rsquo;ensemble des architectures gérées,\u003c/li\u003e\n\u003cli\u003equant à \u003ccode\u003esource\u003c/code\u003e, c\u0026rsquo;est relatif à la disponibilité en tant que paquet source\u003c/li\u003e\n\u003cli\u003etout autre nom d\u0026rsquo;architecture est signifiant en soi et ne fait référence\nque dans les cas où le paquet n\u0026rsquo;est pas disponible pour toutes les\narchitectures gérées par le dépôt mais seulement pour l\u0026rsquo;architecture nommée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Pour interroger si le paquet \u003ccode\u003etilde\u003c/code\u003e est dans le dépôt Debian, en ciblant\nl\u0026rsquo;architecture \u003ccode\u003eamd64\u003c/code\u003e pour la version \u003ccode\u003eoldstable\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$: rmadison -a amd64 -s oldstable -u debian tilde\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Pour interroger si un paquet est dans le dépôt Debian en ciblant certaines\nversions de Debian :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$: rmadison -s stable,testing,sid -u debian gnome\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Si vous avez configuré les variables \u003ccode\u003eRMADISON_ARCHITECTURE\u003c/code\u003e et/ou \u003ccode\u003eRMADISON_DEFAULT_URL\u003c/code\u003e,\nil n\u0026rsquo;y aura plus besoin de spécifier par défaut les options :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$: rmadison xfce4   # restituera l\u0026#39;ensemble des informations selon vos valeurs de configuration\n$: rmadison -s stable xfce4 # restitue celles pour la stable, en tenant compte de vos valeurs configurées\n$: rmadison -s stable,testing,sid xfce4 # restitue celles pour les versions demandées\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"erreurs\"\u003eErreurs\u003c/h3\u003e\n\u003cp\u003e⇒ Quand je cible une architecture/version, pourquoi le résultat est vide ?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSoit parce que le paquet n\u0026rsquo;existe pas pour la cible donnée,\u003c/li\u003e\n\u003cli\u003esoit il est référencé très simplement dans la cible \u003ccode\u003eall\u003c/code\u003e. \u003cbr\u003e\nRefaites la recherche avec d\u0026rsquo;autres options !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eExplications :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eune recherche faite, pour l\u0026rsquo;exemple, sur \u003ccode\u003eamd64\u003c/code\u003e pour xfce4 ne retourne\nrien, mais sur \u003ccode\u003eall\u003c/code\u003e, donnera l\u0026rsquo;info, parce que le paquet recherché\nest disponible sur toutes les architectures  ou versions Debian gérées.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003emais pour certains paquets, tel par exemple \u003ccode\u003etilde\u003c/code\u003e, une recherche sur\n\u003ccode\u003eamd64\u003c/code\u003e ou \u003ccode\u003ei386\u003c/code\u003e retournera l\u0026rsquo;info, mais pas sur \u003ccode\u003eall\u003c/code\u003e car le paquet\nrecherché n\u0026rsquo;a pas été empaqueté sur toutes les architectures ou versions\nDebian gérées.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003ccode\u003ecurl: (3) URL rejected: Malformed input to a URL function\u003c/code\u003e \u003cbr\u003e\nIl est probable que vous ayez mal construit votre requête d\u0026rsquo;interrogation ! \u003cbr\u003e\nConcernant le pendant de \u003ccode\u003eall\u003c/code\u003e, concernant la cible d\u0026rsquo;architecture, encadrer\nle bien entre quotes, tel que \u003ccode\u003e'*'\u003c/code\u003e et non pas simplement \u003ccode\u003e*\u003c/code\u003e\n— attention c\u0026rsquo;est subtil, mais nécessaire.\u003c/p\u003e\n\u003cp\u003e⇒ l\u0026rsquo;interrogation du dépôt \u003ccode\u003eubuntu\u003c/code\u003e semble retourner une erreur 503 ; la requête\nest tout simplement refusée ; réessayer plus tard… ou malheureusement, jamais !\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://manpages.debian.org/trixie/devscripts/rmadison.1.fr.html\" rel=\"external\"\u003emanpage en ligne\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eman rmadison\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","summary":"Interroger à distance le dépôt officiel des archives de paquets Debian, avec l'outil rmadison en ligne de commande.","tags":["Debian","devscripts","rmadison","astuce"],"date_published":"2026-04-30T15:45:52+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-04-23:/fr/sys/debian/extrepo#56f484c38fb7dca8c44c7ccf82fa4111f060faf6a90f493b235c2f0d9d81459d","url":"https://it-log.fr.eu.org/fr/sys/debian/extrepo/","title":"Extrepo : gestion des dépôts Debian externes.","author":{"name":"Stéphane HUC"},"content_text":"Description Depuis Novembre 2019, le projet Extrepo existe et a pour but de faciliter de manière officielle l\u0026rsquo;intégration de dépôts Debian externes au projet Debian, de manière sécurisée, pour la version Stable de Debian.\nCe projet est géré par l\u0026rsquo;équipe Debian, pour les logiciels qu\u0026rsquo;elle ne peut pas maintenir, du fait d\u0026rsquo;une nouvelle version d\u0026rsquo;un logiciel en question, du fait de restrictions juridiques sur le logiciel en question. Quoiqu\u0026rsquo;il en soit les logiciels dépendants de ces dépôts externes ne sont pas officiellement intégrés dans les dépôts backports officiels de Debian. Les logiciels gérés par ces dépôts externes ne sont pas gérés par l\u0026rsquo;équipe Debian mais bel et bien par les mainteneurs responsables de leur(s) dépôt(s). L\u0026rsquo;équipe Debian ne fait QUE gérer l\u0026rsquo;intégration vérifiée des dépôts externes.\nCe projet est une réponse officielle à l\u0026rsquo;ajout de logiciels tiers à l\u0026rsquo;OS Debian de manière sécurisée, et facilitée, dont le but est de s\u0026rsquo;assurer qu\u0026rsquo;il n\u0026rsquo;y a rien de malicieux dans la démarche d\u0026rsquo;intégration du logiciel tiers.\nLe dépôt est utilisable par le biais de l\u0026rsquo;outil idoine extrepo.\nDans la réalité, l\u0026rsquo;outil vous permet :\nd\u0026rsquo;activer un des dépôts Debian externe au sein de votre distribution Debian. puis d\u0026rsquo;installer un logiciel recherché, géré par l\u0026rsquo;un des dépôts Debian externe. Avec extrepo, vous n\u0026rsquo;avez plus besoin de créer/modifier un fichier .source, d\u0026rsquo;installer les clés GPG dépendantes !\nLes clés GPG correspondantes sont installer dans le répertoire /var/lib/extrepo/keys.\nCe que ne permet pas de faire l\u0026rsquo;outil : il ne permet pas l\u0026rsquo;intégration d\u0026rsquo;un dépôt tiers externe. C\u0026rsquo;est seulement l\u0026rsquo;équipe Debian qui gére l\u0026rsquo;intégration par le biais d\u0026rsquo;un processus vérifiant et validant le dépôt en question. En utilisant l\u0026rsquo;outil, vous ne faites qu\u0026rsquo;activer le dépôt externe \u0026ldquo;autorisé\u0026rdquo; et permettre l\u0026rsquo;installation des binaires dépendants dudit dépôt.\nConfiguration Le fichier de configuration du binaire est : /etc/extrepo/config.yaml Il permet de gérer la version de Debian, tel que par exemple trixie. Il faut s\u0026rsquo;assurer à chaque mise à niveau du système Debian que la version stable soit la correspondante !\nPour activer les dépôts renfermant des logiciels dont les licences juridiques ne permettent pas l\u0026rsquo;intégration officielle, il faut décommenter les lignes correspondantes à contrib et surtout non-free.\nVoici un exemple du fichier :\n--- url: https://extrepo-team.pages.debian.net/extrepo-data dist: debian version: trixie # To enable repositories that host software with non-DFSG-free licenses, # uncomment \u0026#34;contrib\u0026#34; and/or \u0026#34;non-free\u0026#34; in the list below. enabled_policies: - main # - contrib # - non-free L\u0026rsquo;outil est utilisable dans la version testing, et installable aussi sous Sid… quoiqu\u0026rsquo;il en soit la version installée du logiciel recherché sera selon la version de Debian stable. Ne cherchez pas à modifier la version de Debian, tel que pour la testing ou Sid, cela ne servira à rien ; laissez le nom de la stable actuelle. Vous installerez des versions faites pour la stable ou backportée pour la stable dans votre version de Debian, quelqu\u0026rsquo;elle soit !\nUtilisation En premier lieu, installer le paquet extrepo. Puis utiliser les commandes de l\u0026rsquo;outil :\nsearch pour vérifier par une recherche que le logiciel désiré est bel et bien disponible enable pour activer le dépôts Debian externe du logiciel recherché utilisez ensuite la commande apt update pour mettre à jour le catalogue système Installez le logiciel recherché, par le biais de l\u0026rsquo;outil apt. Les commandes suivantes sont intéressantes pour :\ndisable désactiver le nom d\u0026rsquo;un dépôt update pour mettre à jour les données relatives aux dépôts. Note : ne pas confondre avec la commmande update de l\u0026rsquo;outil apt. La commande update du paquet extrepo met à jour les données relatives aux dépôts gérés par le projet Extrepo, c\u0026rsquo;est-à-dire les dépôts ajoutés, supprimés, ou dont les clés GPG sont remplacées, et réécrit les fichiers relatifs à la gestion des dépôts gérés par l\u0026rsquo;outil apt. Il est ainsi nécessaire ensuite de mettre à jour les données systèmes par la commande idoine d\u0026rsquo;apt.\nExemple Après avoir installé le paquet extrepo, vous désirez installez la version stable du navigateur internet librewolf, voici comment faire :\n$: extrepo search librewolf Found librewolf: --- contact: maltejur@dismail.de description: LibreWolf Browser gpg-key-checksum: sha256: cd1c45ebf33b42191af369b5ea901508eb7dff3dd5086abcb601b25121bc70ad gpg-key-file: librewolf.asc policy: main source: Architectures: amd64 arm64 Components: main Suites: librewolf Types: deb URIs: https://repo.librewolf.net Le nom du dépôt est donné dans la ligne Found, car pour certains logiciels, il peut y avoir différents noms ; dans ce contexte, le nom du dépôt correspondant est bien librewolf. Ainsi si par exemple, vous faites une recherche concernant les projets de Google ou Brave, vous aurez de multiples réponses, il faudra choisir le nom de dépôt selon la version du logiciel désiré.\nMaintenant, activons le dépôt correspondant et installons le logiciel désiré :\n#: extrepo enable librewolf #: apt update (…) #: apt install librewolf Installation de : librewolf Sommaire : Mise à niveau de : 0. Installation de : 1, Supprimé : 0. Non mis à jour : 28 Taille du téléchargement : 141 Mo Espace nécessaire : 438 Mo / 17,3 Go disponible Réception de : 1 https://repo.librewolf.net librewolf/main amd64 librewolf amd64 150.0-1 [141 MB] 141 Mo réceptionnés en 7s (19,5 Mo/s) Récupération des rapports de bogue… Fait Analyse des informations Trouvé/Corrigé… Fait Sélection du paquet librewolf précédemment désélectionné. (Lecture de la base de données... 325860 fichiers et répertoires déjà installés.) Préparation du dépaquetage de .../librewolf_150.0-1_amd64.deb ... Dépaquetage de librewolf (150.0-1) ... Paramétrage de librewolf (150.0-1) ... (…) Voilà !\nInformations officielles Git : https://salsa.debian.org/extrepo-team/extrepo Liste des dépôts tiers gérées : https://salsa.debian.org/extrepo-team/extrepo/debian/ Documentation la commande --help fournit quelques informations utiles à l\u0026rsquo;usage. le manpage extrepo(1). Remerciements @JustModeste (qui m\u0026rsquo;a fait découvrir le projet) ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eDepuis Novembre 2019, le projet \u003cstrong\u003eExtrepo\u003c/strong\u003e existe et a pour but de faciliter\nde manière officielle l\u0026rsquo;intégration de dépôts Debian externes au projet Debian,\nde manière sécurisée, pour la version Stable de Debian.\u003c/p\u003e\n\u003cp\u003eCe projet est \u003cstrong\u003egéré par l\u0026rsquo;équipe Debian\u003c/strong\u003e, pour les logiciels qu\u0026rsquo;elle ne peut\npas maintenir, du fait d\u0026rsquo;une nouvelle version d\u0026rsquo;un logiciel en question, du\nfait de restrictions juridiques sur le logiciel en question. \u003cbr\u003e\nQuoiqu\u0026rsquo;il en soit les logiciels dépendants de ces dépôts externes ne sont pas\nofficiellement intégrés dans les dépôts backports officiels de Debian. \u003cbr\u003e\nLes logiciels gérés par ces dépôts externes ne sont pas gérés par l\u0026rsquo;équipe Debian\nmais bel et bien par les mainteneurs responsables de leur(s) dépôt(s). \u003cbr\u003e\nL\u0026rsquo;équipe Debian ne fait QUE gérer l\u0026rsquo;intégration vérifiée des dépôts externes.\u003c/p\u003e\n\u003cp\u003eCe projet est une réponse officielle à l\u0026rsquo;ajout de logiciels tiers à l\u0026rsquo;OS Debian\nde manière sécurisée, et facilitée, dont le but est de s\u0026rsquo;assurer qu\u0026rsquo;il n\u0026rsquo;y a rien\nde malicieux dans la démarche d\u0026rsquo;intégration du logiciel tiers.\u003c/p\u003e\n\u003cp\u003eLe dépôt est utilisable par le biais de l\u0026rsquo;outil idoine \u003ccode\u003eextrepo\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eDans la réalité, l\u0026rsquo;outil vous \u003cstrong\u003epermet\u003c/strong\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ed\u0026rsquo;activer un des dépôts Debian externe\u003c/strong\u003e au sein de votre distribution Debian.\u003c/li\u003e\n\u003cli\u003epuis \u003cstrong\u003ed\u0026rsquo;installer un logiciel recherché\u003c/strong\u003e, géré par l\u0026rsquo;un des dépôts Debian externe.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAvec \u003ccode\u003eextrepo\u003c/code\u003e, \u003cstrong\u003evous n\u0026rsquo;avez plus besoin de créer/modifier un fichier .source,\nd\u0026rsquo;installer les clés GPG dépendantes\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003eLes clés GPG correspondantes sont installer dans le répertoire\n\u003ccode\u003e/var/lib/extrepo/keys\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCe que ne permet pas\u003c/strong\u003e de faire l\u0026rsquo;outil : il \u003cstrong\u003ene permet pas l\u0026rsquo;intégration\nd\u0026rsquo;un dépôt tiers externe\u003c/strong\u003e. C\u0026rsquo;est seulement l\u0026rsquo;équipe Debian qui gére\nl\u0026rsquo;intégration par le biais d\u0026rsquo;un processus vérifiant et validant le dépôt en\nquestion. \u003cbr\u003e\nEn utilisant l\u0026rsquo;outil, vous ne faites qu\u0026rsquo;activer le dépôt externe \u0026ldquo;autorisé\u0026rdquo; et\npermettre l\u0026rsquo;installation des binaires dépendants dudit dépôt.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration du binaire est : \u003ccode\u003e/etc/extrepo/config.yaml\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl permet de gérer la version de Debian, tel que par exemple \u003ccode\u003etrixie\u003c/code\u003e. \u003cbr\u003e\n\u003cem\u003eIl faut s\u0026rsquo;assurer à chaque mise à niveau du système Debian que la version stable\nsoit la correspondante !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003ePour activer les dépôts renfermant des logiciels dont les licences juridiques ne\npermettent pas l\u0026rsquo;intégration officielle, il faut décommenter les lignes\ncorrespondantes à \u003ccode\u003econtrib\u003c/code\u003e et surtout \u003ccode\u003enon-free\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eVoici un exemple du fichier :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003eurl: https://extrepo-team.pages.debian.net/extrepo-data\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edist: debian\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eversion: trixie\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# To enable repositories that host software with non-DFSG-free licenses,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# uncomment \u0026#34;contrib\u0026#34; and/or \u0026#34;non-free\u0026#34; in the list below.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eenabled_policies:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e- main\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# - contrib\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# - non-free\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;outil est utilisable dans la version testing, et installable aussi\nsous Sid… quoiqu\u0026rsquo;il en soit la version installée du logiciel recherché sera\nselon la version de Debian stable.\nNe cherchez pas à modifier la version de Debian, tel que pour la testing ou Sid,\ncela ne servira à rien ; laissez le nom de la stable actuelle. \u003cbr\u003e\nVous installerez des versions faites pour la stable ou backportée pour la stable\ndans votre version de Debian, quelqu\u0026rsquo;elle soit !\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEn premier lieu, installer le paquet \u003ccode\u003eextrepo\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuis utiliser les commandes de l\u0026rsquo;outil :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003esearch\u003c/code\u003e pour vérifier par une recherche que le logiciel désiré est bel et\nbien disponible\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eenable\u003c/code\u003e pour activer le dépôts Debian externe du logiciel recherché\u003c/li\u003e\n\u003cli\u003eutilisez ensuite la commande \u003ccode\u003eapt update\u003c/code\u003e pour mettre à jour le catalogue\nsystème\u003c/li\u003e\n\u003cli\u003eInstallez le logiciel recherché, par le biais de l\u0026rsquo;outil \u003ccode\u003eapt\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eLes commandes suivantes sont intéressantes pour :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edisable\u003c/code\u003e désactiver le nom d\u0026rsquo;un dépôt\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eupdate\u003c/code\u003e pour mettre à jour les données relatives aux dépôts.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNote : \u003cstrong\u003ene pas confondre avec la commmande \u003ccode\u003eupdate\u003c/code\u003e de l\u0026rsquo;outil apt\u003c/strong\u003e. \u003cbr\u003e\nLa commande \u003ccode\u003eupdate\u003c/code\u003e du paquet \u003ccode\u003eextrepo\u003c/code\u003e met à jour les données relatives aux\ndépôts gérés par le projet Extrepo, c\u0026rsquo;est-à-dire les dépôts ajoutés, supprimés,\nou dont les clés GPG sont remplacées, et réécrit les fichiers relatifs à la\ngestion des dépôts gérés par l\u0026rsquo;outil \u003ccode\u003eapt\u003c/code\u003e. \u003cbr\u003e\nIl est ainsi nécessaire ensuite de mettre à jour les données systèmes par la\ncommande idoine d\u0026rsquo;apt.\u003c/p\u003e\n\u003ch3 id=\"exemple\"\u003eExemple\u003c/h3\u003e\n\u003cp\u003eAprès avoir installé le paquet \u003ccode\u003eextrepo\u003c/code\u003e, vous désirez installez la version\nstable du navigateur internet \u003cstrong\u003elibrewolf\u003c/strong\u003e, voici comment 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: extrepo search librewolf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFound librewolf:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econtact: maltejur@dismail.de\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edescription: LibreWolf Browser\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg-key-checksum:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sha256: cd1c45ebf33b42191af369b5ea901508eb7dff3dd5086abcb601b25121bc70ad\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg-key-file: librewolf.asc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epolicy: main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esource:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Architectures: amd64 arm64\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Components: main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Suites: librewolf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Types: deb\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  URIs: https://repo.librewolf.net\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe nom du dépôt est donné dans la ligne \u003ccode\u003eFound\u003c/code\u003e, car pour certains logiciels,\nil peut y avoir différents noms ; dans ce contexte, le nom du dépôt correspondant\nest bien \u003ccode\u003elibrewolf\u003c/code\u003e. \u003cbr\u003e\nAinsi si par exemple,  vous faites une recherche concernant les projets de\nGoogle ou Brave, vous aurez de multiples réponses, il faudra choisir le nom de\ndépôt selon la version du logiciel désiré.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eMaintenant, activons le dépôt correspondant et installons le logiciel 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#: extrepo enable librewolf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#: apt update\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:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#: apt install librewolf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eInstallation de :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  librewolf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSommaire :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Mise à niveau de : 0. Installation de : 1, Supprimé : 0. Non mis à jour : \u003cspan style=\"color:#f99b15\"\u003e28\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTaille du téléchargement : \u003cspan style=\"color:#f99b15\"\u003e141\u003c/span\u003e Mo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Espace nécessaire : \u003cspan style=\"color:#f99b15\"\u003e438\u003c/span\u003e Mo / 17,3 Go disponible\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRéception de : \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e https://repo.librewolf.net librewolf/main amd64 librewolf amd64 150.0-1 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e141\u003c/span\u003e MB\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:#f99b15\"\u003e141\u003c/span\u003e Mo réceptionnés en 7s \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e19,5 Mo/s\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRécupération des rapports de bogue… Fait\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAnalyse des informations Trouvé/Corrigé… Fait\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSélection du paquet librewolf précédemment désélectionné.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eLecture de la base de données... \u003cspan style=\"color:#f99b15\"\u003e325860\u003c/span\u003e fichiers et répertoires déjà installés.\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePréparation du dépaquetage de .../librewolf_150.0-1_amd64.deb ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDépaquetage de librewolf \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e150.0-1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eParamétrage de librewolf \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e150.0-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:#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\u003eVoilà !\u003c/p\u003e\n\u003ch2 id=\"informations-officielles\"\u003eInformations officielles\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eGit : \u003ca href=\"https://salsa.debian.org/extrepo-team/extrepo\" rel=\"external\"\u003ehttps://salsa.debian.org/extrepo-team/extrepo\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eListe des dépôts tiers gérées : \u003ca href=\"https://salsa.debian.org/extrepo-team/extrepo/debian/\" rel=\"external\"\u003ehttps://salsa.debian.org/extrepo-team/extrepo/debian/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ela commande \u003ccode\u003e--help\u003c/code\u003e fournit quelques informations utiles à l\u0026rsquo;usage.\u003c/li\u003e\n\u003cli\u003ele manpage \u003ca href=\"https://manpages.debian.org/trixie/extrepo/extrepo.1p.en.html\" rel=\"external\"\u003e\u003ccode\u003eextrepo(1)\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.debian-fr.org/t/debian-fast-track/92237/2?u=pengouinpdt\" rel=\"external\"\u003e@JustModeste\u003c/a\u003e \u003cem\u003e(qui m\u0026rsquo;a fait découvrir le projet)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","summary":"Extrepo : l'outil ultime de gestion des dépôts Debian externes au projet officiel Debian.","tags":["Debian","backports","stable"],"date_published":"2026-04-23T15:43:26+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-04-22:/fr/sys/debian/fast-forward#a93fbd657af59068b750fc93d2980c9cff247f29bbda82eedf59b80fa1081702","url":"https://it-log.fr.eu.org/fr/sys/debian/fast-forward/","title":"Fast Forward Debian","author":{"name":"Stéphane HUC"},"content_text":"Description Fast Forward Debian est un dépôt \u0026ldquo;backport\u0026rdquo; alternatif, dont le but est de fournir alternativement les packets testing et unstable vers la stable.\nCe dépôt a été créé par Daniel Baumann, de manière officieuse en 2005, qui en 2010 est devenu une Debian dérivée (au même titre qu\u0026rsquo;*Buntu, par exemple).\nAvec la sortie de Trixie, les backports créés pour cette Debian dérivée ont migré vers un dépôt distinct, afin d\u0026rsquo;être plus accessibles et utiles à tout utilisateur Debian.\nÊtre une Debian dérivée est un processus qui se fait en collaboration avec les équipes Debian, et qui se doit de respecter le fameux Contrat Social Debian. À ce titre, l\u0026rsquo;infrastructure IT de Debian peut être utilisée.\nActuellement, seules les architectures amd64 , i386 , et arm64 sont supportées.\nInstallation Voici la méthode recommandée ­— ce qui signifie qu\u0026rsquo;il existe d\u0026rsquo;autres méthodes :\nDebian 13 ⇒ Concernant Debian 13 \u0026ldquo;Trixie\u0026rdquo; :\nIl faut télécharger manuellement les paquets depuis le dépôt Debian officiel ; ils sont au nombre de trois nommés : debian-fastforward, debian-fastforward-pgp-keys, debian-fastforward-ssh-keys, Tel que, par exemple : $: files=(\u0026#39;debian-fastforward\u0026#39; \u0026#39;debian-fastforward-pgp-keys\u0026#39; \u0026#39;debian-fastforward-ssh-keys\u0026#39;) $: v=\u0026#34;20260224-8\u0026#34; $: for file in \u0026#34;${files[@]}\u0026#34;; do wget https://deb.debian.org/debian/pool/main/d/debian-fastforward/\u0026#34;${file}\u0026#34;_\u0026#34;${v}\u0026#34;_all.deb; done (À vous de vérifier sur le dépôt la présence de paquets plus récents…)\nUtilisez l\u0026rsquo;outil apt pour installer ces trois paquets\nUne fois fait, pensez à supprimez les paquets téléchargés.\nDebian 14 ⇒ À partir de la Debian 14 \u0026ldquo;Forky\u0026rdquo;, il suffit d\u0026rsquo;installer le paquet debian-fastforward !\nfull-upgrade Ensuite :\nmettez à niveau votre version de Debian : apt full-upgrade --update --yes\nen option, à vous de voir, purgez les paquets devenus inutiles : apt autopurge --yes\nPuis redémarrez la machine !\nVoilà !\nInformations officielles Site : https://fastforward.debian.net/\nDocumentation : https://fastforward.debian.net/doc/\nManpage : https://manpages.debian.org/unstable/debian-fastforward/debian-fastforward.7.en.html\nTracker Debian : https://tracker.debian.org/pkg/debian-fastforward\nChanges : https://changes.fastforward.debian.net/\nDaniel Baumann Announce : https://blog.daniel-baumann.ch/posts/20260228-1.html ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eFast Forward Debian\u003c/strong\u003e est un dépôt \u0026ldquo;\u003cstrong\u003ebackport\u003c/strong\u003e\u0026rdquo; alternatif, dont le but est\nde fournir alternativement les packets \u003cstrong\u003etesting et unstable vers la stable\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eCe dépôt a été créé par \u003ca href=\"https://blog.daniel-baumann.ch/\" rel=\"external\"\u003eDaniel Baumann\u003c/a\u003e, de\nmanière officieuse en 2005, qui en 2010 est devenu une Debian dérivée\n(\u003cem\u003eau même titre qu\u0026rsquo;*Buntu\u003c/em\u003e, par exemple).\u003c/p\u003e\n\u003cp\u003eAvec la sortie de Trixie, les backports créés pour cette Debian dérivée ont\nmigré vers un dépôt distinct, afin d\u0026rsquo;être plus accessibles et utiles à tout\nutilisateur Debian.\u003c/p\u003e\n\u003cp\u003eÊtre une Debian dérivée est un processus qui se fait en collaboration avec les\néquipes Debian, et qui se doit de respecter le fameux \u003ca title=\"documentation DFSG en langue anglaise\" href=\"https://www.debian.org/social_contract#guidelines\" rel=\"external\"\u003eContrat Social Debian\u003c/a\u003e.\nÀ ce titre, l\u0026rsquo;infrastructure IT de Debian peut être utilisée.\u003c/p\u003e\n\u003cp\u003eActuellement, seules les architectures \u003ccode\u003eamd64\u003c/code\u003e , \u003ccode\u003ei386\u003c/code\u003e , et \u003ccode\u003earm64\u003c/code\u003e sont supportées.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eVoici la méthode recommandée ­— \u003cem\u003ece qui signifie qu\u0026rsquo;il existe d\u0026rsquo;autres méthodes\u003c/em\u003e :\u003c/p\u003e\n\u003ch3 id=\"debian-13\"\u003eDebian 13\u003c/h3\u003e\n\u003cp\u003e⇒ Concernant Debian 13 \u0026ldquo;Trixie\u0026rdquo; :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIl faut télécharger manuellement les paquets depuis le dépôt Debian officiel ;\nils sont au nombre de trois nommés : \u003cbr\u003e\n\u003ccode\u003edebian-fastforward\u003c/code\u003e, \u003ccode\u003edebian-fastforward-pgp-keys\u003c/code\u003e, \u003ccode\u003edebian-fastforward-ssh-keys\u003c/code\u003e, \u003cbr\u003e\nTel que, par exemple :\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:#ef6155\"\u003efiles\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;debian-fastforward\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;debian-fastforward-pgp-keys\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;debian-fastforward-ssh-keys\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\"\u003ev\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;20260224-8\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 file in \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efiles\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 wget https://deb.debian.org/debian/pool/main/d/debian-fastforward/\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\"\u003ev\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e_all.deb; \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\u003e(\u003cem\u003eÀ vous de vérifier sur le dépôt la présence de paquets plus récents…\u003c/em\u003e)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUtilisez l\u0026rsquo;outil \u003ccode\u003eapt\u003c/code\u003e pour installer ces trois paquets\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUne fois fait, pensez à supprimez les paquets téléchargés.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"debian-14\"\u003eDebian 14\u003c/h3\u003e\n\u003cp\u003e⇒ À partir de la Debian 14 \u0026ldquo;Forky\u0026rdquo;, il suffit d\u0026rsquo;installer le paquet\n\u003ccode\u003edebian-fastforward\u003c/code\u003e !\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"full-upgrade\"\u003efull-upgrade\u003c/h3\u003e\n\u003cp\u003eEnsuite :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003emettez à niveau votre version de Debian : \u003cbr\u003e\n\u003ccode\u003eapt full-upgrade --update --yes\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003een option, \u003cem\u003eà vous de voir\u003c/em\u003e, purgez les paquets devenus inutiles : \u003cbr\u003e\n\u003ccode\u003eapt autopurge --yes\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuis redémarrez la machine !\u003c/p\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"informations-officielles\"\u003eInformations officielles\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSite : \u003ca href=\"https://fastforward.debian.net/\" rel=\"external\"\u003ehttps://fastforward.debian.net/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDocumentation : \u003ca href=\"https://fastforward.debian.net/doc/\" rel=\"external\"\u003ehttps://fastforward.debian.net/doc/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eManpage : \u003ca href=\"https://manpages.debian.org/unstable/debian-fastforward/debian-fastforward.7.en.html\" rel=\"external\"\u003ehttps://manpages.debian.org/unstable/debian-fastforward/debian-fastforward.7.en.html\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTracker Debian : \u003ca href=\"https://tracker.debian.org/pkg/debian-fastforward\" rel=\"external\"\u003ehttps://tracker.debian.org/pkg/debian-fastforward\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanges : \u003ca href=\"https://changes.fastforward.debian.net/\" rel=\"external\"\u003ehttps://changes.fastforward.debian.net/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eDaniel Baumann Announce : \u003ca href=\"https://blog.daniel-baumann.ch/posts/20260228-1.html\" rel=\"external\"\u003ehttps://blog.daniel-baumann.ch/posts/20260228-1.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n","summary":"Présentation du dépôt alternatif de paquets backports testing ET unstable vers stable au projet Debian.","tags":["Debian","backports","stable"],"date_published":"2026-04-22T11:40:00+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-04-22:/fr/sys/debian/fast-track#30d5779d40f24d7a95f31e525901772b43d9ddcbba669619803e5685110b8c76","url":"https://it-log.fr.eu.org/fr/sys/debian/fast-track/","title":"Debian Fast Track","author":{"name":"Stéphane HUC"},"content_text":"Description Debian Fast Track est un dépôt alternatif dérivé dont le but est de fournir les paquets Testing, qui ne sont plus officiellement supportés, vers stable.\nCe projet existe officiellement depuis Décembre 2018.\nInstallation manuelle Il nécessite l\u0026rsquo;installation des dépôts \u0026ldquo;backports\u0026rdquo; IMPÉRATIVEMENT, en premier. (je ne décris pas cette phase)\nEnsuite, installez le trousseau de clés nécessaire fasttrack-archive-keyring\nPuis, créez le fichier /etc/apt/sources.list.d/fasttrack.sources nécessaire, contenant :\nTypes: deb URIs: https://fasttrack.debian.net/debian-fasttrack Suites: trixie-fasttrack trixie-backports-staging Components: main contrib Signed-By: /usr/share/keyrings/fasttrack-archive-keyring.gpg Mettez à jour vos dépôts de manière habituelle avec l\u0026rsquo;outil apt.\nEnsuite, il n\u0026rsquo;y a plus qu\u0026rsquo;à :\nchercher si un paquet est géré installer les paquets… extrepo Après avoir installé l\u0026rsquo;outil extrepo, il suffit d\u0026rsquo;utiliser le paquet idoine, avec des droits administrateur :\npuis activer le dépôt backports Fast Track : extrepo enable fasttrack_backports Ensuite, cherchez d\u0026rsquo;abord à :\nsavoir si le logiciel est disponible sur le dépôt, puis si c\u0026rsquo;est le cas installez-le ! Outil de recherche Si vous désirez savoir si un paquet est disponible sur le dépôt Fastrack, il faut :\n1/ dans un premier temps, installer le paquet devscripts\n2/ créer ou éditer le fichier ~/.devscripts pour ajouter la ligne suivante :\nRMADISON_URL_MAP_FASTTRACK=https://fasttrack.debian.net/api/madison 3/ utiliser l\u0026rsquo;outil rmadison, tel que : rmadison -u fasttrack nom_paquet Note : rmadison n\u0026rsquo;installe pas le paquet ; c\u0026rsquo;est toujours apt qui s\u0026rsquo;en occupe ;)\nInformations officielles Site : https://fasttrack.debian.net/\nIRC : https://webchat.oftc.net/?channels=debian-fasttrack\nMatrix : https://matrix.to/#/#debian-fasttrack:poddery.com\nAnnonce : https://lists.debian.org/debian-devel/2018/12/msg00297.html\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eDebian Fast Track\u003c/strong\u003e est un dépôt alternatif dérivé dont le but est de fournir\nles paquets \u003cstrong\u003eTesting\u003c/strong\u003e, qui ne sont plus officiellement supportés,\n\u003cstrong\u003evers stable\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eCe projet existe officiellement depuis Décembre 2018.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003ch3 id=\"manuelle\"\u003emanuelle\u003c/h3\u003e\n\u003cp\u003eIl nécessite l\u0026rsquo;installation des dépôts \u0026ldquo;backports\u0026rdquo; IMPÉRATIVEMENT, en premier. \u003cbr\u003e\n(\u003cem\u003eje ne décris pas cette phase\u003c/em\u003e)\u003c/p\u003e\n\u003cp\u003eEnsuite, installez le trousseau de clés nécessaire \u003ccode\u003efasttrack-archive-keyring\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis, créez le fichier \u003ccode\u003e/etc/apt/sources.list.d/fasttrack.sources\u003c/code\u003e nécessaire,\ncontenant :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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: deb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eURIs: https://fasttrack.debian.net/debian-fasttrack\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eSuites: trixie-fasttrack trixie-backports-staging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eComponents: main contrib\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eSigned-By: /usr/share/keyrings/fasttrack-archive-keyring.gpg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMettez à jour vos dépôts de manière habituelle avec l\u0026rsquo;outil \u003ccode\u003eapt\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eEnsuite, il n\u0026rsquo;y a plus qu\u0026rsquo;à :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003echercher si un paquet est géré\u003c/li\u003e\n\u003cli\u003einstaller les paquets…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"extrepo\"\u003eextrepo\u003c/h3\u003e\n\u003cp\u003eAprès avoir installé l\u0026rsquo;outil \u003ccode\u003eextrepo\u003c/code\u003e, il suffit d\u0026rsquo;utiliser le paquet idoine,\navec des droits administrateur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epuis activer le dépôt backports Fast Track :\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\u003eextrepo enable fasttrack_backports\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, cherchez d\u0026rsquo;abord à :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esavoir si le logiciel est disponible sur le dépôt,\u003c/li\u003e\n\u003cli\u003epuis si c\u0026rsquo;est le cas installez-le !\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"outil-de-recherche\"\u003eOutil de recherche\u003c/h2\u003e\n\u003cp\u003eSi vous désirez savoir si un paquet est disponible sur le dépôt Fastrack, il\nfaut :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e1/ dans un premier temps, installer le paquet \u003ccode\u003edevscripts\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e2/ créer ou éditer le fichier \u003ccode\u003e~/.devscripts\u003c/code\u003e pour ajouter la ligne suivante :\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:#06b6ef\"\u003eRMADISON_URL_MAP_FASTTRACK\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003ehttps://fasttrack.debian.net/api/madison\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e3/ utiliser l\u0026rsquo;outil \u003ccode\u003ermadison\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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ermadison -u fasttrack nom_paquet\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNote : \u003ccode\u003ermadison\u003c/code\u003e n\u0026rsquo;installe pas le paquet ; c\u0026rsquo;est toujours \u003ccode\u003eapt\u003c/code\u003e qui s\u0026rsquo;en\noccupe ;)\u003c/p\u003e\n\u003ch2 id=\"informations-officielles\"\u003eInformations officielles\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSite : \u003ca href=\"https://fasttrack.debian.net/\" rel=\"external\"\u003ehttps://fasttrack.debian.net/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIRC : \u003ca href=\"https://webchat.oftc.net/?channels=debian-fasttrack\" rel=\"external\"\u003ehttps://webchat.oftc.net/?channels=debian-fasttrack\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMatrix : \u003ca href=\"https://matrix.to/#/%23debian-fasttrack:poddery.com\" rel=\"external\"\u003ehttps://matrix.to/#/#debian-fasttrack:poddery.com\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnnonce : \u003ca href=\"https://lists.debian.org/debian-devel/2018/12/msg00297.html\" rel=\"external\"\u003ehttps://lists.debian.org/debian-devel/2018/12/msg00297.html\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n","summary":"Présentation du dépôt alternatif de paquets backports testing vers stable au projet Debian.","tags":["Debian","backports","stable"],"date_published":"2026-04-22T11:00:00+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-04-10:/fr/sys/debian/apt-3.2.0#45d3e9da67536c37c32e05400c8bcb8444c2260995c041e7f86b84d141d9708e","url":"https://it-log.fr.eu.org/fr/sys/debian/apt-3.2.0/","title":"Debian : Apt — Changements majeurs à partir de la version 3.2.0","author":{"name":"Stéphane HUC"},"content_text":"Description Depuis le 7 avril 2026, l\u0026rsquo;outil apt qui se trouve être LE gestionnaire de paquets en CLI sous Debian, et distributions dérivés, a reçu une mise-à-jour qui change profondément son comportement.\nLes nouvelles options history-* et why-* apportent leur petit lot de changement dans l\u0026rsquo;utilisation de l\u0026rsquo;outil.\nEn effet, cette version d\u0026rsquo;apt permet d\u0026rsquo;afficher l\u0026rsquo;historique des actions de l\u0026rsquo;outil, avec une possibilité de revenir en arrière aisée, filtrée par dépôt. Apt garde donc un historique de chaque paquet installé, mise-à-jour, supprimé.\nhistory apt history-list affiche la liste complète de chacune de ces actions leur attribuant un identifiant.\napt history-info \u0026lt;id\u0026gt; permet de voir quels paquets sont impactés par action — ou \u0026lt;id\u0026gt; est le numéro d\u0026rsquo;identifiant mentionné ci-dessus.\napt history-undo \u0026lt;id\u0026gt; est à utiliser pour annuler un action spécifique de l\u0026rsquo;outil\napt history-redo \u0026lt;id\u0026gt; sert à annuler une action annulée précédemment\napt history-rollback \u0026lt;id\u0026gt; permet de revenir à une action précédente identifiée annulant de fait toute action effectuée après l\u0026rsquo;identifiant — il semble nécessaire d\u0026rsquo;être prudent avec cette option car elle rend le changement permanent ! Cette commande apporte une réponse attendue pour \u0026ldquo;ramener\u0026rdquo; un paquet dans une version précédente, connu pour être fonctionnel.\nwhy ⇒ apt why garde une trace des raisons d\u0026rsquo;installations des paquets\napt why \u0026lt;nom_paquet\u0026gt; informe exactement quels paquets dépendants d\u0026rsquo;un paquet ont été installés apt why-not \u0026lt;nom_paquet\u0026gt; restitue pourquoi tel paquet n\u0026rsquo;a pas été installé. Note : les commandes why* ont été apportés plutôt dans l\u0026rsquo;année, à-priori fin Janvier 2026, avec la version 3.1.14.\nModernize-sources Un petit rappel concernant la commande modernize-sources modernise les vieux fichiers sources .list en fichier .source actuel\nNote : cette commande a été introduite avec la v2.9.6, fin Janvier 2025.\nDisponible La version 3.2.0 de l\u0026rsquo;outil apt est disponible dans Debian Sid, ou son pendant *Buntu 26.04, et le sera dans la future stable, Debian 14 nommée Forky.\n$ apt --help apt 3.2.0 (amd64) Usage : apt [options] commande apt est un outil en ligne de commande pour gérer les paquets. Il fournit des commandes pour chercher et gérer autant que pour rechercher des informations à propos des paquets. Il fournit les mêmes fonctions que les outils APT spécialisés, tels qu\u0026#39;apt-get et apt-cache, mais dispose d\u0026#39;options plus adaptées pour une utilisation interactive. Commandes les plus utilisées : list - lister les paquets selon leur nom search - chercher dans les descriptions de paquet show - afficher les détails du paquet install - installer les paquets reinstall - réinstaller les paquets remove - supprimer des paquets autoremove - supprimer automatiquement tous les paquets inutilisés update - mettre à jour la liste des paquets disponibles upgrade - mettre à jour le système en installant/mettant à jour les paquets full-upgrade - mettre à jour le système en supprimant/installant/mettant à jour les paquets history-list - show list of history history-info - show info on specific transactions history-redo - redo transactions history-undo - undo transactions history-rollback - rollback transactions edit-sources - éditer le fichier d\u0026#39;information source modernize-sources - moderniser les fichiers .list en fichiers .sources satisfy - satisfaire les chaînes de dépendances why - produire une trace de l\u0026#39;état actuel du paquet why-not - produire une trace de l\u0026#39;état actuel du paquet Veuillez vous référer à apt(8) pour plus d\u0026#39;information à propos des commandes disponibles. Les options de configuration et la syntaxe sont détaillées dans apt.conf(5). Des informations sur la configuration des sources sont disponibles dans sources.list(5). Les choix de paquet et de version peuvent être renseignés grâce à apt_preferences(5). Les informations sur la sécurité sont disponibles dans apt-secure(8). Cet APT a les « Super Cow Powers » Documentation Ne pas hésiter à lire le manpage dédié : https://manpages.debian.org/unstable/apt/apt.8.fr.html ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eDepuis le 7 avril 2026, l\u0026rsquo;outil \u003ccode\u003eapt\u003c/code\u003e qui se trouve être LE gestionnaire\nde paquets en CLI sous Debian, et distributions dérivés, a reçu une mise-à-jour\nqui change profondément son comportement.\u003c/p\u003e\n\u003cp\u003eLes nouvelles options \u003ccode\u003ehistory-*\u003c/code\u003e et \u003ccode\u003ewhy-*\u003c/code\u003e apportent leur petit lot de\nchangement dans l\u0026rsquo;utilisation de l\u0026rsquo;outil.\u003c/p\u003e\n\u003cp\u003eEn effet, cette version d\u0026rsquo;apt permet d\u0026rsquo;afficher l\u0026rsquo;historique des actions de\nl\u0026rsquo;outil, avec une possibilité de revenir en arrière aisée, filtrée par dépôt.\nApt garde donc un historique de chaque paquet installé, mise-à-jour, supprimé.\u003c/p\u003e\n\u003ch3 id=\"history\"\u003ehistory\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eapt history-list\u003c/code\u003e affiche la liste complète de chacune de ces actions leur\nattribuant un identifiant.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eapt history-info \u0026lt;id\u0026gt;\u003c/code\u003e permet de voir quels paquets sont impactés par action\n— \u003cem\u003eou \u003ccode\u003e\u0026lt;id\u0026gt;\u003c/code\u003e est le numéro d\u0026rsquo;identifiant mentionné ci-dessus\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eapt history-undo \u0026lt;id\u0026gt;\u003c/code\u003e est à utiliser pour annuler un action spécifique de\nl\u0026rsquo;outil\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eapt history-redo \u0026lt;id\u0026gt;\u003c/code\u003e sert à annuler une action annulée précédemment\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eapt history-rollback \u0026lt;id\u0026gt;\u003c/code\u003e permet de revenir à une action précédente\nidentifiée annulant de fait toute action effectuée après l\u0026rsquo;identifiant —\n\u003cem\u003e\u003cstrong\u003eil semble nécessaire d\u0026rsquo;être prudent avec cette option car elle rend le\nchangement permanent\u003c/strong\u003e\u003c/em\u003e ! \u003cbr\u003e\nCette commande apporte une réponse attendue pour \u0026ldquo;ramener\u0026rdquo; un paquet dans\nune version précédente, connu pour être fonctionnel.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"why\"\u003ewhy\u003c/h3\u003e\n\u003cp\u003e⇒ \u003ccode\u003eapt why\u003c/code\u003e garde une trace des raisons d\u0026rsquo;installations des paquets\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eapt why \u0026lt;nom_paquet\u0026gt;\u003c/code\u003e informe exactement quels paquets dépendants d\u0026rsquo;un\npaquet ont été installés\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eapt why-not \u0026lt;nom_paquet\u0026gt;\u003c/code\u003e restitue pourquoi tel paquet n\u0026rsquo;a pas été installé.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNote : \u003cem\u003eles commandes \u003ccode\u003ewhy*\u003c/code\u003e ont été apportés plutôt dans l\u0026rsquo;année, à-priori fin\nJanvier 2026, avec la version 3.1.14.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"modernize-sources\"\u003eModernize-sources\u003c/h3\u003e\n\u003cp\u003eUn petit rappel concernant la commande \u003ccode\u003emodernize-sources\u003c/code\u003e modernise les vieux\nfichiers sources \u003ccode\u003e.list\u003c/code\u003e en fichier \u003ccode\u003e.source\u003c/code\u003e actuel\u003c/p\u003e\n\u003cp\u003eNote : \u003cem\u003ecette commande a été introduite avec la v2.9.6, fin Janvier 2025\u003c/em\u003e.\u003c/p\u003e\n\u003ch2 id=\"disponible\"\u003eDisponible\u003c/h2\u003e\n\u003cp\u003eLa version 3.2.0 de l\u0026rsquo;outil apt est disponible dans Debian Sid, \u003cem\u003eou son pendant\n*Buntu 26.04\u003c/em\u003e, et le sera dans la future stable, Debian 14 nommée Forky.\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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ apt --help\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt 3.2.0 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eamd64\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUsage : apt \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eoptions\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e commande\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt est un outil en ligne de commande pour gérer les paquets.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIl fournit des commandes pour chercher et gérer autant que pour\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erechercher des informations à propos des paquets. Il fournit les mêmes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efonctions que les outils APT spécialisés, tels qu\u003cspan style=\"color:#48b685\"\u003e\u0026#39;apt-get et apt-cache,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003emais dispose d\u0026#39;\u003c/span\u003eoptions plus adaptées pour une utilisation interactive.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCommandes les plus utilisées :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  list - lister les paquets selon leur nom\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  search - chercher dans les descriptions de paquet\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  show - afficher les détails du paquet\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  install - installer les paquets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  reinstall - réinstaller les paquets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  remove - supprimer des paquets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  autoremove - supprimer automatiquement tous les paquets inutilisés\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  update - mettre à jour la liste des paquets disponibles\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  upgrade - mettre à jour le système en installant/mettant à jour les paquets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  full-upgrade - mettre à jour le système en supprimant/installant/mettant à jour les paquets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  history-list - show list of history\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  history-info - show info on specific transactions\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  history-redo - redo transactions\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  history-undo - undo transactions\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  history-rollback - rollback transactions\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  edit-sources - éditer le fichier d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;information source\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  modernize-sources - moderniser les fichiers .list en fichiers .sources\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  satisfy - satisfaire les chaînes de dépendances\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  why - produire une trace de l\u0026#39;\u003c/span\u003eétat actuel du paquet\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  why-not - produire une trace de l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;état actuel du paquet\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\"\u003eVeuillez vous référer à apt(8) pour plus d\u0026#39;\u003c/span\u003einformation à propos des commandes disponibles.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLes options de configuration et la syntaxe sont détaillées dans apt.conf\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDes informations sur la configuration des sources sont disponibles dans sources.list\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLes choix de paquet et de version peuvent être renseignés grâce à apt_preferences\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLes informations sur la sécurité sont disponibles dans apt-secure\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                Cet APT a les « Super Cow Powers »\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\u003eNe pas hésiter à lire le manpage dédié :\n\u003ca href=\"https://manpages.debian.org/unstable/apt/apt.8.fr.html\" rel=\"external\"\u003ehttps://manpages.debian.org/unstable/apt/apt.8.fr.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Présentation des nouvelles commandes de l'outil apt à partir de la version 3.2.0.","tags":["Debian","apt"],"date_published":"2026-04-10T03:59:10+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-04-08:/fr/web/hugo/gemini#ec3b773c37698048ebdbb2ca0951a9f1528362918185aa26b3521d13ee822d00","url":"https://it-log.fr.eu.org/fr/web/hugo/gemini/","title":"Hugo : Environnement pour Gemini","author":{"name":"Stéphane HUC"},"content_text":"Description Précédemment, en 2021, je m\u0026rsquo;étais penché sur la question de promouvoir mes sites sur le protocole Gemini ; dans le contexte multilangue, j\u0026rsquo;ai galéré, échoué.\nPour rappel, Gemini est un protocole de communication né courant juin 2019, en parallèle du grand réseau web connu, nommé Internet.\nComment j\u0026rsquo;ai réussi ? C\u0026rsquo;est une histoire de configuration…\nVersion Hugo : 0.159.1 Environnement : Debian Sid Configuration Une \u0026ldquo;saveur\u0026rdquo; du gestionnaire de site statique qu\u0026rsquo;est Hugo est de pouvoir gérer la configuration de celui-ci de bien des manières…\nJ\u0026rsquo;ai appris qu\u0026rsquo;il était possible de générer des pages selon un environnement choisi, et cela a résolu toutes les difficultés auxquelles j\u0026rsquo;avais été confronté.\nCette commande nécessite de créer un sous-répertoire au répertoire config, par exemple dans ce cas-là, le nommer gemini, soit : config/gemini puis d\u0026rsquo;y déposer le ou l\u0026rsquo;ensemble des fichiers de configuration spécifiques à cet environnement. Par défaut, un seul fichier suffit, le bien nommé hugo.(toml|yaml|json).\nIl est nécessaire de créer en sus deux, trois répertoires spécifiques à la gestion, génération des fichiers pour la publication sur Gemini, à la racine du projet Hugo :\ngemini qui est l\u0026rsquo;équivalent de public et devient spécifiquement la valeur de la variable publishDir. gemini-layouts, l\u0026rsquo;équivalent du répertoire layouts, qui sera la valeur de la variable layoutDir. gemini-static, l\u0026rsquo;équivalent du répertoire static, pris en charge par la variable staticDir. Bien-sûr, ces trois répertoires ne sont strictement pas nécessaires si le site Hugo est spécifiquement dédié à la génération de fichiers pour un protocole ou l\u0026rsquo;autre ; je m\u0026rsquo;explique : si je ne génère que pour le protocole Gemini, ou juste pour le protocole web HTTP(S), alors je peux très bien utiliser les répertoires de base, ainsi que la configuration par défaut. Nous sommes bien dans le cas où la génération des fichiers se fait, ET pour HTTP(S), ET pour Gemini, ET pour… envisageons tout autre protocole (Gopher, par exemple).\nHiérarchie On se retrouve donc avec une hiérarchie de fichiers ainsi :\nmon-site-hugo ├─ archetypes ├─ assets ├─ config | ├─_default # global | └─ gemini # configuration spécifique Gemini | └─ hugo.(toml|yaml|json) ├─ content | ├─ en # répertoires et fichiers .md relatif à la langue anglaise | └─ fr # répertoires et fichiers .md relatif à la langue française ├─ data ├─ gemini ├─ gemini-layouts | ├─ home.gmi | ├─ list.gmi | └─ single.gmi ├─ gemini-static | └─ index.gmi # page d\u0026#39;accueil principale ├─ i18n ├─ static └─ themes Explications Ne cherchez pas de variable pour gérer autrement le répertoire de config, tel une hypothétique \u0026lsquo;configDir\u0026rsquo; ; elle n\u0026rsquo;existe pas, du moins pas dans un fichier de configuration. Bien qu\u0026rsquo;il soit possible de spécifier en CLI la variable --configDir ; c\u0026rsquo;est bizarre, mais elle n\u0026rsquo;existe pas dans le contexte du fichier de configuration.\nUne autre raison est que lors de l\u0026rsquo;utilisation de la variable --config en CLI, dans le contexte d\u0026rsquo;un site existant, Hugo va analyser l\u0026rsquo;ensemble du répertoire config\\_default — c\u0026rsquo;est son comportement par défaut — le résultat est qu\u0026rsquo;il va surcharger la configuration. La future génération n\u0026rsquo;aura pas du tout le résultat attendu ; il en résultera aucun fichier généré.\nD\u0026rsquo;où l\u0026rsquo;intérêt d\u0026rsquo;utiliser un environnement qui lui scrutera le(s) fichier(s) de configuration au sein du répertoire défini, dans ce cas d\u0026rsquo;exemple : config/gemini.\nL\u0026rsquo;utilisation d\u0026rsquo;environnement règle ce délicat soucis, et d\u0026rsquo;autres, et permettra une génération \u0026ldquo;propre\u0026rdquo; dans le répertoire de destination défini dans la variable publishDir du fichier de configuration, précédemment créé dans le répertoire de l\u0026rsquo;environnement cible. Soit, dans ce cas, et pour spécifique : publishDir: gemini.\nPour en revenir à la hiérarchie supplémentaire :\ngemini-layouts sera le \u0026ldquo;dépôt\u0026rdquo; des fichiers de configuration pour la génération des futures pages, tel : home.gmi, l\u0026rsquo;actuel fichier index list.gmi, pour les catégories et autres sections single.gmi pour les pages. gemini-static est celui qui accueille la page d\u0026rsquo;accueil du futur site Gemini ;) Pour rappel, le répertoire content est bien celui contenant l\u0026rsquo;ensemble des répertoires et fichiers .md, hierarchisé eux, aussi selon la langue ! Cette hiérarchie linguistique sera maintenue lors de la production dans le répertoire de destination de production gemini spécifique… mais aussi dans le répertoire de production par défaut, public.\nNote : j\u0026rsquo;utilise pour la démonstration un seul fichier central de configuration ; mais il est possible d\u0026rsquo;éclater les différentes sections de configuration dans des fichiers relatifs, tant que ceux-ci restent dans le répertoire d\u0026rsquo;environnement dédié. Les explications données ci-dessous seront basés sur la configuration yaml.\nPassons à l\u0026rsquo;aspect du fichier de configuration :\nYaml Le fichier de configuration hugo.yaml est à remplir dans le répertoire idoine, tel : config/gemini/hugo.yaml.\nLes variables à remplir par défaut, à minima sont :\nbaseURL: gemini://nom-de-domaine defaultContentLanguage: fr defaultContentLanguageInSubdir: true layoutDir: \u0026#34;gemini-layouts\u0026#34; publishDir: gemini staticDir: \u0026#34;gemini-static\u0026#34; title: \u0026#34;Titre du site\u0026#34; Languages La gestion du menu des langues est habituelle, tel que :\nlanguages: en: contentDir: \u0026#34;content/en\u0026#34; direction: ltr label: English locale: \u0026#34;en-EN\u0026#34; menus: main: - identifier: home name: \u0026#34;Home EN\u0026#34; pre: internal url: / weight: 1 (…) params: copyright: \u0026#34;\u0026#34; disable: false description: \u0026#34;\u0026#34; weight: 2 fr: contentDir: \u0026#34;content/fr\u0026#34; direction: ltr label: Français locale: \u0026#34;fr-FR\u0026#34; menus: main: - identifier: home name: \u0026#34;Accueil FR\u0026#34; pre: internal url: / weight: 1 (…) params: copyright: \u0026#34;\u0026#34; disable: false description: \u0026#34;\u0026#34; weight: 1 Bien-sûr, ici dans cet exemple, je ne reprends pas l\u0026rsquo;ensemble d\u0026rsquo;un menu point par point ; juste l\u0026rsquo;essentiel !\nPour rappel, il importe de :\nrestituer le répertoire de contenu linguistique : contentDir: \u0026quot;content/LANG\u0026quot; où LANG est l\u0026rsquo;abrégé de la langue, répertoire où Hugo va chercher les fichiers MD sources. comprendre que les variables label et locale sont les noms actuels d\u0026rsquo;anciennes variables de configuration linguistiques, depuis la v0.158.0 Passons à la configuration des types de media pour que Hugo puisse générer :\nMediaTypes Définition de l\u0026rsquo;extension des futurs fichiers générés, selon le type de media :\nmediaTypes: text/gemini: suffixes: - gmi Outputs Définition de l\u0026rsquo;appel au format de sortie adéquat, ici gemini, selon le type de modèle à générer :\noutputs: home: - gemini page: - gemini section: - gemini OutputFormats Hugo utilisera les paramètres du format de sortie gemini selon les paramètres de configuration choisis :\noutputFormats: gemini: basename: index isHTML: false isPlainText: true mediaType: text/gemini name: gemini permalinkable: true protocol: gemini:// Layouts Ainsi qu\u0026rsquo;il est visible dans la section Hiérarchie, il est nécessaire de créer les fichiers de modèles dans le répertoire adéquat, ici dans gemini-layouts, pour transformer le contenu :\nhome.gmi est l\u0026rsquo;actuel nom de fichier pour la page principale, selon le répertoire linguistique list.gmi est le modèle qui restitue le titre d\u0026rsquo;une page listant un contenu, selon le type d\u0026rsquo;informations, restitue généralement une liste d\u0026rsquo;articles d\u0026rsquo;une section, de catégories, ou de taxonomies. single.gmi est le modèle qui restitue le titre de page et son contenu Je vous renvoie à la documentation officielle sur les templates layouts.\nStatic Pour rappel, le répertoire static est gemini-static ; dans mon cas, il sert au fichier d\u0026rsquo;accueil principal, nommé index.gmi.\ni18n Normalement, il n\u0026rsquo;y a rien à modifier dans ce répertoire ; juste pour rappel, il renferme normalement les fichiers de traduction linguistiques ; ceux-ci sont utilisables dans le contexte des fichiers de modèles layouts exactement de la même manière que pour les modèles par défaut.\nUtilisation Il suffit maintenant d\u0026rsquo;appeler Hugo ainsi : hugo --environment gemini ce qui nous générera tous les fichiers .gmi, selon la hiérarchie linguistique de fichiers du répertoire content, dans le répertoire de publication gemini.\nIl ne reste plus qu\u0026rsquo;à synchroniser les fichiers .gmi dans votre capsule Gemini.\nCela permet de continuer à utiliser et produire normalement du contenu pour le protocole HTTP(S), tel que :\nhugo server pour la phase de développement, hugo pour la production des fichiers dans le répertoire de production par défaut, nommé public. Et tout cela sans impacter l\u0026rsquo;une ou l\u0026rsquo;autre des productions ! :D\nTL;DR ⇒ Création de trois répertoires dédiés à la racine du site Hugo :\n$: mkdir -R config/gemini gemini gemini-{layouts,static} ⇒ Création d\u0026rsquo;un environnement dédié :\n$: mkdir config/gemini $: touch config/gemini/hugo.yaml ⇒ Création/Modification du fichier de configuration :\nbaseURL: gemini://nom-de-domaine defaultContentLanguage: fr defaultContentLanguageInSubdir: true layoutDir: \u0026#34;gemini-layouts\u0026#34; publishDir: gemini staticDir: \u0026#34;gemini-static\u0026#34; title: \u0026#34;Titre du site\u0026#34; languages: en: contentDir: \u0026#34;content/en\u0026#34; direction: ltr label: English locale: \u0026#34;en-EN\u0026#34; menus: main: - identifier: home name: \u0026#34;Home EN\u0026#34; pre: internal url: / weight: 1 (…) params: copyright: \u0026#34;\u0026#34; disable: false description: \u0026#34;\u0026#34; weight: 2 fr: contentDir: \u0026#34;content/fr\u0026#34; direction: ltr label: Français locale: \u0026#34;fr-FR\u0026#34; menus: main: - identifier: home name: \u0026#34;Accueil FR\u0026#34; pre: internal url: / weight: 1 (…) params: copyright: \u0026#34;\u0026#34; disable: false description: \u0026#34;\u0026#34; weight: 1 mediaTypes: text/gemini: suffixes: - gmi outputs: home: - gemini page: - gemini section: - gemini outputFormats: gemini: basename: index isHTML: false isPlainText: true mediaType: text/gemini name: gemini permalinkable: true protocol: gemini:// À ne pas copier tel quel !\n⇒ Création des modèles dans le répertoire gemini-layouts.\n⇒ Création, si nécessaire, de fichiers génériques dans gemini-static.\n⇒ Génération de publication :\n$: hugo --environment gemini Qui produira les fichiers .gmi dans le répertoire de publication ad hoc !\nVoilà !\nExemples Retrouvez pour l\u0026rsquo;exemple mes fichiers dans le dépôt Git correspondant :\n⇒ gemini-layouts:\nhome.gmi list.gmi single.gmi ⇒ gemini-static:\nindex.gmi ⇒ Capsule Gemini pour le domaine huc.fr.eu.org…\nDocumentation Configuration : languages media types menus outputs output formats params Templates Remerciements à la communauté Hugo réactive ! (cf : pour ceux qui veulent en savoir plus…) ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePrécédemment, en 2021, je m\u0026rsquo;étais penché sur la question de promouvoir mes sites\nsur le protocole Gemini ; dans le contexte multilangue, j\u0026rsquo;ai galéré, échoué.\u003c/p\u003e\n\u003cp\u003ePour rappel, Gemini est un protocole de communication né courant juin 2019,\nen parallèle du grand réseau web connu, nommé Internet.\u003c/p\u003e\n\u003cp\u003eComment j\u0026rsquo;ai réussi ? \u003cbr\u003e\nC\u0026rsquo;est une histoire de configuration…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVersion Hugo : \u003ccode\u003e0.159.1\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eEnvironnement : Debian Sid\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eUne \u0026ldquo;saveur\u0026rdquo; du gestionnaire de site statique qu\u0026rsquo;est Hugo est de pouvoir gérer la\nconfiguration de celui-ci de bien des manières…\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai appris qu\u0026rsquo;il était possible de générer des pages selon un \u003ca href=\"https://gohugo.io/quick-reference/glossary/#environment\" rel=\"external\"\u003eenvironnement\u003c/a\u003e\nchoisi, et cela a résolu toutes les difficultés auxquelles j\u0026rsquo;avais été confronté.\u003c/p\u003e\n\u003cp\u003eCette commande nécessite de créer un sous-répertoire au répertoire \u003ccode\u003econfig\u003c/code\u003e,\npar exemple dans ce cas-là, le nommer \u003ccode\u003egemini\u003c/code\u003e, soit : \u003ccode\u003econfig/gemini\u003c/code\u003e \u003cbr\u003e\npuis d\u0026rsquo;y déposer le ou l\u0026rsquo;ensemble des fichiers de configuration spécifiques à\ncet environnement. \u003cbr\u003e\nPar défaut, un seul fichier suffit, le bien nommé \u003ccode\u003ehugo.(toml|yaml|json)\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl est nécessaire de créer en sus deux, trois répertoires spécifiques à la gestion,\ngénération des fichiers pour la publication sur Gemini, à la racine du projet Hugo :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egemini\u003c/code\u003e qui est l\u0026rsquo;équivalent de \u003ccode\u003epublic\u003c/code\u003e et devient spécifiquement la valeur\nde la variable \u003ccode\u003epublishDir\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egemini-layouts\u003c/code\u003e, l\u0026rsquo;équivalent du répertoire \u003ccode\u003elayouts\u003c/code\u003e, qui sera la valeur de\nla variable \u003ccode\u003elayoutDir\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egemini-static\u003c/code\u003e, l\u0026rsquo;équivalent du répertoire \u003ccode\u003estatic\u003c/code\u003e, pris en charge par la\nvariable \u003ccode\u003estaticDir\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eBien-sûr, ces trois répertoires ne sont strictement pas nécessaires si le site\nHugo est spécifiquement dédié à la génération de fichiers pour un protocole ou\nl\u0026rsquo;autre ; je m\u0026rsquo;explique : si je ne génère que pour le protocole Gemini, ou juste\npour le protocole web HTTP(S), alors je peux très bien utiliser les répertoires\nde base, ainsi que la configuration par défaut\u003c/em\u003e. \u003cbr\u003e\nNous sommes bien dans le cas où la génération des fichiers se fait, ET pour HTTP(S),\nET pour Gemini, ET pour… envisageons tout autre protocole (\u003cem\u003eGopher, par exemple\u003c/em\u003e).\u003c/p\u003e\n\u003ch3 id=\"hiérarchie\"\u003eHiérarchie\u003c/h3\u003e\n\u003cp\u003eOn se retrouve donc avec une hiérarchie de fichiers ainsi :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emon-site-hugo\n├─ archetypes\n├─ assets\n├─ config\n| ├─_default   # global\n| └─ gemini    # configuration spécifique Gemini\n|   └─ hugo.(toml|yaml|json)\n├─ content\n| ├─ en     # répertoires et fichiers .md relatif à la langue anglaise\n| └─ fr     # répertoires et fichiers .md relatif à la langue française\n├─ data\n├─ gemini\n├─ gemini-layouts\n| ├─ home.gmi\n| ├─ list.gmi\n| └─ single.gmi\n├─ gemini-static\n| └─ index.gmi  # page d\u0026#39;accueil principale\n├─ i18n\n├─ static\n└─ themes\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"explications\"\u003eExplications\u003c/h3\u003e\n\u003cp\u003eNe cherchez pas de variable pour gérer autrement le répertoire de config, tel\nune hypothétique \u0026lsquo;configDir\u0026rsquo; ; elle n\u0026rsquo;existe pas, du moins pas dans un fichier\nde configuration. \u003cem\u003eBien qu\u0026rsquo;il soit possible de spécifier en CLI la variable\n\u003ccode\u003e--configDir\u003c/code\u003e ; c\u0026rsquo;est bizarre, mais elle n\u0026rsquo;existe pas dans le contexte du fichier\nde configuration\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eUne autre raison est que lors de l\u0026rsquo;utilisation de la variable \u003ccode\u003e--config\u003c/code\u003e en CLI,\ndans le contexte d\u0026rsquo;un site existant, Hugo va analyser l\u0026rsquo;ensemble du répertoire\n\u003ccode\u003econfig\\_default\u003c/code\u003e — \u003cem\u003e\u003cstrong\u003ec\u0026rsquo;est son comportement par défaut\u003c/strong\u003e\u003c/em\u003e — le résultat est\nqu\u0026rsquo;il va surcharger la configuration. \u003cbr\u003e\nLa future génération n\u0026rsquo;aura pas du tout le résultat attendu ; il en résultera\naucun fichier généré.\u003c/p\u003e\n\u003cp\u003eD\u0026rsquo;où l\u0026rsquo;intérêt d\u0026rsquo;utiliser un environnement qui lui scrutera le(s) fichier(s) de\nconfiguration au sein du répertoire défini, dans ce cas d\u0026rsquo;exemple : \u003ccode\u003econfig/gemini\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;utilisation d\u0026rsquo;environnement règle ce délicat soucis, et d\u0026rsquo;autres, et permettra\nune génération \u0026ldquo;propre\u0026rdquo; dans le répertoire de destination défini dans la variable\n\u003ccode\u003epublishDir\u003c/code\u003e du fichier de configuration, précédemment créé dans le répertoire\nde l\u0026rsquo;environnement cible. \u003cbr\u003e\nSoit, dans ce cas, et pour spécifique : \u003ccode\u003epublishDir: gemini\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePour en revenir à la hiérarchie supplémentaire :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egemini-layouts\u003c/code\u003e sera le \u0026ldquo;dépôt\u0026rdquo; des fichiers de configuration pour la génération\ndes futures pages, tel :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ehome.gmi\u003c/code\u003e, l\u0026rsquo;actuel fichier index\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elist.gmi\u003c/code\u003e, pour les catégories et autres sections\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esingle.gmi\u003c/code\u003e pour les pages.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egemini-static\u003c/code\u003e est celui qui accueille la page d\u0026rsquo;accueil du futur site Gemini ;)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour rappel, le répertoire \u003ccode\u003econtent\u003c/code\u003e est bien celui contenant l\u0026rsquo;ensemble des\nrépertoires et fichiers .md, hierarchisé eux, aussi selon la langue ! \u003cbr\u003e\nCette hiérarchie linguistique sera maintenue lors de la production dans le\nrépertoire de destination de production \u003ccode\u003egemini\u003c/code\u003e spécifique… mais aussi dans le\nrépertoire de production par défaut, \u003ccode\u003epublic\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eNote : j\u0026rsquo;utilise pour la démonstration un seul fichier central de configuration ;\nmais il est possible d\u0026rsquo;éclater les différentes sections de configuration dans\ndes fichiers relatifs, tant que ceux-ci restent dans le répertoire d\u0026rsquo;environnement\ndédié. \u003cbr\u003e\nLes explications données ci-dessous seront basés sur la configuration yaml.\u003c/p\u003e\n\u003cp\u003ePassons à l\u0026rsquo;aspect du fichier de configuration :\u003c/p\u003e\n\u003ch2 id=\"yaml\"\u003eYaml\u003c/h2\u003e\n\u003cp\u003eLe fichier de configuration \u003ccode\u003ehugo.yaml\u003c/code\u003e est à remplir dans le répertoire idoine,\ntel : \u003ccode\u003econfig/gemini/hugo.yaml\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLes variables à remplir par défaut, à minima sont :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003ebaseURL: gemini://nom-de-domaine\ndefaultContentLanguage: fr\ndefaultContentLanguageInSubdir: true\nlayoutDir: \u0026#34;gemini-layouts\u0026#34;\npublishDir: gemini\nstaticDir: \u0026#34;gemini-static\u0026#34;\ntitle: \u0026#34;Titre du site\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"languages\"\u003eLanguages\u003c/h3\u003e\n\u003cp\u003eLa gestion du menu des langues est habituelle, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003elanguages:\n  en:\n    contentDir: \u0026#34;content/en\u0026#34;\n    direction: ltr\n    label: English\n    locale: \u0026#34;en-EN\u0026#34;\n\n    menus:\n      main:\n      - identifier: home\n        name: \u0026#34;Home EN\u0026#34;\n        pre: internal\n        url: /\n        weight: 1\n      (…)\n\n    params:\n      copyright: \u0026#34;\u0026#34;\n      disable: false\n      description: \u0026#34;\u0026#34;\n\n    weight: 2\n\n  fr:\n    contentDir: \u0026#34;content/fr\u0026#34;\n    direction: ltr\n    label: Français\n    locale: \u0026#34;fr-FR\u0026#34;\n\n    menus:\n      main:\n      - identifier: home\n        name: \u0026#34;Accueil FR\u0026#34;\n        pre: internal\n        url: /\n        weight: 1\n      (…)\n\n    params:\n      copyright: \u0026#34;\u0026#34;\n      disable: false\n      description: \u0026#34;\u0026#34;\n\n    weight: 1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003eBien-sûr, ici dans cet exemple, je ne reprends pas l\u0026rsquo;ensemble d\u0026rsquo;un menu point\npar point ; juste l\u0026rsquo;essentiel !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003ePour rappel, il importe de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003erestituer le répertoire de contenu linguistique : \u003ccode\u003econtentDir: \u0026quot;content/LANG\u0026quot;\u003c/code\u003e\noù LANG est l\u0026rsquo;abrégé de la langue, répertoire où Hugo va chercher les fichiers\nMD sources.\u003c/li\u003e\n\u003cli\u003ecomprendre que les variables \u003ccode\u003elabel\u003c/code\u003e et \u003ccode\u003elocale\u003c/code\u003e sont les noms actuels\nd\u0026rsquo;anciennes variables de configuration linguistiques, depuis la v\u003ca href=\"https://github.com/gohugoio/hugo/releases/tag/v0.158.0\" rel=\"external\"\u003e0.158.0\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003ePassons à la configuration des types de media pour que Hugo puisse générer :\u003c/p\u003e\n\u003ch3 id=\"mediatypes\"\u003eMediaTypes\u003c/h3\u003e\n\u003cp\u003eDéfinition de l\u0026rsquo;extension des futurs fichiers générés, selon le type de media :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003emediaTypes:\n  text/gemini:\n    suffixes:\n      - gmi\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"outputs\"\u003eOutputs\u003c/h3\u003e\n\u003cp\u003eDéfinition de l\u0026rsquo;appel au format de sortie adéquat, ici \u003ccode\u003egemini\u003c/code\u003e, selon le type\nde modèle à générer :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003eoutputs:\n  home:\n    - gemini\n  page:\n    - gemini\n  section:\n    - gemini\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"outputformats\"\u003eOutputFormats\u003c/h3\u003e\n\u003cp\u003eHugo utilisera les paramètres du format de sortie \u003ccode\u003egemini\u003c/code\u003e selon les paramètres\nde configuration choisis :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003eoutputFormats:\n  gemini:\n    basename: index\n    isHTML: false\n    isPlainText: true\n    mediaType: text/gemini\n    name: gemini\n    permalinkable: true\n    protocol: gemini://\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"layouts\"\u003eLayouts\u003c/h2\u003e\n\u003cp\u003eAinsi qu\u0026rsquo;il est visible dans la section \u003ca href=\"/fr/web/hugo/gemini/#hiérarchie\"\u003eHiérarchie\u003c/a\u003e, il est nécessaire\nde créer les fichiers de modèles dans le répertoire adéquat, ici dans\n\u003ccode\u003egemini-layouts\u003c/code\u003e, pour transformer le contenu :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ehome.gmi\u003c/code\u003e est l\u0026rsquo;actuel nom de fichier pour la page principale, selon le\nrépertoire linguistique\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elist.gmi\u003c/code\u003e est le modèle qui restitue le titre d\u0026rsquo;une page listant un contenu,\nselon le type d\u0026rsquo;informations, restitue généralement une liste d\u0026rsquo;articles\nd\u0026rsquo;une section, de catégories, ou de taxonomies.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esingle.gmi\u003c/code\u003e est le modèle qui restitue le titre de page et son contenu\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eJe vous renvoie à la \u003ca href=\"/fr/web/hugo/gemini/#documentation\"\u003edocumentation\u003c/a\u003e officielle sur les\ntemplates layouts\u003c/em\u003e.\u003c/p\u003e\n\u003ch2 id=\"static\"\u003eStatic\u003c/h2\u003e\n\u003cp\u003ePour rappel, le répertoire static est \u003ccode\u003egemini-static\u003c/code\u003e ; dans mon cas, il sert\nau fichier d\u0026rsquo;accueil principal, nommé \u003ccode\u003eindex.gmi\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"i18n\"\u003ei18n\u003c/h2\u003e\n\u003cp\u003eNormalement, il n\u0026rsquo;y a rien à modifier dans ce répertoire ; juste pour rappel,\nil renferme normalement les fichiers de traduction linguistiques ; ceux-ci\nsont utilisables dans le contexte des fichiers de modèles \u003ccode\u003elayouts\u003c/code\u003e exactement\nde la même manière que pour les modèles par défaut.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eIl suffit maintenant d\u0026rsquo;appeler Hugo ainsi : \u003cbr\u003e\n\u003ccode\u003ehugo --environment gemini\u003c/code\u003e \u003cbr\u003e\nce qui nous générera tous les fichiers .gmi, selon la hiérarchie linguistique\nde fichiers du répertoire \u003ccode\u003econtent\u003c/code\u003e, dans le répertoire de publication \u003ccode\u003egemini\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl ne reste plus qu\u0026rsquo;à synchroniser les fichiers .gmi dans votre capsule Gemini.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eCela permet de continuer à utiliser et produire normalement du contenu pour le\nprotocole HTTP(S), tel que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ehugo server\u003c/code\u003e pour la phase de développement,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehugo\u003c/code\u003e pour la production des fichiers dans le répertoire de production par\ndéfaut, nommé \u003ccode\u003epublic\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEt tout cela sans impacter l\u0026rsquo;une ou l\u0026rsquo;autre des productions ! :D\u003c/p\u003e\n\u003ch2 id=\"tldr\"\u003eTL;DR\u003c/h2\u003e\n\u003cp\u003e⇒ Création de trois répertoires dédiés à la racine du site 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$: mkdir -R config/gemini gemini gemini-\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003elayouts,static\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⇒ Création d\u0026rsquo;un environnement 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$: mkdir config/gemini\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: touch config/gemini/hugo.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Création/Modification du fichier de configuration :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003ebaseURL: gemini://nom-de-domaine\ndefaultContentLanguage: fr\ndefaultContentLanguageInSubdir: true\nlayoutDir: \u0026#34;gemini-layouts\u0026#34;\npublishDir: gemini\nstaticDir: \u0026#34;gemini-static\u0026#34;\ntitle: \u0026#34;Titre du site\u0026#34;\n\nlanguages:\n  en:\n    contentDir: \u0026#34;content/en\u0026#34;\n    direction: ltr\n    label: English\n    locale: \u0026#34;en-EN\u0026#34;\n\n    menus:\n      main:\n      - identifier: home\n        name: \u0026#34;Home EN\u0026#34;\n        pre: internal\n        url: /\n        weight: 1\n      (…)\n\n    params:\n      copyright: \u0026#34;\u0026#34;\n      disable: false\n      description: \u0026#34;\u0026#34;\n\n    weight: 2\n\n  fr:\n    contentDir: \u0026#34;content/fr\u0026#34;\n    direction: ltr\n    label: Français\n    locale: \u0026#34;fr-FR\u0026#34;\n\n    menus:\n      main:\n      - identifier: home\n        name: \u0026#34;Accueil FR\u0026#34;\n        pre: internal\n        url: /\n        weight: 1\n      (…)\n\n    params:\n      copyright: \u0026#34;\u0026#34;\n      disable: false\n      description: \u0026#34;\u0026#34;\n\n    weight: 1\n\nmediaTypes:\n  text/gemini:\n    suffixes:\n      - gmi\n\noutputs:\n  home:\n    - gemini\n  page:\n    - gemini\n  section:\n    - gemini\n\noutputFormats:\n  gemini:\n    basename: index\n    isHTML: false\n    isPlainText: true\n    mediaType: text/gemini\n    name: gemini\n    permalinkable: true\n    protocol: gemini://\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eÀ ne pas copier tel quel !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Création des modèles dans le répertoire \u003ccode\u003egemini-layouts\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e⇒ Création, si nécessaire, de fichiers génériques dans \u003ccode\u003egemini-static\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e⇒ Génération de publication :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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$: hugo --environment gemini\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eQui produira les fichiers .gmi dans le répertoire de publication ad hoc !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cp\u003eRetrouvez pour l\u0026rsquo;exemple mes fichiers dans le dépôt \u003ca href=\"https://framagit.org/sh-web/hugo/huc.fr.eu.org/\" rel=\"external\"\u003eGit\u003c/a\u003e correspondant :\u003c/p\u003e\n\u003cp\u003e⇒ \u003ccode\u003egemini-layouts\u003c/code\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://framagit.org/sh-web/hugo/huc.fr.eu.org/-/raw/main/gemini-layouts/home.gmi\" rel=\"external\"\u003ehome.gmi\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://framagit.org/sh-web/hugo/huc.fr.eu.org/-/raw/main/gemini-layouts/list.gmi\" rel=\"external\"\u003elist.gmi\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://framagit.org/sh-web/hugo/huc.fr.eu.org/-/raw/main/gemini-layouts/home.gmi\" rel=\"external\"\u003esingle.gmi\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003ccode\u003egemini-static\u003c/code\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://framagit.org/sh-web/hugo/huc.fr.eu.org/-/raw/main/gemini-static/index.gmi\" rel=\"external\"\u003eindex.gmi\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Capsule Gemini pour le domaine \u003ca href=\"gemini://huc.fr.eu.org\" rel=\"external\"\u003ehuc.fr.eu.org\u003c/a\u003e…\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eConfiguration :\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/configuration/languages/\" rel=\"external\"\u003elanguages\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/configuration/media-types/\" rel=\"external\"\u003emedia types\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/configuration/menus/\" rel=\"external\"\u003emenus\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/configuration/outputs/\" rel=\"external\"\u003eoutputs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/configuration/output-formats/\" rel=\"external\"\u003eoutput formats\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/configuration/params/\" rel=\"external\"\u003eparams\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/templates/types/\" rel=\"external\"\u003eTemplates\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eà la communauté Hugo réactive !\n\u003cul\u003e\n\u003cli\u003e(\u003cem\u003ecf : pour ceux qui veulent \u003ca href=\"https://discourse.gohugo.io/t/attempt-to-create-gemini-files/56969/4\" rel=\"external\"\u003een savoir plus\u003c/a\u003e…\u003c/em\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Utiliser un environnement Hugo pour publier sur le protocole Gemini, avec un site multilangue (ou non).","tags":["Hugo","Gemini","Environnement"],"date_published":"2026-04-08T19:27:54+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-03-18:/fr/post/bat-cat#4c97ada205fd331de0c287b9052e822c09440e5a1246a8fb2e7015293643e924","url":"https://it-log.fr.eu.org/fr/post/bat-cat/","title":"BAT : un 'cat killer'… de la couleur, de la surbrillance dans le terminal","author":{"name":"Stéphane HUC"},"content_text":"Description Découverte de l\u0026rsquo;outil bat qui est un clone \u0026ldquo;amélioré\u0026rdquo; de l\u0026rsquo;outil cat, qui apporte la mise en évidence de la syntaxe, de la couleur, gère plusieurs languages informatique et s\u0026rsquo;intégre à Git ! Il est même possible d\u0026rsquo;utiliser un thème sombre…\nC\u0026rsquo;est un outil qui existe depuis plusieurs années (4 ans au moment de l\u0026rsquo;écriture de cet article), sous une licence Open Source, au choix de la MIT ou de l\u0026rsquo;Apache 2.0.\nNote : Il vaut mieux utiliser un terminal capable de gérer correctement une palette 24 bit.\nLe dépôt officiel explique beaucoup de choses, en anglais,\nDépôt officiel : https://github.com/sharkdp/bat Installation Généralement, quelque soit l\u0026rsquo;OS Linux ou BSD, le paquet à installer s\u0026rsquo;appelle bat.\nSous Debian, le binaire s\u0026rsquo;appelle batcat Sous OpenBSD : bat tout simplement Configuration Un fichier de configuration peut être généré ainsi :\n:$ bat --generate-config-file Relativement à l\u0026rsquo;usage des couleurs en 24 bit dans le terminal, ajouter la variable d\u0026rsquo;environnement COLORTERM, tel que :\nif [ -x $(command -v bat) ]; then export COLORTERM=\u0026#34;truecolor\u0026#34; # or \u0026#34;24bit\u0026#34; fi (Si Debian/*Buntu, pensez à changer le nom du binaire !)\nUtilisation Un des usages de l\u0026rsquo;outil est de le combiner avec certains outils, tel git, find, man, par exemple parmi d\u0026rsquo;autres.\nfind Pour utiliser bat avec find, il suffit d\u0026rsquo;appeler le binaire par le biais de l\u0026rsquo;option -exec, tel que :\nfind … -exec bat {} + où \u0026lsquo;…\u0026rsquo; représente l\u0026rsquo;expression de votre recherche.\ngit Pour ceux qui font du developpement logiciel et utilise git, bat peut montrer les modifications en les metant en évidence, tout en respectant l\u0026rsquo;indentation.\nCréer une fonction nommée batdiff puis appelez-la :\nbatdiff() { git diff --name-only --relative --diff-filter=d -z | xargs -0 bat --diff } man Ajouter la variable d\u0026rsquo;environnement MANPAGER tel que :\nexport MANPAGER=\u0026#34;bat -pl man\u0026#34; bien sûr, il est possible d\u0026rsquo;y implémenter toute option que gère l\u0026rsquo;outil bat.\nPuis appeler simplement le binaire man avec le manpage désiré, dans un terminal, tel par exemple :\nSous Debian : man batcat Sous OpenBSD : man pf.conf Astuce Vous remarquerez que la sortie produit aussi des signes ou symboles d\u0026rsquo;échappement ANSI, incompréhensibles pour l\u0026rsquo;être humain que nous sommes.\nL\u0026rsquo;astuce est de mettre en pipe, l\u0026rsquo;outil col suivi de bat, tel que :\nman() { sh -c \u0026#34;man \u0026#39;$@\u0026#39; | col -bx | bat -l man\u0026#34; } Et d\u0026rsquo;appeler tout simplement man.\nDocumentation En langue anglaise :\nA cat(1) clone with syntax highlighting and Git integration: https://github.com/sharkdp/bat Bash scripts that integrate bat with various command line tools: https://github.com/eth-p/bat-extras Pipe man into col -b to get rid of ^H Anatomy of a Terminal Emulator Remerciements Wesley: @obj@bsd.cafe Justine Smithies: @justine@snac.smithies.me.uk ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eDécouverte de l\u0026rsquo;outil \u003ccode\u003ebat\u003c/code\u003e qui est un clone \u0026ldquo;amélioré\u0026rdquo; de l\u0026rsquo;outil \u003ccode\u003ecat\u003c/code\u003e, qui\napporte la mise en évidence de la syntaxe, de la couleur, gère plusieurs languages\ninformatique et s\u0026rsquo;intégre à Git !\n\u003cem\u003eIl est même possible d\u0026rsquo;utiliser un thème sombre…\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est un outil qui existe depuis plusieurs années (\u003cem\u003e4 ans au moment de l\u0026rsquo;écriture\nde cet article\u003c/em\u003e), sous une licence Open Source, au choix de la MIT ou de l\u0026rsquo;Apache\n2.0.\u003c/p\u003e\n\u003cp\u003eNote : Il vaut mieux utiliser un terminal capable de gérer correctement une\npalette 24 bit.\u003c/p\u003e\n\u003cp\u003eLe dépôt officiel explique beaucoup de choses, en anglais,\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDépôt officiel : \u003ca href=\"https://github.com/sharkdp/bat\" rel=\"external\"\u003ehttps://github.com/sharkdp/bat\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eGénéralement, quelque soit l\u0026rsquo;OS Linux ou BSD, le paquet à installer s\u0026rsquo;appelle\n\u003ccode\u003ebat\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eSous Debian, le binaire s\u0026rsquo;appelle \u003ccode\u003ebatcat\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSous OpenBSD : \u003ccode\u003ebat\u003c/code\u003e tout simplement\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eUn fichier de configuration peut être généré 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:$ bat --generate-config-file\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRelativement à l\u0026rsquo;usage des couleurs en 24 bit dans le terminal, ajouter la\nvariable d\u0026rsquo;environnement \u003ccode\u003eCOLORTERM\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\"\u003eif [ -x $(command -v bat) ]; then\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eexport COLORTERM\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;truecolor\u0026#34; # or \u0026#34;24bit\u0026#34;\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\u003e(\u003cem\u003eSi Debian/*Buntu, pensez à changer le nom du binaire !\u003c/em\u003e)\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eUn des usages de l\u0026rsquo;outil est de le combiner avec certains outils, tel \u003ccode\u003egit\u003c/code\u003e,\n\u003ccode\u003efind\u003c/code\u003e, \u003ccode\u003eman\u003c/code\u003e, par exemple parmi d\u0026rsquo;autres.\u003c/p\u003e\n\u003ch3 id=\"find\"\u003efind\u003c/h3\u003e\n\u003cp\u003ePour utiliser \u003ccode\u003ebat\u003c/code\u003e avec \u003ccode\u003efind\u003c/code\u003e, il suffit d\u0026rsquo;appeler le binaire par le biais de\nl\u0026rsquo;option \u003ccode\u003e-exec\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\u003efind … -exec bat \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\u003eoù \u0026lsquo;…\u0026rsquo; représente l\u0026rsquo;expression de votre recherche.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"git\"\u003egit\u003c/h3\u003e\n\u003cp\u003ePour ceux qui font du developpement logiciel et utilise git, \u003ccode\u003ebat\u003c/code\u003e peut montrer\nles modifications en les metant en évidence, tout en respectant l\u0026rsquo;indentation.\u003c/p\u003e\n\u003cp\u003eCréer une fonction nommée \u003ccode\u003ebatdiff\u003c/code\u003e puis appelez-la :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebatdiff() {\n    git diff --name-only --relative --diff-filter=d -z | xargs -0 bat --diff\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"man\"\u003eman\u003c/h3\u003e\n\u003cp\u003eAjouter la variable d\u0026rsquo;environnement \u003ccode\u003eMANPAGER\u003c/code\u003e tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexport MANPAGER=\u0026#34;bat -pl man\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003ebien sûr, il est possible d\u0026rsquo;y implémenter toute option que gère l\u0026rsquo;outil \u003ccode\u003ebat\u003c/code\u003e\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003ePuis appeler simplement le binaire \u003ccode\u003eman\u003c/code\u003e avec le manpage désiré, dans un terminal,\ntel par exemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSous Debian : \u003ccode\u003eman batcat\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/debian-batcat-man.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/debian-batcat-man_hu_3cc503cacf8b31ca.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/debian-batcat-man_hu_591483d71d811558.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Debian : man batcat\"\n                    height=\"134\"\n                    id=\"img_images_post_debian-batcat-man.png_0\"\n                    src=\"/images/post/debian-batcat-man.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSous OpenBSD : \u003ccode\u003eman pf.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/post/openbsd-bat-man.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/post/openbsd-bat-man_hu_d6fcc6312cf7b7b6.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/post/openbsd-bat-man_hu_5e95e196aa2bb610.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"OpenBSD : man pf.conf\"\n                    height=\"114\"\n                    id=\"img_images_post_openbsd-bat-man.png_1\"\n                    src=\"/images/post/openbsd-bat-man.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"astuce\"\u003eAstuce\u003c/h3\u003e\n\u003cp\u003eVous remarquerez que la sortie produit aussi des signes ou symboles d\u0026rsquo;échappement\nANSI, incompréhensibles pour l\u0026rsquo;être humain que nous sommes.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;astuce est de mettre en pipe, l\u0026rsquo;outil \u003ccode\u003ecol\u003c/code\u003e suivi de \u003ccode\u003ebat\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\u003eman\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    sh -c \u003cspan style=\"color:#48b685\"\u003e\u0026#34;man \u0026#39;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$@\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39; | col -bx | bat -l man\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt d\u0026rsquo;appeler tout simplement \u003ccode\u003eman\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eEn langue anglaise :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sharkdp/bat\" rel=\"external\"\u003eA cat(1) clone with syntax highlighting and Git integration\u003c/a\u003e: \u003ca href=\"https://github.com/sharkdp/bat\" rel=\"external\"\u003ehttps://github.com/sharkdp/bat\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/eth-p/bat-extras\" rel=\"external\"\u003eBash scripts that integrate bat with various command line tools\u003c/a\u003e: \u003ca href=\"https://github.com/eth-p/bat-extras\" rel=\"external\"\u003ehttps://github.com/eth-p/bat-extras\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://sebastiano.tronto.net/blog/2022-09-05-man-col/\" rel=\"external\"\u003ePipe man into col -b to get rid of ^H\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://poor.dev/terminal-anatomy/\" rel=\"external\"\u003eAnatomy of a Terminal Emulator\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eWesley: \u003ca href=\"https://framapiaf.org/@obj@bsd.cafe/116240454529047739\" rel=\"external\"\u003e@obj@bsd.cafe\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eJustine Smithies: \u003ca href=\"https://snac.smithies.me.uk/justine/p/1773688945.119139\" rel=\"external\"\u003e@justine@snac.smithies.me.uk\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Bat, l'outil qui remplace cat, ET qui met en évidence la syntaxe, en couleur, ET qui gère plusieurs languages.","tags":["Sys","outil"],"date_published":"2026-03-18T10:03:45+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-03-09:/fr/post/openwrt-changements-majeurs-25.12#56eef9aad6acb021a60b530420beb91b162cc38614a34aa0cb1f93c59f199eee","url":"https://it-log.fr.eu.org/fr/post/openwrt-changements-majeurs-25.12/","title":"OpenWRT : Changements Majeurs à partir de la version 25.12","author":{"name":"Stéphane HUC"},"content_text":"Description Un petit laïus relatif à OpenWRT : la dernière version, la 25.12.0, sortie le 05/03/2026, implique des changements intéressants dans la gestion du système.\nopkg → apk Le gestionnaire de paquets opkg n\u0026rsquo;est plus maintenu au profit du nouveau gestionnaire de paquet nommé apk pour Alpine Package Keeper.\napk supporte plus de fonctionnalités, mais attention les arguments en ligne de commande sont différents.\nLa documentation officielle est disponible sur :\nhttps://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet Un petit rappel est émis lors de la connexion SSH :\nBusyBox v1.37.0 (2026-03-08 07:26:48 UTC) built-in shell (ash) _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- OpenWrt 25.12.0, r32713-f919e7899d Dave\u0026#39;s Guitar ----------------------------------------------------- OpenWrt recently switched to the \u0026#34;apk\u0026#34; package manager! OPKG Command APK Equivalent Description ------------------------------------------------------------------ opkg install \u0026lt;pkg\u0026gt; apk add \u0026lt;pkg\u0026gt; Install a package opkg remove \u0026lt;pkg\u0026gt; apk del \u0026lt;pkg\u0026gt; Remove a package opkg upgrade apk upgrade Upgrade all packages opkg files \u0026lt;pkg\u0026gt; apk info -L \u0026lt;pkg\u0026gt; List package contents opkg list-installed apk info List installed packages opkg update apk update Update package lists opkg search \u0026lt;pkg\u0026gt; apk search \u0026lt;pkg\u0026gt; Search for packages ------------------------------------------------------------------ For more information visit: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet ASU ASU pour Attented Sysupgrade est LE changement du projet.\nS\u0026rsquo;il était disponible depuis les versions 24.10 officiellement, il l\u0026rsquo;était en tant qu\u0026rsquo;outil secondaire ; depuis la version 25.12, il devient l\u0026rsquo;outil incontournable pour les mises à niveau du micrologiciel OpenWRT\nMais qu\u0026rsquo;est donc vraiment ASU ?\nASU permet :\nla mise à niveau (upgrade) des nouvelles versions du micrologiciel d\u0026rsquo;OpenWRT de reconstruire automatiquement les images des micrologiciels avec tous les paquets installés. préserve la configuration système durant les mises à niveaux permet l\u0026rsquo;intégration des paquets supplémentaires, installés par l\u0026rsquo;utilisateur, directement dans le système de fichiers SquashFS, tout en préservant la configuration relative. Le but est de simplifier de manière drastique les mises à niveaux : en quelques clics de souris, une image du micrologiciel personnalisé est construite et installée, sans aucune intervention manuelle !\nLa documentation officielle est disponible sur :\nhttps://openwrt.org/docs/guide-user/installation/attended.sysupgrade Retrouvez mes explications dans l\u0026rsquo;article OpenWRT : Attented Sysupgrade Historique shell L\u0026rsquo;historique des commandes shell est enfin maintenant préservé !\nLe comportement peut être changé par l\u0026rsquo;édition du fichier /etc/profile.d/busybox-history-file.sh.\nNote : relatif aux routeurs utilisant des mémoires de type flash, l\u0026rsquo;historique peut avoir un impact sur l\u0026rsquo;endurance de celles-ci car l\u0026rsquo;enregistrement de celui-ci augmente significativement le cycle d\u0026rsquo;écritures.\nChangelog Bien sûr, il existe bien plus de changements au sein de ce projet, ils sont tous informés sur la page changelog-25.12.0.\nLa v25.12.0 comprend le support de plus de 2200 périphériques, ajoutant plus de 180 ; 4700 commits ont été ajoutés à la précédente version, et rend hommage à l\u0026rsquo;un de ces plus fameux contributeurs.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUn petit laïus relatif à OpenWRT : la dernière version, la 25.12.0, sortie le\n05/03/2026, implique des changements intéressants dans la gestion du système.\u003c/p\u003e\n\u003ch2 id=\"opkg--apk\"\u003eopkg → apk\u003c/h2\u003e\n\u003cp\u003eLe gestionnaire de paquets \u003cstrong\u003eopkg\u003c/strong\u003e n\u0026rsquo;est plus maintenu au profit du nouveau\ngestionnaire de paquet nommé \u003cstrong\u003eapk\u003c/strong\u003e pour \u003cem\u003eAlpine Package Keeper\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eapk\u003c/strong\u003e supporte plus de fonctionnalités, mais attention les arguments en ligne\nde commande sont différents.\u003c/p\u003e\n\u003cp\u003eLa documentation officielle est disponible sur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet\" rel=\"external\"\u003ehttps://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUn petit rappel est émis lors de la connexion SSH :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eBusyBox v1.37.0 (2026-03-08 07:26:48 UTC) built-in shell (ash)\n\n  _______                     ________        __\n |       |.-----.-----.-----.|  |  |  |.----.|  |_\n |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|\n |_______||   __|_____|__|__||________||__|  |____|\n          |__| W I R E L E S S   F R E E D O M\n -----------------------------------------------------\n OpenWrt 25.12.0, r32713-f919e7899d Dave\u0026#39;s Guitar\n -----------------------------------------------------\n\n OpenWrt recently switched to the \u0026#34;apk\u0026#34; package manager!\n\n OPKG Command           APK Equivalent      Description\n ------------------------------------------------------------------\n opkg install \u0026lt;pkg\u0026gt;     apk add \u0026lt;pkg\u0026gt;       Install a package\n opkg remove \u0026lt;pkg\u0026gt;      apk del \u0026lt;pkg\u0026gt;       Remove a package\n opkg upgrade           apk upgrade         Upgrade all packages\n opkg files \u0026lt;pkg\u0026gt;       apk info -L \u0026lt;pkg\u0026gt;   List package contents\n opkg list-installed    apk info            List installed packages\n opkg update            apk update          Update package lists\n opkg search \u0026lt;pkg\u0026gt;      apk search \u0026lt;pkg\u0026gt;    Search for packages\n ------------------------------------------------------------------\n\nFor more information visit:\nhttps://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"asu\"\u003eASU\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eASU\u003c/strong\u003e pour \u003cstrong\u003eAttented Sysupgrade\u003c/strong\u003e est LE changement du projet.\u003c/p\u003e\n\u003cp\u003eS\u0026rsquo;il était disponible depuis les versions 24.10 officiellement, il l\u0026rsquo;était en tant\nqu\u0026rsquo;outil secondaire ; depuis la version 25.12, il devient l\u0026rsquo;outil incontournable\npour les mises à niveau du micrologiciel OpenWRT\u003c/p\u003e\n\u003cp\u003eMais qu\u0026rsquo;est donc vraiment ASU ?\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eASU\u003c/strong\u003e permet :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela mise à niveau (upgrade) des nouvelles versions du micrologiciel d\u0026rsquo;OpenWRT\u003c/li\u003e\n\u003cli\u003ede reconstruire automatiquement les images des micrologiciels \u003cstrong\u003eavec\u003c/strong\u003e tous les\npaquets installés.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003epréserve\u003c/strong\u003e la configuration système durant les mises à niveaux\u003c/li\u003e\n\u003cli\u003epermet l\u0026rsquo;intégration des paquets supplémentaires, installés par l\u0026rsquo;utilisateur,\ndirectement dans le système de fichiers SquashFS, tout en préservant la\nconfiguration relative.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLe but est de simplifier de manière drastique les mises à niveaux : en quelques\nclics de souris, une image du micrologiciel personnalisé est construite et installée,\nsans aucune intervention manuelle !\u003c/p\u003e\n\u003cp\u003eLa documentation officielle est disponible sur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/installation/attended.sysupgrade\" rel=\"external\"\u003ehttps://openwrt.org/docs/guide-user/installation/attended.sysupgrade\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eRetrouvez mes explications dans l\u0026rsquo;article \u003ca class=\"inside\" href=\"/fr/sys/openwrt/attented-sysupgrade/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Attented Sysupgrade… (ou comment gérer correctement la mise à niveau ≥ 25.12) '\"\u003eOpenWRT : Attented Sysupgrade\u003c/a\u003e\n\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"historique-shell\"\u003eHistorique shell\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;historique des commandes shell est enfin maintenant préservé !\u003c/p\u003e\n\u003cp\u003eLe comportement peut être changé par l\u0026rsquo;édition du fichier \u003ccode\u003e/etc/profile.d/busybox-history-file.sh\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eNote : relatif aux routeurs utilisant des mémoires de type flash, l\u0026rsquo;historique\npeut avoir un impact sur l\u0026rsquo;endurance de celles-ci car l\u0026rsquo;enregistrement de celui-ci\naugmente significativement le cycle d\u0026rsquo;écritures.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"changelog\"\u003eChangelog\u003c/h2\u003e\n\u003cp\u003eBien sûr, il existe bien plus de changements au sein de ce projet, ils sont tous\ninformés sur la page \u003ca href=\"https://openwrt.org/releases/25.12/changelog-25.12.0\" rel=\"external\"\u003echangelog-25.12.0\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eLa v25.12.0 comprend le support de plus de 2200 périphériques, ajoutant plus de\n180 ; 4700 commits ont été ajoutés à la précédente version, et rend hommage à\nl\u0026rsquo;un de ces plus fameux contributeurs.\u003c/p\u003e\n\u003chr\u003e\n","summary":"Changements majeurs dans OpenWRT à partir de la version 25.12.0","tags":["OpenWRT"],"date_published":"2026-03-09T18:05:09+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-03-09:/fr/sys/openwrt/attented-sysupgrade#a4a2460771bf7782bab43dbdacce74340f9d71745151a70ab09706e5393eb0ea","url":"https://it-log.fr.eu.org/fr/sys/openwrt/attented-sysupgrade/","title":"OpenWRT : Attented Sysupgrade… (ou comment gérer correctement la mise à niveau ≥ 25.12) ","author":{"name":"Stéphane HUC"},"content_text":"Description OpenWRT a intégré le système de mise à niveau ASU pour Attented SysUpgrade, depuis la version 24.10. À ce moment-là, ce système était secondaire pour faire les mises à niveau d\u0026rsquo;OpenWRT.\nDepuis la version 25.12.0, c\u0026rsquo;est LE système à utiliser par défaut, et pleinement intégré à LuCI. Le pendant CLI se nomme owut (OpenWRT Upgrade Tool).\nASU permet :\nla mise à niveau (upgrade) des nouvelles versions du micrologiciel d\u0026rsquo;OpenWRT de reconstruire automatiquement les images des micrologiciels avec tous les paquets installés. préserve la configuration système durant les mises à niveaux permet l\u0026rsquo;intégration des paquets supplémentaires, installés par l\u0026rsquo;utilisateur, directement dans le système de fichiers SquashFS, tout en préservant la configuration relative. Le but est de simplifier de manière drastique les mises à niveaux : en quelques clics de souris, une image du micrologiciel personnalisé est construite et installée, sans aucune intervention manuelle !\nInstallation Le paquet luci-app-attendedsysupgrade est normalement installé, depuis 24.10.0\nDans LuCI, un menu apparaît : \u0026ldquo;System\u0026rdquo; \u0026gt; \u0026ldquo;Attented Sysupgrade\u0026rdquo; !\nMenu System Backup Le premier réflexe à avoir est de faire une sauvegarde du système actuel !\n⇒ Menu \u0026ldquo;System\u0026rdquo; \u0026gt; \u0026ldquo;Backup / Flash firmware\u0026rdquo;, puis section Backup\ncliquez sur le bouton [ Generate archive ]. Une fois générée, il vous sera proposer de la sauvegarder dans votre système de fichier, sur votre ordinateur utilisé.\nCe réflexe est primordial et à répéter à chaque processus de mise à niveau !\nAttented Sysupgrade ⇒ Menu \u0026ldquo;System\u0026rdquo; \u0026gt; \u0026ldquo;Attented Sysupgrade\u0026rdquo;.\nCliquez sur le bouton [ Search for firmware upgrade ] une fenêtre contextuelle apparaît pour sélectionner la version du micrologiciel, puis cliquez sur le bouton [ Request firmware image ]. Suit la fenêtre informant de l\u0026rsquo;avancée de la création du micrologiciel. Une nouvelle fenêtre avertissant du succès de la création de l\u0026rsquo;image du micrologiciel doit apparaître, si c\u0026rsquo;est le cas : Cette fenêtre affiche : le numéro de version, la somme de contrôle SHA256 relative, permet de télécharger le micrologiciel créé - faites-le. Vérifiez que la case à cocher devant l\u0026rsquo;option pour garder la configuration actuelle soit activée. Puis cliquez sur le bouton [ Install firmware image ] ! La fenêtre contextuelle d\u0026rsquo;installation avertit de la phase d\u0026rsquo;installation ; que le système va redémarrer dans quelques instants et d\u0026rsquo;attendre l\u0026rsquo;écran de connexion : Voilà !\nOpenWRT Upgrade Tool owut est l\u0026rsquo;outil en ligne de commande officiel.\nInstallation Si votre version de firmware est relative à 24.10, il faut d\u0026rsquo;abord l\u0026rsquo;installer :\n#: opkg update #: opkg install owut Concernant les versions 25.12.x et supérieures :\n#: apk add owut #: apk -U upgrade owut Configuration Le fichier de configuration : /etc/config/attendedsysupgrade\nBackup Avant d\u0026rsquo;utiliser owut, faites impérativement un backup de votre micrologiciel actuel et sauvegardez-le :\n# sysupgrade -l # sysupgrade -b /tmp/backup-${HOSTNAME}-$(date +%F).tar.gz Récupèrer cette sauvegarde depuis votre ordinateur :\n$: scp -O root@openwrt:/tmp/backup*.tar.gz $(pwd) \u0026lsquo;openwrt\u0026rsquo; est l\u0026rsquo;adresse IP de votre routeur, ou son nom de machine… l\u0026rsquo;utilisation de l\u0026rsquo;option -O est nécessaire… si votre client SSH est ≥ 9.0. Utilisation Les différentes options sont visibles, par l\u0026rsquo;usage de l\u0026rsquo;option -h ou --help.\nLa mise à niveau du micrologiciel OpenWRT est très simple, et se fait par le biais de l\u0026rsquo;option upgrade, tel que :\n# owut upgrade Pour exemple, voici le retour sur un OpenWRT One :\n:# v=\u0026#34;25.12.5\u0026#34; # owut check --verbose --version-to ${v} (… affichage du résultat …) It is safe to proceed with an upgrade Si le dernier message confirme que la future mise à niveau est bonne, alors faites-la ! Sinon cherchez à comprendre la raison de l\u0026rsquo;échec, puis allez interroger la communauté.\n:# owut upgrade --verbose --version-to ${v} owut - OpenWrt Upgrade Tool 2026.04.09~5d6760b5-r1 (/usr/bin/owut) ASU-Server https://sysupgrade.openwrt.org Upstream https://downloads.openwrt.org Target mediatek/filogic Profile xiaomi_mi-router-ax3000t Package-arch aarch64_cortex-a53 Root-FS-type squashfs Sys-type sysupgrade Version-from 25.12.4 r32933-4ccb782af7 (kernel 6.12.87) Version-to 25.12.5 r33051-f5dae5ece4 (kernel 6.12.94) Build-commit https://git.openwrt.org/?p=openwrt/openwrt.git;a=shortlog;h=f5dae5ece4 Build-FS-type squashfs Build-at 2026-06-29T12:59:20Z (~40 hours ago) Image-prefix openwrt-25.12.5-mediatek-filogic-xiaomi_mi-router-ax3000t Image-URL https://downloads.openwrt.org/releases/25.12.5/targets/mediatek/filogic Image-file openwrt-25.12.5-mediatek-filogic-xiaomi_mi-router-ax3000t-squashfs-sysupgrade.bin Installed 174 packages Top-level 94 packages Default 34 packages User-installed 64 packages (top-level only) Package version changes: (… affichage des changements de versions des paquets …) 103 packages are out-of-date Default package analysis: Default Provided-by nftables nftables-json There are currently package build failures for 25.12.5 aarch64_cortex-a53: Feed: telephony 1 unshown Feed: video 10 unshown 11 package build failures don\u0026#39;t affect this device, details at https://downloads.openwrt.org/releases/faillogs-25.12/aarch64_cortex-a53/ Request: Version 25.12.5 r33051-f5dae5ece4 (kernel 6.12.94) Request hash: fd3b5fe1004282cbc9090d9c8d678f8f7017fc16d99f86a47d1c14dadad97efe -- Status: queued - 0 ahead of you Progress: 0s total = 0s in queue + 0s in build -- Status: init Progress: 1s total = 0s in queue + 1s in build -- Status: validate_manifest Progress: 21s total = 0s in queue + 21s in build -- Status: building_image Progress: 49s total = 0s in queue + 49s in build -- Status: done Progress: 51s total = 0s in queue + 51s in build Build succeeded in 51s total = 0s in queue + 51s to build: version_number = 25.12.5 version_code = r33051-f5dae5ece4 (requested r33051-f5dae5ece4) kernel_version = 6.12.94 rootfs_size_mb = default init-script = no-init-script Image source: https://sysupgrade.openwrt.org/store/fd3b5fe1004282cbc9090d9c8d678f8f7017fc16d99f86a47d1c14dadad97efe/openwrt-25.12.5-0f941816f86e-mediatek-filogic-xiaomi_mi-router-ax3000t-squashfs-sysupgrade.bin Image saved : /tmp/firmware.bin Manifest : /tmp/firmware-manifest.json Verifying : /tmp/firmware.bin (9912608 bytes) against /tmp/firmware.sha256sums Saved sha256 matches verifying sysupgrade tar file integrity Checks complete, image is valid. Installing /tmp/firmware.bin and rebooting... Vérification nouvelle version À partir du moment où vous pourrez vous connecter à nouveau à votre routeur, vous retrouverez l\u0026rsquo;information relative à votre nouvelle version :\ndepuis LuCI, aller vers \u0026ldquo;Status\u0026rdquo; \u0026gt; \u0026ldquo;Overview\u0026rdquo;, celui-ci sera affiché dans la section \u0026ldquo;System\u0026rdquo;, face à l\u0026rsquo;information \u0026ldquo;Firmware version\u0026rdquo; en SSH, dans la bannière de connexion affichant ce nouveau numéro de version, comme ci-dessous : BusyBox v1.37.0 (2026-05-13 22:58:17 UTC) built-in shell (ash) _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- OpenWrt 25.12.4, r32933-4ccb782af7 Dave\u0026#39;s Guitar ----------------------------------------------------- OpenWrt recently switched to the \u0026#34;apk\u0026#34; package manager! OPKG Command APK Equivalent Description ------------------------------------------------------------------ opkg install \u0026lt;pkg\u0026gt; apk add \u0026lt;pkg\u0026gt; Install a package opkg remove \u0026lt;pkg\u0026gt; apk del \u0026lt;pkg\u0026gt; Remove a package opkg upgrade apk upgrade Upgrade all packages opkg files \u0026lt;pkg\u0026gt; apk info -L \u0026lt;pkg\u0026gt; List package contents opkg list-installed apk info List installed packages opkg update apk update Update package lists opkg search \u0026lt;pkg\u0026gt; apk search \u0026lt;pkg\u0026gt; Search for packages ------------------------------------------------------------------ For more information visit: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet root@router:~# C\u0026rsquo;est normalement terminé, connectez-vous, et vérifiez vos différents paramètrages.\nDocumentations Upgrade using Attented Sysupgrade owut: OpenWRT Upgrade Tool ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOpenWRT a intégré le système de mise à niveau \u003cstrong\u003eASU\u003c/strong\u003e pour \u003cstrong\u003eAttented SysUpgrade\u003c/strong\u003e,\ndepuis la version 24.10. À ce moment-là, ce système était secondaire pour faire\nles mises à niveau d\u0026rsquo;OpenWRT.\u003c/p\u003e\n\u003cp\u003eDepuis la version 25.12.0, c\u0026rsquo;est \u003cstrong\u003eLE\u003c/strong\u003e système à utiliser par défaut, et pleinement\nintégré à LuCI. Le pendant CLI se nomme \u003ccode\u003eowut\u003c/code\u003e \u003cem\u003e(\u003cstrong\u003eOpenWRT Upgrade Tool\u003c/strong\u003e)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eASU\u003c/strong\u003e permet :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela mise à niveau (upgrade) des nouvelles versions du micrologiciel d\u0026rsquo;OpenWRT\u003c/li\u003e\n\u003cli\u003ede reconstruire automatiquement les images des micrologiciels \u003cstrong\u003eavec\u003c/strong\u003e tous les\npaquets installés.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003epréserve\u003c/strong\u003e la configuration système durant les mises à niveaux\u003c/li\u003e\n\u003cli\u003epermet l\u0026rsquo;intégration des paquets supplémentaires, installés par l\u0026rsquo;utilisateur,\ndirectement dans le système de fichiers SquashFS, tout en préservant la\nconfiguration relative.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLe but est de simplifier de manière drastique les mises à niveaux : en quelques\nclics de souris, une image du micrologiciel personnalisé est construite et installée,\nsans aucune intervention manuelle !\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eLe paquet \u003ccode\u003eluci-app-attendedsysupgrade\u003c/code\u003e est normalement installé,\ndepuis 24.10.0\u003c/p\u003e\n\u003cp\u003eDans LuCI, un menu apparaît : \u0026ldquo;System\u0026rdquo; \u0026gt; \u0026ldquo;Attented Sysupgrade\u0026rdquo; !\u003c/p\u003e\n\u003ch2 id=\"menu-system\"\u003eMenu System\u003c/h2\u003e\n\u003ch3 id=\"backup\"\u003eBackup\u003c/h3\u003e\n\u003cp\u003eLe \u003cstrong\u003epremier réflexe\u003c/strong\u003e à avoir est de faire une sauvegarde du système actuel !\u003c/p\u003e\n\u003cp\u003e⇒ Menu \u0026ldquo;System\u0026rdquo; \u0026gt; \u0026ldquo;Backup / Flash firmware\u0026rdquo;,  puis section \u003cstrong\u003eBackup\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecliquez sur le bouton [ Generate archive ].\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne fois générée, il vous sera proposer de la sauvegarder dans votre système de\nfichier, sur votre ordinateur utilisé.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCe réflexe est primordial et à répéter à chaque processus de mise à niveau !\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"attented-sysupgrade\"\u003eAttented Sysupgrade\u003c/h3\u003e\n\u003cp\u003e⇒  Menu \u0026ldquo;System\u0026rdquo; \u0026gt; \u0026ldquo;Attented Sysupgrade\u0026rdquo;.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCliquez sur le bouton [ Search for firmware upgrade ]\n\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/openwrt/ASU_search_available_sysupgrade.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/openwrt/ASU_search_available_sysupgrade_hu_cb089559802b9b0e.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/openwrt/ASU_search_available_sysupgrade_hu_5193cd3d4f5e00c.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Attented Sysupgrade : Recherche d’une nouvelle image disponible\"\n                    height=\"132\"\n                    id=\"img_images_openwrt_ASU_search_available_sysupgrade.png_0\"\n                    src=\"/images/openwrt/ASU_search_available_sysupgrade.png\"\n                    width=\"730\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003cli\u003eune fenêtre contextuelle apparaît pour sélectionner la version du micrologiciel,\npuis cliquez sur le bouton [ Request firmware image ].\n\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/openwrt/ASU_select_available_firmware.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/openwrt/ASU_select_available_firmware_hu_5caeb8608dd47be8.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/openwrt/ASU_select_available_firmware_hu_fdf9fa972a827bf9.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Attented Sysupgrade : Sélection d’une nouvelle image disponible\"\n                    height=\"232\"\n                    id=\"img_images_openwrt_ASU_select_available_firmware.png_1\"\n                    src=\"/images/openwrt/ASU_select_available_firmware.png\"\n                    width=\"729\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003cli\u003eSuit la fenêtre informant de l\u0026rsquo;avancée de la création du micrologiciel.\n\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/openwrt/ASU_building_firmware.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/openwrt/ASU_building_firmware_hu_da4eb22b2108ba4b.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/openwrt/ASU_building_firmware_hu_bb7df2c3c78a1448.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Attented Sysupgrade : Création du nouveau micrologiciel\"\n                    height=\"105\"\n                    id=\"img_images_openwrt_ASU_building_firmware.png_2\"\n                    src=\"/images/openwrt/ASU_building_firmware.png\"\n                    width=\"732\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003cli\u003eUne nouvelle fenêtre avertissant du succès de la création de l\u0026rsquo;image du micrologiciel\ndoit apparaître, si c\u0026rsquo;est le cas :\n\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/openwrt/ASU_success_created_firmware_to_install.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/openwrt/ASU_success_created_firmware_to_install_hu_c5bda8a16f6c0f40.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/openwrt/ASU_success_created_firmware_to_install_hu_f79636d67253eab1.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Attented Sysupgrade : Succès de la création de l’image\"\n                    height=\"307\"\n                    id=\"img_images_openwrt_ASU_success_created_firmware_to_install.png_3\"\n                    src=\"/images/openwrt/ASU_success_created_firmware_to_install.png\"\n                    width=\"737\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\n\u003cul\u003e\n\u003cli\u003eCette fenêtre affiche :\n\u003cul\u003e\n\u003cli\u003ele numéro de version,\u003c/li\u003e\n\u003cli\u003ela somme de contrôle SHA256 relative,\u003c/li\u003e\n\u003cli\u003epermet de télécharger le micrologiciel créé - \u003cem\u003efaites-le\u003c/em\u003e. \u003cbr\u003e\nVérifiez que la case à cocher devant l\u0026rsquo;option pour garder la configuration\nactuelle soit activée. \u003cbr\u003e\nPuis cliquez sur le bouton [ Install firmware image ] !\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eLa fenêtre contextuelle d\u0026rsquo;installation avertit de la phase d\u0026rsquo;installation ;\nque le système va redémarrer dans quelques instants et d\u0026rsquo;attendre l\u0026rsquo;écran\nde connexion :\n\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/openwrt/ASU_install_sysupgrade_image.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/openwrt/ASU_install_sysupgrade_image_hu_5d166c9ada01150d.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/openwrt/ASU_install_sysupgrade_image_hu_2182d62a6f69b600.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Attented Sysupgrade : Installation de l’image créée\"\n                    height=\"191\"\n                    id=\"img_images_openwrt_ASU_install_sysupgrade_image.png_4\"\n                    src=\"/images/openwrt/ASU_install_sysupgrade_image.png\"\n                    width=\"737\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"openwrt-upgrade-tool\"\u003eOpenWRT Upgrade Tool\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eowut\u003c/code\u003e est l\u0026rsquo;outil en ligne de commande officiel.\u003c/p\u003e\n\u003ch3 id=\"installation-1\"\u003eInstallation\u003c/h3\u003e\n\u003cp\u003eSi votre version de firmware est relative à 24.10, il faut d\u0026rsquo;abord l\u0026rsquo;installer :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e#: opkg update\n#: opkg install owut\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eConcernant les versions 25.12.x et supérieures :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e#: apk add owut\n#: apk -U upgrade owut\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"configuration\"\u003eConfiguration\u003c/h3\u003e\n\u003cp\u003eLe fichier de configuration : \u003ccode\u003e/etc/config/attendedsysupgrade\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"backup-1\"\u003eBackup\u003c/h3\u003e\n\u003cp\u003eAvant d\u0026rsquo;utiliser \u003ccode\u003eowut\u003c/code\u003e, faites impérativement un backup de votre micrologiciel\nactuel et sauvegardez-le :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e# sysupgrade -l\n# sysupgrade -b /tmp/backup-${HOSTNAME}-$(date +%F).tar.gz\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRécupèrer cette sauvegarde depuis votre ordinateur :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e$: scp -O root@openwrt:/tmp/backup*.tar.gz $(pwd)\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u0026lsquo;openwrt\u0026rsquo; est l\u0026rsquo;adresse IP de votre routeur, ou son nom de machine…\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;utilisation de l\u0026rsquo;option \u003ccode\u003e-O\u003c/code\u003e est nécessaire… si votre client SSH est ≥ 9.0.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"utilisation\"\u003eUtilisation\u003c/h3\u003e\n\u003cp\u003eLes différentes options sont visibles, par l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003e-h\u003c/code\u003e ou \u003ccode\u003e--help\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLa mise à niveau du micrologiciel OpenWRT est très simple, et se fait par le biais\nde l\u0026rsquo;option \u003ccode\u003eupgrade\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e# owut upgrade\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003ePour exemple, voici le retour sur un OpenWRT One :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# v=\u0026#34;25.12.5\u0026#34;\n\n# owut check --verbose --version-to ${v}\n(… affichage du résultat …)\n\nIt is safe to proceed with an upgrade\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi le dernier message confirme que la future mise à niveau est bonne, alors\nfaites-la ! \u003cbr\u003e\n\u003cem\u003eSinon cherchez à comprendre la raison de l\u0026rsquo;échec, puis allez interroger la\ncommunauté.\u003c/em\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# owut upgrade --verbose --version-to ${v}\nowut - OpenWrt Upgrade Tool 2026.04.09~5d6760b5-r1 (/usr/bin/owut)\nASU-Server     https://sysupgrade.openwrt.org\nUpstream       https://downloads.openwrt.org\nTarget         mediatek/filogic\nProfile        xiaomi_mi-router-ax3000t\nPackage-arch   aarch64_cortex-a53\nRoot-FS-type   squashfs\nSys-type       sysupgrade\nVersion-from   25.12.4 r32933-4ccb782af7 (kernel 6.12.87)\nVersion-to     25.12.5 r33051-f5dae5ece4 (kernel 6.12.94)\nBuild-commit   https://git.openwrt.org/?p=openwrt/openwrt.git;a=shortlog;h=f5dae5ece4\nBuild-FS-type  squashfs\nBuild-at       2026-06-29T12:59:20Z (~40 hours ago)\nImage-prefix   openwrt-25.12.5-mediatek-filogic-xiaomi_mi-router-ax3000t\nImage-URL      https://downloads.openwrt.org/releases/25.12.5/targets/mediatek/filogic\nImage-file     openwrt-25.12.5-mediatek-filogic-xiaomi_mi-router-ax3000t-squashfs-sysupgrade.bin\nInstalled      174 packages\nTop-level       94 packages\nDefault         34 packages\nUser-installed  64 packages (top-level only)\n\nPackage version changes:\n(… affichage des changements de versions des paquets …)\n\n103 packages are out-of-date\n\nDefault package analysis:\n  Default                        Provided-by\n  nftables                       nftables-json\n\nThere are currently package build failures for 25.12.5 aarch64_cortex-a53:\n  Feed: telephony\n    1 unshown\n  Feed: video\n    10 unshown\n11 package build failures don\u0026#39;t affect this device, details at\n  https://downloads.openwrt.org/releases/faillogs-25.12/aarch64_cortex-a53/\n\nRequest:\n  Version 25.12.5 r33051-f5dae5ece4 (kernel 6.12.94)\nRequest hash:\n  fd3b5fe1004282cbc9090d9c8d678f8f7017fc16d99f86a47d1c14dadad97efe\n--\nStatus:   queued - 0 ahead of you\nProgress:   0s total =   0s in queue +   0s in build\n--\nStatus:   init\nProgress:   1s total =   0s in queue +   1s in build\n--\nStatus:   validate_manifest\nProgress:  21s total =   0s in queue +  21s in build\n--\nStatus:   building_image\nProgress:  49s total =   0s in queue +  49s in build\n--\nStatus:   done\nProgress:  51s total =   0s in queue +  51s in build\n\nBuild succeeded in  51s total =   0s in queue +  51s to build:\n  version_number = 25.12.5\n  version_code   = r33051-f5dae5ece4 (requested r33051-f5dae5ece4)\n  kernel_version = 6.12.94\n  rootfs_size_mb = default\n  init-script    = no-init-script\n\nImage source: https://sysupgrade.openwrt.org/store/fd3b5fe1004282cbc9090d9c8d678f8f7017fc16d99f86a47d1c14dadad97efe/openwrt-25.12.5-0f941816f86e-mediatek-filogic-xiaomi_mi-router-ax3000t-squashfs-sysupgrade.bin\nImage saved : /tmp/firmware.bin\nManifest    : /tmp/firmware-manifest.json\nVerifying   : /tmp/firmware.bin (9912608 bytes) against /tmp/firmware.sha256sums\n  Saved sha256 matches\n  verifying sysupgrade tar file integrity\nChecks complete, image is valid.\nInstalling /tmp/firmware.bin and rebooting...\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"vérification-nouvelle-version\"\u003eVérification nouvelle version\u003c/h2\u003e\n\u003cp\u003eÀ partir du moment où vous pourrez vous connecter à nouveau à votre routeur,\nvous retrouverez l\u0026rsquo;information relative à votre nouvelle version :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edepuis LuCI, aller vers \u0026ldquo;Status\u0026rdquo; \u0026gt; \u0026ldquo;Overview\u0026rdquo;, celui-ci sera affiché\ndans la section \u0026ldquo;System\u0026rdquo;, face à l\u0026rsquo;information \u0026ldquo;Firmware version\u0026rdquo;\u003c/li\u003e\n\u003cli\u003een SSH, dans la bannière de connexion affichant ce nouveau numéro de\nversion, comme ci-dessous :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003eBusyBox v1.37.0 (2026-05-13 22:58:17 UTC) built-in shell (ash)\n\n  _______                     ________        __\n |       |.-----.-----.-----.|  |  |  |.----.|  |_\n |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|\n |_______||   __|_____|__|__||________||__|  |____|\n          |__| W I R E L E S S   F R E E D O M\n -----------------------------------------------------\n OpenWrt 25.12.4, r32933-4ccb782af7 Dave\u0026#39;s Guitar\n -----------------------------------------------------\n\n OpenWrt recently switched to the \u0026#34;apk\u0026#34; package manager!\n\n OPKG Command           APK Equivalent      Description\n ------------------------------------------------------------------\n opkg install \u0026lt;pkg\u0026gt;     apk add \u0026lt;pkg\u0026gt;       Install a package\n opkg remove \u0026lt;pkg\u0026gt;      apk del \u0026lt;pkg\u0026gt;       Remove a package\n opkg upgrade           apk upgrade         Upgrade all packages\n opkg files \u0026lt;pkg\u0026gt;       apk info -L \u0026lt;pkg\u0026gt;   List package contents\n opkg list-installed    apk info            List installed packages\n opkg update            apk update          Update package lists\n opkg search \u0026lt;pkg\u0026gt;      apk search \u0026lt;pkg\u0026gt;    Search for packages\n ------------------------------------------------------------------\n\nFor more information visit:\nhttps://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet\n\nroot@router:~#\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003eC\u0026rsquo;est normalement terminé, connectez-vous, et vérifiez vos différents paramètrages.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/installation/attended.sysupgrade\" rel=\"external\"\u003eUpgrade using Attented Sysupgrade\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/installation/sysupgrade.owut\" rel=\"external\"\u003eowut: OpenWRT Upgrade Tool\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment mettre à niveau correctement OpenWRT… avec ASU : Attented SysUpgrade est la nouvelle manière officielle de mettre à niveau, tout en préservant les données de configuration utilisateur !","tags":["OpenWRT","ASU","sysupgrade"],"date_published":"2026-03-09T13:59:34+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2026-02-24:/fr/sys/debian/amdgpu-rocm-opencl#70ce51c549a657e31040e0babf62ba96f909a1264dfe7ba58e21969c0aa42782","url":"https://it-log.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-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2025-09-23:/fr/sys/openwrt/factory-reset#2e0fd0f5b93d71a894185bd741ee2be1944f13723288a2d17e7c20158be620da","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2025-09-23:/fr/sys/openwrt/wifi-repeter#5bf0bdcfbefc59ed2fa4f4a474c16ab8b2ea4509d1a3a4a46583357f4e12a025","url":"https://it-log.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 network.\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\u003enetwork\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2025-08-31:/fr/post/openrgb#7d91870561b8c64187e7dcbed0a6eb73bfb6f8024b3d2c889c02d3b92bcf5438","url":"https://it-log.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_62a2dfc31aa8a97.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Logo OpenRGB\" height=\"106\" loading=\"lazy\" src=\"/images/openrgb/OpenRGB_hu_47fdd3300ddd4ef2.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2025-08-05:/fr/sys/debian/gnome-fr#de016d863b5f8ac3abe7dbf8a587099cfb6fa9b226d49ca43bef0bca8431a041","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2024-02-25:/fr/sys/debian/qemu-bridge-network#fdbd56e650a558df04222c5c8400b071421e45685ab4b22b804c684aadd7e7cc","url":"https://it-log.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 iface br0 inet6 auto 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.\nRedémarrez à minima la couche réseau ;) :\n:# systemctl restart networking.service Network 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\nSélectionnez dans la catégorie Virtuel, le choix Pont Nommez la connexion, telle que br0, ainsi que l\u0026rsquo;interface dans l\u0026rsquo;onglet \u0026lsquo;Pont\u0026rsquo; (ouvert par défaut) Cliquez sur le bouton [ Ajouter ] pour ajouter un nouveau type de connexion\nLaissez le choix par défaut Ethernet puis cliquez sur le bouton [ Créer… ]\nDans 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 ] 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…\nUne fois terminé, clique sur le bouton [ Enregistrer ] 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…\nDevice 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)\nÉtat du lien : veillez à ce que la case à cocher [ ] actif, le soit. Pour l\u0026rsquo;exemple : 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.service ⇒ 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 ! ","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\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eiface br0 inet6 auto\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\u003cp\u003eRedémarrez à minima la couche réseau ;) :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# systemctl restart networking.service\n\u003c/code\u003e\u003c/pre\u003e\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\u003e\n\u003cp\u003eCliquez sur le bouton [ + ] pour ajouter une nouvelle connection\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSélectionnez dans la catégorie \u003cstrong\u003eVirtuel\u003c/strong\u003e, le choix \u003cstrong\u003ePont\u003c/strong\u003e\n\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/nm-connection-1.1-ajout-pont.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/nm-connection-1.1-ajout-pont_hu_1eb23c17ff8eee06.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/nm-connection-1.1-ajout-pont_hu_c097494a032bdea6.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Network Manager : ajout d’un pont\"\n                    height=\"209\"\n                    id=\"img_images_debian_nm-connection-1.1-ajout-pont.png_0\"\n                    src=\"/images/debian/nm-connection-1.1-ajout-pont.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/nm-connection-2.br0.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/nm-connection-2.br0_hu_c83b54817f41d8fa.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/nm-connection-2.br0_hu_ffbce23ffba2ceda.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Network Manager : nommer nouvelle connection\"\n                    height=\"353\"\n                    id=\"img_images_debian_nm-connection-2.br0.png_1\"\n                    src=\"/images/debian/nm-connection-2.br0.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eCliquez sur le bouton [ Ajouter ] pour ajouter un nouveau type de connexion\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLaissez le choix par défaut \u003cstrong\u003eEthernet\u003c/strong\u003e puis cliquez sur le bouton [ Créer… ]\u003c/p\u003e\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/nm-connection-3.Ethernet.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/nm-connection-3.Ethernet_hu_6fc80c4b71c78323.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/nm-connection-3.Ethernet_hu_817087c8d1a0ea77.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Network Manager : ajout d’une connection Ethernet\"\n                    height=\"249\"\n                    id=\"img_images_debian_nm-connection-3.Ethernet.png_2\"\n                    src=\"/images/debian/nm-connection-3.Ethernet.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\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/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUne fois terminé, clique sur le bouton [ Enregistrer ]\n\n    \n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/nm-connection-exemple-pont-ethernet.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/nm-connection-exemple-pont-ethernet_hu_6997a4876e8e14f8.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/nm-connection-exemple-pont-ethernet_hu_2fbcc7c2b2ecb863.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Network Manager : ajout d’un pont\"\n                    height=\"213\"\n                    id=\"img_images_debian_nm-connection-exemple-pont-ethernet.png_3\"\n                    src=\"/images/debian/nm-connection-exemple-pont-ethernet.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\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\u003e\n\u003cp\u003eSource du réseau : \u003cstrong\u003ebridge device…\u003c/strong\u003e\u003c/p\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\u003e\n\u003cp\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\u003c/p\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/virt-manager-interface-exemple.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/virt-manager-interface-exemple_hu_da567292bde43702.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/virt-manager-interface-exemple_hu_388c1a728e374eb2.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : exemple d’interface réseau paramétrée sur le pont ‘br0’\"\n                    height=\"108\"\n                    id=\"img_images_debian_virt-manager-interface-exemple.png_4\"\n                    src=\"/images/debian/virt-manager-interface-exemple.png\"\n                    width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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.service\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","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-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2024-02-03:/fr/sys/debian/vm-windows11#d430667da96c4d483331cefe7b5d57e551dfadeed26dcfb4a8b768d9d043ffe5","url":"https://it-log.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 : Choisir le chemin de l\u0026rsquo;ISO d\u0026rsquo;installation de Windows : Choisir les paramètres mémoire et CPU : Activer le stockage en sélectionnant un personnalisé : Dans votre home, créez un volume de 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 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 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 ] 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 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 ","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=\"https://it-log.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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-1.creation.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-1.creation_hu_d7dcb715e79eb495.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-1.creation_hu_7262198e0aab9740.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : création de la nouvelle VM\"\n                    height=\"536\"\n                    id=\"img_images_debian_qemu_virt-manager-1.creation.png_0\"\n                    src=\"/images/debian/qemu/virt-manager-1.creation.png\"\n                    width=\"509\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-2.media-installation.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-2.media-installation_hu_dc103c2d2d007aa2.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-2.media-installation_hu_905139eb51fd90c3.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : choisir le média d’installation\"\n                    height=\"543\"\n                    id=\"img_images_debian_qemu_virt-manager-2.media-installation.png_1\"\n                    src=\"/images/debian/qemu/virt-manager-2.media-installation.png\"\n                    width=\"602\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-3.parametres-mem-cpu.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-3.parametres-mem-cpu_hu_93fd682a9f486356.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-3.parametres-mem-cpu_hu_7dbd7e0f051f5912.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : choisir les paramètres mémoire et CPU\"\n                    height=\"536\"\n                    id=\"img_images_debian_qemu_virt-manager-3.parametres-mem-cpu.png_2\"\n                    src=\"/images/debian/qemu/virt-manager-3.parametres-mem-cpu.png\"\n                    width=\"507\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-4.0.stockage.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-4.0.stockage_hu_f0d3a65016a1426a.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-4.0.stockage_hu_42dde01c1244beae.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : activer le stockage personnalisé\"\n                    height=\"535\"\n                    id=\"img_images_debian_qemu_virt-manager-4.0.stockage.png_3\"\n                    src=\"/images/debian/qemu/virt-manager-4.0.stockage.png\"\n                    width=\"513\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-4.1.stockage-creation.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-4.1.stockage-creation_hu_3a5c09daa207173d.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-4.1.stockage-creation_hu_2a2375212c8dba51.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : créer un volume de stockage\"\n                    height=\"628\"\n                    id=\"img_images_debian_qemu_virt-manager-4.1.stockage-creation.png_4\"\n                    src=\"/images/debian/qemu/virt-manager-4.1.stockage-creation.png\"\n                    width=\"794\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-4.2.stockage-creation.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-4.2.stockage-creation_hu_971d5b874c1a500f.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-4.2.stockage-creation_hu_506617ea320a5572.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : créer du volume de stockage\"\n                    height=\"645\"\n                    id=\"img_images_debian_qemu_virt-manager-4.2.stockage-creation.png_5\"\n                    src=\"/images/debian/qemu/virt-manager-4.2.stockage-creation.png\"\n                    width=\"764\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-4.3.stockage-choix-volume.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-4.3.stockage-choix-volume_hu_3ef4d1f73ee7a16c.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-4.3.stockage-choix-volume_hu_366c2738a647edf2.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : localiser le stockage personnalisé\"\n                    height=\"534\"\n                    id=\"img_images_debian_qemu_virt-manager-4.3.stockage-choix-volume.png_6\"\n                    src=\"/images/debian/qemu/virt-manager-4.3.stockage-choix-volume.png\"\n                    width=\"758\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-4.4.stockage-personnalise.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-4.4.stockage-personnalise_hu_6c66bb1de1176a9c.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-4.4.stockage-personnalise_hu_779e5a3ef2f0ba33.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : gérer le stockage personnalisé\"\n                    height=\"537\"\n                    id=\"img_images_debian_qemu_virt-manager-4.4.stockage-personnalise.png_7\"\n                    src=\"/images/debian/qemu/virt-manager-4.4.stockage-personnalise.png\"\n                    width=\"512\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-5.start-install.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-5.start-install_hu_a1dd2eb7dd67484e.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-5.start-install_hu_f9373a9b203114d5.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : activer le stockage\"\n                    height=\"535\"\n                    id=\"img_images_debian_qemu_virt-manager-5.start-install.png_8\"\n                    src=\"/images/debian/qemu/virt-manager-5.start-install.png\"\n                    width=\"510\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-6.0.partage-memoire.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-6.0.partage-memoire_hu_13a80eb6bff67d57.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-6.0.partage-memoire_hu_103f4c4c48330afe.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : activer la mémoire partagée\"\n                    height=\"309\"\n                    id=\"img_images_debian_qemu_virt-manager-6.0.partage-memoire.png_9\"\n                    src=\"/images/debian/qemu/virt-manager-6.0.partage-memoire.png\"\n                    width=\"702\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-6.1.Systeme-fichiers.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-6.1.Systeme-fichiers_hu_db2c3cc59c1aa55b.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/virt-manager-6.1.Systeme-fichiers_hu_2f613bcc88711aa3.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"virt-manager : activer le système de fichiers\"\n                    height=\"649\"\n                    id=\"img_images_debian_qemu_virt-manager-6.1.Systeme-fichiers.png_10\"\n                    src=\"/images/debian/qemu/virt-manager-6.1.Systeme-fichiers.png\"\n                    width=\"756\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/WinFSP-installer-1.start.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/WinFSP-installer-1.start_hu_3401668b9375b89.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/WinFSP-installer-1.start_hu_7f81fe21ab51d938.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Démarrage de l’installation de WinFSP\"\n                    height=\"386\"\n                    id=\"img_images_debian_qemu_WinFSP-installer-1.start.png_11\"\n                    src=\"/images/debian/qemu/WinFSP-installer-1.start.png\"\n                    width=\"498\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/WinFSP-installer-2.custom-setup.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/WinFSP-installer-2.custom-setup_hu_955e45ae4f03cd5a.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/WinFSP-installer-2.custom-setup_hu_cb2979cb81d0bf0.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Phase de personnalisation de l’installation de WinFSP\"\n                    height=\"389\"\n                    id=\"img_images_debian_qemu_WinFSP-installer-2.custom-setup.png_12\"\n                    src=\"/images/debian/qemu/WinFSP-installer-2.custom-setup.png\"\n                    width=\"494\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/Virtio-win-installer-1.start.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-1.start_hu_4890db2d8265ca80.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-1.start_hu_f4b471b1ebbfe41c.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Démarrage de l’installation de Virtio-win\"\n                    height=\"386\"\n                    id=\"img_images_debian_qemu_Virtio-win-installer-1.start.png_13\"\n                    src=\"/images/debian/qemu/Virtio-win-installer-1.start.png\"\n                    width=\"501\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/Virtio-win-installer-2.custom-setup.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-2.custom-setup_hu_cd0491e8a78afbec.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-2.custom-setup_hu_61a0c8937eb7b0ec.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Phase de personnalisation de l’installation de Virtio-win\\\" s=\\\"/debian/qemu/Virtio-win de l’installation de Virtio-win\"\n                    height=\"391\"\n                    id=\"img_images_debian_qemu_Virtio-win-installer-2.custom-setup.png_14\"\n                    src=\"/images/debian/qemu/Virtio-win-installer-2.custom-setup.png\"\n                    width=\"500\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/Virtio-win-installer-3.service.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-3.service_hu_5a8c8b29f922dd35.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-3.service_hu_d9c647ef3402c05a.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Gestion du service Virtio-FS\"\n                    height=\"593\"\n                    id=\"img_images_debian_qemu_Virtio-win-installer-3.service.png_15\"\n                    src=\"/images/debian/qemu/Virtio-win-installer-3.service.png\"\n                    width=\"806\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\n\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/Virtio-win-installer-4.service-start.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-4.service-start_hu_b45d7508e90d0570.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-4.service-start_hu_635dc85aeaf97818.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Démarrage du service Virtio-FS\"\n                    height=\"513\"\n                    id=\"img_images_debian_qemu_Virtio-win-installer-4.service-start.png_16\"\n                    src=\"/images/debian/qemu/Virtio-win-installer-4.service-start.png\"\n                    width=\"406\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z_hu_f5c76f6893ec85e1.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z_hu_5661e9c231a9e9c3.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Vue de l’Explorateur de Fichiers Z:\"\n                    height=\"499\"\n                    id=\"img_images_debian_qemu_Windows11-Fichiers-vue-vmshare-Z.png_17\"\n                    src=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z.png\"\n                    width=\"1127\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z-True.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z-True_hu_4eafe9661422e4f1.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z-True_hu_32e825d0b022ccc8.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Depuis la VM : Vue de l’Explorateur de Fichiers Z: du fichier True.txt\"\n                    height=\"498\"\n                    id=\"img_images_debian_qemu_Windows11-Fichiers-vue-vmshare-Z-True.png_18\"\n                    src=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z-True.png\"\n                    width=\"799\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/debian/qemu/Host-Fichiers-vue-vmshare-True.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/qemu/Host-Fichiers-vue-vmshare-True_hu_a57aa53741b0d6bc.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/qemu/Host-Fichiers-vue-vmshare-True_hu_2b0cebba84c0c1c1.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Depuis l’hôte : Vue de l’Explorateur de Fichiers du fichier True.txt\"\n                    height=\"354\"\n                    id=\"img_images_debian_qemu_Host-Fichiers-vue-vmshare-True.png_19\"\n                    src=\"/images/debian/qemu/Host-Fichiers-vue-vmshare-True.png\"\n                    width=\"763\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\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-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2023-05-10:/fr/sys/openbsd/sysclean#d19092b6ef51208e14d84b4050322436493fada28ae5a1e77d454deae3c133e8","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2023-02-19:/fr/sys/openwrt/unbound-dot#152f274e8bf9f38db10a64c74793d8eebc4dbb9385830cb4b1749e0a4edbc7f3","url":"https://it-log.fr.eu.org/fr/sys/openwrt/unbound-dot/","title":"OpenWRT + Unbound : utiliser le protocole DoT ","author":{"name":"Stéphane HUC"},"content_text":"opkg → apk Le projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet. 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 backup Du fait des modifications faites dans la configuration d\u0026rsquo;unbound, ci-dessous, il est nécessaire d\u0026rsquo;ajouter le répertoire /etc/unbound à la configuration de l\u0026rsquo;outil backup.\n⇒ Menu \u0026ldquo;System\u0026rdquo; \u0026gt; \u0026ldquo;Backup / Flash Firmware\u0026rdquo; \u0026gt; onglet \u0026ldquo;Configuration\u0026rdquo; ! ⇒ CLI : /etc/sysupgrade.conf :\n:# echo \u0026#34;/etc/unbound/\u0026#34; \u0026gt;\u0026gt; /etc/sysupgrade.conf Profitez pour faire une petite vérification :\n:# sysupgrade -l | grep /etc/unbound 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, depuis le menu \u0026ldquo;Network\u0026rdquo; \u0026gt; \u0026ldquo;DNS\u0026rdquo; :\nonglet \u0026ldquo;Resolv and Hosts Files\u0026rdquo; \u0026gt; option Ignore resolv file, pour la première onglet \u0026ldquo;Forwards\u0026rdquo; \u0026gt; option DNS Forwards, 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 ","content_html":"\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eopkg → apk\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLe projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet.\u003c/strong\u003e\u003c/div\u003e\n\n\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=\"backup\"\u003ebackup\u003c/h3\u003e\n\u003cp\u003eDu fait des modifications faites dans la configuration d\u0026rsquo;unbound, ci-dessous,\nil est nécessaire d\u0026rsquo;ajouter le répertoire \u003ccode\u003e/etc/unbound\u003c/code\u003e à la configuration de\nl\u0026rsquo;outil backup.\u003c/p\u003e\n\u003cp\u003e⇒ Menu \u0026ldquo;System\u0026rdquo; \u0026gt; \u0026ldquo;Backup / Flash Firmware\u0026rdquo; \u0026gt; onglet \u0026ldquo;Configuration\u0026rdquo; !\n⇒ CLI : \u003ccode\u003e/etc/sysupgrade.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# echo \u0026#34;/etc/unbound/\u0026#34; \u0026gt;\u0026gt; /etc/sysupgrade.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eProfitez pour faire une petite vérification :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# sysupgrade -l | grep /etc/unbound\n\u003c/code\u003e\u003c/pre\u003e\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, depuis le menu\n\u0026ldquo;Network\u0026rdquo; \u0026gt; \u0026ldquo;DNS\u0026rdquo; :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eonglet \u0026ldquo;Resolv and Hosts Files\u0026rdquo; \u0026gt; option \u003cstrong\u003eIgnore resolv file\u003c/strong\u003e, pour\nla première\u003c/li\u003e\n\u003cli\u003eonglet \u0026ldquo;Forwards\u0026rdquo; \u0026gt; option \u003cstrong\u003eDNS Forwards\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\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","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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-11-28:/fr/sys/openbsd/vm-debian-11-bullseye#aa36b021653d7777f2fa787ef2b16960d26cb999fb1c3209be36d80e8ec7767d","url":"https://it-log.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.\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\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","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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-11-24:/fr/sys/openbsd/moc#f7ebbdc60c776198927b9d10be254b10f9b96e26221cd60fd2f6686427ca0bea","url":"https://it-log.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_1f0eff623326c5b6.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_6097802c26c4ab5.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-11-24:/fr/monitor/introduction-influxdb-openbsd#2a20d38d9067ab7da2668ce29d2b6e28f887856c6419c1ecbcf89e14e9f1352e","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-11-22:/fr/sys/openbsd/multimedia#485b59e8d235c2ad6b8e13d1df6c4bfb93bfa05594517c7845e1d4ed25f48b30","url":"https://it-log.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) ","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","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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-11-19:/fr/sys/openbsd/obsdfreqd#bd9c73d1a314e0cd1bd5a79ddd26ff0b6c32c74c19051222675501d20aa44ad2","url":"https://it-log.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":" 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 high,auto. Cf le manpage sysctl(2) 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 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://git.sr.ht/~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":"\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\n\u003ccode\u003ehw.perfpolicy\u003c/code\u003e géré par \u003cstrong\u003esysctl\u003c/strong\u003e a été ajoutée au système, paramétrée par\ndéfaut sur la valeur \u003ccode\u003ehigh,auto\u003c/code\u003e. \u003cbr\u003e\n\u003cem\u003eCf le manpage \u003ca href=\"https://man.openbsd.org/sysctl.2#HW_PERFPOLICY~2\" rel=\"external\"\u003esysctl(2)\u003c/a\u003e\u003c/em\u003e\u003c/div\u003e\n\n\u003chr\u003e\n\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\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://git.sr.ht/~solene/obsdfreqd/#usage\" rel=\"external\"\u003ehttps://git.sr.ht/~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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-10-25:/fr/post/pass-gestionnaire-mot-passe-unix#62860ea2d2d25d3f4b07cd0a464a62a9faeea547aff2e969ba2642c977f43487","url":"https://it-log.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\"\u003e\n    Philosophie_d'Unix\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-10-22:/fr/sys/openwrt/wifi-schedule#e9c94732c4eae15c8ee9b24b73459d0f0bde66602847118828b9cfed755743e7","url":"https://it-log.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":"opkg → apk Le projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet. 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:\n:# opkg install wifischedule luci-app-wifischedule Avec 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 :\n:# uci set wifi_schedule.@global[0].enabled=\u0026#39;1\u0026#39; Vous trouverez aussi une option pour journaliser l\u0026rsquo;activité Enable logging.\n:# uci 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 :\n:# uci 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 : 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":"\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eopkg → apk\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLe projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet.\u003c/strong\u003e\u003c/div\u003e\n\n\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:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# opkg install wifischedule luci-app-wifischedule\n\u003c/code\u003e\u003c/pre\u003e\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\"\u003e:# uci 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\"\u003e:# uci 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\"\u003e:# uci set wifi_schedule.Vacances=entry\n:# uci set wifi_schedule.Vacances.enabled=\u0026#39;1\u0026#39;\n:# uci set wifi_schedule.Vacances.daysofweek=\u0026#39;Monday Tuesday Wednesday Thursday Friday Saturday Sunday\u0026#39;\n:# uci set wifi_schedule.Vacances.starttime=\u0026#39;09:00\u0026#39;\n:# uci set wifi_schedule.Vacances.stoptime=\u0026#39;23:30\u0026#39;\n:# uci set wifi_schedule.Vacances.forcewifidown=\u0026#39;1\u0026#39;\n:# uci 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 :\n\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/openwrt/Network-Wireless-disabled.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/openwrt/Network-Wireless-disabled_hu_83c6fde394110f76.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/openwrt/Network-Wireless-disabled_hu_178798fc5fde2693.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Aperçu de la fonction Wireless désactivée\"\n                    height=\"276\"\n                    id=\"img_images_openwrt_Network-Wireless-disabled.png_0\"\n                    src=\"/images/openwrt/Network-Wireless-disabled.png\"\n                    width=\"785\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-09-01:/fr/post/openbsd-nsd-dnssec-tlsa#72a1f683e14e2d391190464f18005eb64191442e0e55f2ab45d5a0ad3a7c852b","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-05-03:/fr/sys/debian/mfp-scanner-epson#00247f5793f256f6acbb3c863f672337929c3e41e8c8af722d5346b657ec6b8c","url":"https://it-log.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.\nCapture Écran du logiciel \u0026amp;#39;Epson Scan 2 v6.6.2.x\u0026amp;#39; 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\n            \n                    \n                    \u003cfigure role=\"figure\"aria-label=\"Capture Écran du logiciel \u0026amp;#39;Epson Scan 2 v6.6.2.x\u0026amp;#39;\"\u003e\n    \u003ca href=\"/images/debian/Epson-Scan2-v6.6.2.x-add-scanner.png\"title=\"Capture Écran du logiciel \u0026amp;#39;Epson Scan 2 v6.6.2.x\u0026amp;#39;\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/debian/Epson-Scan2-v6.6.2.x-add-scanner_hu_34d60ed146af5637.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/debian/Epson-Scan2-v6.6.2.x-add-scanner_hu_aca7f5541051fe55.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Epscon Scan2 v6.6.2\"\n                    height=\"159\"\n                    id=\"img_images_debian_Epson-Scan2-v6.6.2.x-add-scanner.png_0\"\n                    src=\"/images/debian/Epson-Scan2-v6.6.2.x-add-scanner.png\"\n                    title=\"Capture Écran du logiciel \u0026#39;Epson Scan 2 v6.6.2.x\u0026#39;\"\n                    width=\"250\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\u003cfigcaption\u003eCapture Écran du logiciel \u0026amp;#39;Epson Scan 2 v6.6.2.x\u0026amp;#39;\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-05-01:/fr/sys/openbsd/vger-voyager-gemini#5fc55e7bd8716352ac79536310b28b3f3b17989ef57ff4c47f3e112ab260b340","url":"https://it-log.fr.eu.org/fr/sys/openbsd/vger-voyager-gemini/","title":"Vger 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.8\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 InfoVger fonctionne bien, sans soucis, pour de l\u0026rsquo;hébergement d\u0026rsquo;une capsule. Il peut faire du multi-hosting…\nSi vous êtes à la recherche d\u0026rsquo;une solution légère, facile à configurer, à utiliser, pour du multi-hébergements de capsule, liés à des noms de domaines, voire par utilisateurs, préférez l\u0026rsquo;utilisation de gmid… ceci ne reflète que mon avis.\nInstallation 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 ! Note : Pour une configuration multi-hosting, merci de lire cet autre article : multihosts\nUtilisateur 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 _vger /var/gemini/nom_domaine InfoAttention à bien veiller à ce que la racine /var/gemini appartienne bien à root:wheel autrement cela pourrait empêcher SSH de se connecter ! 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 :\n127.0.0.1:1965 stream tcp nowait _vger /usr/local/bin/vger vger -d /var/gemini -v [::1]: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.\nCes modifications pour gérer les certificats SSL sont nécessaires pour relayd, mais ne le sont pas pour nginx.\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/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 : load_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\nLogs Pensez à l\u0026rsquo;édition du fichier de regénération des logs /etc/newsyslog.conf pour y ajouter celle du log relative aux connexions, tel que\n/var/www/logs/access.gemini.log 644 4 * $W0 Z \u0026#34;pkill -USR1 -u root -U root -x inetd\u0026#34; Voilà !\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.\nSSH Ce qui suit n\u0026rsquo;est pas directement relatif à l\u0026rsquo;utilisation de VGer, mais bien de SSH !\nVous n\u0026rsquo;arrivez pas à vous connecter avec SSH, et en regardant les logs suite à votre tentative, vous avez le message suivant :\nfatal: bad ownership or modes for chroot directory \u0026quot;/var/gemini\u0026quot;.\nIl est très probable que la racine /var/gemini n\u0026rsquo;est pas les bons droits systèmes. J\u0026rsquo;avais écrit cet article qui expliquait la raison.\nBref, vérifiez :\nles droits d\u0026rsquo;appartenance root:wheel dessus ; les droits de lecture/écriture à 0755 et assurez-vous que l\u0026rsquo;utilisateur _vger n\u0026rsquo;ait les droits que sur le(s) sous-répertoire(s) correspondant au (différent) nom de domaine… Documentations 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) , newsyslog.conf(8) 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.8\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\u003chr\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eVger fonctionne bien, sans soucis, pour de l\u0026rsquo;hébergement d\u0026rsquo;une capsule. Il peut faire du multi-hosting…\u003c/p\u003e\n\u003cp\u003eSi vous êtes à la recherche d\u0026rsquo;une solution légère, facile à configurer, à utiliser, pour du multi-hébergements de capsule, liés à des noms de domaines, voire par utilisateurs, préférez l\u0026rsquo;utilisation de \u003ca href=\"/fr/sys/openbsd/gmid\"\u003egmid\u003c/a\u003e… \u003cem\u003ececi ne reflète que mon avis\u003c/em\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\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\u003cp\u003eNote : \u003cbr\u003e\nPour une configuration multi-hosting, merci de lire cet autre article :\n\u003ca href=\"/fr/sys/openbsd/vger-gemini-multihosts\"\u003emultihosts\u003c/a\u003e\u003c/p\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 _vger /var/gemini/nom_domaine\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 à bien veiller à ce que la racine \u003ccode\u003e/var/gemini\u003c/code\u003e appartienne bien à \u003ccode\u003eroot:wheel\u003c/code\u003e autrement cela pourrait empêcher SSH de se connecter !\u003c/div\u003e\n\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\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\"\u003e127.0.0.1:1965 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\"\u003e[::1]:1965 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\u003eCes modifications pour gérer les certificats SSL sont nécessaires pour relayd,\nmais ne le sont pas pour nginx.\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/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        \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        \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        \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    \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        \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        \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        \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        \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        \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\u003ch3 id=\"logs\"\u003eLogs\u003c/h3\u003e\n\u003cp\u003ePensez à l\u0026rsquo;édition du fichier de regénération des logs \u003ccode\u003e/etc/newsyslog.conf\u003c/code\u003e pour y ajouter celle du log relative aux connexions, 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/var/www/logs/access.gemini.log         644  4     *    $W0   Z \u0026#34;pkill -USR1 -u root -U root -x inetd\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\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\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\u003chr\u003e\n\u003ch3 id=\"ssh\"\u003eSSH\u003c/h3\u003e\n\u003cp\u003eCe qui suit n\u0026rsquo;est pas directement relatif à l\u0026rsquo;utilisation de VGer, mais bien de SSH !\u003c/p\u003e\n\u003cp\u003eVous n\u0026rsquo;arrivez pas à vous connecter avec SSH, et en regardant les logs suite à votre tentative, vous avez le message suivant :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003efatal: bad ownership or modes for chroot directory \u0026quot;/var/gemini\u0026quot;\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl est très probable que la racine \u003ccode\u003e/var/gemini\u003c/code\u003e n\u0026rsquo;est pas les bons droits systèmes.\nJ\u0026rsquo;avais écrit cet \u003ca class=\"inside\" href=\"/fr/sec/ssh/chroot-directory-fatal/\" title=\"Lien interne vers l\u0026#39;article : 'SSH : ChrootDirectory fatal: bad ownership or modes for chroot directory'\"\u003earticle\u003c/a\u003e\n qui expliquait la raison.\u003c/p\u003e\n\u003cp\u003eBref, vérifiez :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles droits d\u0026rsquo;appartenance \u003ccode\u003eroot:wheel\u003c/code\u003e dessus ;\u003c/li\u003e\n\u003cli\u003eles droits de lecture/écriture à \u003ccode\u003e0755\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet assurez-vous que l\u0026rsquo;utilisateur \u003ccode\u003e_vger\u003c/code\u003e n\u0026rsquo;ait les droits que sur le(s) sous-répertoire(s) correspondant au (différent) nom de domaine…\u003c/li\u003e\n\u003c/ul\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, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/newsyslog.conf.8\" title=\"Page du Manuel OpenBSD pour : newsyslog.conf\"\u003enewsyslog.conf(8)\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 diffuser sur le protocol Gemini","tags":["Gemini","Vger","OpenBSD","PF","nginx","relayd"],"date_published":"2022-05-01T12:12:22+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-04-10:/fr/monitor/iblock-openbsd#ef4da31002eaea35d4bd133e9bcea994d187565badf77312697b7f804b5a5613","url":"https://it-log.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 iblock fait partie des paquets installables sous OpenBSD !\nNéanmoins cette version n\u0026rsquo;installe pas le fichier rc.d bien utile… Passons à l\u0026rsquo;installation depuis le dépôt Git :\nGit 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 -pedantic -Wall -Wextra -Wmissing-prototypes -Werror -Wshadow -Wstrict-overflow -fno-strict-aliasing -Wstrict-prototypes -Wwrite-strings -Os -o iblock main.c :$ $ doas make install install -o root -g wheel iblock /usr/local/sbin/ install -o root -g wheel iblock.rc /etc/rc.d/iblock install -o root -g wheel iblock.8 /usr/local/man/man8/ Si la phase de compilation s\u0026rsquo;exécute mal, contactez Solène !\nPassons 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\nshutdown 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-iblock.txt Puis créons/modifions le fichier /etc/rc.shutdown pour y ajouter :\npfctl -t iblocked -T show \u0026gt; /etc/pf-iblock.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 iblocked\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 2507.\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;iblocked\u0026gt; persist file \u0026#34;/etc/pf-iblock.txt\u0026#34; ### iblock: block all in table block in quick from \u0026lt;iblocked\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 2507 pass in quick on egress inet6 proto tcp to port $block_tcp_ports rdr-to ::1 port 2507 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 ⇒ L\u0026rsquo;activité est enregistrée dans les deux logs \u0026lsquo;daemon\u0026rsquo; et \u0026lsquo;messages\u0026rsquo;.\n:$ grep iblock /var/log/messages May 11 20:06:14 sh1 iblock: listening on 127.0.0.1 port 2507, muahaha :\u0026gt; May 11 20:06:14 sh1 iblock: listening on ::1 port 2507, muahaha :\u0026gt; May 11 20:06:14 sh1 iblock: block and kill states for 138.197.101.205 May 11 20:06:50 sh1 iblock: block and kill states for 49.88.193.33 May 11 20:09:39 sh1 iblock: block and kill states for 162.254.116.236 (…) ⇒ 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 iblocked -T show 49.88.193.33 138.197.101.205 162.254.116.236 (…) 2600:3c03::2000:b1ff:fe14:13e5 2604:a880:400:d1:0:3:ef58:7001 (…) 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 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 iblocked -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 iblock: No such file or directory Dans les logs \u0026lsquo;daemon\u0026rsquo; et \u0026lsquo;messages\u0026rsquo;, vous retrouvez le message suivant :\n: execv /usr/local/sbin/iblock: No such file or directory\nAssurez-vous d\u0026rsquo;avoir compiler puis installer le binaire iblock dans le répertoire en question !\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\u003e\u003ccode\u003eiblock\u003c/code\u003e fait partie des paquets installables sous OpenBSD !\u003c/p\u003e\n\u003cp\u003eNéanmoins cette version n\u0026rsquo;installe pas le fichier rc.d bien utile… \u003cbr\u003e\nPassons à l\u0026rsquo;installation depuis le dépôt Git :\u003c/p\u003e\n\u003ch3 id=\"git\"\u003eGit\u003c/h3\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 -pedantic -Wall -Wextra -Wmissing-prototypes  -Werror -Wshadow -Wstrict-overflow -fno-strict-aliasing  -Wstrict-prototypes -Wwrite-strings  -Os -o iblock main.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:$ $ doas make install\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einstall -o root -g wheel iblock /usr/local/sbin/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einstall -o root -g wheel iblock.rc /etc/rc.d/iblock\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einstall -o root -g wheel iblock.8 /usr/local/man/man8/\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\u003chr\u003e\n\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=\"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-iblock.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 iblocked -T show \u0026gt; /etc/pf-iblock.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\u003eiblocked\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\u003e2507\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;iblocked\u0026gt; persist file \u0026#34;/etc/pf-iblock.txt\u0026#34;\n\n### iblock: block all in table\nblock in quick from \u0026lt;iblocked\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 2507\npass in quick on egress inet6 proto tcp to port $block_tcp_ports rdr-to ::1       port 2507\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\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\u003eMay \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e 20:06:14 sh1 iblock: listening on 127.0.0.1 port 2507, muahaha :\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e 20:06:14 sh1 iblock: listening on ::1 port 2507, muahaha :\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e 20:06:14 sh1 iblock: block and kill states \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e 138.197.101.205\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e 20:06:50 sh1 iblock: block and kill states \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e 49.88.193.33\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e 20:09:39 sh1 iblock: block and kill states \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e 162.254.116.236\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⇒ 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 iblocked -T show\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   49.88.193.33\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   138.197.101.205\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   162.254.116.236\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   2600:3c03::2000:b1ff:fe14:13e5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   2604:a880:400:d1:0:3:ef58:7001\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\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\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 iblocked -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_3dbffc249bb7edfe.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_ab68ffa9accd8a1b.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\u003ch3 id=\"iblock-no-such-file-or-directory\"\u003eiblock: No such file or directory\u003c/h3\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\u003e: execv /usr/local/sbin/iblock: No such file or directory\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAssurez-vous d\u0026rsquo;avoir compiler puis installer le binaire iblock dans le\nrépertoire en question !\u003c/strong\u003e\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-04-03:/fr/sys/openbsd/sshlockout#ecc46cda142041fad2e6e6ab6d80f6d374ebc17fa77aea64c1050804111cc468","url":"https://it-log.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 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\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2022-01-19:/fr/sys/openbsd/sshfs#743c5655892cdf7b79720f213bf63397dd0aebffba01c30d399aa7679d1d4af6","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-07-30:/fr/monitor/goaccess-openbsd#d9b8ce72f05dfad3d71a2bed8517b22e919c6ca53881f6e4cf5e13195a4f0e2f","url":"https://it-log.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 ","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_32de140a245efaa6.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"dashboard goaccess real time\" height=\"36\" loading=\"lazy\" src=\"/images/monitor/goaccess-realtime_hu_1e00616802b3e058.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\"\u003e\n    Liste_des_codes_HTTP : 4xx_-_Erreur_du_client_HTTP\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-07-28:/fr/web/hugo/redirect-permanent-nginx-openbsd#ec00d1ca2666452b65b3878f91ebcfd24ec5a4e2b07aa268b867591617eab660","url":"https://it-log.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\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","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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-07-28:/fr/monitor/pfstat-openbsd#0a6004d50f225be0a13cca476656bd20b9ee6dbc2de6ccf3d704635c9e51c567","url":"https://it-log.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_44f5065c3fc752c1.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_888bbe36212847bd.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\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\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-07-23:/fr/sys/openbsd/gnome#205551a3e502b7c4b4f048176b6c3cf8e5e921aabf8cafbbb488bc15bddfe0a8","url":"https://it-log.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.8 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 xenodm 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 gdm 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 Langue 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 LibreOffice 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.\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… ","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.8\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\u003ch4 id=\"xenodm\"\u003exenodm\u003c/h4\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:# rcctl disable xenodm\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl stop xenodm\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"gdm\"\u003egdm\u003c/h4\u003e\n\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:# rcctl enable multicast messagebus avahi_daemon gdm\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl start multicast messagebus avahi_daemon gdm\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\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:# rcctl enable apmd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl set apmd flags -A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl start apmd\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\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\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;\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 paquet \u003ccode\u003eunoconv\u003c/code\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\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:# grep gdm /var/log/daemon\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","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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-07-20:/fr/sys/openbsd/xfce4#11a160de8b67fd8425a2578354c6d4e9a67dbd4e84412705c00c7321904cdf44","url":"https://it-log.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.8 Xfce4 : 4.14 → 4.20 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, tels les paquets dbus, consolekit2.\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. 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 :\n/usr/local/bin/ck-launch-session xfce4-session 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\nConfiguration Maintenant 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 # ou nano, emacs, voire vim ENV=$HOME/.kshrc LC_MESSAGES=fr # ou fr_FR.UTF8, si vous préférez ; mais ça sera pareil ! export EDITOR ENV LC_MESSAGES Pour finir sur ce sujet, il est bien sûr possible de définir toute variable d\u0026rsquo;environnement, tel 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 .kshrc Lire la page KSH : Korn shell pour mieux configurer ce fichier personnel.\n.xsession Il faut modifier votre fichier personnel ~/.xsession pour ajouter l\u0026rsquo;environnement du profil, tel que :\n. $HOME/.profile /usr/local/bin/ck-launch-session 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…\ndbus 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.\ncf la page : D-Bus [système de bus de messages] / OpenBSD\nImpression Pour gérer l\u0026rsquo;impression, il est utile d\u0026rsquo;installer CUPS .\nbinaires lp Depuis 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.\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 obsdfreqd 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.\nPour en savoir plus : obsdfreqd : un service pour gérer la fréquence CPU / OpenBSD\nupower 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\ncf la page : Consolekit2 (bus de messages) / OpenBSD\nxfce4-power-manager ⇒ À ce propos si votre machine est un ordinateur portable, installez le paquet xfce4-power-manager, qui n\u0026rsquo;est pas fourni par défaut.\nAstuces Pour 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.8\u003c/li\u003e\n\u003cli\u003eXfce4 : \u003cdel\u003e4.14\u003c/del\u003e → 4.20\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, tels les paquets\n\u003ccode\u003edbus\u003c/code\u003e, \u003ccode\u003econsolekit2\u003c/code\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\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\"\u003e/usr/local/bin/ck-launch-session 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\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\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\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   # 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  # 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\u003ePour finir sur ce sujet, il est bien sûr possible de définir toute\nvariable d\u0026rsquo;environnement, tel \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\u003ch3 id=\"kshrc\"\u003e.kshrc\u003c/h3\u003e\n\u003cp\u003eLire la page \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-pdksh/\" title=\"Lien interne vers l\u0026#39;article : 'KSH : Korn shell'\"\u003eKSH : Korn shell\u003c/a\u003e pour mieux configurer\nce fichier personnel.\u003c/p\u003e\n\u003ch3 id=\"xsession-1\"\u003e.xsession\u003c/h3\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\"\u003e/usr/local/bin/ck-launch-session 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\u003chr\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\u003ecf la page : \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=\"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\u003chr\u003e\n\u003ch4 id=\"binaires-lp\"\u003ebinaires lp\u003c/h4\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\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\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\u003cp\u003ePour en savoir plus : \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\u003ch4 id=\"upower\"\u003eupower\u003c/h4\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\u003ecf la page : \u003ca class=\"inside\" href=\"/fr/sys/openbsd/consolekit/\" title=\"Lien interne vers l\u0026#39;article : 'Consolekit2 (bus de messages) / OpenBSD'\"\u003eConsolekit2 (bus de messages) / OpenBSD\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"xfce4-power-manager\"\u003exfce4-power-manager\u003c/h4\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\u003ch2 id=\"astuces\"\u003eAstuces\u003c/h2\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-07-18:/fr/sys/openbsd/nut#633ce3bef2ac7107584b17a1f3b2b1ce359978f3da5df44e7b9cf14121b5771d","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-05-25:/fr/sys/openbsd/tip-howto-dl#63ec1d220599e80f162265d8bf42a9341e0a60022dbdec1facf3c1e289b0d149","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-05-25:/fr/sys/openbsd/tip-checksum#cd1f13bc9d8bbd9ceebd9b0bf3a8735296c8c9feec902e81bc4df43b7f8eda52","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-05-15:/fr/sys/openbsd/tip-video#9e75dabb2bc501a1fa5ed9d50153f3b31c5c5e022501e056a377d61a761b17d6","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-05-07:/fr/trad/solene-rapenne/openbsd-bases-services#4d7dbcfea6639291d8a2983db28d63de584ce85177c10f97a590fd09a0c26b32","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-05-05:/fr/trad/solene-rapenne/openbsd-getting-started#c7aca1cb97e23df3cc3250b218fe260f6ec61f9a4dce1088aa1e108f9fb94f1d","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-04-13:/fr/sys/openbsd/tip-relayd#965751bbe5fd83e086d4ea224069b07f0ccf864c7cd36948e443fe2d81f4e4dc","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-02-22:/fr/web/nginx/nginx-image-avif#c1258ccc8dedd178ff3251a3ccc79d493c66e4a9b30607dec6a6e35c90ed556c","url":"https://it-log.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…\nInstallation 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 href=\"/fr/web/nginx/nginx-image-webp/\"\u003eimages webp par nginx\u003c/a\u003e.\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. \u003cbr\u003e\nAinsi les images compressées dans ce format sont encore plus légères que le format Webp \u003cem\u003e(bien sûr, généralement, cela dépend fortement des taux de 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 ce format AVIF :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele navigateur web Chromium, et son pendant non libre dixit Google 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.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\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/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 bibliothè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 la 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, écrit en langage Rust. \u003cbr\u003e\nReste plus qu\u0026rsquo;à télécharger la version .deb fournie : \u003cbr\u003e\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 correctement 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. \u003cbr\u003e\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, plus ou moins considérable, selon les options choisies et le poids de l\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. \u003cbr\u003e\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 est demandé des images au format jpeg|gif|png|tiff, il essaye de diffuser celles 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 : \u003cbr\u003e\n\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 permettra 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 href=\"/fr/web/nginx/nginx-image-webp/\"\u003emodifié pour le support webp\u003c/a\u003e\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 correspondant - \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, tel 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 l\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_e91ff52ed5705247.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, soit 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; - \u003cem\u003een anglais\u003c/em\u003e - qui expliquent les raisons pour lesquelles utiliser un taux de compression min à 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 qui 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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-02-21:/fr/sys/openbsd/vmd-console-serie#b48dbba0b506ba565f195066242f2d33b91af714632b5632b79e7e5f5d07adaa","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-02-21:/fr/sys/openbsd/vmd-hote-invite-meme-reseau#0bdd3fbe277710dde7d20a95929604a65fbfafa3fcb677a5b893b9dabcb7131c","url":"https://it-log.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 ","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","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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-02-20:/fr/trad/solene-rapenne/openbsd-default-security#1904c0df5935218e0027ad9ed8b0d1502bb8427515ce3eb4c48c74c1da44b8e1","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-02-19:/fr/sys/openbsd/smartmontools#c650f5f769f084929d312034722a87e79ac08aecfb79a8a89439d23b1b58d72a","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2021-01-24:/fr/web/hugo/hugo-gemini-gopher#8c6bf8054036635e00f4c782c6926ddfe13796eb59b97e2e82e5343244125fa9","url":"https://it-log.fr.eu.org/fr/web/hugo/hugo-gemini-gopher/","title":"Hugo : Gemini, Gopher… 'Quoi d'autres ?!'","author":{"name":"Stéphane HUC"},"content_text":" AttentionVeuillez aller lire plutôt cet article :\ngemini 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.Language.Locale }} \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":"\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eVeuillez aller lire plutôt cet article :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/web/hugo/gemini/\"\u003egemini\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\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.Language.Locale }}\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\"\u003e\n    Gemini\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Gopher\" title=\"Article Wikipédia : Gopher\"\u003e\n    Gopher\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-12-22:/fr/trad/solene-rapenne/cryptpad-openbsd#d2ee30bdbd93670c2c7065925ff46284e602f2db9524a34e9b8b78d3b2b2469a","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-12-22:/fr/sys/openwrt/dns-doh-proxy#e0ea50451d671e325150170d067c5dd02ccee9a302592d4cee09879ceb767133","url":"https://it-log.fr.eu.org/fr/sys/openwrt/dns-doh-proxy/","title":"OpenWRT : proxy DNS DoH","author":{"name":"Stéphane HUC"},"content_text":"opkg → apk Le projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet. 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 ","content_html":"\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eopkg → apk\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLe projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet.\u003c/strong\u003e\u003c/div\u003e\n\n\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:# opkg update\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# opkg install https-dns-proxy luci-app-https-dns-proxy\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:# /etc/init.d/rpcd restart\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_187095281be00168.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_11533dca7e77f13e.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\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","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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-12-21:/fr/web/nginx/nginx-image-webp#1b206003f7a08ab0f1e9e1828e5460b184a1268298cb9d0604317f3b3ebe8b7e","url":"https://it-log.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_e91ff52ed5705247.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\"\u003e\n    WebP\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-11-23:/fr/trad/unixsheikh.com/guide-du-routeur-openbsd#e807be009259836107c861a823c746a6cb9f70a857793a8b57ee9999b2ca3342","url":"https://it-log.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\u0026rsquo; 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\u0026rsquo; 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 n\u0026rsquo;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 sur 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 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\u0026rsquo;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 et 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 \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.\u003c/p\u003e\n\u003cp\u003eNous 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 \u003ca href=\"https://fr.wikipedia.org/wiki/Zone_d%C3%A9militaris%C3%A9e_(informatique)\" rel=\"external\"\u003eDMZ\u003c/a\u003e), tel qu\u0026rsquo;un serveur web ou serveur mail privé. \u003cbr\u003e\nNous 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.\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 en console, les noms de fichiers et leurs chemins, les paramètres de configuration, etc…\u003c/li\u003e\n\u003cli\u003eLes commandes en console qui doivent être tapées en tant qu\u0026rsquo;utilisateur \u003ccode\u003eroot\u003c/code\u003e sont préfixées du symbole dièse \u003ccode\u003e#\u003c/code\u003e et la commande apparaît en \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 normal sont préfixées du symbole dollar \u003ccode\u003e$\u003c/code\u003e et la commande apparaît en \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 n\u0026rsquo;utilisent pas IPv6 et beaucoup de FAI - \u003cem\u003eFournisseur d\u0026rsquo;Accès à Internet\u003c/em\u003e - utilisent seulement IPv4, mais IPv6 est planifié dans le contexte d\u0026rsquo;une future mise à jour de ce guide.\u003c/div\u003e\n\n\u003cp\u003ePeu 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.\u003c/p\u003e\n\u003cp\u003eIl 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 \u003ca href=\"https://fr.wikipedia.org/wiki/Botnet\" rel=\"external\"\u003eBotnet\u003c/a\u003e, tel que le fait le \u003ca href=\"https://fr.wikipedia.org/wiki/Mirai_(logiciel_malveillant)\" rel=\"external\"\u003elogiciel malveillant Mirai\u003c/a\u003e. \u003cbr\u003e\nDe nombreux modems et routeurs grand public sont à blâmer à propos de certaines \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 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.\u003c/p\u003e\n\u003cp\u003eSans 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.\u003c/p\u003e\n\u003cp\u003eC\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.\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 et un pare-feu efficaces pour votre maison ou votre bureau. \u003cbr\u003e\nMême avec du matériel \u0026ldquo;bas de gamme\u0026rdquo; bon marché, vous pouvez avoir une solution très solide.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai créé de multiples solutions avec la carte-mère \u003ca href=\"https://www.asrock.com/mb/Intel/Q1900DC-ITX/\" rel=\"external\"\u003eASRock Q1900DC-ITX\u003c/a\u003e qui est fournie 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_4b441576ac796f12.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 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.\u003c/p\u003e\n\u003cp\u003eLa 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.\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 consommant 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 DC-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_623aa12dfed40507.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 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.\u003c/p\u003e\n\u003cp\u003eEnfin, j\u0026rsquo;utilise une carte réseau quadruple port Intel bon marché, trouvé sur 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_5602bf10a7a269d4.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 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.\u003c/p\u003e\n\u003cp\u003eJe vous recommande de chercher une carte mini-ITX dont le matériel est \u003ca href=\"https://www.openbsd.org/amd64.html\" rel=\"external\"\u003epris en charge par OpenBSD\u003c/a\u003e, 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. \u003cbr\u003e\nJe 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.\u003c/p\u003e\n\u003cp\u003eVous 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 :)\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 BSD ou une des différentes \u003ca href=\"https://fr.wikipedia.org/wiki/Distribution_Linux\" rel=\"external\"\u003edistributions Linux\u003c/a\u003e, mais \u003ca href=\"https://www.openbsd.org/\" rel=\"external\"\u003eOpenBSD\u003c/a\u003e est spécifiquement très bien adapté et conçu pour ce genre de tâche. \u003cbr\u003e\nNon 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. \u003cbr\u003e\nJe \u003ca href=\"https://www.unixsheikh.com/articles/openbsd-is-fantastic.html\" rel=\"external\"\u003erecommande chaudement\u003c/a\u003e OpenBSD plutôt que tout autre système d\u0026rsquo;exploitation pour ce genre de tâches.\u003c/p\u003e\n\u003cp\u003eCe guide ne vous montre pas comment installer OpenBSD. \u003cbr\u003e\nSi 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.\nOpenBSD est un des systèmes d\u0026rsquo;exploitations des plus faciles et rapides à installer.\nN\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.\u003c/p\u003e\n\u003cp\u003eAvant de commencer ce voyage, assurez-vous de consulter la documentation d\u0026rsquo;OpenBSD ! \u003cbr\u003e\nNon seulement, chaque chose est très bien documentée, mais vous trouverez très probablement toutes les réponses dont vous avez besoin. \u003cbr\u003e\nLisez la \u003ca href=\"https://www.openbsd.org/faq/index.html\" rel=\"external\"\u003eFAQ OpenBSD\u003c/a\u003e, regardez les différentes \u003ca href=\"https://man.openbsd.org/\" rel=\"external\"\u003epages de manuels\u003c/a\u003e à propos 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 à propos 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 souscrivant à 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 ! \u003cbr\u003e\nMême si vous n\u0026rsquo;utilisez pas quotidiennement OpenBSD, vous utilisez peut-être déjà \u003ca href=\"https://www.openssh.com/\" rel=\"external\"\u003eOpenSSH\u003c/a\u003e sur Linux, alors vous utilisez vraiment un logiciel du projet OpenBSD. \u003cbr\u003e\nConsidé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.\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 deux ou plusieurs réseaux séparés.\nLe 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.\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 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.\nUn exemple de passerelle serait un dispositif qui joint un réseau PC avec un réseau télécom.\u003c/div\u003e\n\n\u003cp\u003eDans ce tutoriel, nous construirons un routeur et nous avons 4 réseaux de même type à faire travailler ensemble.\nL\u0026rsquo;un est Internet, et les trois autres sont segmentés intentionnellement en réseaux locaux (LAN).\nCertaines 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.\nVous 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.\nVous 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.\nJe 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.\u003c/p\u003e\n\u003cp\u003eBien 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.\nLa 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.\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 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).\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 ; je vous recommande de n\u0026rsquo;utiliser aucun type de connectivité sans fil, si vous pouvez vous en passer.\nSi 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é.\nAinsi, si jamais votre appareil sans fil est compromis, vous pourrez mieux contrôler le résultat et limiter les dégâts.\nVous 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.\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 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.\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\u0026rsquo; OpenBSD 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 réseaux de notre routeur OpenBSD.\nSur 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.\u003c/p\u003e\n\u003cp\u003eSi 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.\u003c/p\u003e\n\u003cp\u003eAvant de commencer, assurez-vous de lire et de comprendre les différentes options 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 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.\nCela signifie que chaque carte est listée en tant qu\u0026rsquo;\u003ccode\u003eemX\u003c/code\u003e où X est le numé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 numéro indiqué ci-dessus.\nVous 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.\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é \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 de votre FAI, vers Internet.\nDans 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.\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 recevra 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 IP 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 adresses 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 pour 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 celle 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 dé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 modem 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 alors 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 qui 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 entre les interfaces réseaux du routeur.\nPar défaut, OpenBSD ne fera pas de redirection des paquets IP entre les différentes interfaces réseaux.\nEn d\u0026rsquo;autres mots, les fonctions de routage (appelées aussi fonctions de passerelles) 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 interface 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 que nous exécuterons pour nos différents PC et dispositifs attachés aux différents LAN.\nAvant, assurons-nous de lire et de comprendre les différentes options de la 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 à 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 spécifiques qui se connectent sur nos différents ports.\nCela est nécessaire si nous voulons rediriger le trafic qui vient d\u0026rsquo;Internet vers quelque chose comme un serveur web.\nNous pouvons cacher une adresse IP spécifique vers un PC spécifique via l\u0026rsquo;adresse \u003ca href=\"https://en.wikipedia.org/wiki/MAC_address\" rel=\"external\"\u003eMAC\u003c/a\u003e de l\u0026rsquo;interface ré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 de 10 à 254 pour le DHCP, tandis que je laisserais les autres qui restent pour 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 adapter 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 faire fonctionner sur notre routeur.\u003c/p\u003e\n\u003cp\u003eDe 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é.\u003c/p\u003e\n\u003cp\u003eDe 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 :\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 le 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 l\u0026rsquo;appendice pour savoir comment ajouter facilement un \u003ca href=\"https://fr.wikipedia.org/wiki/Fully_qualified_domain_name\" rel=\"external\"\u003enom de domaine pleinement qualifié (FQDN)\u003c/a\u003e à votre paramétrage et comment vous pouvez utiliser l\u0026rsquo;option \u003ccode\u003edomain-name\u003c/code\u003e dans DHCP afin d\u0026rsquo;éviter à avoir à écrire le FQDN à chaque fois que vous en avez besoin. \u003cbr\u003e\nCe 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.\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 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.\u003c/p\u003e\n\u003cp\u003eLe 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é.\u003c/p\u003e\n\u003cp\u003eUne 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.\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 \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 le trafic correspondant à une connexion existante ou ouvre une nouvelle connexion permise.\nQuand 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.\nIl a suffisamment de capacité de correspondance pour déterminer si un paquet est valide pour une session.\nTout paquet qui ne correspond pas au modèle de session sera automatiquement rejeté.\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 de nouvelles sessions.\nSi une nouvelle session est passée, tous les paquets conséquents sont automatiquement alloués et tout paquet imposteur sera automatiquement rejeté.\nSi une nouvelle session est bloquée, aucun des paquets conséquents n\u0026rsquo;est autorisé.\nLe 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.\u003c/p\u003e\n\u003cp\u003eLa Traduction d\u0026rsquo;Adresse Réseau (NAT) permet à un réseau privé derrière le pare-feu de partager une adresse IP publique unique.\nLa 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.\nLa 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.\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é 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.\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 d\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 bien 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 \u003ca href=\"https://www.openbsd.org/faq/pf/index.html\" rel=\"external\"\u003eGuide de l\u0026rsquo;Utilisateur de PF\u003c/a\u003e et la page du manuel \u003ca href=\"https://man.openbsd.org/pf.conf\" rel=\"external\"\u003epf.conf\u003c/a\u003e, spécifiquement la page du manuel qui est très importante.\nMême si vous ne comprenez pas toutes les différentes options, assurez-vous de lire la documentation !\nLisez la page du manuel \u003ca href=\"https://man.openbsd.org/pf\" rel=\"external\"\u003epf\u003c/a\u003e pour avoir une complè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 est très lisible, il est \u003cstrong\u003etrès facile\u003c/strong\u003e de faire des erreurs lors de l\u0026rsquo;écriture des règles de pare-feu.\nMê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.\u003c/p\u003e\n\u003cp\u003eÉ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 :)\nJe 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.\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 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.\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 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.\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 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 \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 à 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 et 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 de 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 d\u0026rsquo;ordinateurs vers une interface réseau (les ordinateurs étant rattachés à ce périphérique réseau) et \u003cstrong\u003epass out\u003c/strong\u003e pour les paquets de données venant de 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 le critère \u003ccode\u003equick\u003c/code\u003e, le paquet \u003cstrong\u003eest passé sans inspection des règles de filtrage 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 rè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, \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 est \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, ou \u003cstrong\u003equi passent au-travers\u003c/strong\u003e de cette interface en particulier ou d\u0026rsquo;un groupe d\u0026rsquo;interface. \u003cbr\u003e\nLe critère \u003ccode\u003eon any\u003c/code\u003e correspondra à toute interface existante, exceptée celles 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 seulement aux paquets \u003cstrong\u003eentrants\u003c/strong\u003e, ou \u003cstrong\u003epassant au-travers\u003c/strong\u003e ce domaine particulier de routage, soit IPv4, soit IPv6. \u003cbr\u003e\nVous 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 \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 protocoles ne sont pas affectés. Vous pouvez chercher les protocoles dans 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 \u003ca href=\"https://fr.wikipedia.org/wiki/Transmission_Control_Protocol\" rel=\"external\"\u003eTCP\u003c/a\u003e et \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 du trafic. Un paquet \u003cstrong\u003eentre\u003c/strong\u003e ou \u003cstrong\u003esort\u003c/strong\u003e toujours par le port sur l\u0026rsquo;interface Ethernet. \u003ccode\u003ein\u003c/code\u003e et \u003ccode\u003eout\u003c/code\u003e s\u0026rsquo;applique aux paquets entrants et sortants au-travers du port Ethernet physique auquel est attaché le câble Ethernet. \u003cstrong\u003eSi rien n\u0026rsquo;est spécifié, la règle correspondra aux 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 d\u0026rsquo;une interface réseau vers une autre, ce qui est fait par la NAT, en utilisant 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 seulement le trafic \u003cstrong\u003eentrant\u003c/strong\u003e et \u003cstrong\u003esortant\u003c/strong\u003e du port Ethernet physique d\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 une 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 spécifications OS sont optionnels. \u003cbr\u003e\nQuand nous avons affaire avec un routeur ayant de multiples interfaces réseaux, il est facile de penser cela :\n\u003cem\u003eJe 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\u003c/em\u003e signifiant que nous suivront le \u0026ldquo;chemin des données\u0026rdquo; dans notre esprit, et alors nous écrivons quelque chose comme cela : \u003cbr\u003e\n\u003ccode\u003epass in on $ext_if from $ext_if to $dmz port 80\u003c/code\u003e \u003cbr\u003e\nMais 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 \u003ccode\u003epass out\u003c/code\u003e spécifique et déterminer exactement sur quelle machine nous voulons que les données arrivent.\nÀ 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 ! \u003cbr\u003e\nLes fonctionnalités \u003ca href=\"https://www.openbsd.org/faq/pf/filter.html#urpf\" rel=\"external\"\u003euRPF (Unicast Reverse Path Forwardint)\u003c/a\u003e de PF protégeront votre réseau  interne aussi bien avec un paramétrage de base de NAT, avec l\u0026rsquo;option \u003ccode\u003enat-to\u003c/code\u003e et une redirection avec l\u0026rsquo;option \u003ccode\u003erdr-to\u003c/code\u003e, PF gérera les paquets venant de l\u0026rsquo;intérieur vers l\u0026rsquo;extérieur et 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 \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 se traduit par : \u003cbr\u003e\n\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 partie \u003ccode\u003eany\u003c/code\u003e étant celle par défaut. Vous avez cependant besoin de \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 des 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 les 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 le paquet traverse l\u0026rsquo;interface donnée\u003c/strong\u003e.\nCette 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 \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 \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 \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 multiples numéros de ports, vous pouvez les séparer avec une espace ou 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 de 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 manuel \u003ca href=\"https://man.openbsd.org/pf.conf\" rel=\"external\"\u003epf.conf\u003c/a\u003e et cherchez le texte \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 d\u0026rsquo;une interface, les règles de filtrage sont évaluées dans un ordre séquentiel, de 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 de quelle action prise\u003c/strong\u003e.\nSi 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.\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 dans votre paramétrage de PF, vous avez besoin de savoir que \u003cstrong\u003ela résolution de tout nom de domaine ou d\u0026rsquo;hôte est faite au moment du chargement du jeu de 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, le jeu de règles \u003cstrong\u003edoit être rechargé pour que le changement soit pris en compte 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 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.\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 utiliser soit actif et fonctionnel \u003cstrong\u003eavant\u003c/strong\u003e que PF ne démarre, autrement PF échouera à charger le jeu de règles car il ne peut résoudre le nom d\u0026rsquo; hô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é, ce 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 domaines lorsque vous utilisez les règles PF et de privilégier les adresses IP, si possible.\nIl 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.\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 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).\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 à distance 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 aussi claires et simples que possible, en utilisant les valeurs par défaut, quand c\u0026rsquo;est possible.\nN\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.\nUne valeur par défaut peut être \u003ccode\u003eany to any\u003c/code\u003e, et vous pouvez laisser cela de côté, mais il serait plus facile de comprendre une règle particulière quand 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 sans 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, vous pouvez voir comment le jeu de règles a été traduit par PF avec la commande \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 ferais 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 interfaces réseaux nous utilisons.\nUtiliser 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.\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 celle qui permet du trafic avec des adresses non routable vers Internet.\nNous 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.\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 du 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 activons 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 référencées dans la \u003ca href=\"https://tools.ietf.org/html/rfc1918\" rel=\"external\"\u003eRFC1918\u003c/a\u003e qui ne doivent pas être utilisées sur Internet.\nLe trafic venant ou allant vers de telles adresses doit être abandonné sur 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 l\u0026rsquo;habitude d\u0026rsquo;utiliser l\u0026rsquo;instruction \u003ca href=\"https://man.openbsd.org/pf.conf#Scrub\" rel=\"external\"\u003escrub\u003c/a\u003e dans le paramétrage ci-dessus, toutefois après avoir consulté l\u0026rsquo;équipe OpenBSD avec \u003ca href=\"http://henningbrauer.com/\" rel=\"external\"\u003eHenning Brauer\u003c/a\u003e (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).\nVous aurez besoin de la règle \u003ccode\u003escrub\u003c/code\u003e seulement si un hôte sur votre réseau gé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é à 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 un exemple de paramétrage pour un routeur très basique, avec certaines valeurs spécifiques pour \u003ccode\u003escrub\u003c/code\u003e, mais ma recommandation est d\u0026rsquo;utiliser seulement \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 rè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 suivante 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é \u003ca href=\"https://www.openbsd.org/faq/pf/filter.html#urpf\" rel=\"external\"\u003euRPF (Unicast Reverse Path Forwarding)\u003c/a\u003e 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 \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 fins d\u0026rsquo;éducation.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;usurpation est lorsque quelqu\u0026rsquo;un fabrique une adresse IP. Le critère \u003ccode\u003eantispoof\u003c/code\u003e 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.\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 de l\u0026rsquo;interface réseau \u003ccode\u003eem1\u003c/code\u003e qui signifie alors : \u003cem\u003ebloque 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\u003c/em\u003e.\nPuisque l\u0026rsquo;interface \u003ccode\u003eem1\u003c/code\u003e 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.\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 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 \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 utiliserons à 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 du 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 est la même que l\u0026rsquo;interface du paquet qui vient juste d\u0026rsquo;entrer, alors la vérification d\u0026rsquo;uRPF autorise.\nAutrement, il est possible que le paquet ait son adresse IP source usurpée ainsi 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 dans notre paramétrage, quand bien même des administrateurs réseaux bloquent complètement ICMP.\nLa 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 \u003ca href=\"https://en.wikipedia.org/wiki/Ping_sweep\" rel=\"external\"\u003eping sweep\u003c/a\u003e, le \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, et 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 performance réseau peuvent être défectueuses puisque des mécanismes importants sont 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 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.\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 un 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 continuellement des paquets non délivrés et le système source continue à les 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 ICMP (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 é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 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.\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 chemin 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 la destination.\nAvec ICMP bloqué, l\u0026rsquo;hôte ne fera jamais attention à la route la plus optimale vers la destination.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans 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.\nAvec le critère \u003ccode\u003emax-pkt-rate 100/10\u003c/code\u003e, le routeur arrêtera de répondre aux ping 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 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).\nNous le faisons en disant : \u003cem\u003ebloque toutes les données entrantes sur em1 venant 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 (DNS régulier) et 853 (DNS sur TLS) soient toujours bloquées si elles ne viennent 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é à notre serveur DNS vers notre serveur DNS.\nJe faisais cela parce que nous bloquions toute requête DNS sur le port 53, soit avec \u003ccode\u003ereturn\u003c/code\u003e ou \u003ccode\u003edrop\u003c/code\u003e, 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.\nDepuis j\u0026rsquo;ai changé cela en block parce que je crois que c\u0026rsquo;est une meilleure approche.\nTous 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.\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 ne 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 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.\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 requêtes.\nAinsi nous avons besoin des deux protocoles UDP et TCP dans la règle pour le 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 \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 au serveur web.\nPuisque nous avons un serveur web publique, nous allons définir un certain nombre de restrictions.\nSi le serveur web est compromis, l\u0026rsquo;intrus aura du mal à trouver ce qui est localisé dans notre réseau interne.\u003c/p\u003e\n\u003cp\u003eNous 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 \u003cstrong\u003eseulement manuellement\u003c/strong\u003e certaines choses pour quand nous avons besoin de mettre à jour la machine ou quoi que ce soit d\u0026rsquo;autres.\nJ\u0026rsquo;ai commenté les options dont nous avons besoins, quand nous avons besoin de telles choses, laissant les parties restreintes actives.\nQuand vous aurez besoin de mettre à jour le serveur, ouvrez l\u0026rsquo;accès DNS et 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 besoin de mettre à jour le serveur web, nous pouvons aussi utiliser une \u003ca href=\"https://man.openbsd.org/pf.conf#ANCHORS\" rel=\"external\"\u003eancre\u003c/a\u003e, mais par esprit de simplification, 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 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.\nJe préfère le paramètre \u003ccode\u003e:network\u003c/code\u003e 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é.\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 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.\u003c/p\u003e\n\u003cp\u003eEnfin, occupons-nous de la partie relative à la redirection dans notre jeu de règles.\nC\u0026rsquo;est là où nous permettons le trafic venant d\u0026rsquo;Internet vers notre serveur web publique sur l\u0026rsquo;interface réseau DMZ.\nVous devriez, bien sûr, laisser cette partie si vous n\u0026rsquo;avez pas de serveurs publiques 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 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.\u003c/p\u003e\n\u003cp\u003eSi 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) :\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 concernées en une fois.\nD\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.\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 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).\nUne fois que vous avez déterminé quel est l\u0026rsquo;ensemble d\u0026rsquo;adresses IP, vous pouvez 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 des 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 liste blanche en une fois, mais en surveillant le réseau, en utilisant e.g. \u003ca href=\"https://man.openbsd.org/tcpdump\" rel=\"external\"\u003etcpdump\u003c/a\u003e, quand le jeu essaye d’accéder au 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 multiples 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 en 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 les problèmes de résolution de DNS n\u0026rsquo;entraîneront pas des problèmes pour PF.\u003c/p\u003e\n\u003cp\u003eSi vous souhaitez utiliser la solution des tables persistantes, vous pouvez le faire en ajoutant une table persistante dans la section des tables dans \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 qui 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 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 :\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 ceci :\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 (avant qu\u0026rsquo;elles ne soient purgées) dans un fichier physique afin que l\u0026rsquo;option \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 l\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 l\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 de 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 le 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 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 \u003ccode\u003e0.0.0.0\u003c/code\u003e n\u0026rsquo;est pas 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 en 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 est 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 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.\u003c/p\u003e\n\u003cp\u003eDNS 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.\u003c/p\u003e\n\u003cp\u003eSi 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 \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 besoin 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, qui 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 venant 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 la 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 sous la \u003ca href=\"https://en.wikipedia.org/wiki/DNS_root_zone\" rel=\"external\"\u003ezone racine\u003c/a\u003e, similaire à ce que sont tous les fichiers dans un système de fichier sous 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 ré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 sous 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 qui 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, le 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 pour obtenir le serveur faisant autorité responsable.\nLes 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.\u003c/p\u003e\n\u003cp\u003eMê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 \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 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.\nLes résolveurs utilisent un petit fichier nommé \u003ccode\u003eroot.hints\u003c/code\u003e de 3 Ko, publié par \u003ca href=\"https://fr.wikipedia.org/wiki/InterNIC\" rel=\"external\"\u003eInternic\u003c/a\u003e pour amorcer cette liste initiale d\u0026rsquo;adresses des serveurs racines.\nPour beaucoup de logiciels, incluant Unbound, cette liste est intégrée à l\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, 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.\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, 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.\nPuisque nous avons, pour l\u0026rsquo;exemple, pris une liste des serveurs de noms TLD responsables pour le TLD \u003ca href=\"https://www.iana.org/domains/root/db/dk.html\" rel=\"external\"\u003e.dk\u003c/a\u003e, 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.\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 serveurs DNS.\nSoit 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.\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 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. \u003cbr\u003e\nLes 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. \u003cbr\u003e\nUn 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. \u003cbr\u003e\nChaque zone DNS doit être assignée à un ensemble de serveurs de noms faisant autorité.\nCet ensemble de serveurs est enregistré dans la zone de domaine parente des enregistrements du serveur de noms (NS).\nUn 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. \u003cbr\u003e\nVous pouvez utiliser un outil réseau, tel que \u003ca href=\"https://man.openbsd.org/dig\" rel=\"external\"\u003edig\u003c/a\u003e ou \u003ca href=\"https://linux.die.net/man/1/drill\" rel=\"external\"\u003edrill\u003c/a\u003e 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é.\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 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.\n(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. \u003cbr\u003e\nLa 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. \u003cbr\u003e\nEn théorie, les serveurs de noms faisant autorité sont suffisant pour opérer sur Internet.\nToutefois, 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.\nPour 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. \u003cbr\u003e\nUne 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.\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 il 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é doivent ê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 qu\u0026rsquo;une réponse faisant autorité, les serveurs récursifs devraient être restreints à un nombre de clients seulement, car ils sont enclins à des \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 \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 DNS Open Source récursif, cache et validant avec les fonctionnalités suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCache avec possibilité de récupèrer des éléments populaires avant qu\u0026rsquo;ils n\u0026rsquo;expirent.\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 modernes basées sur des normes ouvertes. Fin 2019, Unbound a été \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 résolveurs cache seulement, tel que \u003ca href=\"https://fr.wikipedia.org/wiki/Dnsmasq\" rel=\"external\"\u003ednsmasq\u003c/a\u003e par exemple, est que si vous n\u0026rsquo;utilisez pas l\u0026rsquo;option \u003cstrong\u003eforward\u003c/strong\u003e dans la configuration d\u0026rsquo;Unbound, Unbound \u003cstrong\u003efera des requêtes directement aux serveurs racines\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 publique, tel que Google ou Cloudflare, et tout enregistrement, vente et manipulation de données, tels qu\u0026rsquo;ils le font sera évité.\nUn 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é.\nCela signifie que le serveur DNS qui sait spécifiquement ce que vous recherchez 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 en 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 l\u0026rsquo;information afin que vous puissiez déterminer sur le trafic de 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 \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 la 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 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 \u003ca href=\"https://man.openbsd.org/resolv.conf\" rel=\"external\"\u003e/etc/resolv.conf\u003c/a\u003e (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 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;.\u003c/li\u003e\n\u003cli\u003eLe serveur racine répond par une référence aux serveurs concernés du domaine TLD \u0026ldquo;.org\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eUnbound 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;.\u003c/li\u003e\n\u003cli\u003eLe serveur répond avec une référence aux serveurs de noms faisant autorité enregistré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 autorité 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 listée dans les enregistrements \u0026ldquo;A\u0026rdquo; et/ou \u0026ldquo;AAAA\u0026rdquo; pour le domaine \u0026ldquo;wikipedia.org\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eUnbound reçoit l\u0026rsquo;adresse IP du serveur de noms faisant autorité et retourne la réponse au client.\u003c/li\u003e\n\u003cli\u003eSi 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.\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 propos ci-dessus. J\u0026rsquo;utilise \u003ca href=\"https://linux.die.net/man/1/drill\" rel=\"external\"\u003edrill\u003c/a\u003e dans 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 \u003ca href=\"https://fr.wikipedia.org/wiki/Domain_Name_System_Security_Extensions\" rel=\"external\"\u003eDNSSEC\u003c/a\u003e 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é.\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, tous 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 et \u003ca href=\"https://man.openbsd.org/unbound.conf#harden~4\" rel=\"external\"\u003ehardened dnssec-stripped data\u003c/a\u003e sont 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 qui vous permet de fournir une \u0026ldquo;fausse\u0026rdquo; réponse au client qui effectue la requête.\nNous bloquons une requête pour une adresse IP valide soit en répondant avec un \u003ca href=\"https://tools.ietf.org/html/rfc8020\" rel=\"external\"\u003eNXDOMAIN\u003c/a\u003e, signifiant nom de domaine inexistant, ou soit en redirigeant vers une autre adresse IP que celle prévue par le propriétaire du domaine.\u003c/p\u003e\n\u003cp\u003eCela 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.\u003c/p\u003e\n\u003cp\u003eNormalement, 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.\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 blocage par DNS peut être contourné.\nMême en ayant une solide approche en place, il est toujours possible pour quelqu\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 pour contourner cela.\nNous 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.\nIl 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.\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 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.\nNXDOMAIN est une norme de réponse pour un \u0026ldquo;nom de domaine Intranet ou Internet non existant\u0026rdquo;.\nSi le nom de domaine est incapable d\u0026rsquo;être résolu en utilisant DNS, une condition appellée NXDOMAIN est obtenue.\u003c/p\u003e\n\u003cp\u003eNous pouvons essayer de résoudre un domaine non existant avec la commande \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 (au moins pas durant le temps où j\u0026rsquo;écris cela), nous obtenons une réponse \u0026ldquo;NXDOMAIN\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eNous pouvons aussi utiliser \u003ccode\u003edrill\u003c/code\u003e. L\u0026rsquo;information pertinente depuis la sortie 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 dans 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 bloquer un domaine, en accord avec la \u003ca href=\"https://tools.ietf.org/html/rfc8020\" rel=\"external\"\u003eRFC8020\u003c/a\u003e, 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.\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 machine locale, nous pouvons toujours envoyé un ping à cette adresse, car elle 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 ce 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 NXDOMAIN, mais il ne peut pas gérer de grandes listes de domaines qui ont besoin d\u0026rsquo;être redirigés aussi bien.\nSi pour certaines raisons, vous devriez insister sur la redirection plutôt que d\u0026rsquo;utiliser NXDOMAIN, je vous recommande de paramétrer \u003ca href=\"http://www.thekelleys.org.uk/dnsmasq/doc.html\" rel=\"external\"\u003ednsmasq\u003c/a\u003e avec l\u0026rsquo;option \u003cstrong\u003e\u0026ndash;addn-hosts=\u0026lt;file\u0026gt;\u003c/strong\u003e, 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.\nContrairement à 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.\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, 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 \u003cstrong\u003eMAUVAISE\u003c/strong\u003e approche.\u003c/p\u003e\n\u003cp\u003eAvec 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.\nNon 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.\nC\u0026rsquo;est spécifiquement un problème pour le \u003ca href=\"https://fr.wikipedia.org/wiki/Logiciel_propri%C3%A9taire\" rel=\"external\"\u003elogiciel propriétaire\u003c/a\u003e dont nous ne pouvons pas voir le code source, mais dont nous ne pouvons pas aussi changer les paramétres DoH.\u003c/p\u003e\n\u003cp\u003eÀ 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.\nToutefois, 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 \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 basiquement possible de surpasser les paramétres DNS imposés centralement.\nCela 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 \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 cauchemar.\u003c/p\u003e\n\u003cp\u003eDoH gène complétement l\u0026rsquo;analyse réseau et la surveillance du trafic DNS à des fins de sécurité.\nEn 2019, Godlua, un bot Linux DDoS, était le premier \u003ca href=\"https://fr.wikipedia.org/wiki/Logiciel_malveillant\" rel=\"external\"\u003elogiciel malveillant\u003c/a\u003e vu à \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 aucunément le suivi des utilisateurs\u003c/strong\u003e.\nCertaines parties de la connection HTTPS ne sont pas chiffrées, tels que les \u003ca href=\"https://fr.wikipedia.org/wiki/Server_Name_Indication\" rel=\"external\"\u003echamps SNI\u003c/a\u003e (mais on y arrive lentement), les \u003ca href=\"https://fr.wikipedia.org/wiki/Online_Certificate_Status_Protocol\" rel=\"external\"\u003econnexions OCSP\u003c/a\u003e, et bien sûr \u003cstrong\u003eles adresses IP de destination\u003c/strong\u003e, ce qui à mon humble avis est 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 journalistes dans des pays ayant une politique de confidentialité compromise, ne peuvent faire confiance à DoH !\nL\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é.\nSi quelqu\u0026rsquo;un a vraiment besoin de chiffrer la communication, il a besoin d\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, 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 ?\u003c/p\u003e\n\u003cp\u003eCertains 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 \u003ca href=\"https://en.wikipedia.org/wiki/DNS_over_TLS\" rel=\"external\"\u003eDoT (DNS over TLS)\u003c/a\u003e, puisque les requêtes DNS sont cachées dans le large flux du trafic HTTPS.\nCela donne aux administrateurs réseaux moins de visibilité mais fournit aux 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 caché dans le trafic HTTPS, l\u0026rsquo;adresse IP de destination fournit par le serveur DoH ne l\u0026rsquo;est pas.\nQuand 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).\u003c/p\u003e\n\u003cp\u003eBien 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.\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é \u003ca href=\"/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/#inspecter-dns-sur-https-doh\"\u003eInspecter DNS sur HTTPS (DOH)\u003c/a\u003e, dans laquelle nous ferons une démonstration de comment l\u0026rsquo;adresse IP de destination est révélée dans la communication DoH.\nVous pouvez aussi trouver un chapitre appellé \u003ca href=\"/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/#bloquer-dns-sur-https-doh\"\u003eBloquer DNS sur HTTPS (DOH)\u003c/a\u003e dans laquelle 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 paramètres par défaut, mais est aussi très bien documenté.\nAvant que nous commencions, je vous recommande de regarder les pages des manuels OpenBSD pour \u003ca href=\"https://man.openbsd.org/unbound\" rel=\"external\"\u003eunbound\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/unbound-checkconf\" rel=\"external\"\u003eunbound-checkconf\u003c/a\u003e et \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 sur OpenBSD, le fichier de configuration \u003ccode\u003eunbound.conf\u003c/code\u003e ne réside pas dans \u003ccode\u003e/etc\u003c/code\u003e, là où il devrait être normalement, mais à la place réside dans \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 \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 plus profondes concernant la configuration, regardez la page du manuel \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 chroot 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 section 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 est chrooté.\nAvec l\u0026rsquo;option \u003ccode\u003elogfile\u003c/code\u003e ci-dessus, le fichier log se retrouve dans \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 loopback (127.0.0.1) en premier afin que les applications réseaux locales soient 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é notre serveur DNS Unbound, car je ne veux rien sur le routeur qui interroge les 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 modem ou routeur de votre FAI), vous devez vous assurez que \u003ca href=\"https://man.openbsd.org/dhclient\" rel=\"external\"\u003edhclient\u003c/a\u003e ne 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 redé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 le 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 suivante (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 fait 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 faire 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 pour 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 personnes sur des valeurs TTL ridiculeusement basses pour leurs domaines.\nPour certaines raisons, il est presque tendance d\u0026rsquo;avoir une valeur par dé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 le DNS cache.\nUne requête utilisera seulement la réponse en cache aussi longtemps que le TTL ne soit pas expiré.\nMême au-travers des RFC qui disent qu\u0026rsquo;un TTL doit être respecté, de telles valeurs basses rend le DNS extrêmement inefficace.\nJe recommande toutefois que vous surchargiez le paramétrage TTL par celui d\u0026rsquo;une heure par défaut.\nUne 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.\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 obtenir une nouvelle adresse IP qui ne peut pas être résolu puisque l\u0026rsquo;ancienne entrée est dans le cache.\nToutefois, 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.\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 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\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 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.\nVous pouvez facilement ajouter de nouvelles listes de blocage ou supprimer l\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 dans ce tutoriel.\u003c/p\u003e\n\u003cp\u003eActuellement 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.\u003c/p\u003e\n\u003cp\u003eAfin d\u0026rsquo;éviter qu\u0026rsquo;Unbound tombe en panne lors du chargement de la liste, é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 dans 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 la dans \u003ccode\u003e/var/unbound/etc/\u003c/code\u003e et éditez le fichier de configuration d\u0026rsquo;Unbound \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 qu\u0026rsquo;Unbound consomme pas mal de ressources CPU lors du chargement initial de 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 vers 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 3lift.com en répondant avec un NXDOMAIN, alors que le serveur DNS de Cloudflare 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 concernent 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 de 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 DNS 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 redirigées vers un autre serveur DNS.\nC\u0026rsquo;est typiquement fait en redirigeant tout le trafic sur le port 53 à destination d\u0026rsquo;un autre.\u003c/p\u003e\n\u003cp\u003eUn 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é.\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 champ \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 la réponse fait autorité.\nEssayons de l\u0026rsquo;obtenir depuis le serveur DNS publique de Cloudflare avec la 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 faite 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 obtenu \u003cstrong\u003efaisait autorité\u003c/strong\u003e, ce qui signifie que notre requête DNS n\u0026rsquo;a pas té détournée.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai maintenant activé un service VPN que je connais pour intercepter les requê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 puis 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é directement le serveur faisant autorité.\nLe trafic DNS \u003cstrong\u003ea été détourné\u003c/strong\u003e et la réponse a été redirigé depuis un autre 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, est hautement problèmatique.\nTout d\u0026rsquo;abord, nous ne pouvons avoir pleinement confiance aux réponses que nous obtenons depuis le serveur DNS.\nEn 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.\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, 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.\nLe 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.\nJe ne sais pas combien de FAI et fournisseurs de service DNS publique le font 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é, vous 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 qui ne fait pas de détournement ou ne bloque pas le port 53.\nEnsuite, 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.\u003c/li\u003e\n\u003cli\u003eUtilisez 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.\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 du détournement de DNS.\nAlors 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.\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 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.\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 de la couche application en effectuant une validation de bout en bout une fois 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 utilise des signatures digitales cryptographiques avec un certificat de clé publique de confiance pour déterminer l\u0026rsquo;authenticité des données.\nDNSSEC peut protéger contre l\u0026rsquo;usurpation de DNS, toutefois beaucoup d\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 le font les TLD de code de pays, mais de nombreux TLD de code de pays ne le 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 confidentialité autant de l\u0026rsquo;adresse IP source que celle de destination, qui 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 ordinateurs du LAN pour adultes, et je surveille le trafic sur l\u0026rsquo;interface \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 remplir inutilement syslog avec trop de bruits DNS, et j\u0026rsquo;ai utilisé \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 surveillance 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 que 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 paramé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 tant 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 le DNS régulier comme solution de repli.\nAvant de forcer Firefox à utiliser seulement DoH, vous devez paramétrer la 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 \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 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.\nDans le même temps, rien n\u0026rsquo;est arrivé dans le journal d\u0026rsquo;Unbound, \u003ccode\u003etail\u003c/code\u003e nous 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 vé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 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.\u003c/p\u003e\n\u003cp\u003eCela 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.\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 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.\u003c/p\u003e\n\u003cp\u003eBloquer 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.\nLa 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.\u003c/p\u003e\n\u003cp\u003eJ\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 \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 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).\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 utilisez 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; de \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 avoir à 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 et éditez les selon vos besoins et enregistrez les quelque part sur le disque.\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 les 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 \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; du 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 actuellement 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 les 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 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.\nCela est dû à des outils tel que \u003ccode\u003ehost\u003c/code\u003e qui s\u0026rsquo;attend à ce que la recherche vers un nom d\u0026rsquo;hôte soit \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 \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 adresse, ou je ne me souviens pas quel hôte a l\u0026rsquo;adresse IP 192.168.1.7 associé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 à chaque fois.\nSi nous ajoutons l\u0026rsquo;option \u003ca href=\"https://man.openbsd.org/dhcp-options#option~24\" rel=\"external\"\u003edomain-name\u003c/a\u003e à \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 l\u0026rsquo;utiliser en interne sur votre LAN, et bien que ce soit certainement fonctionnel, 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, \u003ccode\u003e.home\u003c/code\u003e ou \u003ccode\u003e.lan\u003c/code\u003e, en accord avec la \u003ca href=\"https://tools.ietf.org/html/rfc6762#appendix-G\" rel=\"external\"\u003eRFC 6762\u003c/a\u003e sans aucun problè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 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.\u003c/p\u003e\n\u003cp\u003eDans notre paramétrage actuel, nous avons déjà le domaine \u003ccode\u003eexample.com\u003c/code\u003e attaché à 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, changez-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, parce 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 que \u003ccode\u003eexample.com\u003c/code\u003e est pour votre développement web professionnel, et que \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 avec l\u0026rsquo;option \u003ccode\u003edomain-search\u003c/code\u003e dans \u003ccode\u003e/etc/dhcpd.conf\u003c/code\u003e au lieu de l\u0026rsquo;option \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 domaine est ajouté, alors qu\u0026rsquo;avec l\u0026rsquo;option \u003ccode\u003edomain-search\u003c/code\u003e, 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é.\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 fixes.\nDans cet exemple, nous avons seulement le serveur web, mais nous pouvons utiliser autant d\u0026rsquo;hôtes que nécessaires.\nVous 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.\nCréez un nouveau fichier appelé tel que \u003ccode\u003e/var/unbound/etc/unbound-local.conf\u003c/code\u003e, par 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é, ce 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 des LAN et le connectez à nouveau, vous serez notifié que \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e a 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 multiples 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 fortement à 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 qui bloque les plus grandes choses irritantes d\u0026rsquo;Internet.\nLes désagréments tels les brute-forceurs SSH et SMTP sont largement éliminés par ce script.\u003c/p\u003e\n\u003cp\u003epf-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.\npf-badhost les ajoute alors aux adresses IP collectées vers le pare-feu PF 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 de la FAQ d\u0026rsquo;OpenBSD\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mwl.io/nonfiction/os#ao2e\" rel=\"external\"\u003eAbsolute OpenBSD, 2nd edition\u003c/a\u003e de Michael Warren Lucas.\nCertaines syntaxes de PF ont déjà changées depuis que Michael a écrit le livre, 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 de 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, correction, 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 personnes contribuant généreusement à ce guide. De fait, je ne suis pas responsable 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 est 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 \u003ca href=\"/fr/don/\"\u003ebon café à l\u0026rsquo;italienne comme je les \u0026lt;3\u003c/a\u003e… :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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-11-21:/fr/trad/revues#7a2c47be89f8f39d385d137530b960b5de902363ca6118fa7565ae3a23a9f25f","url":"https://it-log.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 étaient hébergés sur le wiki de la communauté \u0026ldquo;OpenBSD pour Tous\u0026rdquo; (obsd4a) !\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 D\u0026rsquo;autres fausses croyances des développeurs à-propos du temps\u0026quot; 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… ⇒ 2026\nEn mai, \u0026ldquo;OpenSMTPD : le serveur mail du futur\u0026rdquo;, traduction de l\u0026rsquo;article de Peter N.M. Hansteen : OpenSMTPD Is The Mail Server For The Future 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 que j\u0026rsquo;ai faites, soit par mes propres soins, soit en collaborant avec des équipes :\u003c/p\u003e\n\u003ch3 id=\"diverses\"\u003eDiverses\u003c/h3\u003e\n\u003cp\u003eLa plupart de ces traductions diverses étaient hébergés sur le wiki de la communauté \u0026ldquo;OpenBSD pour Tous\u0026rdquo; \u003cem\u003e(obsd4a)\u003c/em\u003e !\u003c/p\u003e\n\u003cp\u003e⇒ Date inconnue : l\u0026rsquo;article \u0026ldquo;\u003ca href=\"/fr/trad/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://web.archive.org/web/20211103172438/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 href=\"/fr/trad/fausses-croyances-dev-temps/\"\u003eFausses croyances des développeurs à-propos du temps\u003c/a\u003e\u0026rdquo; et \u003ca href=\"/fr/trad/fausses-croyances-dev-temps-2/\"\u003eD\u0026rsquo;autres fausses croyances des développeurs à-propos du temps\u003c/a\u003e\u0026quot;\u003c/li\u003e\n\u003cli\u003eEn Juin : de l\u0026rsquo;article \u0026ldquo;\u003ca href=\"/fr/trad/tumfatig.net/openbsd-collectd-influxdb-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 href=\"/fr/trad/tumfatig.net/telegraf-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 href=\"/fr/trad/jcs.org/openbsd-surface-go/\"\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 href=\"/fr/trad/tumfatig.net/openbsd-raspberry-pi3/\"\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://web.archive.org/web/20211103172438/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 \u003ca href=\"https://web.archive.org/web/20211103172438/https://wiki.openbsd.fr.eu.org/doku.php/trad/hambsd/start\" rel=\"external\"\u003eHamBSD.org\u003c/a\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 href=\"/fr/trad/bsdhowto.ch/externaldns/\"\u003eComment créer un serveur de noms avec DNS-over-TLS (DoT)\u003c/a\u003e\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;\u003ca href=\"/fr/trad/bsdhowto.ch/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;\u003ca href=\"/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/\"\u003e Guide du Routeur OpenBSD\u003c/a\u003e\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;\u003ca href=\"/fr/trad/solene-rapenne/cryptpad-openbsd/\"\u003e Héberger votre suite web office Cryptpad sous OpenBSD\u003c/a\u003e…\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003e2026\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEn mai, \u0026ldquo;\u003ca href=\"/fr/trad/petern-n-m-hansteen/opensmtpd-is-mail-server-for-future/\"\u003eOpenSMTPD : le serveur mail du futur\u003c/a\u003e\u0026rdquo;, traduction de l\u0026rsquo;article de Peter N.M. Hansteen : \u003ca href=\"https://nxdomain.no/~peter/time_for_opensmtpd.html\" rel=\"external\"\u003eOpenSMTPD Is The Mail Server For The Future\u003c/a\u003e\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 s\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 ⇒ \u003ca href=\"/fr/trad/developpez.net/Dive-Into-Python-6-closures-et-generateurs/\"\u003eDive Into Python 3 - 6 : Closures et Générateurs\u003c/a\u003e\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 ⇒ \u003ca href=\"/fr/trad/developpez.net/Dive-Into-Python-8-Iterateurs-Avances/\"\u003eDive Into Python 3 - 8 : Itérateurs avancés\u003c/a\u003e\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 ⇒ \u003ca href=\"/fr/trad/developpez.net/PyMOTW3-Structures-de-donnees/\"\u003ePython 3 Module of the Week - Chap 2 : Data Structures\u003c/a\u003e\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 assez 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, principal administrateur, et traducteur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles différentes \u003ca href=\"https://web.archive.org/web/20211103172438/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://web.archive.org/web/20211103172438/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://web.archive.org/web/20211103172438/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://web.archive.org/web/20211103172438/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://web.archive.org/web/20211103172438/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://web.archive.org/web/20211103172438/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://web.archive.org/web/20211103172438/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://web.archive.org/web/20211103172438/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://web.archive.org/web/20211103172438/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 ou \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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-11-20:/fr/sys/debian/add-apt-key#5ff0d495aafdd718ecc9c675b9fb19ca3608f6385066ed0ac38c734c1362bdef","url":"https://it-log.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\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","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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-11-03:/fr/sys/openbsd/tip-bluetooth#ab227f59ca9b4beecb5f77b109999f6219a65c1d98a28343562ba8cf61b9ca49","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-09-20:/fr/sys/openwrt/openssh#43cd959c52ca8b127dec39c3f8c7c19862e1b2cca5acb78ed27462cac74db9a6","url":"https://it-log.fr.eu.org/fr/sys/openwrt/openssh/","title":"OpenWRT : OpenSSH pour remplacer Dropbear","author":{"name":"Stéphane HUC"},"content_text":"opkg → apk Le projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet. 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":"\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eopkg → apk\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLe projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet.\u003c/strong\u003e\u003c/div\u003e\n\n\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\"\u003e\n    Comparison_of_SSH_servers\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\u003c/a\u003e\n, \u003ca href=\"https://en.wikipedia.org/wiki/FIPS_140-2\" title=\"Article Wikipédia : FIPS_140-2\"\u003e\n    FIPS_140-2\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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\"\u003e\n    Situation_de_compétition\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-09-18:/fr/sec/ssh/sshd-durci#b5715361d1f88f29490fb732bee78a815f0cf4375e17aa1a399a3fa9dbb991e4","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-09-18:/fr/sys/openbsd/tip-compose#abfffabf9e8530fb657ae76c44bcd889340cc2bf6068f459fa84acb5da93f8ec","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-09-16:/fr/trad/que-se-passe-t-il-quand-vous-ecrivez-dans-la-barre-d-adresse-du-navigateur-web#a63f54ed79306f1cf2cc748d99fa9085c36d183390a8e5e035f9c1cb9c82ba9f","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-09-14:/fr/sys/openwrt/sysupgrade#5bf9e428f5910a71524ae4b1b64b79da69e5b8ca9b84583a41e2ecd5fe63ccaa","url":"https://it-log.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":"opkg → apk Le projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet. AttentionMerci de vous dirigez vers la page\nOpenWRT : Attented Sysupgrade… (ou comment gérer correctement la mise à niveau ≥ 25.12) 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.\n⇒ Récupèrons le depuis opkgscript.sh :\n:$ curl -O https://raw.githubusercontent.com/richb-hanover/OpenWrtScripts/master/opkgscript.sh ⇒ Donnons les droits d\u0026rsquo;exécution nécessaire :\n:# chmod 0700 opkgscript.sh ⇒ Sauvegardons la liste des paquets installés - pour pouvoir restaurer après la mise à niveau système :\n:# ./opkgscript.sh -v write Le script écrit la liste dans un fichier /etc/config/opkg.installed.\nTéléchargement firmware Depuis le répertoire /tmp, récupèrons la nouvelle version du firmware :\ne.g. pour la version actuelle : :# v=\u0026quot;24.10.5\u0026quot;\n⇒ pour le routeur OpenWRT One :\n:# curl -O https://downloads.openwrt.org/releases/\u0026quot;${v}\u0026quot;/targets/mediatek/filogic/{openwrt-\u0026quot;${v}\u0026quot;-mediatek-filogic-openwrt_one-squashfs-sysupgrade.itb,sha256sums}\n⇒ pour le routeur Ubiquiti EdgeRouter X :\n:# curl -O https://downloads.openwrt.org/releases/\u0026quot;${v}\u0026quot;/targets/ramips/mt7621/{openwrt-\u0026quot;${v}\u0026quot;-ramips-mt7621-ubnt_edgerouter-x-squashfs-sysupgrade.bin,sha256sums}\n⇒ pour le Xiaomi Mi Router AX3000T :\n:# curl -O https://downloads.openwrt.org/releases/\u0026quot;${v}\u0026quot;/targets/mediatek/filogic/{openwrt-\u0026quot;${v}\u0026quot;-mediatek-filogic-xiaomi_mi-router-ax3000t-squashfs-sysupgrade.bin,sha256sums}\n⇒ pour le Xiaomi Redmi Router AC2100 :\n:# curl -O https://downloads.openwrt.org/releases/\u0026quot;${v}\u0026quot;/targets/ramips/mt7621/{openwrt-\u0026quot;${v}\u0026quot;-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin,sha256sums}\nVérification du téléchargement Puis, nous vérifions la somme de contrôle afin de nous assurer du firmware :\n:$ 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\nDangerATTENTION : Si la vérification échoue, allez en discuter sur le forum !\nNe cherchez pas à mettre à jour avec un micro-logiciel corrompu !!!\nSauvegarde configuration L\u0026rsquo;étape suivante est de vérifier la configuration de la sauvegarde :\n:# 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 :\n/etc/sudoers /etc/sudoers.d/ Vérifions à nouveau - et sauvegardons la configuration :\n:# 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ù \u0026lsquo;openwrt\u0026rsquo; est l\u0026rsquo;adresse IP de votre routeur…)\nInfoSi 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.\nMise à Niveau Système Passons à la mise à niveau système, tel que, par exemple :\n:# sysupgrade -v openwrt-\u0026quot;${v}\u0026quot;-*-sysupgrade.bin ou :# sysupgrade -v openwrt-\u0026quot;${v}\u0026quot;-*-sysupgrade.itb selon le modèle de routeur.\n⇒ Exemple, pour le routeur OpenWRT One :\n:# 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 !\nInfoLors 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.\nVérification nouvelle version À partir du moment où vous pourrez vous connecter à nouveau à votre routeur, vous retrouverez l\u0026rsquo;information relative à votre nouvelle version :\ndepuis LuCI, aller vers \u0026ldquo;Status\u0026rdquo; \u0026gt; \u0026ldquo;Overview\u0026rdquo;, celui-ci sera affiché dans la section \u0026ldquo;System\u0026rdquo;, face à l\u0026rsquo;information \u0026ldquo;Firmware version\u0026rdquo; en SSH, dans la bannière de connexion affichant ce nouveau numéro de version, comme ci-dessous : 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 \u0026ldquo;tiers\u0026rdquo; 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 :\n:# opkg update \u0026amp;\u0026amp; opkg list-upgradable\nNormalement suite à la mise à niveau, il ne devrait pas y en avoir.\nS\u0026rsquo;il y en a, exécutez la commande suivante :\n:# 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\u0026rsquo;installation de l\u0026rsquo;outil curl, puis du script opkgscript.sh.\nEt une fois installé et les droits d\u0026rsquo;exécution attribués, on l\u0026rsquo;exécute pour qu\u0026rsquo;il complète l\u0026rsquo;installation du \u0026ldquo;profil utilisateur\u0026rdquo; :\n:# ./opkgscript.sh -v install Pour finir, mieux vaut redémarrer !\nUltimes Vérifications Ensuite, vérifier la configuration de votre routeur :\nque vos différentes interfaces réseaux soient toujours présentes et opérationnelles. que votre configuration \u0026ldquo;firewall\u0026rdquo; 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\u0026rsquo;un tunnel IPv6 , OpenVPN, ou tout service accessible depuis le menu \u0026ldquo;Services\u0026rdquo;. Voilà…\nNormalement, tout devrait fonctionner correctement en suivant ce processus de mise à niveau.\nNotes Retrouvez ci-dessous différentes notes d\u0026rsquo;informations utiles, seulement dans certains contextes.\nFlash depuis LuCI Depuis le menu \u0026ldquo;System\u0026rdquo; \u0026gt; \u0026ldquo;Backup / Flash firmware\u0026rdquo; de l\u0026rsquo;interface web LuCI :\n1/ Il est utile d\u0026rsquo;aller à l\u0026rsquo;onglet \u0026lsquo;Configuration\u0026rsquo; pour modifier la liste des fichiers personnalisés à sauvegarder aussi… Si les fichiers et autres répertoires relatifs à l\u0026rsquo;installation de binaires tiers ne sont pas écrits ici, rien ne sera sauvegardé !\n2/ Faites une sauvegarde de votre configuration d\u0026rsquo;OpenWRT depuis l\u0026rsquo;onglet \u0026lsquo;Actions\u0026rsquo;, section \u0026lsquo;Backup\u0026rsquo;.\n3/ Lors du processus pour flasher une nouvelle image de mise à niveau :\n⇒ Pensez à utiliser les options :\nla 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.\nDe même les binaires tiers seront dans tous les cas à réinstaller, voire à reconfigurer.\nGardez à l\u0026rsquo;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.\nÀ-propos de SSH v9.0 et supérieure Si votre client SSH est de version ≥ 9.0 :\nÀ partir de la version 9.0 de SSH, le comportement de scp a changé. Dans l\u0026rsquo;état, la commande ci-dessus échouera avec le message d\u0026rsquo;erreur suivant :\nscp 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…\nAjoutez l\u0026rsquo;option -O à la commande scp, tel que : :$ scp -O root@openwrt:/tmp/backup*.tar.gz $(pwd) (cela rétablit l\u0026rsquo;ancien comportement SFTP de scp)\nUne autre astuce est d\u0026rsquo;installer le serveur OpenSSH en lieu et place de Dropbear .\nLibération mémoire Cette section est surtout utile si le système de fichier /tmp n\u0026rsquo;est pas assez grand pour enregistrer l\u0026rsquo;image d\u0026rsquo;OpenWRT. Les actions ci-dessous vont permettre de libérer temporairement de l\u0026rsquo;espace dans la RAM.\nPar acquis de conscience, assurons-nous de l\u0026rsquo;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\u0026rsquo;image téléchargée. Si c\u0026rsquo;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\u0026rsquo;OpenWRT.\nPrenons un exemple pour mieux comprendre :\n⇒ la taille du binaire d\u0026rsquo;upgrade de la version ci-dessus :\n:$ 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.\n⇒ L\u0026rsquo;espace disponible dans /tmp :\n:# 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\u0026rsquo;espace disponible est de 59.1 Mo, ce qui est largement suffisant pour récupèrer l\u0026rsquo;image de mise à niveau et la gérer.\n⇒ De même, l\u0026rsquo;espace libérée de mémoire :\n:# free -m total used free shared buff/cache available Mem: 122220 40532 61400 540 20288 46700 Swap: 0 0 0 Dans ce contexte, l\u0026rsquo;espace libre en mémoire est de d\u0026rsquo;environ 60 Mo. Là, encore, il y a assez d\u0026rsquo;espace pour gérer l\u0026rsquo;image de mise à niveau.\nSi ainsi, dans votre contexte, l\u0026rsquo;espace totale disponible, soit celle de la mémoire plus celle en /tmp n\u0026rsquo;est pas assez grande, il est possible d\u0026rsquo;essayer ce qui suit - supprimer ce qui devient désormais inutile :\nles 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\u0026rsquo;il n\u0026rsquo;y ait aucun lien symbolique dans le répertoire /etc/modules.d, si c\u0026rsquo;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\u0026rsquo;identification de l\u0026rsquo;hôte à distance par SSH Lors de la nouvelle connexion par SSH, il est normalement possible que vous ayez le droit au message d\u0026rsquo;erreur suivant :\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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\u0026rsquo;est normal ! Ayant changé de version de système d\u0026rsquo;exploitation, l\u0026rsquo;identification de l\u0026rsquo;hôte a changé aussi. Appliquez la commande ssh-keygen, telle que donnée, dans votre cas, pour supprimer l\u0026rsquo;ancienne identification d\u0026rsquo;hôte. Puis retentez votre connexion.\nAttentionAprè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\u0026rsquo;est bien !\nMais avant de faire toute autre action, connectez-vous à l\u0026rsquo;interface web, puis sur le menu \u0026ldquo;Interfaces\u0026rdquo; ; il va vous être proposé de faire une migration de la configuration, faites-la !\nPuis, redémarrez !\nresolv.conf À ce moment de l\u0026rsquo;étape, il est possible que vous ne puissiez plus communiquer avec l\u0026rsquo;extérieur, car le fichier /etc/resolv.conf est toujours configuré pour la résolution de noms en interne, tel que :\n:# 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 :\n:# 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 !\nDocumentations Comme vous pourrez le lire dans la documentation du wiki OpenWRT, il y a d\u0026rsquo;autres méthodes ; celle que je vous propose me semble la plus pertinente…\nUpgrading OpenWrt firmware using LuCI and CLI Upgrading OpenWrt firmware using LuCI Upgrading OpenWrt firmware using CLI ","content_html":"\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eopkg → apk\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLe projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet.\u003c/strong\u003e\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\u003eMerci de vous dirigez vers la page\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openwrt/attented-sysupgrade/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Attented Sysupgrade… (ou comment gérer correctement la mise à niveau ≥ 25.12) '\"\u003eOpenWRT : Attented Sysupgrade… (ou comment gérer correctement la mise à niveau ≥ 25.12) \u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"opkgscriptsh\"\u003eopkgscript.sh\u003c/h3\u003e\n\u003cp\u003eLe script \u003ccode\u003eopkgscript.sh\u003c/code\u003e permet de sauvegarder la liste des paquets\ninstallés en sus de la base.\u003c/p\u003e\n\u003cp\u003e⇒ Récupèrons le depuis \u003ca href=\"https://raw.githubusercontent.com/richb-hanover/OpenWrtScripts/master/opkgscript.sh\" rel=\"external\"\u003eopkgscript.sh\u003c/a\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:$ curl -O https://raw.githubusercontent.com/richb-hanover/OpenWrtScripts/master/opkgscript.sh\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Donnons les droits d\u0026rsquo;exécution nécessaire :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# chmod 0700 opkgscript.sh\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Sauvegardons la liste des paquets installés - \u003cem\u003epour pouvoir restaurer\naprès la mise à niveau 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:# ./opkgscript.sh -v write\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe script écrit la liste dans un fichier \u003ccode\u003e/etc/config/opkg.installed\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"téléchargement-firmware\"\u003eTéléchargement firmware\u003c/h3\u003e\n\u003cp\u003eDepuis le répertoire \u003ccode\u003e/tmp\u003c/code\u003e, récupèrons la nouvelle version du firmware :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ee.g. pour la version actuelle :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003e:# v=\u0026quot;24.10.5\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ pour le routeur \u003cstrong\u003eOpenWRT One\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# curl -O https://downloads.openwrt.org/releases/\u0026quot;${v}\u0026quot;/targets/mediatek/filogic/{openwrt-\u0026quot;${v}\u0026quot;-mediatek-filogic-openwrt_one-squashfs-sysupgrade.itb,sha256sums}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ pour le routeur \u003cstrong\u003eUbiquiti EdgeRouter X\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# curl -O https://downloads.openwrt.org/releases/\u0026quot;${v}\u0026quot;/targets/ramips/mt7621/{openwrt-\u0026quot;${v}\u0026quot;-ramips-mt7621-ubnt_edgerouter-x-squashfs-sysupgrade.bin,sha256sums}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ pour le \u003cstrong\u003eXiaomi Mi Router AX3000T\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# curl -O https://downloads.openwrt.org/releases/\u0026quot;${v}\u0026quot;/targets/mediatek/filogic/{openwrt-\u0026quot;${v}\u0026quot;-mediatek-filogic-xiaomi_mi-router-ax3000t-squashfs-sysupgrade.bin,sha256sums}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ pour le \u003cstrong\u003eXiaomi Redmi Router AC2100\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# curl -O https://downloads.openwrt.org/releases/\u0026quot;${v}\u0026quot;/targets/ramips/mt7621/{openwrt-\u0026quot;${v}\u0026quot;-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin,sha256sums}\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"vérification-du-téléchargement\"\u003eVérification du téléchargement\u003c/h4\u003e\n\u003cp\u003ePuis, nous vérifions la somme de contrôle afin de nous assurer du 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:$ sha256sum -c sha256sums 2\u0026gt; /dev/null | grep OK\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Résultat correct pour le routeur \u003cstrong\u003eOpenWRT One\u003c/strong\u003e : \u003cbr\u003e\n\u003ccode\u003eopenwrt-24.10.4-mediatek-filogic-openwrt_one-squashfs-sysupgrade.itb: OK\u003c/code\u003e\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 : 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\u003ch3 id=\"sauvegarde-configuration\"\u003eSauvegarde configuration\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;étape suivante est de vérifier la configuration de la sauvegarde :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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:# sysupgrade -l\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi nécessaire, il faut éditer le fichier pour ajouter certains répertoires/fichiers,\nainsi 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,\nil faudra ajouter ce qui suit dans le fichier \u003ccode\u003e/etc/sysupgrade.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e/etc/sudoers\u003c/li\u003e\n\u003cli\u003e/etc/sudoers.d/\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVérifions à nouveau - et sauvegardons 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:# 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\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\"\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\u003chr\u003e\n\u003cp\u003ePuis, il faut récupèrer cette sauvegarde :\n\u003ccode\u003e:$ scp root@openwrt:/tmp/backup*.tar.gz $(pwd)\u003c/code\u003e\n\u003cem\u003e(où \u0026lsquo;openwrt\u0026rsquo; est l\u0026rsquo;adresse IP de votre routeur…)\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\"\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\u003chr\u003e\n\u003ch3 id=\"mise-à-niveau-système\"\u003eMise à Niveau Système\u003c/h3\u003e\n\u003cp\u003ePassons à la mise à niveau système, tel que, par exemple :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# sysupgrade -v openwrt-\u0026quot;${v}\u0026quot;-*-sysupgrade.bin\u003c/code\u003e ou \u003cbr\u003e\n\u003ccode\u003e:# sysupgrade -v openwrt-\u0026quot;${v}\u0026quot;-*-sysupgrade.itb\u003c/code\u003e selon le modèle de routeur.\u003c/p\u003e\n\u003cp\u003e⇒ Exemple, pour le routeur \u003cstrong\u003eOpenWRT One\u003c/strong\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# sysupgrade -v openwrt-\u0026#34;$v\u0026#34;-mediatek-filogic-openwrt_one-squashfs-sysupgrade.itb\n(date) upgrade: Saving config files...\netc/config/attendedsysupgrade\netc/config/dhcp\netc/config/dropbear\netc/config/firewall\netc/config/https-dns-proxy\netc/config/luci\netc/config/network\netc/config/opkg.installed\netc/config/rpcd\netc/config/system\netc/config/ubihealthd\netc/config/ubootenv\netc/config/uhttpd\netc/config/unbound\netc/config/wifi_schedule\netc/config/wireless\netc/crontabs/root\netc/dropbear/authorized_keys\netc/dropbear/dropbear_ed25519_host_key\netc/dropbear/dropbear_rsa_host_key\netc/fw_env.config\netc/group\netc/hosts\netc/inittab\netc/luci-uploads/.placeholder\netc/nftables.d/10-custom-filter-chains.nft\netc/nftables.d/README\netc/opkg/keys/8a11255d14aef6c8\netc/opkg/keys/d310c6f2833e97f7\netc/passwd\netc/profile\netc/profile.d/busybox-history-file.sh\netc/rc.local\netc/shadow\netc/shells\netc/shinit\netc/sysctl.conf\netc/sysupgrade.conf\netc/uhttpd.crt\netc/uhttpd.key\netc/unbound/unbound.conf\netc/unbound/unbound_ext.conf\nroot/opkgscript.sh\n(date) upgrade: Commencing upgrade. Closing all shell sessions.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNormalement votre session SSH va se fermer et le routeur démarrer !\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\"\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\u003ch4 id=\"vérification-nouvelle-version\"\u003eVérification nouvelle version\u003c/h4\u003e\n\u003cp\u003eÀ partir du moment où vous pourrez vous connecter à nouveau à votre routeur,\nvous retrouverez l\u0026rsquo;information relative à votre nouvelle version :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edepuis LuCI, aller vers \u0026ldquo;Status\u0026rdquo; \u0026gt; \u0026ldquo;Overview\u0026rdquo;, celui-ci sera affiché\ndans la section \u0026ldquo;System\u0026rdquo;, face à l\u0026rsquo;information \u0026ldquo;Firmware version\u0026rdquo;\u003c/li\u003e\n\u003cli\u003een SSH, dans la bannière de connexion affichant ce nouveau numéro de\nversion, comme ci-dessous :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003eBusyBox v1.36.1 (2025-12-17 21:08:22 UTC) built-in shell (ash)\n\n  _______                     ________        __\n |       |.-----.-----.-----.|  |  |  |.----.|  |_\n |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|\n |_______||   __|_____|__|__||________||__|  |____|\n          |__| W I R E L E S S   F R E E D O M\n -----------------------------------------------------\n OpenWrt 24.10.5, r29087-d9c5716d1d\n -----------------------------------------------------\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch3 id=\"mise-à-niveau-tiers\"\u003eMise à Niveau \u0026ldquo;tiers\u0026rdquo;\u003c/h3\u003e\n\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\u003cp\u003e⇒ Effectuons la mise à niveau des paquets tiers :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# opkg update \u0026amp;\u0026amp; opkg list-upgradable\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eNormalement suite à la mise à niveau, il ne devrait pas y en avoir.\u003c/p\u003e\n\u003cp\u003eS\u0026rsquo;il y en a, exécutez 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 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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"restauration-profil-utilisateur\"\u003eRestauration profil utilisateur\u003c/h3\u003e\n\u003cp\u003ePour restaurer le profil utilisateur, on répète les étapes d\u0026rsquo;installation\nde l\u0026rsquo;outil curl, puis du script \u003ccode\u003eopkgscript.sh\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eEt une fois installé et les droits d\u0026rsquo;exécution attribués, on l\u0026rsquo;exécute pour\nqu\u0026rsquo;il complète l\u0026rsquo;installation du \u0026ldquo;profil utilisateur\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-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# ./opkgscript.sh -v install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour finir, mieux vaut redémarrer !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"ultimes-vérifications\"\u003eUltimes Vérifications\u003c/h2\u003e\n\u003cp\u003eEnsuite, vérifier la configuration de votre routeur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eque vos différentes interfaces réseaux soient toujours présentes et\nopérationnelles.\u003c/li\u003e\n\u003cli\u003eque votre configuration \u0026ldquo;firewall\u0026rdquo; soit correcte ; vérifiez dans les\ndifférents onglets votre configuration.\u003c/li\u003e\n\u003cli\u003eque les différents services, que vous auriez précédement installés,\nsoient toujours opérationnels, tel qu\u0026rsquo;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\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, OpenVPN,\nou tout service accessible depuis le menu \u0026ldquo;Services\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà…\u003c/p\u003e\n\u003cp\u003eNormalement, tout devrait fonctionner correctement en suivant\nce processus de mise à niveau.\u003c/p\u003e\n\u003ch2 id=\"notes\"\u003eNotes\u003c/h2\u003e\n\u003cp\u003eRetrouvez ci-dessous différentes notes d\u0026rsquo;informations utiles, seulement\ndans certains contextes.\u003c/p\u003e\n\u003ch3 id=\"flash-depuis-luci\"\u003eFlash depuis LuCI\u003c/h3\u003e\n\u003cp\u003eDepuis le menu \u0026ldquo;System\u0026rdquo; \u0026gt; \u0026ldquo;Backup / Flash firmware\u0026rdquo; de l\u0026rsquo;interface web LuCI :\u003c/p\u003e\n\u003cp\u003e1/ Il est utile d\u0026rsquo;aller à l\u0026rsquo;onglet \u0026lsquo;Configuration\u0026rsquo; pour modifier la liste\ndes fichiers personnalisés à sauvegarder aussi… \u003cbr\u003e\nSi les fichiers et autres répertoires relatifs à l\u0026rsquo;installation de binaires\ntiers ne sont pas écrits ici, rien ne sera sauvegardé !\u003c/p\u003e\n\u003cp\u003e2/ Faites une sauvegarde de votre configuration d\u0026rsquo;OpenWRT depuis l\u0026rsquo;onglet\n\u0026lsquo;Actions\u0026rsquo;, section \u0026lsquo;Backup\u0026rsquo;.\u003c/p\u003e\n\u003cp\u003e3/ Lors du processus pour flasher une nouvelle image de mise à niveau :\u003c/p\u003e\n\u003cp\u003e⇒ Pensez à utiliser les options :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela case à cocher \u003cstrong\u003eKEEP SETTINGS AND RETAIN THE CURRENT CONFIGURATION\u003c/strong\u003e,\nà minima\u003c/li\u003e\n\u003cli\u003ela case à cocher \u003cstrong\u003eINCLUDE IN BACKUP A LIST OF CURRENT INSTALLED PACKAGES AT /ETC/BACKUP/INSTALLED_PACKAGES.TXT\u003c/strong\u003e,\nqui inclut une liste des paquets supplémentaires installés par vos soins.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi ces cases ne sont pas cochées, vous perdrez toute votre configuration\nlié à OpenWRT.\u003c/p\u003e\n\u003cp\u003eDe même les binaires tiers seront dans tous les cas à réinstaller, voire\nà reconfigurer.\u003c/p\u003e\n\u003cp\u003eGardez à l\u0026rsquo;esprit QUE des changements induits par les mises à niveau vers\nune version majeure peuvent poser des soucis lors de la migration. Il peut\ny avoir des changements critiques.\u003c/p\u003e\n\u003ch3 id=\"à-propos-de-ssh-v90-et-supérieure\"\u003eÀ-propos de SSH v9.0 et supérieure\u003c/h3\u003e\n\u003cp\u003eSi votre client SSH est de version ≥ 9.0 :\u003c/p\u003e\n\u003cp\u003eÀ partir de la version 9.0 de SSH, le comportement de \u003ccode\u003escp\u003c/code\u003e a changé. \u003cbr\u003e\nDans l\u0026rsquo;état, la commande ci-dessus échouera avec le message d\u0026rsquo;erreur suivant :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003escp router:/tmp/backup-***-2022-04-21.tar.gz .\nash: /usr/libexec/sftp-server: not found\nscp: Connection closed\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDans les faits, Dropbear ne peut plus discuter avec…\u003c/p\u003e\n\u003cp\u003eAjoutez l\u0026rsquo;option \u003ccode\u003e-O\u003c/code\u003e à la commande \u003ccode\u003escp\u003c/code\u003e, tel que :\n\u003ccode\u003e:$ scp -O root@openwrt:/tmp/backup*.tar.gz $(pwd)\u003c/code\u003e\n\u003cem\u003e(cela rétablit l\u0026rsquo;ancien comportement SFTP de scp)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eUne autre astuce est d\u0026rsquo;\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.\u003c/p\u003e\n\u003ch3 id=\"libération-mémoire\"\u003eLibération mémoire\u003c/h3\u003e\n\u003cp\u003eCette section est surtout utile si le système de fichier \u003ccode\u003e/tmp\u003c/code\u003e n\u0026rsquo;est pas\nassez grand pour enregistrer l\u0026rsquo;image d\u0026rsquo;OpenWRT. Les actions ci-dessous\nvont permettre de libérer temporairement de l\u0026rsquo;espace dans la RAM.\u003c/p\u003e\n\u003cp\u003ePar acquis de conscience, assurons-nous de l\u0026rsquo;espace mémoire et disque\navec les commandes \u003ccode\u003efree\u003c/code\u003e et \u003ccode\u003edf\u003c/code\u003e, voire \u003ccode\u003ecat /proc/meminfo\u003c/code\u003e ; le but\nest de vérifier que \u003cstrong\u003ela taille de RAM \u003cem\u003elibre\u003c/em\u003e est plus importante que la\ntaille de l\u0026rsquo;image\u003c/strong\u003e téléchargée. Si c\u0026rsquo;est le cas, nous pouvons continuer\nle processus, sinon, nous avons un sérieux problème et il faut en discuter\nsur le forum d\u0026rsquo;OpenWRT.\u003c/p\u003e\n\u003cp\u003ePrenons un exemple pour mieux comprendre :\u003c/p\u003e\n\u003cp\u003e⇒ la taille du binaire d\u0026rsquo;upgrade de la version ci-dessus :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:$ ll -h\n(…)\n-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(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eelle est donc de 6.7 Mo.\u003c/p\u003e\n\u003cp\u003e⇒ L\u0026rsquo;espace disponible dans \u003ccode\u003e/tmp\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# df -h\nFilesystem                Size      Used Available Use% Mounted on\n/dev/root                 3.8M      3.8M         0 100% /rom\ntmpfs                    59.7M    540.0K     59.1M   1% /tmp\n/dev/ubi0_1              97.2M      7.8M     84.7M   8% /overlay\noverlayfs:/overlay       97.2M      7.8M     84.7M   8% /\ntmpfs                   512.0K         0    512.0K   0% /dev\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDans le contexte du Xiaomi Redmi AC2100, à ce jour, l\u0026rsquo;espace disponible\nest de 59.1 Mo, ce qui est largement suffisant pour récupèrer l\u0026rsquo;image\nde mise à niveau et la gérer.\u003c/p\u003e\n\u003cp\u003e⇒ De même, l\u0026rsquo;espace libérée de mémoire :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# free -m\n              total        used        free      shared  buff/cache   available\nMem:         122220       40532       61400         540       20288       46700\nSwap:             0           0           0\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDans ce contexte, l\u0026rsquo;espace libre en mémoire est de d\u0026rsquo;environ 60 Mo. Là,\nencore, il y a assez d\u0026rsquo;espace pour gérer l\u0026rsquo;image de mise à niveau.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eSi\u003c/strong\u003e ainsi, dans votre contexte, l\u0026rsquo;espace totale disponible, soit celle de\nla mémoire plus celle en \u003ccode\u003e/tmp\u003c/code\u003e n\u0026rsquo;est pas assez grande, il est possible\nd\u0026rsquo;essayer ce qui suit - supprimer ce qui devient désormais inutile :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles fichiers de listes des paquets :\n\u003ccode\u003e:# rm -r /tmp/opkg-lists/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eles caches suivants :\n\u003ccode\u003e:# sync \u0026amp;\u0026amp; echo 3 \u0026gt; /proc/sys/vm/drop_caches\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eEt si nécessaire, suppression des pilotes wifi suivants :\n\u003ccode\u003e:# rm /etc/modules.d/*{80211,ath9k,b43}*\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour finir, vérifiez qu\u0026rsquo;il n\u0026rsquo;y ait aucun lien symbolique dans le répertoire\n\u003ccode\u003e/etc/modules.d\u003c/code\u003e, si c\u0026rsquo;est le cas, détruisez-les, ce qui libérera de\nla RAM au prochain démarrage, puis \u003cstrong\u003eredémarrez absolument OpenWRT\u003c/strong\u003e\navant de faire la mise à niveau.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"à-propos-de-lidentification-de-lhôte-à-distance-par-ssh\"\u003eÀ-propos de l\u0026rsquo;identification de l\u0026rsquo;hôte à distance par SSH\u003c/h3\u003e\n\u003cp\u003eLors de la nouvelle connexion par SSH, il est normalement possible que\nvous ayez le droit au message d\u0026rsquo;erreur 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@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eNe paniquez pas, c\u0026rsquo;est normal !\u003c/strong\u003e\nAyant changé de version de système d\u0026rsquo;exploitation, l\u0026rsquo;identification de l\u0026rsquo;hôte\na changé aussi.\nAppliquez la commande ssh-keygen, telle que donnée, dans votre cas, pour\nsupprimer l\u0026rsquo;ancienne identification d\u0026rsquo;hôte. Puis retentez votre connexion.\u003c/p\u003e\n\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\u003ch3 id=\"à-propos-de-la-migration-vers--21020\"\u003eÀ-propos de la Migration vers ≥ 21.02.0\u003c/h3\u003e\n\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\u003cp\u003eVous avez choisi de migrer vers la version 21.02.0-*** depuis 19.07.***,\nc\u0026rsquo;est bien !\u003c/p\u003e\n\u003cp\u003eMais avant de faire toute autre action, connectez-vous à l\u0026rsquo;interface web,\npuis sur le menu \u0026ldquo;Interfaces\u0026rdquo; ; il va vous être proposé de faire une\nmigration de la configuration, faites-la !\u003c/p\u003e\n\u003cp\u003ePuis, redémarrez !\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"resolvconf\"\u003eresolv.conf\u003c/h3\u003e\n\u003cp\u003eÀ ce moment de l\u0026rsquo;étape, il est possible que vous ne puissiez plus\ncommuniquer avec l\u0026rsquo;extérieur, car le fichier \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e est\ntoujours configuré pour la résolution de noms en interne, 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:# cat /etc/resolv.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003esearch huc.home\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003enameserver 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\"\u003enameserver ::1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans ce cas, éditez le fichier pour ajouter un serveur DNS à interroger,\ntel que ceux de la FDN : \u003ccode\u003e80.67.169.12\u003c/code\u003e, et \u003ccode\u003e2001:910:800::12\u003c/code\u003e.\nPar 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:# 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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien sûr, modifiez à votre convenance !\u003c/p\u003e\n\u003c!--\nExemple : 8.8.8.8 ! # Cx de Google !\n\nsed -i -e 's/127.0.0.1/8.8.8.8/;s/::1//' /etc/resolv.conf\nsed -i -e 's/80.67.169.12/8.8.8.8/;s/2001:910:800::12//' /etc/resolv.conf\n--\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cp\u003eComme vous pourrez le lire dans la documentation du wiki OpenWRT, il y a\nd\u0026rsquo;autres méthodes ; celle que je vous propose me semble la plus pertinente…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/installation/generic.sysupgrade\" rel=\"external\"\u003eUpgrading OpenWrt firmware using LuCI and CLI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-quick-start/sysupgrade.luci\" rel=\"external\"\u003eUpgrading OpenWrt firmware using LuCI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/installation/sysupgrade.cli\" rel=\"external\"\u003eUpgrading OpenWrt firmware using CLI\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-08-29:/fr/trad/bsdhowto.ch/malware#0f001a62d3c69b81dfd388183f1423b94d2a2adb8a2c783bd2976b87699f3b8e","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-08-27:/fr/sys/openbsd/help#417cd3cfcd3204e38ae476d69b612d0af200c18e5ca093e8d6205f719e782665","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-08-27:/fr/sys/openbsd/sshguard#5f54badb6dc75c3e37ed8e337e92007dbe4ac75b90e2b3ea3bab0cc352ad8655","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-08-25:/fr/web/hugo/hugo-search-jqueryui-autocomplete-json#3a70ff6994e82a614d07c111eb1cd3b2faba9894ddd2c4ca585ec896b069a238","url":"https://it-log.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.\nEt, 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 :\nERROR 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 moteur de recherche basique en s\u0026rsquo;aidant de la méthode \u003ca href=\"/fr/web/hugo/hugo-search-jqueryui-autocomplete/\"\u003e\u003ccode\u003eautocomplete()\u003c/code\u003e\u003c/a\u003e de JQueryUI.\u003c/p\u003e\n\u003cp\u003eEt, puis je me suis rappelé que, parmi les flux de syndication, j\u0026rsquo;en génère un au format JSON, le bien nommé \u003cstrong\u003efeed.json\u003c/strong\u003e, \u003cem\u003edisponible à partir de la page d\u0026rsquo;accueil\u003c/em\u003e. Je me suis demandé si je pouvais réutiliser mon code, et je découvre que notre fameux \u003cabbr title=\"Static Site Generator\"\u003eSSG\u003c/abbr\u003e\n Hugo 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 de 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 est que la fonction \u003ccode\u003erange\u003c/code\u003e d\u0026rsquo;Hugo va directement appeler le contenu retourné par la fonction \u003ccode\u003egetJSON\u003c/code\u003e. La suite du traitement est faite par la méthode \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 multitude d\u0026rsquo;erreur, telle que la suivante et le serveur s\u0026rsquo;arrête tout seul :\u003c/p\u003e\n\u003cp\u003e\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 capable 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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-08-25:/fr/trad/bsdhowto.ch/externaldns#49bdecc651b08f5e26ba605ae00ea73a7d0c7edfdf7d8e914251396aa62eebf9","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-08-22:/fr/web/nginx/nginx-error-504-gateway-timeout#458dc1361d670e7d0c9dcaa24c77d960ccb32e26c8ce9be31ccc9e1d210c10b8","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-08-22:/fr/web/nginx/nginx-error-403-forbidden#b7b645034b343e54354e5e85304cd6a89a50e31cf61b7de0c45915f3e1429957","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-08-20:/fr/web/nginx/nginx-brotli-openbsd#c25e7a731579f05d0cafbbd5c737a4bd98316003a9885f021912eae7dcaae62a","url":"https://it-log.fr.eu.org/fr/web/nginx/nginx-brotli-openbsd/","title":"Nginx + Brotli / OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"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 qui 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. Remarquons : 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… ","content_html":"\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 gestion de la compression au format Brotli semble compromise.\u003c/p\u003e\n\u003cp\u003eEt, 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 ports. À 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 - \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 absolu sur l\u0026rsquo;émetteur du contenu compressé à la volée\u003c/em\u003e -, dans ce mémo, nous 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 l\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 : \u003cbr\u003e\n\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 \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 mes 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 arbitraire\u003c/em\u003e - 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.\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 d\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 du protocole \u003cabbr title=\"HyperText Transfert Protocole Secure\"\u003eHTTPS\u003c/abbr\u003e\n, même si 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 : \u003cbr\u003e\n\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 la 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 du 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 délivrer le fichier statique demandé dans sa forme compressée. Par exemple, 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 que 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 à 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 pour 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 web natif \u003cstrong\u003ehttpd\u003c/strong\u003e sous OpenBSD, lisez mon \u003ca href=\"/fr/web/httpd/httpd-delivre-fichiers-compresses/\"\u003earticle\u003c/a\u003e…\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-08-19:/fr/sys/openbsd/acme-client-bad-exit#90d5fa0adb14165ca0beba4ff595f513468ee78f9808207201e26788b9ab6b7e","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-07-25:/fr/sys/openbsd/epson-mfp#1dfcf19a0f6ad64ce0f7b4e11bf12b9004d7c572d658a094c26e1ef1541e8622","url":"https://it-log.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 proche, 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 proche, 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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-06-20:/fr/sys/openbsd/epson-ecotank-et-3700#a3ce25a3b9a73ff3a8d7ab5cb35bc35faee951065799d26a1be9c81a8065e2dc","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-06-18:/fr/sys/debian/unstable-sid#c816e3543264216df5e6ba3d10bacc24b550f34ebbfae218d3d9bf3b1fc11b31","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-06-18:/fr/sys/openbsd/checkrestart#a2540635b87fd05e9eff2ec1dee645cb93ecaa69610f1ebe394bee8ffd18e9a3","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-05-30:/fr/sys/openbsd/tip-ffs2#3d0812aaab9e9b627780cb969b9af5c1a2f256199523c6a0e85e837a26b5a017","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-05-28:/fr/web/httpd/httpd-delivre-fichiers-compresses#d42b067fe86bf5bbb01cafe39dd83fed6aee31b5e9d1359128688930eebf4e45","url":"https://it-log.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\nun 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 petite 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 é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.\nl\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.\nUne 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 ou moins succinctement  \u003ca href=\"/fr/web/httpd/httpd/\"\u003eici\u003c/a\u003e\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 aux formats deflate, gzip, br, alors \u003cstrong\u003ehttpd\u003c/strong\u003e passe la main à \u003cstrong\u003eslowcgi\u003c/strong\u003e qui 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 dé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 le 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 assumer 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, \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 chroot 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 né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 à 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, qui 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, \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 \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 \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 : 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 \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 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 !\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 chaque 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 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 !\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 d\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 \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 dé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 CGI à exécuter.\u003c/li\u003e\n\u003cli\u003ele paramètre \u003cstrong\u003erealroot\u003c/strong\u003e : bien indiquer la racine vers votre espace web, au sein du chroot web.\u003c/li\u003e\n\u003cli\u003eles autres paramètres sont certes optionnels mais néanmoins utiles à envoyer 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 seulement 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 a révélé deux failles majeures liées à la compression à la volée, ou compression dynamique 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 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.\u003c/p\u003e\n\u003cp\u003eParmi les parades, a été l\u0026rsquo;adoption depuis HTTP 1.1 du transfert par encodage de bloc - \u003cem\u003ela fameuse entête \u003ccode\u003eTransfer-Encoding: chunked\u003c/code\u003e\u003c/em\u003e - de même, il est fortement recommandé de mettre en place une politique \u003cstrong\u003eReferrer\u003c/strong\u003e 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.).\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. Et, 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é, ce 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 de l\u0026rsquo;entreprise Google. Il est considéré comme étant le successeur de gzip car 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 7.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 - \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, bien 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 pas 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 de 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 Atom et RSS avec le mime type \u003cstrong\u003etext/xml\u003c/strong\u003e, 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.\u003c/p\u003e\n\u003cp\u003eSi vous les délivrer avec leur propre type de contenu, à savoir respectivement \u003cstrong\u003eapplication/atom+xml\u003c/strong\u003e et \u003cstrong\u003eapplication/rss+xml\u003c/strong\u003e, tous les deux normés par 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\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 petite histoire, Xavier Cartron @prx est l\u0026rsquo;auteur original de cette idé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 shell. Mais elle ne me satisfaisait pas, pour plusieurs raisons, car il se 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 à fixer un identifiant par ressource délivrée. C\u0026rsquo;est dans ce contexte, que le 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 repris/continué l\u0026rsquo;écriture afin de pouvoir délivrer du contenu statique compressé 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 à dé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 format 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 é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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAttention\u003c/strong\u003e :  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à !\u003c/p\u003e\n\u003cp\u003ePuis, après quelques recherches sur le web, j\u0026rsquo;ai compris que le format de compression \u003cstrong\u003edeflate\u003c/strong\u003e qui peut être demandé par certains clients web, est compris 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 à comprendre et encore moins à résoudre. Et, là deux \u0026ldquo;choses\u0026rdquo; m\u0026rsquo;ont sérieusement aider à avancer - \u003cem\u003ecar, à 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 écessaire pour avancer\u003c/em\u003e - :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSolè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.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\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 pour m\u0026rsquo;assurer des différents retours.\u003c/p\u003e\n\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 CGI, en lui envoyant les différentes valeurs possibles lors de l\u0026rsquo;appel… via 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 avec des droits utilisateurs \u003cstrong\u003e0550\u003c/strong\u003e, vous aurez le droit à cette petite 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\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 appelé sur le système - \u003cem\u003equi nécessite l\u0026rsquo;usage du binaire \u003cstrong\u003ebasename\u003c/strong\u003e\u003c/em\u003e - et 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 é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 de syndication ne sont plus correctement supportés\u003c/em\u003e, un petit pack était nécessaire pour lui délivrer les flux Atom et RSS au format \u0026ldquo;trompeur\u0026rdquo; \u003cstrong\u003etext/xml\u003c/strong\u003e. Ainsi, Firefox accepte de le lire au-lieu de demander à l\u0026rsquo;ouvrir avec 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 \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é franç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 des 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; par les mesures de sécurité sur les appels système que sont pledge(2) et 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 choses ne sont pas gérées : pas de gestion de l\u0026rsquo;entête \u003cstrong\u003eLast-Modified\u003c/strong\u003e, ni 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\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\"\u003e\n    BREACH\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-05-26:/fr/sys/openbsd/megatools#0dbfa65cb50f04b32c50852ff889ad069914ba87142a34a52320b6d4db942129","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-05-24:/fr/sys/openbsd/tor-browser#e5b499737a58b0e7226d27102143912bea9cdd55d15c9c22058b6c1c23e4b5e9","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-05-23:/fr/sys/openbsd/keepassxc#8c6de5f1ca59f5cf2ce9732b713fa76ce91fde334f9dc34eab7d9838a7db8b70","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-05-17:/fr/web/httpd/relayd-log#cb07b05a50fe68cae9f4dc7053d49bf307ed1c38c54871d09fdac558dc2341ba","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-05-14:/fr/sys/openbsd/ovh-over-the-box-v2a#4f675fdbcd0415509ccf2f450e68e72a6e0450cc73558af8d871f8f63502c4fc","url":"https://it-log.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_293d81c035d72286.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_e8bc6af790680ffd.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-05-13:/fr/sys/openbsd/dino#a0049993de91f2c489fbcf5ec6323923cd82cc78b78815ad3b1f4d2aea756e8d","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-05-07:/fr/web/httpd/relayd-cache-httpd#c05ca7acaff3fdf6a3fd74676ea30266640e3e73ba4705130c2b487846c32707","url":"https://it-log.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 succinctementici\nun 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 (cf : l\u0026rsquo;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 :\nles 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.\npuis nous retournons une entête de réponse Cache-Control ciblant l\u0026rsquo;étiquette.\nPuis 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 succinctement\u003ca href=\"/fr/web/httpd/httpd/\"\u003eici\u003c/a\u003e\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 mise 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 - \u003cem\u003epar contre, il le fait de manière globale, \u003cabbr title=\"c'est-à-dire\"\u003eçad\u003c/abbr\u003e\n non 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 sur cet autre \u003ca href=\"/fr/web/httpd/relayd-headers-httpd/#httpd\"\u003earticle\u003c/a\u003e \u003cbr\u003e\n\u003cem\u003e(cf : \u003ca href=\"/fr/web/httpd/relayd-headers-httpd/#httpd-exemple\"\u003el\u0026rsquo;exemple de configuration\u003c/a\u003e\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 peu, mais est réutilisé plus tard, dans le contexte des déclarations de relais\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003enous ciblons tous les fichiers contenant normalement du contenu statique, en analysant les requêtes - \u003cbr\u003e\nc\u0026rsquo;est généralement le cas pour les fichiers, tels que :\u003c/p\u003e\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\u003e\n\u003cp\u003enous leur appliquons une politique d\u0026rsquo;étiquetage, par l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003etag\u003c/code\u003e. \u003cem\u003eLà, encore le nom donné importe peu pourvu que vous réutilisiez le même dans le cadre de l\u0026rsquo;entête \u003ccode\u003eheader\u003c/code\u003e de réponse.\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epuis nous retournons une entête de réponse \u003ccode\u003eCache-Control\u003c/code\u003e ciblant l\u0026rsquo;étiquette.\u003c/p\u003e\n\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-05-06:/fr/web/httpd/relayd-headers-httpd#9e2c00c0b6a67c609251c26813a594436da8664deacca2465c1a00cb92136797","url":"https://it-log.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\nun 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.\nquant à lui, httpd ne fera qu\u0026rsquo;interroger la boucle locale sur les ports redirigés.\nNe 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\u0026rsquo;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.\nles filtres de correspondance match pour créer les réponses d\u0026rsquo;entêtes header.\nles 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 :\nl\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 Cross-origin Resource Sharing Frame-Options HSTS Referrer X-Content-Type-Options X-Frame-Options X-Xss-Protection ","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 succinctement \u003ca href=\"/fr/web/httpd/httpd/\"\u003eici\u003c/a\u003e\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 entê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, et 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 les gérer - \u003cem\u003epar contre, il le fait de manière globale, \u003cabbr title=\"c'est-à-dire\"\u003eçad\u003c/abbr\u003e\n non 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 la configuration des deux fichiers de configuration relatifs.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003erelayd\u003c/strong\u003e va recevoir tout le traffic à destination des ports web, 80, voire 443, si \u003cabbr title=\"Transport Layer Secure\"\u003eTLS\u003c/abbr\u003e\n 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.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003equant à lui, \u003cstrong\u003ehttpd\u003c/strong\u003e ne fera qu\u0026rsquo;interroger la boucle locale sur les ports redirigés.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNe pas oublier de redémarrer les services correspondants après modifier de 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 à faire :\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 paramé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. \u003cbr\u003e\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 autres, 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 \u003cabbr title=\"HyperText Transport Protocol Secure\"\u003eHTTPS\u003c/abbr\u003e\n, via \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 présentations dans mon article de \u003ca href=\"/fr/web/httpd/httpd/\"\u003eprésentation d\u0026rsquo;httpd\u003c/a\u003e.\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\u003e\n\u003cp\u003eNous déclarons un protocole \u003cstrong\u003ehttp\u003c/strong\u003e en lui donnant un nom - \u003cem\u003ele nom importe peu, mais est réutilisé plus tard, dans le contexte des déclarations de relais\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eles filtres de correspondance \u003ccode\u003ematch\u003c/code\u003e pour créer les réponses d\u0026rsquo;entêtes \u003ccode\u003eheader\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles deux premières déclarations sont nécessaires pour capturer les valeurs 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\u003e\n\u003cp\u003epuis nous relaierons en paramétrant, dans les déclarations \u003ccode\u003erelay\u003c/code\u003e correspondantes :\u003c/p\u003e\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 entê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 local, et le port désiré, correspondant à celui sur lequel écoute \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 de 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 les 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, qui 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\u003e\u003ca href=\"/fr/web/http/csp/\"\u003eContent-Security-Policy\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/fr/web/http/cors/\"\u003eCross-origin Resource Sharing\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/fr/web/http//\"\u003eFrame-Options\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/fr/web/http/hsts/\"\u003eHSTS\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/fr/web/http/Referrer/\"\u003eReferrer\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/fr/web/http/X-Content-Type-Options/\"\u003eX-Content-Type-Options\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/fr/web/http/X-Frame-Options/\"\u003eX-Frame-Options\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/fr/web/http/X-Xss-Protection/\"\u003eX-Xss-Protection\u003c/a\u003e\u003c/strong\u003e\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":"tag:doc.huc.fr.eu.org,2020-04-27:/fr/sys/debian/devuan_opensmtpd-client-auth#7f31ef003fb52979466dc468090d7323b0adaddc24f880afd8827d83114cc302","url":"https://it-log.fr.eu.org/fr/sys/debian/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/debian/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\"\u003e\n    Local_Mail_Transfer_Protocol\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-04-25:/fr/sys/debian/devuan_openntpd#3898a4a23343aa2363443134ab4203f3bd4d04c40850d49ef2beb1f88fe7fe77","url":"https://it-log.fr.eu.org/fr/sys/debian/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/debian/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/debian/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/debian/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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-04-14:/fr/web/hugo/hugo-opensearch#71b7c0fc02f53475300d5112bb8d8cd90132f10dd95843ac34105cf5a97185d4","url":"https://it-log.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 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.\u003c/p\u003e\n\u003cp\u003eLa plupart des navigateurs vous proposeront l\u0026rsquo;ajout de votre site en tant que 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 devoir modifier la \u003ca href=\"/fr/web/hugo/hugo-opensearch/#configuration\"\u003econfiguration\u003c/a\u003e pour créer un nouveau format de 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 : \u003cbr\u003e\n\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 : \u003cbr\u003e\n\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 la 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 correspondante à 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 votre 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 format 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 l\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 \u003ca href=\"/fr/web/hugo/hugo-feed/\"\u003eAtom\u003c/a\u003e, il 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 href=\"/fr/web/hugo/hugo-feed/\"\u003eRSS\u003c/a\u003e , veillez à 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 dans 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 connaî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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-03-18:/fr/sys/openbsd/fswebcam#1d2330d3d8e1e8610e26e916a317981f8154e0c12bf375aec1867885925a6bf2","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-02-29:/fr/sys/openwrt/switch-lan-wan#4800ba1b1c72c08854681c2b3ae7463a158bf5cd031d28e57d3f7c00f37e40b5","url":"https://it-log.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 Puis 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\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# /etc/init.d/network restart\n:# /etc/init.d/firewall reload\n\u003c/code\u003e\u003c/pre\u003e\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-02-29:/fr/sys/openwrt/ubiquiti-edgerouter-x#6784d483e32f9321a3017b3da251ebf51b8a774f2e68fbb3a3b6c694fcbb9bbe","url":"https://it-log.fr.eu.org/fr/sys/openwrt/ubiquiti-edgerouter-x/","title":"OpenWRT : Ubiquiti EdgeRouter X","author":{"name":"Stéphane HUC"},"content_text":"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":"\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\"\u003e\n    Réseau_local_virtuel\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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\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\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\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-02-26:/fr/sys/openwrt/ssh-tunnel#8266be93b07c3b7994418b533df9e443f43512e5f823e91b579366b76ced4318","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-02-24:/fr/sys/openwrt/sudo#3b13c59c9c6f441ab413fcce4cd78bf36b74f93cc5314fb781cc00d4f9d944d4","url":"https://it-log.fr.eu.org/fr/sys/openwrt/sudo/","title":"OpenWRT : sudo","author":{"name":"Stéphane HUC"},"content_text":"opkg → apk Le projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet. 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":"\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eopkg → apk\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLe projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet.\u003c/strong\u003e\u003c/div\u003e\n\n\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-02-24:/fr/sys/openwrt/opkg-upgrade#ae2d4a8b258cc918bf2ed4e017afb4e29107029b33e97522aeccdc5440d3036f","url":"https://it-log.fr.eu.org/fr/sys/openwrt/opkg-upgrade/","title":"OpenWRT : opkg upgrade (astuce)","author":{"name":"Stéphane HUC"},"content_text":"opkg → apk Le projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet. Merci de vous dirigez vers la page OpenWRT : Attented Sysupgrade… (ou comment gérer correctement la mise à niveau ≥ 25.12) 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":"\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eopkg → apk\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLe projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet.\u003c/strong\u003e\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003eMerci de vous dirigez vers la page \n\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/attented-sysupgrade/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Attented Sysupgrade… (ou comment gérer correctement la mise à niveau ≥ 25.12) '\"\u003eOpenWRT : Attented Sysupgrade… (ou comment gérer correctement la mise à niveau ≥ 25.12) \u003c/a\u003e\n\n\u003c/strong\u003e\u003c/p\u003e\n\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-02-24:/fr/monitor/reed-alert-openbsd#c28d833ca87cd7cfe10eff77858401c5dc1083021e7096fba159efb1d0b5b01e","url":"https://it-log.fr.eu.org/fr/monitor/reed-alert-openbsd/","title":"Reed-alert : Monitorer simplement OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"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":"\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-02-21:/fr/sys/openbsd/mate#0a98c7986271a208dafeb0b5c9dad872259001e4bda482421c96081d8db85aeb","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-02-21:/fr/sys/openbsd/slim#ac24438b8e43c548a849f337fb585281cd7c3830bec97ebd4bbccd8d80a365b8","url":"https://it-log.fr.eu.org/fr/sys/openbsd/slim/","title":"SLiM / OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"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":"\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-02-21:/fr/don#16b75471e87314299952fe9d8ff8c3c91561833fb5c31071567b4d36d806eca9","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-02-20:/fr/sys/openwrt/about#19ab21d426386a43b0691bd63b9e3ef00ad91558b4f11bebb773a44066c9dac5","url":"https://it-log.fr.eu.org/fr/sys/openwrt/about/","title":"OpenWRT : Présentation du projet","author":{"name":"Stéphane HUC"},"content_text":"opkg → apk Le projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet. 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":"\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eopkg → apk\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLe projet OpenWRT a rendu l\u0026#39;usage de l\u0026#39;outil **opkg** obsolète depuis la version 25.12.0. Ce binaire est remplacé par l\u0026#39;outil **apk** *(Alpine Package Keeper)* ; Merci de lire la page relative: https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet.\u003c/strong\u003e\u003c/div\u003e\n\n\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_83f26d22a240c37.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_12d5a5e472f4cf45.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_322ded639672fceb.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_dea2fa68ef5f02e0.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_dab8f99cda79dfec.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_46cc73d1ea60e893.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_8b7f717c69b3dedf.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_de39b73d6098a71d.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_24c42428d8237859.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_a3d3ea6c44d951f4.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-fr-lang#56cdc39e0a170598c2fed9b7fdcfce068f2d78131304a19332902f4a62df8e0a","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-limits#e3b1ccf38ba9c9f71284a2102a3f9a3b23364139daf70fd6efabc740cae01e0e","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-group#26169f9c05f5a28c9d5dcba1ff3844a614c0bf00e3c9dc6ee0593301cb604903","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/kit-survie#96c3c67ab4e8816920d20c2ea4b92728b6828afeb07a9e0cb55338a84942da8c","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-cpu#e6ceb55d5b126c953e86ba2432be39a22c975d1eccf41be730dce7b7f246d965","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-boot#729be497f52f21a14974b1e09e00f0359068ce1fa0f4608f078f34a40f7d7b05","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-audio#544f850731cb40a802b4e22604432d01872d5b4037929a82a057db57d113d4e8","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-pdksh#45f0b513f803240d3116ac6acb32aae3494c15401000554f4586f3d2f4ca7994","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/audacious#daf1f7a48d83ddd97afaa31ee4dc60da45c6ac41ffca777fac6533460ba30c51","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/lftp#11c6c9e8e3f38be71d2a51f8f5b6fbfbe0bade8339280b413f28b64d4063b493","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/gajim#3d8bf0f45ad8c5d2120b986f514393ca023b22886a6d473e6acb716eec889d8f","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/filezilla#86e0321d70b0f239e4cdc849c82729d1a2dbf03b8b5fbcfcc4f6cd18d24ebd29","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/avahi#eaf824a90af3ee7f2cf83407255297eb26cb4e71c911a981f1f2b79f04a7cbcc","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/encfs#11954ded52af2a8bcb22b916a8625092b809387f4687bf439ca962752bd524c7","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/readymedia#448187f6748f1fb22cb5f0a4082fd305564299e1dba395d7c74e8d740d1774a4","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tutoriel-openbsd-cvs#bbb03da17d7bbec8e8c66abe1824fa616b9ef3a7752e81dc5e4ae5b6a73a5d01","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/mediatomb#29eee94416ccb98bc02ec9b754e5816a3fcfc8218c7a0993251e6afe078a9747","url":"https://it-log.fr.eu.org/fr/sys/openbsd/mediatomb/","title":"Mediatomb","author":{"name":"Stéphane HUC"},"content_text":"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":"\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/syspatch#d37dff48065b2d7608c27ce1a42e5d3aff80aaccd21bee23c8228636f05535b1","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/rcctl#33700b6ac07a0869fded6e55fd23accaa5a267550a14cc8a373dbf98d2fdbe26","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/ntpd#93709ede455735fb4b893746f17e01c2119f4a8e740e427e6302c57f83c086d6","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/pkg#6850136a8cd085a050b2d77e8b4da546f9bacf2138b591eb6d52b2d48e112fc0","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/sysupgrade#40c12fe2a1f64d05500438af9a7364e8665e0a7c285f98884011190990c62c88","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/installurl#5e55519f55cc4bd0a7da5228c082b51e805f16e04e561270635448b392775dba","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tutoriel-pandoc#76ddd03d1f88bf6500d55d28bb4bb6c1d710f33ce3ed28ee1bfadb8d6dc96d28","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/hotplugd#cc6a708600f4c19f28847c813890cc94e2f698973b5cad0242c83adc16574cd3","url":"https://it-log.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 Cette documentation 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 Cette documentation 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\u003eCette documentation 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\u003eCette documentation 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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/consolekit#22c5a339b514710ee4a845dd2285b566e80cb3551d86146667f33a63ff3fb486","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tutoriel-mount-usb#c6bf2895bcd8e57f36850444e38f889ee551896b8e8fbfc57176ea71ecf2f5ce","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/anacron#27a56e7557de286c20700d6b52852ab738d05c0494fe27e909418d455fb18da0","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/pycharm#8e265f0d2e5a894c7033f62d82444f18336bec01ae7239fd5afac8cd83a04ffb","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tor#8799dea57ea7fc510b37d9f702c14c5ae05eff424b2b1157fe8e5a33c5136ff1","url":"https://it-log.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_d53e4b08a5557d29.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_a6b71b81d2270516.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/jdk#ab8b3ca7b0833f843088a3cd62a959c38ec734d388b9be4866fd72a8ff7ae7a5","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-unicode#d2bd7c784592b41b42ccdf775d575357015d45f1ede351ab6bb049185f77c541","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/cups#0aba983a61fecb61d1de3f28bb4cfd0484c4925d9b5de2b80a22880bab3ea5bc","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/cabal#23de33587b4188e885c6f6d2c3df4a0b10ce3c309e8f99f7b10ec4f40a770dff","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/sane#140b1faf518d18e401fd4aa03903530b49bf61cfceb99bcb664c39941f9a70ff","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/inkscape#c4f5176b4c262d88a6a35acfc8c3ee994669443034c6b24c26dc0d28be8ddea4","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/ffmpeg#b0acc3ec7758601658d1863de0c212d5b5cb0d4e57eb97ec757697baae6813a5","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/qemu#c5da0e8a7044f6603989dc22bc48ab67e2cc7ee4eebdee5a2fcef44d73e97881","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/memcached#d1851797e7c17b9abc2869e81387f27467416df74f54b6ec7c856f332315cad3","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-depannage#8caaf0eaba96778e6d53e80dc48ffb93ac148549d42663b0d564eee9ddb1839f","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-wifi#c11a96fc9feec8cc6842bee120f5b9e67afe89421d8f6010e5d9754478e5d5ab","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-webcam#bccbed4b263e3608766058f5a7f4b17e045abce36f47a8c48f4213dd12dd6d91","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-usb#c0dd392846beb6b81325318eb07308176fffffc90abe0577b0d0c0be54d227ba","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-python#d47f110f091caf81145ad39afc6ae24776f88da2d0e79a1227e26b8356e2a397","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-themes#5f35ae19c92c1fe9bbd6c6120d44ab72d748844f80a2d1deaa62136904109c69","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/pf#b5af1d5b842625936a3127c9d06a4e4605f31c14da37f6eaa2c3c676661ab269","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-terminal#7a462b9cca6a3178f05ca8159bcf31db36df15eeab497f8189841f894656775c","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/tip-session#b001fbea9e03e16d82046d6d4d019dde6042e7269cc5076b21a11896dbf2d0f7","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/sct#3ce19711d0c1fa4a723261b3636a2ca591ab58b3c03fddd25e756ab31aa59a0d","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/mplayer#185d28052ff8eaa55bb563a32d10744529669cfdd2974091b4a5bc3dcbb5897e","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/lumina#91739ebe12fd31b448cf73b03258f99c1ad284db24b2dc74597391b17b0a7b43","url":"https://it-log.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\nDisponible à partir d\u0026rsquo;OpenBSD 6.1 !\nInstallation Installez le paquet lumina.\nConfiguration langue Les paramètres de langue configurés dans le fichier ~/.profile semblent ne pas être pris en compte.\nDe même, modifiez ceux-ci dans les paramètres de session ne changent rien. :(\n.xsession Créer/modifier le fichier de session ~/.xsession, et y ajouter à minima :\n. $HOME/.profile /usr/local/bin/ck-launch-session start-lumina-desktop Pensez à redémarrer le service xenodm !\nImpression Merci de lire notre page du service cups , pour configurer correctement la gestion de l\u0026rsquo;impression ;)\nUSB Il faut plutôt s\u0026rsquo;inspirer d\u0026rsquo;une des méthodes fournies dans notre page \u0026ldquo;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\u003cp\u003eDisponible à partir d\u0026rsquo;OpenBSD 6.1 !\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=\"langue\"\u003elangue\u003c/h3\u003e\n\u003cp\u003eLes paramètres de langue configurés dans le fichier \u003ccode\u003e~/.profile\u003c/code\u003e semblent ne pas\nêtre pris en compte.\u003c/p\u003e\n\u003cp\u003eDe même, modifiez ceux-ci dans les paramètres de session ne changent rien. :(\u003c/p\u003e\n\u003ch3 id=\"xsession\"\u003e.xsession\u003c/h3\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:#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\"\u003e/usr/local/bin/ck-launch-session start-lumina-desktop\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\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=\"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\u003ca class=\"inside\" href=\"/fr/tutoriel/openbsd-mount-usb/\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003eMonter un disque / une clé USB en tant qu’utilisateur\u003c/a\u003e\n\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/intel#783adb6fc7d107c2694cf5a1dce012d925813c9cb0f2a4d3aa309560e508c19f","url":"https://it-log.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; \u0026quot;true\u0026quot; - cette option principale est par défaut désactivée ; donc, il faut l\u0026rsquo;activer ! Option \u0026quot;SwapbuffersWait\u0026quot; \u0026quot;true\u0026quot; - normalement cette option est activée par défaut Option \u0026quot;VSync\u0026quot; \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 \u0026#34;Composite\u0026#34; \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 \u0026#34;intel\u0026#34; Driver \u0026#34;intel\u0026#34; Option \u0026#34;HotPlug\u0026#34; \u0026#34;true\u0026#34; Option \u0026#34;TearFree\u0026#34; \u0026#34;true\u0026#34; #false by default (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 \u0026#34;intel\u0026#34; #modesetting, or Intel Graphics Driver \u0026#34;intel\u0026#34; #modesetting Option \u0026#34;AccelMethod\u0026#34; \u0026#34;sna\u0026#34; #sna by default Option \u0026#34;DDC\u0026#34; \u0026#34;true\u0026#34; #true by default Option \u0026#34;DRI\u0026#34; \u0026#34;true\u0026#34; Option \u0026#34;HotPlug\u0026#34; \u0026#34;true\u0026#34; Option \u0026#34;NoAccel\u0026#34; \u0026#34;false\u0026#34; #false by default Option \u0026#34;RelaxedFencing\u0026#34; \u0026#34;true\u0026#34; #true if G33 Model \u0026amp; \u0026gt; Option \u0026#34;SwapbuffersWait\u0026#34; \u0026#34;true\u0026#34; #true by default (avoid tearing) Option \u0026#34;TearFree\u0026#34; \u0026#34;true\u0026#34; #false by default (avoid tearing) Option \u0026#34;Throttle\u0026#34; \u0026#34;true\u0026#34; #true by default Option \u0026#34;Tiling\u0026#34; \u0026#34;true\u0026#34; #true by default Option \u0026#34;TripleBuffer\u0026#34; \u0026#34;true\u0026#34; #true by default #Option \u0026#34;VideoRAM\u0026#34; ??? Option \u0026#34;VSync\u0026#34; \u0026#34;true\u0026#34; #true by default (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 \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;       \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   \u0026quot;SwapbuffersWait\u0026quot;   \u0026quot;true\u0026quot;\u003c/code\u003e - normalement cette option est\nactivée par défaut\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eOption   \u0026quot;VSync\u0026quot;         \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    \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    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;Composite\u0026#34;     \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\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 : 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\n\u003ch3 id=\"exemples-de-configuration\"\u003eExemples de configuration\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\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\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    \u003cspan style=\"color:#06b6ef\"\u003eIdentifier  \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\"\u003eDriver  \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\"\u003eOption  \u0026#34;HotPlug\u0026#34;       \u0026#34;true\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;TearFree\u0026#34;      \u0026#34;true\u0026#34;  #false by default   (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\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\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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    \u003cspan style=\"color:#06b6ef\"\u003eIdentifier  \u0026#34;intel\u0026#34; #modesetting, or Intel Graphics\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eDriver  \u0026#34;intel\u0026#34; #modesetting\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;AccelMethod\u0026#34;   \u0026#34;sna\u0026#34;   #sna by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;DDC\u0026#34;           \u0026#34;true\u0026#34;  #true by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;DRI\u0026#34;           \u0026#34;true\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;HotPlug\u0026#34;       \u0026#34;true\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;NoAccel\u0026#34;       \u0026#34;false\u0026#34; #false by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;RelaxedFencing\u0026#34;    \u0026#34;true\u0026#34;  #true if G33 Model \u0026amp; \u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;SwapbuffersWait\u0026#34;   \u0026#34;true\u0026#34;  #true by default (avoid tearing)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;TearFree\u0026#34;      \u0026#34;true\u0026#34;  #false by default   (avoid tearing)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;Throttle\u0026#34;      \u0026#34;true\u0026#34;  #true by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;Tiling\u0026#34;        \u0026#34;true\u0026#34;  #true by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;TripleBuffer\u0026#34;  \u0026#34;true\u0026#34;  #true by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#Option \u0026#34;VideoRAM\u0026#34;      ???\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;VSync\u0026#34;         \u0026#34;true\u0026#34;  #true by default    (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               24\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\"\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/gigolo#2b517933092ec79dcf2bcee497f117fe97651af5615b01bbe5d90e9dde9ea963","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/dbus#01dc06aa97d5b584aa907343eb3956f4a5d9decab0400058a37f823d1c8ac19b","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/cwm#6683f0c8d7ccc5bbd73ef2f47e3092a703cdd4f39fe7b12d00c3149c9d1906ab","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/iridium#a989f68ced9483a6b7188609b89a348afc7878af20b36d2a41eb6f0e642d10c7","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/firefox-esr#598341be4ea9fdf9f1e8b140fc6899a019cf9bb118c15fab4ee9b0422d21dc75","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-19:/fr/sys/openbsd/chromium#c6fce8713563218562fa36b44cc3158a7913f366199dd20ff8972ec95bce39d4","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2020-01-02:/fr/web/hugo/hugo-openbsd#7f2d747ca17970d5b4dc56d3821d78dcf54d8b883d7b69e40852269c7b37f29a","url":"https://it-log.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":"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":"\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":"tag:doc.huc.fr.eu.org,2019-12-23:/fr/web/nextcloud/nextcloud-loop-login#08104c4286e38ddb5ba3552453c048e8b81547f2e2f39e6c88b0d6afe37c5dd8","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-12-22:/fr/sys/openbsd/bioctl-fde#7221a6adcdd580a16d18dcfe048c53096fda97d27408e9315cc217b24c44b3b4","url":"https://it-log.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\"\u003e\n    Master_boot_record\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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\"\u003e\n    GUID_Partition_Table\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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":"tag:doc.huc.fr.eu.org,2019-12-18:/fr/web/hugo/hugo-menu-nav#fad41c46bc696b88e35b797f4185ac5abc8f92290b2350f7eafdb52a68fa5c4e","url":"https://it-log.fr.eu.org/fr/web/hugo/hugo-menu-nav/","title":"Hugo : Menu de navigation (simple ou dropdown)","author":{"name":"Stéphane HUC"},"content_text":"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/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; pageRef = \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; pageRef = \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; pageRef = \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 pageRef : 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; label = \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; pageRef = \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; pageRef = \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; pageRef = \u0026#34;#contact\u0026#34; weight = 3 [languages.fr] homeText = \u0026#34;\u0026#34; label = \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; pageRef = \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; pageRef = \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; pageRef = \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 pageRef.\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;{{ .pageRef }}\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 span lang=\u0026ldquo;en\u0026rdquo;\u0026gt;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; pageRef = \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; pageRef = \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; pageRef = \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; pageRef = \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;{{ .pageRef | relLangURL }}\u0026#34;{{ if $.IsHome }} data-target=\u0026#34;{{ .pageRef }}\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;{{ .pageRef | relLangURL }}\u0026#34;{{ if $.IsHome }} data-target=\u0026#34;{{ .pageRef }}\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.\n","content_html":"\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 le \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 remplir à 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 \u003ccode\u003econfig.toml\u003c/code\u003e. \u003cem\u003ePour information, il existe deux autres formats, JSON et YAML\u003c/em\u003e. \u003cbr\u003e\nNous 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.\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 dans votre langue native, il faut modifier au moins la variable \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 \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 crée dans le répertoire \u003ccode\u003elayouts/_partials/\u003c/code\u003e, et quelque soit son nom, \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/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 page, 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\"\u003epageRef\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\"\u003epageRef\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\"\u003epageRef\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\u003epageRef\u003c/code\u003e : le nom de l\u0026rsquo;ancre, ou de la page, à cibler. La présence du symbole \u003ccode\u003e#\u003c/code\u003e signifie que le lien ciblé est une ancre dans la page ; son absence cible un 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, plus 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 documentation 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\"\u003elabel\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\"\u003epageRef\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\"\u003epageRef\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\"\u003epageRef\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\"\u003elabel\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\"\u003epageRef\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\"\u003epageRef\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\"\u003epageRef\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 qu\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 faudra donc créer dans le répertoire \u003ccode\u003econtent\u003c/code\u003e les articles correspondants portant les noms servant de valeur à la variable \u003ccode\u003epageRef\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 de 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;{{ .pageRef }}\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 restituer le code correspondant.\u003c/p\u003e\n\u003cp\u003eMaintenant si dans le fichier de configuration, vous ajoutez et remplissez la variable \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 le texte, ce qui est utile dans le contexte de la bibliothèque \u003cstrong\u003eFont Awesome\u003c/strong\u003e ou 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 \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 framework \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\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, qui 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 des 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 à la 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 d\u0026rsquo;activer le répertoire qui doit comporter à minima le span lang=\u0026ldquo;en\u0026rdquo;\u0026gt;Front 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. \u003cem\u003e(ce qui est évidemment utile dans le contexte de génération de \u003ca href=\"/fr/web/hugo/hugo-feed\"\u003eflux de syndication\u003c/a\u003e)\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\"\u003epageRef\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\"\u003epageRef\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\"\u003epageRef\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\"\u003epageRef\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 menu 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 qui a \u003ccode\u003eidentifier = \u0026quot;dev\u0026quot;\u003c/code\u003e, \u003cem\u003equi est bien aussi leur répertoire parent, dans 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 ci-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;{{ .pageRef | 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;{{ .pageRef }}\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;{{ .pageRef | 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;{{ .pageRef }}\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 faire 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","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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-12-11:/fr/web/hugo/hugo-feed#2055ab6a16185e41b07c9cb9c5c64af6712f2e8013c49dd3bca95164333fef6a","url":"https://it-log.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/#atomoutputformat\"\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\"\u003e\n    Universal_Unique_Identifier\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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":"tag:doc.huc.fr.eu.org,2019-12-06:/fr/web/hugo/hugo-search-jqueryui-autocomplete#c6457c000e0f690e2f108c6dd8d0bac0cc7eb0120b330210a09978feea806898","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-11-29:/fr/web/hugo/hugo-shortcodes#7ae4c3f9fb391570f826cba446c03169518c52fa85ca46d67ad3ebe01cc7ec95","url":"https://it-log.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=\"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=\"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=\"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=\"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=\"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=\"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=\"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=\"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_e0b3cd9c38226f1f.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Mon Logo\" height=\"124\" loading=\"lazy\" src=\"/images/Logo_full_192px_hu_bfb19336d47c760c.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=\"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=\"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=\"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\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=\"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=\"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=\"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=\"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=\"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=\"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\"\u003e\n    OpenBSD\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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\"\u003e\n    Debian\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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)\"\u003e\n    Pare-feu_(informatique)\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-11-29:/fr/web/hugo/hugo-deploy#9a0f6a564778c09402cb65a0296bc0d6fbec8235ec110fa4a73bfaa1fcf11c64","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-11-27:/fr/sys/openbsd/pysnmp#ef69f19ad4575cf2d6f9662b9e5ad5f6fd7ea48e9ca2814e399549817fcd4359","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-11-23:/fr/web/nextcloud/occ#d07d47f2e041d0ace01bc543864c420546bb3e560e23d29dacb74fd4c4f6fa14","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-11-23:/fr/web/nextcloud/nextcloud-upgrade#6d05026669df1e7e7c9365cb5b9bee510be82adb5627ad64deefda5b90db8f26","url":"https://it-log.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 :\nErreur On 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… \u003cbr\u003e\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 sous OpenBSD. L\u0026rsquo;instance que j\u0026rsquo;administre est donc sous OpenBSD, desservie par le 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.*, qui 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 href=\"/fr/web/nextcloud/nextcloud-php-chroot/\"\u003efaut légérement modifier\u003c/a\u003e le 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 du 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, c\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 transformation 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 configuration : \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 celles qui \u003cstrong\u003ene sont pas natives\u003c/strong\u003e vers le nouveau répertoire d\u0026rsquo;applications. \u003cbr\u003e\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 ré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 enfants, 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 dans 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, et 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 fichier 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\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eErreur\u003c/strong\u003e\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\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAllez supprimer le fichier \u003ccode\u003eCAN_INSTALL\u003c/code\u003e qui se trouve dans le nouveau ré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 \u003ca href=\"/fr/web/nextcloud/occ/\"\u003eocc\u003c/a\u003e.\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-11-22:/fr/monitor/openbsd-munin-node#b19541cf9133cb0e7cfc5e4f21a29c4f78dc06ca09e94a83f887b4b55dce0495","url":"https://it-log.fr.eu.org/fr/monitor/openbsd-munin-node/","title":"Munin-node : Client pour monitorer OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"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":"\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-11-21:/fr/sys/openbsd/snmp#e9f4372969dc17ec72c2c43394d7ca238d4544e5ec1e420ed4ada710d3b86acd","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-11-20:/fr/monitor/openbsd-snmpd#990ad90d331b09df91c003cc8379378c3b9de35cba1dcd23b01309d174ae0fb5","url":"https://it-log.fr.eu.org/fr/monitor/openbsd-snmpd/","title":"Snmpd : Monitorer OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"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":"\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":"tag:doc.huc.fr.eu.org,2019-11-17:/fr/web/httpd/httpd#fc8721421184ee47a2bebdc2938034c45d62e06ec482bcf4de07f57eaec76d40","url":"https://it-log.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 directivelocation`, 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\u0026rsquo;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, nommé \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é que par la séparation des privilèges, l\u0026rsquo;usage de chiffrements forts, de courbes elliptiques, et autres paramétres forts pour \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 fichiers statiques, qui supporte les appels directs ou asynchrones FastCGI (soit par socket Unix - \u003cem\u003ec\u0026rsquo;est mieux\u003c/em\u003e -, soit par \u003cabbr title=\"Transfert Control Protocol\"\u003eTCP\u003c/abbr\u003e\n/\u003cabbr title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n). 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.\u003c/p\u003e\n\u003cp\u003eUne configuration flexible d\u0026rsquo;hôtes virtuels est possible, soit par nom d\u0026rsquo;hôte, soit par adresse IP.\u003c/p\u003e\n\u003cp\u003eEnfin, la journalisation se fait soit via \u003ccode\u003esyslog\u003c/code\u003e, soit par des journaux d\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 fichier 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 créer un fichier par hôte et de l\u0026rsquo;inclure dans le fichier de configuration par 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 spécifié, il a pour valeur \u003ccode\u003e/var/www/\u003c/code\u003e qui est le répertoire home de l\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 donnée ou un type de fichier. S\u0026rsquo;il n\u0026rsquo;est pas spécifié, le type par défaut est \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, il 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 3 processus serveur. Augmenter cette valeur améliore la performance et 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 ne peut utiliser des mots clés réservés. Elles commencent forcément par une 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 dé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 spé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 pas déjà inclus dans le fichier \u003ccode\u003e/usr/share/misc/mimes.types\u003c/code\u003e ; si ce n\u0026rsquo;est pas 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 l\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 dans 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 virtuel 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, en 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 entre 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 de 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 des standards des serveurs web Apache ou nginx. \u003ccode\u003ecommon\u003c/code\u003e est le type par 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 contenant la valeur des entêtes \u003ccode\u003eX-Forwarded-For\u003c/code\u003e et \u003ccode\u003eX-Forwarded-Port\u003c/code\u003e \u003cem\u003e(respectivement, la première doit retourner l\u0026rsquo;adresse ip du client, la seconde celle du port de connexion sur le serveur)\u003c/em\u003e. Intéressant quand \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. Chaque entrée du journal est un résumé de chaque connexion qui peut contenir 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, \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\u003cstrong\u003ePar mesure de sécurité, ensuite, attribuez-lui des droits en exécution \u003ccode\u003e0400\u003c/code\u003e, accessible rien que par l\u0026rsquo;utilisateur web \u003ccode\u003ewww\u003c/code\u003e.\u003c/strong\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 qui 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, sur le protocole HTTP, il est recommandé fortement de mettre en frontal \u003ca href=\"/fr/web/httpd/relayd-headers-httpd/#relayd-httpoxy\"\u003erelayd afin de lutter contre la faille Httpoxy\u003c/a\u003e !\u003c/div\u003e\n\n\u003cp\u003ePour autant que vous avez installer PHP sur le serveur, \u003cstrong\u003ehttpd\u003c/strong\u003e peut servir du 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, sur le protocole HTTP, il est recommandé fortement de mettre en frontal \u003ca href=\"/fr/web/httpd/relayd-headers-httpd/#relayd-httpoxy\"\u003erelayd afin de lutter contre la faille Httpoxy\u003c/a\u003e !\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 \u003cabbr title=\"Common Gateway Interface\"\u003eCGI\u003c/abbr\u003e\n, \u003cem\u003elui aussi intégré dans le système de 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 cgi-bin/\u003ccode\u003edu chroot web, par le biais de la directive\u003c/code\u003elocation`, 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 \u003ca href=\"/fr/web/httpd/httpd/#authentification-web\"\u003eauthentification web\u003c/a\u003e pour protéger le contenu délivré par 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 cet 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 dans 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 hôtes HSTS. \u003cbr\u003e\n\u003cstrong\u003eIl semble important par mesure de sécurité d\u0026rsquo;utiliser cette option lors de fonctionnement avec des sous-domaines, même si ces derniers ont leurs propres certificats TLS\u003c/strong\u003e.\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 différentes options sont comprises dans les crochets. Les options suivantes sont possibles :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecertificate\u003c/code\u003e - nécessaire - pour spécifier le certificat serveur, encodé au 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 aussi au format PEM. \u003cbr\u003e\n\u003cstrong\u003eATTENTION : ce fichier doit absolument résider en-dehors du chroot web\u003c/strong\u003e.\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, \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 avec 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 actif 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 nombre 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\u003cstrong\u003eIl 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 !\u003c/strong\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 contenu d\u0026rsquo;un répertoire en particulier. Ajoutez tout simplement, soit dans une directive \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":"tag:doc.huc.fr.eu.org,2019-11-16:/fr/monitor/openbsd-munin-server#e760625373ad4646bedfb0471ed05a82f43a2efe80592932dbf1314ca37fa085","url":"https://it-log.fr.eu.org/fr/monitor/openbsd-munin-server/","title":"Munin : Monitorer OpenBSD avec httpd ","author":{"name":"Stéphane HUC"},"content_text":"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":"\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":"tag:doc.huc.fr.eu.org,2019-11-14:/fr/monitor/openbsd-nagios#369bee29b568fba2ae1c7caf193dfb642c8c9dfba65a37f06a8ff31d131352cc","url":"https://it-log.fr.eu.org/fr/monitor/openbsd-nagios/","title":"Nagios : Monitorer OpenBSD avec httpd + slowcgi","author":{"name":"Stéphane HUC"},"content_text":"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":"\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":"tag:doc.huc.fr.eu.org,2019-10-31:/fr/sec/firewall/pf-icmp#90b1ba3f26f81e4fd3f26f1e17a4957ec13ab3d89f1d0fa789fbeec372aaab8f","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-10-31:/fr/sec/firewall/pf-icmpv6#42714680a177f6454cc40c8b2cc61a9b23c7c28f6b3a3d5d4f29c9fef1a7d191","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-10-31:/fr/sec/firewall/pf-traceroute#dda18a70f7794de8d1554cce01df5690967433926508cc171dc91f4d40df38a6","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-10-31:/fr/sec/firewall/pf-saned#17a369cdd2c0ba76d74c247f16dfc3bc30cef879943f5af8b1cfabc5aa2c192c","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-10-31:/fr/sec/firewall/pf-avahi#7c86b63d41db7dd672c6d6bde2e871554ae346585133139871b881919f82a810","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-10-31:/fr/sec/firewall/pf-samba#a7dccab274520f5406e2b9f8a9a9aa843a09169aed47929074b60ef5fd637284","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-10-31:/fr/sec/firewall/pf-syncthing#80f94bffe0062d44a9cc0e173ee49f7dc07925c73d7c665080e08f95d8a1d260","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-10-31:/fr/sec/firewall/pf-ping#cf84d8e5c8fed523af6c7e129e26a0b15d8574f6b40c4eb5e141da656be781ed","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-10-15:/fr/sys/openbsd/vm-debian-10-buster#9114de34fa440029604365e2ef4d8ca4698f762efbc0a533056f9c19eee51afd","url":"https://it-log.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… ","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","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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-06-19:/fr/dev/python/env-python-openbsd#eac606f7e4bfd8fd861588ba867bb57d23fe8016a30c503481f19c96fad6b2c2","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-06-19:/fr/sys/openbsd/env-python-openbsd#2a3f3b39ee41446bee9b6cc114d3ae71c5b03718e331658bf8e93061eee73691","url":"https://it-log.fr.eu.org/fr/sys/openbsd/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\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":"\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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-06-18:/fr/sys/android/synchronisation-xiaomi-nextcloud#c9e43bbf1d23dbb4e044ba1525f21a2792f5be1ba8079ba0bfac7288e2ab0696","url":"https://it-log.fr.eu.org/fr/sys/android/synchronisation-xiaomi-nextcloud/","title":"Xiaomi : Synchronisation avec Nextcloud et OpenSync (MIUI)","author":{"name":"Stéphane HUC"},"content_text":"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":"\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":"tag:doc.huc.fr.eu.org,2019-05-27:/fr/web/php/php-composer-openbsd#57dbfcacf4adf477e6702bc8a5d2319884b462a2b159944e12f4b4c49c0dec72","url":"https://it-log.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":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-05-20:/fr/trad/developpez.net/dive-into-python-6-closures-et-generateurs#dae9f22558001767e93bb92ec2e96f0ceab7a5ddca3aacd29e8cea2cc820a34e","url":"https://it-log.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":"tag:doc.huc.fr.eu.org,2019-05-16:/fr/trad/developpez.net/pymotw3-structures-de-donnees#40385a87af72716bdfd7b616756c90112db66fb5593d9a73d92d633c9b0763d8","url":"https://it-log.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.\nLe 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\u003cspan\u003e\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\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;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\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\"\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:#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\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e, \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\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\"\u003ec\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e D\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"mise-à-jour-des-valeurs\"\u003eMise à jour des Valeurs\u003c/h4\u003e\n\u003cp\u003eUne \u003ccode\u003eChainMap\u003c/code\u003e 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 à \u003ccode\u003eChainMap\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# collections_chainmap_update_behind.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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Before: \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\u003ea[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\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;After : \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\u003eChanger les valeurs associées avec les clés existantes et ajouter de nouveaux éléments fonctionne de la même 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 collections_chainmap_update_behind.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\u003eBefore: C\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAfter : E\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl est également possible de définir directement des valeurs via \u003ccode\u003eChainMap\u003c/code\u003e, bien que seule la première correspondance de la chaîne soit réellement modifié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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# collections_chainmap_update_directly.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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Before:\u0026#39;\u003c/span\u003e, m)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003em[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\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;After :\u0026#39;\u003c/span\u003e, m)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a:\u0026#39;\u003c/span\u003e, a)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eQuand la nouvelle valeur est enregistrée en utilisant \u003ccode\u003em\u003c/code\u003e, la correspondance \u003ccode\u003ea\u003c/code\u003e est 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 collections_chainmap_update_directly.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\u003eBefore: ChainMap\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\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;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\u003cspan style=\"color:#5bc4bf\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAfter : ChainMap\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;E\u0026#39;\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;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\u003cspan style=\"color:#5bc4bf\"\u003e})\u003c/span\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;E\u0026#39;\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\u003ccode\u003eChainMap\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_new_child.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\u003em1 \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\u003em2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e m1\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enew_child()\n\u003c/span\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;m1 before:\u0026#39;\u003c/span\u003e, m1)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m2 before:\u0026#39;\u003c/span\u003e, m2)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003em2[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m1 after:\u0026#39;\u003c/span\u003e, m1)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m2 after:\u0026#39;\u003c/span\u003e, m2)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe comportement d\u0026rsquo;empilement est pratique pour utiliser les instances de \u003ccode\u003eChainMap\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_new_child.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\u003em1 before: ChainMap\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\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;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\u003cspan style=\"color:#5bc4bf\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003em2 before: ChainMap\u003cspan style=\"color:#5bc4bf\"\u003e({}\u003c/span\u003e, \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\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;B\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\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\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\u003em1 after: ChainMap\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\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;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\u003cspan style=\"color:#5bc4bf\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003em2 after: ChainMap\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\u0026#39;\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;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\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;B\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;c\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\u0026#39;\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\u003ePour les situations où le nouveau contexte est connu ou natif à l\u0026rsquo;avance, il est aussi possible de passer une correspondance à \u003ccode\u003enew_child()\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# collections_chainmap_new_child_explicit.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\u003ec \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\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\u003em1 \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\u003em2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e m1\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enew_child(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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m1[\u0026#34;c\u0026#34;] = \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(m1[\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(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m2[\u0026#34;c\u0026#34;] = \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(m2[\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\u003eCe qui est l\u0026rsquo;équivalent de :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\u003em2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eChainMap(c, \u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003em1\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emaps)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eet produit :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_new_child_explicit.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\u003em1\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;c\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]\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\u003em2\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;c\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e E\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"compter-les-objets-hachables\"\u003eCompter les objets hachables\u003c/h3\u003e\n\u003cp\u003eUn \u003ccode\u003eCounter\u003c/code\u003e 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.\u003c/p\u003e\n\u003ch4 id=\"initialisation\"\u003eInitialisation\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003eCounter\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_counter_init.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\u003eprint(collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eCounter([\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\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;a\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;b\u0026#39;\u003c/span\u003e]))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eCounter({\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\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\u003eprint(collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eCounter(a\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e, b\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e, c\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 résultats des trois formes d\u0026rsquo;initialisation sont les mêmes.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_counter_init.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\u003eCounter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: 3, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: 2, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: 1\u003cspan style=\"color:#5bc4bf\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCounter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: 3, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: 2, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: 1\u003cspan style=\"color:#5bc4bf\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCounter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: 3, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: 2, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: 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\u003eUn \u003ccode\u003eCounter\u003c/code\u003e vide peut être construit sans arguments et rempli via la méthode \u003ccode\u003eupdate()\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# collections_counter_update.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\u003ec \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eCounter()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Initial :\u0026#39;\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\u003ec\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eupdate(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;abcdaab\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;Sequence:\u0026#39;\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\u003ec\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eupdate({\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Dict    :\u0026#39;\u003c/span\u003e, c)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes 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 \u003ccode\u003ea\u003c/code\u003e va de \u003ccode\u003e3\u003c/code\u003e à \u003ccode\u003e4\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_counter_update.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\u003eInitial : Counter\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSequence: Counter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: 3, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: 2, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e: 1\u003cspan style=\"color:#5bc4bf\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDict    : Counter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e: 6, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: 4, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: 2, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: 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\u003ch4 id=\"accéder-aux-compteurs\"\u003eAccéder aux Compteurs\u003c/h4\u003e\n\u003cp\u003eUne fois qu\u0026rsquo;un \u003ccode\u003eCounter\u003c/code\u003e est rempli, ses valeurs peuvent être récupérées en utilisant l\u0026rsquo;API de dictionnaire.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_counter_get_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\"\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\u003ec \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eCounter(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;abcdaab\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\"\u003efor\u003c/span\u003e letter \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;abcde\u0026#39;\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{}\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(letter, c[letter]))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe \u003ccode\u003eCounter\u003c/code\u003e ne soulève pas d\u0026rsquo;erreur \u003ccode\u003eKeyError\u003c/code\u003e 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 \u003ccode\u003ee\u003c/code\u003e), son compteur est à \u003ccode\u003e0\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_counter_get_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\u003ea : \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eb : \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ec : \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed : \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ee : \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 méthode \u003ccode\u003eelements()\u003c/code\u003e retourne un itérateur qui produit tous les items connus de \u003ccode\u003eCounter\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# collections_counter_elements.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\u003ec \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eCounter(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;extremely\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ec[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;z\u0026#39;\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\u003eprint(c)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(list(c\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eelements()))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_counter_elements.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\u003eCounter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e: 3, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;x\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;t\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;r\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;m\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;l\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;y\u0026#39;\u003c/span\u003e: 1,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;z\u0026#39;\u003c/span\u003e: 0\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:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;x\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;t\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;r\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;m\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;l\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;y\u0026#39;\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\u003eUtilisez \u003ccode\u003emost_common()\u003c/code\u003epour produire une séquence de \u003ccode\u003en\u003c/code\u003e valeurs d\u0026rsquo;entrées les plus fréquemment rencontrées et de leurs compteurs respectifs.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_counter_most_common.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\u003ec \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eCounter()\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;/usr/share/dict/words\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;rt\u0026#39;\u003c/span\u003e) \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e f:\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 f:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        c\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eupdate(line\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003erstrip()\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003elower())\n\u003c/span\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;Most common:\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 letter, count \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e c\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emost_common(\u003cspan style=\"color:#f99b15\"\u003e3\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{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:\u0026gt;7}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(letter, count))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCet 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 à \u003ccode\u003emost_common ()\u003c/code\u003e, vous obtenez une liste de tous les éléments, par ordre de fréquence.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_counter_most_common.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\u003eMost common:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ee:  \u003cspan style=\"color:#f99b15\"\u003e235331\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ei:  \u003cspan style=\"color:#f99b15\"\u003e201032\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea:  \u003cspan style=\"color:#f99b15\"\u003e199554\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"arithmétique\"\u003eArithmétique\u003c/h4\u003e\n\u003cp\u003eLes instances de \u003ccode\u003eCounter\u003c/code\u003e 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 \u003ccode\u003eCounter\u003c/code\u003e, mais les opérateurs sur place \u003ccode\u003e+=\u003c/code\u003e, \u003ccode\u003e-=\u003c/code\u003e, \u003ccode\u003e\u0026amp;=\u003c/code\u003e, et \u003ccode\u003e|=\u003c/code\u003e sont aussi supportés.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_counter_arithmetic.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\u003ec1 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eCounter([\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\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;a\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;b\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ec2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eCounter(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;alphabet\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;C1:\u0026#39;\u003c/span\u003e, c1)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;C2:\u0026#39;\u003c/span\u003e, c2)\n\u003c/span\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\"\u003eCombined counts:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(c1 \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e c2)\n\u003c/span\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\"\u003eSubtraction:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(c1 \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e c2)\n\u003c/span\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\"\u003eIntersection (taking positive minimums):\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(c1 \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u003c/span\u003e c2)\n\u003c/span\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\"\u003eUnion (taking maximums):\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(c1 \u003cspan style=\"color:#5bc4bf\"\u003e|\u003c/span\u003e c2)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eChaque fois qu\u0026rsquo;un nouveau \u003ccode\u003eCounter\u003c/code\u003e est produit par opération, chaque item avec un compteur zéro ou négatif est supprimé. Le compteur pour \u003ccode\u003ea\u003c/code\u003e est le même dans \u003ccode\u003ec1\u003c/code\u003e et \u003ccode\u003ec2\u003c/code\u003e, la soustraction le laisse à zéro.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_counter_arithmetic.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\u003eC1: Counter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: 3, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: 2, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: 1\u003cspan style=\"color:#5bc4bf\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eC2: Counter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: 2, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;l\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;p\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;h\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;t\u0026#39;\u003c/span\u003e: 1\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\u003eCombined counts:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCounter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: 4, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: 4, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;l\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;p\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;h\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;t\u0026#39;\u003c/span\u003e: 1\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\u003eSubtraction:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCounter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: 2, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: 1\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\u003eIntersection \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etaking positive minimums\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCounter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: 2, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: 1\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\u003eUnion \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etaking maximums\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCounter\u003cspan style=\"color:#5bc4bf\"\u003e({\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: 3, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: 2, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;l\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;p\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;h\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e: 1, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;t\u0026#39;\u003c/span\u003e: 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\u003ch3 id=\"defaultdict---retourner-une-valeur-par-défaut-aux-clés-manquantes\"\u003edefaultdict - Retourner une Valeur par Défaut aux Clés Manquantes\u003c/h3\u003e\n\u003cp\u003eLe dictionnaire standard inclut la méthode \u003ccode\u003esetdefault()\u003c/code\u003e pour récupérer une valeur et en établir une par défaut si la valeur n\u0026rsquo;existe pas. Par contraste, \u003ccode\u003edefaultdict\u003c/code\u003e permet à l\u0026rsquo;appelant de spécifier la valeur par défaut dès l\u0026rsquo;initialisation du conteneur.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_defaultdict.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\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\"\u003edefault_factory\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:#48b685\"\u003e\u0026#39;default value\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\u003ed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edefaultdict(default_factory, foo\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;bar\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;d:\u0026#39;\u003c/span\u003e, d)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;foo =\u0026gt;\u0026#39;\u003c/span\u003e, d[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;foo\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;bar =\u0026gt;\u0026#39;\u003c/span\u003e, d[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;bar\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCette 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 \u003ccode\u003elist\u003c/code\u003e, \u003ccode\u003eset\u003c/code\u003e, ou même \u003ccode\u003eint\u003c/code\u003e. La documentation standard de la bibliothèque inclus de nombreux exemples dans lesquels \u003ccode\u003edefaultdict\u003c/code\u003e est utilisé de cette 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 collections_defaultdict.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\u003ed: defaultdict\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u0026lt;\u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e default_factory at 0x101341950\u0026gt;,\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#39;foo\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;bar\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\"\u003efoo\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u0026gt; bar\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ebar\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u0026gt; default value\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"lire-aussi-2\"\u003eLire aussi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca title=\"Exemples utilisant defaultdict\" href=\"https://docs.python.org/fr/3.7/library/collections.html#defaultdict-examples\" rel=\"external\"\u003edefaultdict : exemples\u003c/a\u003e – Exemples d\u0026rsquo;utilisation de \u003ccode\u003edefaultdict\u003c/code\u003e dans la documentation standard de la bibliothèque\u003c/li\u003e\n\u003cli\u003e\u003ca title=\"Evolution of Default Dictionaries in Python\" href=\"http://jtauber.com/blog/2008/02/27/evolution_of_default_dictionaries_in_python/\" rel=\"external\"\u003eÉvolution des Dictionnaires par défaut en Python\u003c/a\u003e – Article, en anglais, de James Tauber de la relation entre \u003ccode\u003edefaultdict\u003c/code\u003e et d’autres moyens d’initialisation des dictionnaires.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"deque---file-dattente-double\"\u003edeque - File d\u0026rsquo;Attente Double\u003c/h3\u003e\n\u003cp\u003eUne file d\u0026rsquo;attente double, ou \u003ccode\u003edeque\u003c/code\u003e 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é.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque.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\u003ed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeque(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;abcdefg\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;Deque:\u0026#39;\u003c/span\u003e, d)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Length:\u0026#39;\u003c/span\u003e, len(d))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Left end:\u0026#39;\u003c/span\u003e, d[\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Right end:\u0026#39;\u003c/span\u003e, d[\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\u003ed\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eremove(\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(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;remove(c):\u0026#39;\u003c/span\u003e, d)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuisque les deques sont un type de conteneur de séquences, ils prennent en charge certaines des opérations similaires à \u003ccode\u003elist\u003c/code\u003e, tel que l\u0026rsquo;examen des contenus avec \u003ccode\u003e__getitem__()\u003c/code\u003e, déterminer la longueur, et la suppression des éléments depuis le milieu de la queue par correspondance d\u0026rsquo;identité.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque.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\u003eDeque: deque\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;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, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;g\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\u003eLength: \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLeft end: a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRight end: g\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eremove\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ec\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: deque\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;b\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;g\u0026#39;\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\u003ch4 id=\"remplissage\"\u003eRemplissage\u003c/h4\u003e\n\u003cp\u003eUne deque peut être remplis depuis chaque extrémité, décrite à «gauche» ou à «droite» dans l\u0026rsquo;implémentation Python.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque_populating.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\u003e\u003cspan style=\"color:#776e71\"\u003e# Add to the right\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed1 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeque()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed1\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eextend(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;abcdefg\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;extend    :\u0026#39;\u003c/span\u003e, d1)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed1\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eappend(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;h\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;append    :\u0026#39;\u003c/span\u003e, d1)\n\u003c/span\u003e\u003c/span\u003e\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# Add to the left\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeque()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed2\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eextendleft(range(\u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;extendleft:\u0026#39;\u003c/span\u003e, d2)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed2\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eappendleft(\u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;appendleft:\u0026#39;\u003c/span\u003e, d2)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa fonction \u003ccode\u003eextendleft()\u003c/code\u003e effectue une itération sur son entrée et effectue l\u0026rsquo;équivalent d\u0026rsquo;un \u003ccode\u003eappendleft()\u003c/code\u003e pour chaque item. Le résultat final est que \u003ccode\u003edeque\u003c/code\u003e contient la séquence d\u0026rsquo;entrée dans l\u0026rsquo;ordre inverse.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque_populating.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\u003eextend    : deque\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;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, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;g\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\u003eappend    : deque\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;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, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;g\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;h\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\u003eextendleft: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e5, 4, 3, 2, 1, 0\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eappendleft: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e6, 5, 4, 3, 2, 1, 0\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"consommation\"\u003eConsommation\u003c/h4\u003e\n\u003cp\u003eDe la même manière, les éléments de \u003ccode\u003edeque\u003c/code\u003e peuvent être consommés depuis les deux extrémités, ou de l\u0026rsquo;une, selon l\u0026rsquo;algorithme qui est appliqué.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque_consuming.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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;From the right:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeque(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;abcdefg\u0026#39;\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:#815ba4\"\u003eTrue\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(d\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epop(), end\u003cspan style=\"color:#5bc4bf\"\u003e=\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    \u003cspan style=\"color:#815ba4\"\u003eexcept\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eIndexError\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ebreak\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;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eFrom the left:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeque(range(\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:#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:#815ba4\"\u003etry\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(d\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epopleft(), end\u003cspan style=\"color:#5bc4bf\"\u003e=\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    \u003cspan style=\"color:#815ba4\"\u003eexcept\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eIndexError\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ebreak\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUtilisez \u003ccode\u003epop()\u003c/code\u003e pour supprimer un item depuis l\u0026rsquo;extrémité «droite» de \u003ccode\u003edeque\u003c/code\u003e et \u003ccode\u003epopleft()\u003c/code\u003e pour prendre un item depuis l\u0026rsquo;extrémité «gauche».\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque_consuming.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\u003eFrom the right:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egfedcba\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFrom the left:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e012345\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuisque les deques sont des processus sûrs \u003cem\u003e(dits «thead-safe»)\u003c/em\u003e, les contenus peuvent être consommés depuis chaque extrémité en même temps, depuis des processus séparés.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque_both_ends.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\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003ethreading\u003c/span\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\"\u003etime\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecandle \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeque(range(\u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e))\n\u003c/span\u003e\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\"\u003eburn\u003c/span\u003e(direction, nextSource):\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:#815ba4\"\u003eTrue\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            next \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e nextSource()\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\"\u003eIndexError\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ebreak\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            print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:\u0026gt;8}\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(direction, next))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            time\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esleep(\u003cspan style=\"color:#f99b15\"\u003e0.1\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{:\u0026gt;8}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e done\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(direction))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\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\u003eleft \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e threading\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eThread(target\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eburn,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        args\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Left\u0026#39;\u003c/span\u003e, candle\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epopleft))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eright \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e threading\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eThread(target\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eburn,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                         args\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Right\u0026#39;\u003c/span\u003e, candle\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epop))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eleft\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003estart()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eright\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003estart()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eleft\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eright\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes processus dans cet exemple alternent entre chaque extrémité, supprimant les éléments jusqu\u0026rsquo;à ce que \u003ccode\u003edeque\u003c/code\u003e soit vide.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque_both_ends.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 Left: \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRight: \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRight: \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e Left: \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRight: \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e Left \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRight \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=\"rotation\"\u003eRotation\u003c/h4\u003e\n\u003cp\u003eUn autre aspect utile de \u003ccode\u003edeque\u003c/code\u003e est la capacité à se retourner dans chaque direction, et ainsi à sauter par dessus certains items.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque_rotate.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\u003ed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeque(range(\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Normal        :\u0026#39;\u003c/span\u003e, 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\u003ed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeque(range(\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003erotate(\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Right rotation:\u0026#39;\u003c/span\u003e, 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\u003ed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeque(range(\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003erotate(\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Left rotation :\u0026#39;\u003c/span\u003e, d)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa rotation de \u003ccode\u003edeque\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque_rotate.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\u003eNormal        : deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e0, 1, 2, 3, 4, 5, 6, 7, 8, 9\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRight rotation: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e8, 9, 0, 1, 2, 3, 4, 5, 6, 7\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLeft rotation : deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e2, 3, 4, 5, 6, 7, 8, 9, 0, 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\u003ch4 id=\"contraindre-la-taille-de-la-queue\"\u003eContraindre la Taille de la Queue\u003c/h4\u003e\n\u003cp\u003eUne instance \u003ccode\u003edeque\u003c/code\u003e 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 \u003ccode\u003en\u003c/code\u003e derniers éléments d\u0026rsquo;un flux d\u0026rsquo;une longueur indéterminé.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque_maxlen.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\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003erandom\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Set the random seed so we see the same output each time\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# the script is run.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erandom\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eseed(\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\u003ed1 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeque(maxlen\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\u003ed2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeque(maxlen\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e range(\u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    n \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e random\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003erandint(\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e100\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;n =\u0026#39;\u003c/span\u003e, n)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    d1\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eappend(n)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    d2\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eappendleft(n)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;D1:\u0026#39;\u003c/span\u003e, d1)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;D2:\u0026#39;\u003c/span\u003e, d2)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa longueur de la file d\u0026rsquo;attente est maintenue quelque soit l\u0026rsquo;extrémité à laquelle sont ajoutés les éléments.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_deque_maxlen.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\"\u003en\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eD1: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e17\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003emaxlen\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eD2: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e17\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003emaxlen\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\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\"\u003en\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e72\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eD1: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e17, 72\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003emaxlen\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eD2: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e72, 17\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003emaxlen\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\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\"\u003en\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e97\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eD1: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e17, 72, 97\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003emaxlen\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eD2: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e97, 72, 17\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003emaxlen\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\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\"\u003en\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eD1: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e72, 97, 8\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003emaxlen\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eD2: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e8, 97, 72\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003emaxlen\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\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\"\u003en\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e32\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eD1: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e97, 8, 32\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003emaxlen\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eD2: deque\u003cspan style=\"color:#5bc4bf\"\u003e([\u003c/span\u003e32, 8, 97\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003emaxlen\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\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=\"lire-aussi-3\"\u003eLire aussi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Double-ended_queue\" rel=\"external\"\u003eWikipedia : Deque\u003c/a\u003e - Une discussion sur la structure de données deque \u003cem\u003e(en anglais)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/fr/3.7/library/collections.html#deque-recipes\" rel=\"external\"\u003eRecettes Deque\u003c/a\u003e - Exemples d\u0026rsquo;utilisations des files d\u0026rsquo;attente depuis la documentation de la bibliothèque standard.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"namedtuple---sous-classe-de-tuple-avec-champs-nommés\"\u003enamedtuple - Sous-classe de tuple avec champs nommés\u003c/h3\u003e\n\u003cp\u003eLe \u003ccode\u003etuple\u003c/code\u003e standard utilise les index numériques pour accéder à ses membres.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_tuple.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\u003ebob \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bob\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e30\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;male\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;Representation:\u0026#39;\u003c/span\u003e, bob)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ejane \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Jane\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e29\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;female\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\"\u003eField by index:\u0026#39;\u003c/span\u003e, jane[\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eFields by index:\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 p \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e [bob, jane]:\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 is a \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e year old \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:#5bc4bf\"\u003e*\u003c/span\u003ep))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe qui fait des tuples des conteneurs pratiques pour des utilisations simples.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_tuple.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\u003eRepresentation: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bob\u0026#39;\u003c/span\u003e, 30, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;male\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\u003eField by index: Jane\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFields by index:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eBob is a \u003cspan style=\"color:#f99b15\"\u003e30\u003c/span\u003e year old male\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eJane is a \u003cspan style=\"color:#f99b15\"\u003e29\u003c/span\u003e year old female\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePar 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 \u003ccode\u003enamedtuple\u003c/code\u003e assigne des noms, aussi bien que des index numériques, pour chaque membre.\u003c/p\u003e\n\u003ch4 id=\"définitions\"\u003eDéfinitions\u003c/h4\u003e\n\u003cp\u003eLes instances \u003ccode\u003enamedtuple\u003c/code\u003e sont juste plus efficient en mémoire que les tuples ordinaires car ils n\u0026rsquo;ont pas de dictionnaires par instance. Chaque type de \u003ccode\u003enamedtuple\u003c/code\u003e est représenté par sa propre classe, qui est créée en utilisant la fonction de fabrication \u003ccode\u003enamedtuple()\u003c/code\u003e. Les arguments sont des noms de la nouvelle classe et une chaîne contenant les noms des éléments.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_namedtuple_person.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\u003ePerson \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enamedtuple(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Person\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;name age\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\u003ebob \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Person(name\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bob\u0026#39;\u003c/span\u003e, age\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eRepresentation:\u0026#39;\u003c/span\u003e, bob)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ejane \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Person(name\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Jane\u0026#39;\u003c/span\u003e, age\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e29\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\"\u003eField by name:\u0026#39;\u003c/span\u003e, jane\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eFields by index:\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 p \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e [bob, jane]:\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 is \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e years old\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(\u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003ep))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eComme l\u0026rsquo;exemple l\u0026rsquo;illustre, il est possible d\u0026rsquo;accéder aux champs du \u003ccode\u003enamedtuple\u003c/code\u003e par nom en utilisant la notation (\u003ccode\u003eobj.attr\u003c/code\u003e) aussi bien que par l\u0026rsquo;utilisation des index positionnés des tuples standards.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_namedtuple_person.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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRepresentation: Person\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bob\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003eage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e30\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\u003eField by name: Jane\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFields by index:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eBob is \u003cspan style=\"color:#f99b15\"\u003e30\u003c/span\u003e years old\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eJane is \u003cspan style=\"color:#f99b15\"\u003e29\u003c/span\u003e years old\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTout comme un \u003ccode\u003etuple\u003c/code\u003e ordinaire, un \u003ccode\u003enamedtuple\u003c/code\u003e est immuable. Cette restriction permet aux instances \u003ccode\u003etuples\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_namedtuple_immutable.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\u003ePerson \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enamedtuple(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Person\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;name age\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\u003epat \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Person(name\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Pat\u0026#39;\u003c/span\u003e, age\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e12\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\"\u003eRepresentation:\u0026#39;\u003c/span\u003e, pat)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epat\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eage \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e21\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEssayer de changer sa valeur par son nom d\u0026rsquo;attribut résulte en une erreur \u003ccode\u003eAttributError\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_namedtuple_immutable.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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRepresentation: Person\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Pat\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003eage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e12\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\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;collections_namedtuple_immutable.py\u0026#34;\u003c/span\u003e, line 17, in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;module\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    pat.age \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e21\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAttributeError: can\u003cspan style=\"color:#ef6155\"\u003e\u0026#39;\u003c/span\u003et set attribute\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"noms-de-champs-invalides\"\u003eNoms de Champs Invalides\u003c/h4\u003e\n\u003cp\u003eLes noms de champs sont invalides s\u0026rsquo;ils sont répétés ou en conflit avec des mots clés Python.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_namedtuple_bad_fields.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\u003e\u003cspan style=\"color:#815ba4\"\u003etry\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enamedtuple(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Person\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;name class age\u0026#39;\u003c/span\u003e)\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\"\u003eValueError\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(err)\n\u003c/span\u003e\u003c/span\u003e\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\"\u003etry\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enamedtuple(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Person\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;name age age\u0026#39;\u003c/span\u003e)\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\"\u003eValueError\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(err)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eComme les noms des champs sont analysés, les valeurs invalides causent des erreurs d\u0026rsquo;exceptions \u003ccode\u003eValueError\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_namedtuple_bad_fields.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\u003eType names and field names cannot be a keyword: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;class\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEncountered duplicate field name: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;age\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans les situations où un \u003ccode\u003enamedtuple\u003c/code\u003e 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 \u003ccode\u003erename\u003c/code\u003e doit être paramétrée à \u003ccode\u003eTrue\u003c/code\u003e pour que les champs invalides soient renommés.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_namedtuple_rename.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\u003ewith_class \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enamedtuple(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Person\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;name class age\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rename\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003eTrue\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(with_class\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e_fields)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etwo_ages \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enamedtuple(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Person\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;name age age\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rename\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003eTrue\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(two_ages\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e_fields)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes nouveaux noms des champs renommés dépendent de leur index dans le tuple, ainsi le champ avec le nom \u003ccode\u003eclass\u003c/code\u003e devient \u003ccode\u003e_1\u003c/code\u003e et le champ dupliqué \u003ccode\u003eage\u003c/code\u003e est changé en \u003ccode\u003e_2\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_namedtuple_rename.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:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;name\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;_1\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;age\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:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;name\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;age\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;_2\u0026#39;\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\u003ch4 id=\"attributs-spéciaux\"\u003eAttributs Spéciaux\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003enamedtuple\u003c/code\u003e 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 (\u003ccode\u003e_\u003c/code\u003e), qui par convention dans la plupart des programmes Python indique un attribut privé. Pour \u003ccode\u003enamedtuple\u003c/code\u003e, cependant, le préfixe est intentionnel pour protéger le nom d\u0026rsquo;une collision avec les noms d\u0026rsquo;attributs fournis par utilisateur.\u003c/p\u003e\n\u003cp\u003eLes noms de ces champs passés à \u003ccode\u003enamedtuple\u003c/code\u003e pour définir de nouvelle classe sont sauvegardés sont l\u0026rsquo;attribut \u003ccode\u003e_fields\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# collections_namedtuple_fields.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\u003ePerson \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enamedtuple(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Person\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;name age\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\u003ebob \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Person(name\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bob\u0026#39;\u003c/span\u003e, age\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Representation:\u0026#39;\u003c/span\u003e, bob)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Fields:\u0026#39;\u003c/span\u003e, bob\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e_fields)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_namedtuple_fields.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\u003eRepresentation: Person\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bob\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003eage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e30\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFields: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;name\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;age\u0026#39;\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\u003eLes instances \u003ccode\u003enamedtuple\u003c/code\u003e peuvent être converties en instances \u003ccode\u003eOrderedDict\u003c/code\u003e par l\u0026rsquo;usage de \u003ccode\u003e_asdict()\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# collections_namedtuple_asdict.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\u003ePerson \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enamedtuple(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Person\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;name age\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\u003ebob \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Person(name\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bob\u0026#39;\u003c/span\u003e, age\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Representation:\u0026#39;\u003c/span\u003e, bob)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;As Dictionary:\u0026#39;\u003c/span\u003e, bob\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e_asdict())\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes clés de \u003ccode\u003eOrderedDict\u003c/code\u003e sont dans le même ordre que les champs du \u003ccode\u003enamedtuple\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_namedtuple_asdict.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\u003eRepresentation: Person\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bob\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003eage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e30\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAs Dictionary: OrderedDict\u003cspan style=\"color:#5bc4bf\"\u003e([(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;name\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bob\u0026#39;\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;age\u0026#39;\u003c/span\u003e, 30\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\u003eLa méthode \u003ccode\u003e_replace()\u003c/code\u003e construit une nouvelle instance, en remplaçant les valeur de certains champs dans le processus.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_namedtuple_replace.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\u003ePerson \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enamedtuple(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Person\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;name age\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\u003ebob \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Person(name\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bob\u0026#39;\u003c/span\u003e, age\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eBefore:\u0026#39;\u003c/span\u003e, bob)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebob2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e bob\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e_replace(name\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Robert\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;After:\u0026#39;\u003c/span\u003e, bob2)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Same?:\u0026#39;\u003c/span\u003e, bob \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e bob2)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien que le nom implique que l\u0026rsquo;objet existant ait été modifié, parce que les instances \u003ccode\u003enamedtuple\u003c/code\u003e sont immuables, la méthode retourne actuellement un nouvel objet.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_namedtuple_replace.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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eBefore: Person\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bob\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003eage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e30\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAfter: Person\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Robert\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003eage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e30\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSame?: False\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"ordereddict---se-souvenir-de-lordre-des-clés-ajoutées-à-un-dictionnaire\"\u003eOrderedDict - Se souvenir de l\u0026rsquo;ordre des clés ajoutées à un dictionnaire\u003c/h3\u003e\n\u003cp\u003eUn \u003ccode\u003eOrderedDict\u003c/code\u003e est une sous-classe de dictionnaire qui se souvient de l\u0026rsquo;ordre dans lequel son contenu est ajouté.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_ordereddict_iter.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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Regular dictionary:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003ed[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003ed[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\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\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 d\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eitems():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(k, v)\n\u003c/span\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\"\u003eOrderedDict:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eOrderedDict()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003ed[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003ed[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\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\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 d\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eitems():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(k, v)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAvant Python 3.6 un \u003ccode\u003edict\u003c/code\u003e 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 \u003ccode\u003eOrderedDict\u003c/code\u003e, 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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.5 collections_ordereddict_iter.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\u003eRegular dictionary:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ec C\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eb B\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea 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\u003eOrderedDict:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eb B\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ec C\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSous Python 3.6, le natif \u003ccode\u003edict\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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.6 collections_ordereddict_iter.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\u003eRegular dictionary:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eb B\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ec 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\u003eOrderedDict:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eb B\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ec C\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"égalité\"\u003eÉgalité\u003c/h4\u003e\n\u003cp\u003eUn \u003ccode\u003edict\u003c/code\u003e ordinaire cherche son contenu lorsqu\u0026rsquo;il teste l\u0026rsquo;égalité. Un \u003ccode\u003eOrderedDict\u003c/code\u003e considère lui aussi l\u0026rsquo;ordre dans lequel les items sont ajoutés.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_ordereddict_equality.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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;dict       :\u0026#39;\u003c/span\u003e, end\u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003ed1 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed1[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003ed1[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003ed1[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed2[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003ed2[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003ed2[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(d1 \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e d2)\n\u003c/span\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;OrderedDict:\u0026#39;\u003c/span\u003e, end\u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003ed1 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eOrderedDict()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed1[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003ed1[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003ed1[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eOrderedDict()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed2[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003ed2[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003ed2[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(d1 \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e d2)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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_ordereddict_equality.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\u003edict       : True\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOrderedDict: False\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"réordonner-1\"\u003eRéordonner\u003c/h4\u003e\n\u003cp\u003eIl est possible de changer l\u0026rsquo;ordre des clés dans un \u003ccode\u003eOrderedDict\u003c/code\u003e en les bougeant selon le début ou la fin de la séquence en utilisant \u003ccode\u003emove_to_end()\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# collections_ordereddict_move_to_end.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\u003ed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eOrderedDict(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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;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;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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Before:\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 d\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eitems():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(k, v)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emove_to_end(\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\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\"\u003emove_to_end():\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 d\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eitems():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(k, v)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emove_to_end(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e, last\u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003emove_to_end(last=False):\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 d\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eitems():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(k, v)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe dernier argument demande à \u003ccode\u003emove_to_end()\u003c/code\u003e de bouger l\u0026rsquo;élément afin de devenir le dernier dans la séquence de clé (quand \u003ccode\u003eTrue\u003c/code\u003e) ou le premier (quand \u003ccode\u003eFalse\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_ordereddict_move_to_end.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\u003eBefore:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eb B\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ec 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\u003emove_to_end\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ec C\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eb 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\u003emove_to_end\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003elast\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eFalse\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eb B\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ec C\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"lire-aussi-4\"\u003eLire aussi\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/fr/3.7/using/cmdline.html#envvar-PYTHONHASHSEED\" rel=\"external\"\u003eVariable 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\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"collectionsabc---classes-de-base-abstraites-pour-les-conteneurs\"\u003ecollections.abc - Classes de base abstraites pour les conteneurs\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eBut\u003c/strong\u003e : Classes de bases abstraites pour types de données de conteneur.\u003c/p\u003e\n\u003cp\u003eLe module \u003ccode\u003ecollections.abc\u003c/code\u003e 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 \u003ccode\u003ecollections\u003c/code\u003e. Référez-vous à la table ci-dessous pour la liste des classes et leur but.\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eClasse\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eClasse(s) de Base\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eBut de l\u0026rsquo;API\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eContainer\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eFonctionnalités de base de conteneur, tel que l\u0026rsquo;opérateur \u003ccode\u003einc\u003c/code\u003e.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eHashable\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAjoute le support de fourniture d\u0026rsquo;une valeur de hachage pour l\u0026rsquo;instance du conteneur.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eIterable\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePeut créer un itérateur sur le contenu du conteneur.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eIterator\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eIterable\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eEst un itérateur sur le contenu du conteneur.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eGenerator\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eIterator\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eÉtend les itérateurs avec le protocole générateur du PEP 342.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSized\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAjoute les méthodes de conteneurs pour connaître la grosseur de leur taille.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eCallable\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePour les conteneurs invoqués en tant que fonction.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSequence\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSized, Iterable, Container\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePrend 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.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMutableSequence\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSequence\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePrend en charge l\u0026rsquo;ajout et la suppression des éléments d\u0026rsquo;une instance après qu\u0026rsquo;ils soient créés.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eByteString\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSequence\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAPI combinées de \u003ccode\u003ebytes\u003c/code\u003e et de \u003ccode\u003ebytearray\u003c/code\u003e.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSet\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSized, Iterable, Container\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePrend en charges les opérations d\u0026rsquo;ensemble telles que l\u0026rsquo;intersection et l\u0026rsquo;union.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMutableSet\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSet\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAjoute les méthodes de manipulation pour le contenu d\u0026rsquo;ensemble après qu\u0026rsquo;il soit créé.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMapping\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSized, Iterable, Container\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDéfinit l\u0026rsquo;API en lecture seule utilisé par \u003ccode\u003edict\u003c/code\u003e.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMutableMapping\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eMapping\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDéfinit les méthodes de manipulation des contenus pour la correspondance après qu\u0026rsquo;ils soient créés.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMappingView\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSized\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDéfinit la vue de l\u0026rsquo;API pour l’accès à la correspondance depuis un itérateur.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eItemsView\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eMappingView, Set\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePartie de la vue de l\u0026rsquo;API.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eKeysView\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eMappingView, Set\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePartie de la vue de l\u0026rsquo;API.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eValuesView\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eMappingView\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePartie de la vue de l\u0026rsquo;API.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAwaitable\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAPI pour les objets qui peuvent être utilisés dans des expressions \u003ccode\u003eawait\u003c/code\u003e, telles que des coroutines.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eCoroutine\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAwaitable\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAPI pour les classes qui implémentent le protocole coroutine.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAsyncIterable\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAPI pour les itérables compatibles avec \u003ccode\u003easync for\u003c/code\u003e, telle que définit dans la PEP 492.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAsyncIterator\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAsyncIterable\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAPI pour les itérateurs asynchrones.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eEn 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; \u003ccode\u003eisinstance()\u003c/code\u003e. 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.\u003c/p\u003e\n\u003ch2 id=\"array---séquence-de-données-de-type-fixé\"\u003earray - Séquence de Données de Type Fixé\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBut\u003c/strong\u003e : Gérer efficacement des séquences de données numériques de type fixé.\u003c/p\u003e\n\u003cp\u003eLe module \u003ccode\u003earray\u003c/code\u003e définit une structure de données de séquence qui ressemble beaucoup à une \u003ccode\u003elist\u003c/code\u003e, 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 \u003ccode\u003ebytes\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eRéférez-vous à la table ci-dessous pour connaître certains des types supportés. La documentation de la bibliothèque standard pour \u003ccode\u003earray\u003c/code\u003e inclus une liste complète des codes de types.\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCode\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eType\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eTaille minimal (octets)\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eb\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eint\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e1\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eB\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eint\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e1\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eh\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003esigned short\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eH\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eunsigned short\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003ei\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003esigned int\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eI\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eunsigned int\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003el\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003esigned long\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e4\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eL\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eunsigned long\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e4\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eq\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003esigned long long\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e8\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eQ\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eunsigned long long\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e8\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003ef\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003efloat\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e4\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003ed\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003edouble float\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e8\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"initialisation-1\"\u003eInitialisation\u003c/h3\u003e\n\u003cp\u003eUn \u003ccode\u003earray\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# array_string.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\"\u003earray\u003c/span\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\"\u003ebinascii\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003es \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eb\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;This is the array.\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e array\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003earray(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e, s)\n\u003c/span\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;As byte string:\u0026#39;\u003c/span\u003e, s)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;As array      :\u0026#39;\u003c/span\u003e, a)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;As hex        :\u0026#39;\u003c/span\u003e, binascii\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ehexlify(a))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 array_string.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\u003eAs byte string: b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;This is the array.\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAs array      : array\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e84, 104, 105, 115, 32, 105, 115, 32,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e 116, 104, 101, 32, 97, 114, 114, 97, 121, 46\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAs hex        : b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;54686973206973207468652061727261792e\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"manipuler-des-tableaux\"\u003eManipuler des Tableaux\u003c/h3\u003e\n\u003cp\u003eUn \u003ccode\u003earray\u003c/code\u003e peut être étendu ou autrement manipulé de la même manière que les autres séquences Python.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# array_sequence.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\"\u003earray\u003c/span\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\"\u003epprint\u003c/span\u003e\n\u003c/span\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 array\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003earray(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, range(\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Initial :\u0026#39;\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\u003ea\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eextend(range(\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Extended:\u0026#39;\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Slice   :\u0026#39;\u003c/span\u003e, a[\u003cspan style=\"color:#f99b15\"\u003e2\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Iterator:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(list(enumerate(a)))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes opérations supportées incluent le découpage, l\u0026rsquo;itération, et l\u0026rsquo;ajout d\u0026rsquo;éléments à la fin.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 array_sequence.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\u003eInitial : array\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0, 1, 2\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eExtended: array\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0, 1, 2, 0, 1, 2\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSlice   : array\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e2, 0, 1\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIterator:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[(\u003c/span\u003e0, 0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, 1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2, 2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3, 0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e4, 1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5, 2\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=\"tableaux-et-fichiers\"\u003eTableaux et Fichiers\u003c/h3\u003e\n\u003cp\u003eLe 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# array_file.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\"\u003earray\u003c/span\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\"\u003ebinascii\u003c/span\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\"\u003etempfile\u003c/span\u003e\n\u003c/span\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 array\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003earray(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, range(\u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;A1:\u0026#39;\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:#776e71\"\u003e# Write the array of numbers to a temporary file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoutput \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e tempfile\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eNamedTemporaryFile()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etofile(output\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efile)  \u003cspan style=\"color:#776e71\"\u003e# must pass an *actual* file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoutput\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eflush()\n\u003c/span\u003e\u003c/span\u003e\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# Read the raw data\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(output\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;rb\u0026#39;\u003c/span\u003e) \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e input:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    raw_data \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e input\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eread()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Raw Contents:\u0026#39;\u003c/span\u003e, binascii\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ehexlify(raw_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\u003e    \u003cspan style=\"color:#776e71\"\u003e# Read the data into an array\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    input\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eseek(\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    a2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e array\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003earray(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    a2\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efromfile(input, len(a))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;A2:\u0026#39;\u003c/span\u003e, a2)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCet 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 array_file.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\u003eA1: array\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0, 1, 2, 3, 4\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRaw Contents: b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0000000001000000020000000300000004000000\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eA2: array\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0, 1, 2, 3, 4\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\u003ccode\u003etofile()\u003c/code\u003e utilise \u003ccode\u003etobytes()\u003c/code\u003e pour formater les données, et \u003ccode\u003efromfile()\u003c/code\u003e utilise \u003ccode\u003efrombytes()\u003c/code\u003e pour les convertir à nouveau en une instance de tableau.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# array_tobytes.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\"\u003earray\u003c/span\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\"\u003ebinascii\u003c/span\u003e\n\u003c/span\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 array\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003earray(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, range(\u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;A1:\u0026#39;\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\u003eas_bytes \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e a\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etobytes()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Bytes:\u0026#39;\u003c/span\u003e, binascii\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ehexlify(as_bytes))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e array\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003earray(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea2\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efrombytes(as_bytes)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;A2:\u0026#39;\u003c/span\u003e, a2)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes deux fonctions \u003ccode\u003etobytes()\u003c/code\u003e et \u003ccode\u003efrombytes()\u003c/code\u003e fonctionnent sur des chaînes d\u0026rsquo;octets, et non pas des chaînes Unicode.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 array_tobytes.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\u003eA1: array\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0, 1, 2, 3, 4\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eBytes: b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0000000001000000020000000300000004000000\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eA2: array\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0, 1, 2, 3, 4\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=\"ordre-alternatif-doctet\"\u003eOrdre Alternatif d\u0026rsquo;Octet\u003c/h3\u003e\n\u003cp\u003eSi 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# array_byteswap.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\"\u003earray\u003c/span\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\"\u003ebinascii\u003c/span\u003e\n\u003c/span\u003e\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\"\u003eto_hex\u003c/span\u003e(a):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    chars_per_item \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e a\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eitemsize \u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e  \u003cspan style=\"color:#776e71\"\u003e# 2 hex digits\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    hex_version \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e binascii\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ehexlify(a)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    num_chunks \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e len(hex_version) \u003cspan style=\"color:#5bc4bf\"\u003e//\u003c/span\u003e chars_per_item\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e range(num_chunks):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        start \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e i \u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003e chars_per_item\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        end \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e start \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e chars_per_item\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eyield\u003c/span\u003e hex_version[start:end]\n\u003c/span\u003e\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\u003estart \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e int(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0x12345678\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eend \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e start \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\u003ea1 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e array\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003earray(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, range(start, end))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e array\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003earray(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e, range(start, end))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea2\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ebyteswap()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efmt \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:\u0026gt;12}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:\u0026gt;12}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:\u0026gt;12}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:\u0026gt;12}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(fmt\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;A1 hex\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;A1\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;A2 hex\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;A2\u0026#39;\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(fmt\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efmt \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{!r:\u0026gt;12}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:12}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{!r:\u0026gt;12}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:12}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\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 values \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e zip(to_hex(a1), a1, to_hex(a2), a2):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(fmt\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(\u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003evalues))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa méthode \u003ccode\u003ebyteswap()\u003c/code\u003e é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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 array_byteswap.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      A1 hex           A1       A2 hex           A2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-------- -------- -------- --------\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;78563412\u0026#39;\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e305419896\u003c/span\u003e  b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;12345678\u0026#39;\u003c/span\u003e   \u003cspan style=\"color:#f99b15\"\u003e2018915346\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;79563412\u0026#39;\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e305419897\u003c/span\u003e  b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;12345679\u0026#39;\u003c/span\u003e   \u003cspan style=\"color:#f99b15\"\u003e2035692562\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;7a563412\u0026#39;\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e305419898\u003c/span\u003e  b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;1234567a\u0026#39;\u003c/span\u003e   \u003cspan style=\"color:#f99b15\"\u003e2052469778\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;7b563412\u0026#39;\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e305419899\u003c/span\u003e  b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;1234567b\u0026#39;\u003c/span\u003e   \u003cspan style=\"color:#f99b15\"\u003e2069246994\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;7c563412\u0026#39;\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e305419900\u003c/span\u003e  b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;1234567c\u0026#39;\u003c/span\u003e   \u003cspan style=\"color:#f99b15\"\u003e2086024210\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"lire-aussi-5\"\u003eLire aussi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/fr/3.7/library/array.html\" rel=\"external\"\u003eDocumentation de la bibliothèque standard pour \u003ccode\u003earray\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/fr/trad/developpez.net/pymotw3-structures-de-donnees/#module-struct\"\u003estruct\u003c/a\u003e - Le module \u003ccode\u003estruct\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.numpy.org/\" rel=\"external\"\u003ePython Numérique\u003c/a\u003e - NumPy est une bibliothèque Python pour travailler efficacement avec de grands ensembles de données.\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eNotes de Portage de Python 2 vers 3 sur array\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"heapq---algorithme-de-tri-heap\"\u003eheapq - Algorithme de Tri Heap\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBut\u003c/strong\u003e : Heapq implémente un algorithme de tri minitas(?) approprié pour utiliser les listes Python.\u003c/p\u003e\n\u003cp\u003eUn \u003ccode\u003eheap\u003c/code\u003e 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 \u003ccode\u003ebinary heaps\u003c/code\u003e peut être représenté en utilisant une liste ou un tableau organisé afin que les nœuds enfants d\u0026rsquo;élément \u003ccode\u003eN\u003c/code\u003e soient à la position 2 * \u003cem\u003eN\u003c/em\u003e + 1 et 2 * \u003cem\u003eN\u003c/em\u003e + 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.\u003c/p\u003e\n\u003cp\u003eUn 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 \u003ccode\u003eheapq\u003c/code\u003e implémente un min-heap.\u003c/p\u003e\n\u003ch3 id=\"exemple-de-donnée\"\u003eExemple de Donnée\u003c/h3\u003e\n\u003cp\u003eCet exemple dans ce chapitre utilise la donnée dans le script \u003ccode\u003eheapq_heapdata.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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# heapq_heapdata.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:#776e71\"\u003e# This data was generated with the random module.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edata \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [\u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa sortie du tas est imprimé en utilisant le script \u003ccode\u003eheapq_showtree.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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# heapq_showtree.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\"\u003emath\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\"\u003eio\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e StringIO\n\u003c/span\u003e\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\"\u003eshow_tree\u003c/span\u003e(tree, total_width\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e36\u003c/span\u003e, fill\u003cspan style=\"color:#5bc4bf\"\u003e=\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    \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u0026#34;Pretty-print a tree.\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    output \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e StringIO()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    last_row \u003cspan style=\"color:#5bc4bf\"\u003e=\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:#815ba4\"\u003efor\u003c/span\u003e i, n \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e enumerate(tree):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e i:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            row \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e int(math\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efloor(math\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003elog(i \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\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:#815ba4\"\u003eelse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            row \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\"\u003eif\u003c/span\u003e row \u003cspan style=\"color:#5bc4bf\"\u003e!=\u003c/span\u003e last_row:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            output\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ewrite(\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)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        columns \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e**\u003c/span\u003e row\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        col_width \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e int(math\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efloor(total_width \u003cspan style=\"color:#5bc4bf\"\u003e/\u003c/span\u003e columns))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        output\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ewrite(str(n)\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ecenter(col_width, fill))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        last_row \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e row\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(output\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003egetvalue())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003e total_width)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"créer-un-heap\"\u003eCréer un Heap\u003c/h3\u003e\n\u003cp\u003eIl y a deux manières de base de créer un heap : \u003ccode\u003eheappush()\u003c/code\u003e et \u003ccode\u003eheapify()\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# heapq_heappush.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\"\u003eheapq\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\"\u003eheapq_showtree\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e show_tree\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\"\u003eheapq_heapdata\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e 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\u003eheap \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e []\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;random :\u0026#39;\u003c/span\u003e, data)\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\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e n \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e data:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;add \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:\u0026gt;3}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e:\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(n))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    heapq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eheappush(heap, n)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    show_tree(heap)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eQuand \u003ccode\u003eheappush()\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 heapq_heappush.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\u003erandom : \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e19, 9, 4, 10, 11\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\u003eadd  19:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e19\u003c/span\u003e\n\u003c/span\u003e\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\u003eadd   9:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e\n\u003c/span\u003e\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\u003eadd   4:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e                \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\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\u003eadd  10:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e                \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e\n\u003c/span\u003e\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\u003eadd  11:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e                \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e19\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----------------------\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi la donnée est toujours en mémoire, il est plus efficient d\u0026rsquo;utiliser \u003ccode\u003eheapify()\u003c/code\u003e pour réarranger les items dans la liste.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# heapq_heapify.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\"\u003eheapq\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\"\u003eheapq_showtree\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e show_tree\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\"\u003eheapq_heapdata\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e 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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;random    :\u0026#39;\u003c/span\u003e, data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eheapq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eheapify(data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;heapified :\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eshow_tree(data)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe 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 \u003ccode\u003eheapify()\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 heapq_heapify.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\u003erandom    : \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e19, 9, 4, 10, 11\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eheapified :\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e                 \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e10\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----------------------\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"accéder-au-contenu-dun-heap\"\u003eAccéder au Contenu d\u0026rsquo;un Heap\u003c/h3\u003e\n\u003cp\u003eUne fois que le heap est organisé correctement, utilisez \u003ccode\u003eheappop()\u003c/code\u003e pour supprimer l\u0026rsquo;élément ayant la valeur la plus petite.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# heapq_heappop.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\"\u003eheapq\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\"\u003eheapq_showtree\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e show_tree\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\"\u003eheapq_heapdata\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e 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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;random    :\u0026#39;\u003c/span\u003e, data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eheapq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eheapify(data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;heapified :\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eshow_tree(data)\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\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e range(\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    smallest \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e heapq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eheappop(data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;pop    \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:\u0026gt;3}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e:\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(smallest))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    show_tree(data)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans cet exemple, adapté de la documentation de la bibliothèque standard, \u003ccode\u003eheapify()\u003c/code\u003e et \u003ccode\u003eheappop()\u003c/code\u003e sont utilisées pour trier une liste de nombres.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 heapq_heappop.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\u003erandom    : \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e19, 9, 4, 10, 11\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eheapified :\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e                 \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e10\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----------------------\n\u003c/span\u003e\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\u003epop      4:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e                \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e\n\u003c/span\u003e\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\u003epop      9:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e                \u003cspan style=\"color:#f99b15\"\u003e19\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\u003ePour supprimer des éléments existants et les remplacer par de nouvelles valeurs en une unique opération, utilisez \u003ccode\u003eheapreplace()\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# heapq_heapreplace.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\"\u003eheapq\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\"\u003eheapq_showtree\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e show_tree\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\"\u003eheapq_heapdata\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e 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\u003eheapq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eheapify(data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;start:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eshow_tree(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\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e n \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e [\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e]:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    smallest \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e heapq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eheapreplace(data, n)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;replace \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:\u0026gt;2}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e with \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:\u0026gt;2}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e:\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(smallest, n))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    show_tree(data)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRemplacer des éléments rend possible de maintenir un heap de taille fixée, tel qu\u0026rsquo;une file de travaux ordonnés par priorité.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 heapq_heapreplace.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\u003estart:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e                 \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e10\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----------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereplace  \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e with  0:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e                 \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e10\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----------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereplace  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e with 13:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e                \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e13\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----------------------\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"extrêmes-des-données-dun-heap\"\u003eExtrêmes des Données d\u0026rsquo;un Heap\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eheapq\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# heapq_extremes.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\"\u003eheapq\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\"\u003eheapq_heapdata\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e 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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;all       :\u0026#39;\u003c/span\u003e, data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;3 largest :\u0026#39;\u003c/span\u003e, heapq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enlargest(\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e, data))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;from sort :\u0026#39;\u003c/span\u003e, list(reversed(sorted(data)[\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;3 smallest:\u0026#39;\u003c/span\u003e, heapq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ensmallest(\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e, data))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;from sort :\u0026#39;\u003c/span\u003e, sorted(data)[:\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\u003eUtiliser \u003ccode\u003enlargest()\u003c/code\u003e et \u003ccode\u003ensmallest()\u003c/code\u003e est efficace seulement pour les valeurs relativement petites de \u003cem\u003en\u003c/em\u003e \u0026gt; 1, mais peut toujours devenir plus pratique dans quelques 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 heapq_extremes.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       : \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e19, 9, 4, 10, 11\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:#f99b15\"\u003e3\u003c/span\u003e largest : \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e19, 11, 10\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efrom sort : \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e19, 11, 10\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:#f99b15\"\u003e3\u003c/span\u003e smallest: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e4, 9, 10\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efrom sort : \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e4, 9, 10\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=\"fusion-efficace-des-séquences-triées\"\u003eFusion Efficace des Séquences Triées\u003c/h3\u003e\n\u003cp\u003eCombiner de nombreuses séquences triées en une nouvelle séquence est facile pour de petits ensembles de données.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epython list(sorted(itertools.chain(*data))) \u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour 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, \u003ccode\u003emerge()\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# heapq_merge.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\"\u003eheapq\u003c/span\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\"\u003erandom\u003c/span\u003e\n\u003c/span\u003e\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\u003erandom\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eseed(\u003cspan style=\"color:#f99b15\"\u003e2016\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edata \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\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e range(\u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    new_data \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e list(random\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esample(range(\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e101\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    new_data\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esort()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    data\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eappend(new_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\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e i, d \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e enumerate(data):\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(i, 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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eMerged:\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 i \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e heapq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emerge(\u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003edata):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(i, end\u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003eprint()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuisque l\u0026rsquo;implémentation de \u003ccode\u003emerge()\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 heapq_merge.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\u003e0: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e33, 58, 71, 88, 95\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e1: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e10, 11, 17, 38, 91\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e13, 18, 39, 61, 63\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e3: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e20, 27, 31, 42, 45\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\u003eMerged:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e18\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e27\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e31\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e33\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e38\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e39\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e42\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e45\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e58\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e61\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e63\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e71\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e88\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e91\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e95\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"lire-aussi-6\"\u003eLire aussi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/fr/3.7/library/heapq.html\" rel=\"external\"\u003eDocumentation de la bibliothèque standard pour heapq\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Heap_(data_structure)\" rel=\"external\"\u003eWikipedia - Heap (structure de données)\u003c/a\u003e - Une description générale des structures de données heap\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://pymotw.com/3/queue/index.html#queue-priorityqueue\" rel=\"external\"\u003ePriorité de la File d\u0026rsquo;attente\u003c/a\u003e - Une implémentation prioritaire de la file d\u0026rsquo;attente de \u003ccode\u003eQueue\u003c/code\u003e dans la bibliothèque standard.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"bisect---maintenir-les-listes-dans-un-ordre-trié\"\u003ebisect - Maintenir les Listes dans un Ordre Trié\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBut\u003c/strong\u003e : Maintenir une liste dans un ordre trié sans avoir à appeler le tri chaque fois qu\u0026rsquo;un item est ajouté à la liste.\u003c/p\u003e\n\u003cp\u003eLe module \u003ccode\u003ebisect\u003c/code\u003e implémente un algorithme pour insérer des éléments dans une liste tout en maintenant la liste dans un ordre trié.\u003c/p\u003e\n\u003ch3 id=\"insérer-dans-un-ordre-trié\"\u003eInsérer dans un Ordre Trié\u003c/h3\u003e\n\u003cp\u003eVoici un exemple dans lequel \u003ccode\u003einsort()\u003c/code\u003e est utilisé pour insérer des items dans la liste en ordre trié.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# bisect_example.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\"\u003ebisect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 series of random numbers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evalues \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [\u003cspan style=\"color:#f99b15\"\u003e14\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e85\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e77\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e26\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e50\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e45\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e66\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e79\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e84\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e77\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;New  Pos  Contents\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;---  ---  ------\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\u003el \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\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e values:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    position \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e bisect\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ebisect(l, i)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    bisect\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003einsort(l, i)\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{:3}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:3}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(i, position), l)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 bisect_example.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\u003eNew  Pos  Contents\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e14\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14\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:#f99b15\"\u003e85\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 85\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:#f99b15\"\u003e77\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 77, 85\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:#f99b15\"\u003e26\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 26, 77, 85\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:#f99b15\"\u003e50\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 26, 50, 77, 85\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:#f99b15\"\u003e45\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 26, 45, 50, 77, 85\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:#f99b15\"\u003e66\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 26, 45, 50, 66, 77, 85\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:#f99b15\"\u003e79\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 26, 45, 50, 66, 77, 79, 85\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:#f99b15\"\u003e10\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e10, 14, 26, 45, 50, 66, 77, 79, 85\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:#f99b15\"\u003e3\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e3, 10, 14, 26, 45, 50, 66, 77, 79, 85\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:#f99b15\"\u003e84\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e3, 10, 14, 26, 45, 50, 66, 77, 79, 84, 85\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:#f99b15\"\u003e77\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85\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:#f99b15\"\u003e1\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e1, 3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85\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\u003eCeci 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.\u003c/p\u003e\n\u003ch3 id=\"traitement-des-doublons\"\u003eTraitement des Doublons\u003c/h3\u003e\n\u003cp\u003eLe résultat de l\u0026rsquo;ensemble montré précédemment inclus une valeur répétée, \u003ccode\u003e77\u003c/code\u003e. Le module \u003ccode\u003ebisect\u003c/code\u003e 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 \u003ccode\u003einsort()\u003c/code\u003e est actuellement un alias de \u003ccode\u003einsort_right()\u003c/code\u003e, qui insère un item après une valeur existante. La fonction correspondante \u003ccode\u003einsort_left()\u003c/code\u003e insère un item avant la valeur existante.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# bisect_example2.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\"\u003ebisect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 series of random numbers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evalues \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [\u003cspan style=\"color:#f99b15\"\u003e14\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e85\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e77\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e26\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e50\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e45\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e66\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e79\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e84\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e77\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;New  Pos  Contents\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;---  ---  ------\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# Use bisect_left and insort_left.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003el \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\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e values:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    position \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e bisect\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ebisect_left(l, i)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    bisect\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003einsort_left(l, i)\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{:3}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:3}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(i, position), l)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eQuand la même donnée est manipulée par l\u0026rsquo;utilisation des fonctions \u003ccode\u003ebisect_left()\u003c/code\u003e et \u003ccode\u003einsort_left()\u003c/code\u003e, il en résulte la même liste triée mais l\u0026rsquo;insertion des positions est différente pour les valeurs dupliqué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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 bisect_example2.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\u003eNew  Pos  Contents\n\u003c/span\u003e\u003c/span\u003e\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\"\u003e14\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14\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:#f99b15\"\u003e85\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 85\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:#f99b15\"\u003e77\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 77, 85\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:#f99b15\"\u003e26\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 26, 77, 85\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:#f99b15\"\u003e50\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 26, 50, 77, 85\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:#f99b15\"\u003e45\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 26, 45, 50, 77, 85\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:#f99b15\"\u003e66\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 26, 45, 50, 66, 77, 85\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:#f99b15\"\u003e79\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e14, 26, 45, 50, 66, 77, 79, 85\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:#f99b15\"\u003e10\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e10, 14, 26, 45, 50, 66, 77, 79, 85\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:#f99b15\"\u003e3\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e3, 10, 14, 26, 45, 50, 66, 77, 79, 85\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:#f99b15\"\u003e84\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e3, 10, 14, 26, 45, 50, 66, 77, 79, 84, 85\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:#f99b15\"\u003e77\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85\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:#f99b15\"\u003e1\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e1, 3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85\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=\"lire-aussi-7\"\u003eLire aussi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/fr/3.7/library/bisect.html\" rel=\"external\"\u003eDocumentation de la bibliothèque standard pour bisect\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Insertion_sort\" rel=\"external\"\u003eWikipedia - Tri d\u0026rsquo;insertion\u003c/a\u003e - Une description de l\u0026rsquo;algorithme d\u0026rsquo;insertion de tri.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"queue---implémentation-fifo-thread-safe\"\u003equeue - Implémentation FIFO Thread-Safe\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBut\u003c/strong\u003e : Fournir une implémentation FIFO de processus sûrs.\u003c/p\u003e\n\u003cp\u003eLe module \u003ccode\u003equeue\u003c/code\u003e 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 \u003ccode\u003eQueue\u003c/code\u003e facilement et en toute sécurité. La taille de la \u003ccode\u003eQueue\u003c/code\u003e (le nombre des éléments qu\u0026rsquo;elle contient) peut être restreinte à l\u0026rsquo;utilisation ou au traitement de la mémoire.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e\nCette 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.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"file-dattente-fifo-de-base\"\u003eFile d\u0026rsquo;attente FIFO de base\u003c/h3\u003e\n\u003cp\u003eLa classe \u003ccode\u003eQueue\u003c/code\u003e 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 \u003ccode\u003eput()\u003c/code\u003e, et supprimé à la fin d\u0026rsquo;une autre par l\u0026rsquo;utilisation de \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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# queue_fifo.py\u003c/span\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\"\u003equeue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eq \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e queue\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eQueue()\n\u003c/span\u003e\u003c/span\u003e\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 i \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e range(\u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    q\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eput(i)\n\u003c/span\u003e\u003c/span\u003e\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\"\u003ewhile\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003enot\u003c/span\u003e q\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eempty():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(q\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eget(), end\u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003eprint()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCet 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 queue_fifo.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:#f99b15\"\u003e0\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\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"file-dattente-lifo\"\u003eFile d\u0026rsquo;Attente LIFO\u003c/h3\u003e\n\u003cp\u003ePar contraste à l\u0026rsquo;implémentation standard FIFO de \u003ccode\u003eQueue\u003c/code\u003e, la \u003ccode\u003eLifoQueue\u003c/code\u003e utilise l\u0026rsquo;ordre dernier entré, premier sorti (normalement associé à la pile de la structure 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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# queue_lifo.py\u003c/span\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\"\u003equeue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eq \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e queue\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eLifoQueue()\n\u003c/span\u003e\u003c/span\u003e\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 i \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e range(\u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    q\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eput(i)\n\u003c/span\u003e\u003c/span\u003e\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\"\u003ewhile\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003enot\u003c/span\u003e q\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eempty():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(q\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eget(), end\u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003eprint()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;élément le plus récemment entré dans la file d\u0026rsquo;attente est supprimé par \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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 queue_lifo.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:#f99b15\"\u003e4\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\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=\"priorité-dans-la-file-dattente\"\u003ePriorité dans la File d\u0026rsquo;Attente\u003c/h3\u003e\n\u003cp\u003eParfois, 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. \u003ccode\u003ePriorityQueues\u003c/code\u003e utilise l\u0026rsquo;ordre de tri de la file d\u0026rsquo;attente pour décider quel élément est à récupérer.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# queue_priority.py\u003c/span\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\"\u003efunctools\u003c/span\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\"\u003equeue\u003c/span\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\"\u003ethreading\u003c/span\u003e\n\u003c/span\u003e\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@functools.total_ordering\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\"\u003eJob\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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, priority, description):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epriority \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e priority\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edescription \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e description\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;New job:\u0026#39;\u003c/span\u003e, description)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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__eq__\u003c/span\u003e(self, other):\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            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epriority \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e other\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epriority\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\"\u003eAttributeError\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 NotImplemented\n\u003c/span\u003e\u003c/span\u003e\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__lt__\u003c/span\u003e(self, other):\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            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epriority \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003e other\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epriority\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\"\u003eAttributeError\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 NotImplemented\n\u003c/span\u003e\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\u003eq \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e queue\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ePriorityQueue()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eput(Job(\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Mid-level job\u0026#39;\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eput(Job(\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Low-level job\u0026#39;\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eput(Job(\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Important job\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\"\u003eprocess_job\u003c/span\u003e(q):\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:#815ba4\"\u003eTrue\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        next_job \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e q\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eget()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Processing job:\u0026#39;\u003c/span\u003e, next_job\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edescription)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        q\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etask_done()\n\u003c/span\u003e\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\u003eworkers \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    threading\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eThread(target\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eprocess_job, args\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e(q,)),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    threading\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eThread(target\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eprocess_job, args\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e(q,)),\n\u003c/span\u003e\u003c/span\u003e\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 w \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e workers:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    w\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esetDaemon(\u003cspan style=\"color:#815ba4\"\u003eTrue\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    w\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003estart()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eq\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCet 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ù \u003ccode\u003eget()\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 queue_priority.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\u003eNew job: Mid-level job\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNew job: Low-level job\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNew job: Important job\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eProcessing job: Important job\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eProcessing job: Mid-level job\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eProcessing job: Low-level job\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"construire-un-thread-client-de-podcast\"\u003eConstruire un Thread Client de Podcast\u003c/h3\u003e\n\u003cp\u003eLe code source pour un client de podcast dans ce chapitre démontre comment utiliser la classe \u003ccode\u003eQueue\u003c/code\u003e 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 \u003ccode\u003equeue\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eEn 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# fetch_podcasts.py\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\"\u003equeue\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e Queue\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\"\u003ethreading\u003c/span\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\"\u003etime\u003c/span\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\"\u003eurllib\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\"\u003eurllib.parse\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e urlparse\n\u003c/span\u003e\u003c/span\u003e\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\"\u003efeedparser\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Set up some global variables\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enum_fetch_threads \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\u003eenclosure_queue \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Queue()\n\u003c/span\u003e\u003c/span\u003e\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 real app wouldn\u0026#39;t use hard-coded data...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efeed_urls \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;http://talkpython.fm/episodes/rss\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\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\"\u003emessage\u003c/span\u003e(s):\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(threading\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ecurrent_thread()\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename, s))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa fonction \u003ccode\u003edownload_enclosures()\u003c/code\u003e s\u0026rsquo;exécute dans le thread de travail et traite les téléchargements en utilisant \u003ccode\u003eurllib\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\"\u003edownload_enclosures\u003c/span\u003e(q):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u0026#34;This is the worker thread function.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    It processes items in the queue one after\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    another.  These daemon threads go into an\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    infinite loop, and exit only when\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    the main thread ends.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    \u0026#34;\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\"\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        message(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;looking for the next enclosure\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        url \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e q\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eget()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        filename \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e url\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003erpartition(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\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        message(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;downloading \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(filename))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        response \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e urllib\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003erequest\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eurlopen(url)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        data \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e response\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eread()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e# Save the downloaded file to the current directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        message(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;writing to \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(filename))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ewith\u003c/span\u003e open(filename, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;wb\u0026#39;\u003c/span\u003e) \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e outfile:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            outfile\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ewrite(data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        q\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etask_done()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUne fois que la fonction cible pour les threads est définie, le thread de travail peut être démarré. Quand \u003ccode\u003edownload_enclosures()\u003c/code\u003e s\u0026rsquo;occupe de l\u0026rsquo;instruction \u003ccode\u003eurl = q.get()\u003c/code\u003e, 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# Set up some threads to fetch the enclosures\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 i \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e range(num_fetch_threads):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    worker \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e threading\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eThread(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        target\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003edownload_enclosures,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        args\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e(enclosure_queue,),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        name\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;worker-\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(i),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    worker\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esetDaemon(\u003cspan style=\"color:#815ba4\"\u003eTrue\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    worker\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003estart()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;étape suivante est de récupérer le contenu de flux en utilisant le module \u003ccode\u003efeedparser\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# Download the feed(s) and put the enclosure URLs into\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# the queue.\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 url \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e feed_urls:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    response \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e feedparser\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eparse(url, agent\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;fetch_podcasts.py\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 entry \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e response[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;entries\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:#815ba4\"\u003efor\u003c/span\u003e enclosure \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e entry\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eget(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;enclosures\u0026#39;\u003c/span\u003e, []):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            parsed_url \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e urlparse(enclosure[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;url\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            message(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;queuing \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(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                parsed_url\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epath\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003erpartition(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\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            enclosure_queue\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eput(enclosure[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;url\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl ne reste plus qu\u0026rsquo;à attendre que la file se vide à nouveau, par l\u0026rsquo;utilisation de \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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Now wait for the queue to be empty, indicating that we have\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# processed all of the downloads.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emessage(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;*** main thread waiting\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eenclosure_queue\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emessage(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;*** done\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;exécution de cet exemple de script produit une sortie similaire à celle 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epython3 fetch_podcasts.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\u003eworker-0: looking \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e the next enclosure\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eworker-1: looking \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e the next enclosure\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMainThread: queuing turbogears-and-the-future-of-python-web-frameworks.mp3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMainThread: queuing continuum-scientific-python-and-the-business-of-open-source.mp3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMainThread: queuing openstack-cloud-computing-built-on-python.mp3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMainThread: queuing pypy.js-pypy-python-in-your-browser.mp3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMainThread: queuing machine-learning-with-python-and-scikit-learn.mp3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMainThread: *** main thread waiting\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eworker-0: downloading turbogears-and-the-future-of-python-web-frameworks.mp3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eworker-1: downloading continuum-scientific-python-and-the-business-of-open-source.mp3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eworker-0: looking \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e the next enclosure\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eworker-0: downloading openstack-cloud-computing-built-on-python.mp3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eworker-1: looking \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e the next enclosure\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eworker-1: downloading pypy.js-pypy-python-in-your-browser.mp3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eworker-0: looking \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e the next enclosure\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eworker-0: downloading machine-learning-with-python-and-scikit-learn.mp3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eworker-1: looking \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e the next enclosure\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eworker-0: looking \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e the next enclosure\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMainThread: *** \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\u003eLa sortie actuelle dépendra du contenu des flux RSS utilisés.\u003c/p\u003e\n\u003ch3 id=\"lire-aussi-8\"\u003eLire aussi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/fr/3.7/library/queue.html\" rel=\"external\"\u003eDocumentation de la bibliothèque standard pour queue\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003edeque - File d\u0026rsquo;Attente Double\u003c/a\u003e dans le chapitre \u003ca\u003ecollections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca title=\"Queue data structures\" href=\"https://en.wikipedia.org/wiki/Queue_(data_structure)\" rel=\"external\"\u003eStructures de Données en Files d\u0026rsquo;Attente\u003c/a\u003e - Un article Wikipédia en anglais expliquant les files d\u0026rsquo;attentes.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/File_(structure_de_donn%C3%A9es)\" rel=\"external\"\u003eFIFO\u003c/a\u003e - Un article Wikipédia expliquant les structures de données, premier entré, premier sorti.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://pypi.python.org/pypi/feedparser\" rel=\"external\"\u003emodule feedparser\u003c/a\u003e - Un module pour analyser les flux RSS et Atom, créé par Mark Pilgrim et maintenu par Kurt McKee.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"struct---structures-de-données-binaires\"\u003estruct - Structures de Données Binaires\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBut\u003c/strong\u003e : Conversion entre chaînes et données binaires.\u003c/p\u003e\n\u003cp\u003eLe module \u003ccode\u003estruct\u003c/code\u003e 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.\u003c/p\u003e\n\u003ch3 id=\"fonctions-versus-classe-struct\"\u003eFonctions versus Classe Struct\u003c/h3\u003e\n\u003cp\u003eUn ensemble de fonctions au niveau du module est disponible pour travailler avec des valeurs structurées, tout comme la classe \u003ccode\u003eStruct\u003c/code\u003e. 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 \u003ccode\u003eStruct\u003c/code\u003e 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 \u003ccode\u003eStruct\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"emballage-et-déballage\"\u003eEmballage et Déballage\u003c/h3\u003e\n\u003cp\u003eLes structures prennent en charge l\u0026rsquo;\u003cem\u003eemballage\u003c/em\u003e de données dans les chaînes, et le \u003cem\u003edéballage\u003c/em\u003e 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.\u003c/p\u003e\n\u003cp\u003eDans 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é.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# struct_pack.py\u003c/span\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\"\u003estruct\u003c/span\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\"\u003ebinascii\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evalues \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eencode(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;utf-8\u0026#39;\u003c/span\u003e), \u003cspan style=\"color:#f99b15\"\u003e2.7\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003es \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e struct\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eStruct(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;I 2s f\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epacked_data \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epack(\u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003evalues)\n\u003c/span\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;Original values:\u0026#39;\u003c/span\u003e, values)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Format string  :\u0026#39;\u003c/span\u003e, s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Uses           :\u0026#39;\u003c/span\u003e, s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esize, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;bytes\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;Packed Value   :\u0026#39;\u003c/span\u003e, binascii\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ehexlify(packed_data))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;exemple convertit la valeur encodée en une séquence d\u0026rsquo;octets hexadécimaux pour l\u0026rsquo;imprimer avec la fonction \u003ccode\u003ebinascii.hexlify()\u003c/code\u003e, puisque certains des caractères sont nuls.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 struct_pack.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\u003eOriginal values: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e, 2.7\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFormat string  : I 2s f\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUses           : \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e bytes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePacked Value   : b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0100000061620000cdcc2c40\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUtilisez \u003ccode\u003eunpack()\u003c/code\u003e pour extraire la donnée de sa représentation encodé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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# struct_unpack.py\u003c/span\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\"\u003estruct\u003c/span\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\"\u003ebinascii\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epacked_data \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e binascii\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eunhexlify(\u003cspan style=\"color:#48b685\"\u003eb\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0100000061620000cdcc2c40\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\u003es \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e struct\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eStruct(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;I 2s f\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eunpacked_data \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eunpack(packed_data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Unpacked Values:\u0026#39;\u003c/span\u003e, unpacked_data)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePasser la valeur condensée à \u003ccode\u003eunpack()\u003c/code\u003e renvoie les mêmes valeurs (notez l’écart dans la valeur à virgule flottante).\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 struct_unpack.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\u003eUnpacked Values: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e, 2.700000047683716\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=\"endianness\"\u003eEndianness\u003c/h3\u003e\n\u003cp\u003ePar défaut, les valeurs sont codées à l\u0026rsquo;aide de la notion d\u0026rsquo;\u003cem\u003eendianness\u003c/em\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# struct_endianness.py\u003c/span\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\"\u003estruct\u003c/span\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\"\u003ebinascii\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evalues \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eencode(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;utf-8\u0026#39;\u003c/span\u003e), \u003cspan style=\"color:#f99b15\"\u003e2.7\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Original values:\u0026#39;\u003c/span\u003e, values)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eendianness \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;@\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;native, native\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;native, standard\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;\u0026lt;\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;little-endian\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;\u0026gt;\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;big-endian\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;network\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\"\u003efor\u003c/span\u003e code, name \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e endianness:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    s \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e struct\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eStruct(code \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39; I 2s f\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    packed_data \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epack(\u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003evalues)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Format string  :\u0026#39;\u003c/span\u003e, s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;for\u0026#39;\u003c/span\u003e, name)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Uses           :\u0026#39;\u003c/span\u003e, s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esize, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;bytes\u0026#39;\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;Packed Value   :\u0026#39;\u003c/span\u003e, binascii\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ehexlify(packed_data))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Unpacked Value :\u0026#39;\u003c/span\u003e, s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eunpack(packed_data))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa table ci-dessous liste les spécificateurs d\u0026rsquo;ordre d\u0026rsquo;octets utilisés par \u003ccode\u003eStruct\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eCode\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eSignification\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e@\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOrdre natif\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e=\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eStandard natif\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u0026lt;\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003elittle-endian\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u0026gt;\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ebig-endian\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e!\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOrdre réseau\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 struct_endianness.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\u003eOriginal values: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e, 2.7\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\u003eFormat string  : @ I 2s f \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e native, native\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUses           : \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e bytes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePacked Value   : b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0100000061620000cdcc2c40\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUnpacked Value : \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e, 2.700000047683716\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\u003eFormat string  : \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e I 2s f \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e native, standard\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUses           : \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e bytes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePacked Value   : b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;010000006162cdcc2c40\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUnpacked Value : \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e, 2.700000047683716\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\u003eFormat string  : \u0026lt; I 2s f \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e little-endian\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUses           : \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e bytes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePacked Value   : b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;010000006162cdcc2c40\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUnpacked Value : \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e, 2.700000047683716\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\u003eFormat string  : \u0026gt; I 2s f \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e big-endian\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUses           : \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e bytes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePacked Value   : b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;000000016162402ccccd\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUnpacked Value : \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e, 2.700000047683716\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\u003eFormat string  : ! I 2s f \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e network\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUses           : \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e bytes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePacked Value   : b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;000000016162402ccccd\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUnpacked Value : \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e, 2.700000047683716\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=\"tampons\"\u003eTampons\u003c/h3\u003e\n\u003cp\u003eTravailler 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 \u003ccode\u003epack_into()\u003c/code\u003e et \u003ccode\u003eunpack_from()\u003c/code\u003e prennent en charge l\u0026rsquo;écriture directe de tampons préalloués.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# struct_buffers.py\u003c/span\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\"\u003earray\u003c/span\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\"\u003ebinascii\u003c/span\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\"\u003ectypes\u003c/span\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\"\u003estruct\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003es \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e struct\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eStruct(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;I 2s f\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evalues \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eencode(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;utf-8\u0026#39;\u003c/span\u003e), \u003cspan style=\"color:#f99b15\"\u003e2.7\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Original:\u0026#39;\u003c/span\u003e, values)\n\u003c/span\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()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ctypes string buffer\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\u003eb \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ctypes\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ecreate_string_buffer(s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esize)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Before  :\u0026#39;\u003c/span\u003e, binascii\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ehexlify(b\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eraw))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003es\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epack_into(b, \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003evalues)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;After   :\u0026#39;\u003c/span\u003e, binascii\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ehexlify(b\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eraw))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Unpacked:\u0026#39;\u003c/span\u003e, s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eunpack_from(b, \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\u003eprint()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;array\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\u003ea \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e array\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003earray(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003eb\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\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\u003e s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esize)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Before  :\u0026#39;\u003c/span\u003e, binascii\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ehexlify(a))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003es\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epack_into(a, \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003evalues)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;After   :\u0026#39;\u003c/span\u003e, binascii\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ehexlify(a))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Unpacked:\u0026#39;\u003c/span\u003e, s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eunpack_from(a, \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\u003eL\u0026rsquo;attribut \u003ccode\u003esize\u003c/code\u003e à \u003ccode\u003eStruct\u003c/code\u003e nous dit la taille dont a besoin le tampon.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 struct_buffers.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\u003eOriginal: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e, 2.7\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\u003ectypes string buffer\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eBefore  : b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;000000000000000000000000\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAfter   : b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0100000061620000cdcc2c40\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUnpacked: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e, 2.700000047683716\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\u003earray\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eBefore  : b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;000000000000000000000000\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAfter   : b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0100000061620000cdcc2c40\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUnpacked: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1, b\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ab\u0026#39;\u003c/span\u003e, 2.700000047683716\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=\"lire-aussi-9\"\u003eLire aussi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/fr/3.7/library/struct.html\" rel=\"external\"\u003eDocumentation de la bibliothèque standard pour struct\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca title=\"Python 2 to 3 porting notes for struct\" href=\"https://pymotw.com/3/porting_notes.html#porting-struct\" rel=\"external\"\u003eNotes de portage de Python 2 vers 3 pour struct\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003earray\u003c/a\u003e - Le module \u003ccode\u003earray\u003c/code\u003e, pour travailler avec des séquences de valeurs de type fixé\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ebinascii\u003c/code\u003e - Le module \u003ccode\u003ebinascii\u003c/code\u003e, pour produire des représentations ASCII de donnée binaire.\u003c/li\u003e\n\u003cli\u003e\u003ca title=\"Endianess : Boutisme\" href=\"https://fr.wikipedia.org/wiki/Boutisme\" rel=\"external\"\u003eWikipédia : Endianess\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"weakref---références-impermanentes-aux-objets\"\u003eweakref - Références Impermanentes aux Objets\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBut\u003c/strong\u003e: 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.\u003c/p\u003e\n\u003cp\u003eLe module \u003ccode\u003eweakref\u003c/code\u003e 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.\u003c/p\u003e\n\u003ch3 id=\"références\"\u003eRéférences\u003c/h3\u003e\n\u003cp\u003eLes références faibles d\u0026rsquo;objets sont gérés au-travers de la classe \u003ccode\u003eref\u003c/code\u003e. Pour récupérer l\u0026rsquo;objet original, appelez la référence objet.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# weakref_ref.py\u003c/span\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\"\u003eweakref\u003c/span\u003e\n\u003c/span\u003e\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\"\u003eExpensiveObject\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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__del__\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;(Deleting \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(self))\n\u003c/span\u003e\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\u003eobj \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003er \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e weakref\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eref(obj)\n\u003c/span\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;obj:\u0026#39;\u003c/span\u003e, obj)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ref:\u0026#39;\u003c/span\u003e, r)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;r():\u0026#39;\u003c/span\u003e, r())\n\u003c/span\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;deleting obj\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edel\u003c/span\u003e obj\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;r():\u0026#39;\u003c/span\u003e, r())\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans ce cas, puisque \u003ccode\u003eobj\u003c/code\u003e est supprimé avant le second appel à la référence, la \u003ccode\u003eref\u003c/code\u003e retourne \u003ccode\u003eNone\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 weakref_ref.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\u003eobj: \u0026lt;__main__.ExpensiveObject object at 0x1007b1a58\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eref: \u0026lt;weakref at 0x1007a92c8; to \u003cspan style=\"color:#48b685\"\u003e\u0026#39;ExpensiveObject\u0026#39;\u003c/span\u003e at\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e0x1007b1a58\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003er\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e: \u0026lt;__main__.ExpensiveObject object at 0x1007b1a58\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeleting obj\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eDeleting \u0026lt;__main__.ExpensiveObject object at 0x1007b1a58\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003er\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e: None\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"rappels-de-référence\"\u003eRappels de Référence\u003c/h3\u003e\n\u003cp\u003eLe constructeur \u003ccode\u003eref\u003c/code\u003e accepte une fonction optionnelle de rappel qui est invoquée quand la référence de l\u0026rsquo;objet est supprimé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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# weakref_ref_callback.py\u003c/span\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\"\u003eweakref\u003c/span\u003e\n\u003c/span\u003e\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\"\u003eExpensiveObject\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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__del__\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;(Deleting \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(self))\n\u003c/span\u003e\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\"\u003ecallback\u003c/span\u003e(reference):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u0026#34;Invoked when referenced object is deleted\u0026#34;\u0026#34;\u0026#34;\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;callback(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{!r}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(reference))\n\u003c/span\u003e\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\u003eobj \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003er \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e weakref\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eref(obj, callback)\n\u003c/span\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;obj:\u0026#39;\u003c/span\u003e, obj)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ref:\u0026#39;\u003c/span\u003e, r)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;r():\u0026#39;\u003c/span\u003e, r())\n\u003c/span\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;deleting obj\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edel\u003c/span\u003e obj\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;r():\u0026#39;\u003c/span\u003e, r())\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 weakref_ref_callback.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\u003eobj: \u0026lt;__main__.ExpensiveObject object at 0x1010b1978\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eref: \u0026lt;weakref at 0x1010a92c8; to \u003cspan style=\"color:#48b685\"\u003e\u0026#39;ExpensiveObject\u0026#39;\u003c/span\u003e at\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e0x1010b1978\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003er\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e: \u0026lt;__main__.ExpensiveObject object at 0x1010b1978\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeleting obj\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eDeleting \u0026lt;__main__.ExpensiveObject object at 0x1010b1978\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecallback\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u0026lt;weakref at 0x1010a92c8; dead\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003er\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e: None\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"finalisation-des-objets\"\u003eFinalisation des Objets\u003c/h3\u003e\n\u003cp\u003ePour une gestion plus robuste des ressources lorsque des références faibles sont nettoyées, utilisez la méthode \u003ccode\u003efinalize\u003c/code\u003e pour associer les rappels aux objets. Une instance \u003ccode\u003efinalize\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# weakref_finalize.py\u003c/span\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\"\u003eweakref\u003c/span\u003e\n\u003c/span\u003e\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\"\u003eExpensiveObject\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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__del__\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;(Deleting \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(self))\n\u003c/span\u003e\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\"\u003eon_finalize\u003c/span\u003e(\u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003eargs):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;on_finalize(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{!r}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(args))\n\u003c/span\u003e\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\u003eobj \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eweakref\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efinalize(obj, on_finalize, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;extra argument\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\"\u003edel\u003c/span\u003e obj\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes arguments de \u003ccode\u003efinalize\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 weakref_finalize.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:#5bc4bf\"\u003e(\u003c/span\u003eDeleting \u0026lt;__main__.ExpensiveObject object at 0x1019b10f0\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eon_finalize\u003cspan style=\"color:#5bc4bf\"\u003e((\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;extra argument\u0026#39;\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\u003eL\u0026rsquo;instance \u003ccode\u003efinalize\u003c/code\u003e a une propriété en écriture nommée \u003ccode\u003eatexit\u003c/code\u003e pour contrôler quand le rappel est invoqué lorsqu’un programme se termine, s\u0026rsquo;il n\u0026rsquo;a pas déjà été appelé.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# weakref_finalize_atexit.py\u003c/span\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\"\u003esys\u003c/span\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\"\u003eweakref\u003c/span\u003e\n\u003c/span\u003e\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\"\u003eExpensiveObject\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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__del__\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;(Deleting \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(self))\n\u003c/span\u003e\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\"\u003eon_finalize\u003c/span\u003e(\u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003eargs):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;on_finalize(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{!r}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(args))\n\u003c/span\u003e\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\u003eobj \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ef \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e weakref\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efinalize(obj, on_finalize, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;extra argument\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ef\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eatexit \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e bool(int(sys\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eargv[\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\u003eLe comportement par défaut est d\u0026rsquo;invoquer le rappel. Paramétrer \u003ccode\u003eatexit\u003c/code\u003e sur \u003ccode\u003efalse\u003c/code\u003e désactivera ce comportement.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 weakref_finalize_atexit.py \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\u003eon_finalize\u003cspan style=\"color:#5bc4bf\"\u003e((\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;extra argument\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:#5bc4bf\"\u003e(\u003c/span\u003eDeleting \u0026lt;__main__.ExpensiveObject object at 0x1007b10f0\u0026gt;\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$ python3 weakref_finalize_atexit.py \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\u003eDonner à l\u0026rsquo;instance \u003ccode\u003efinalize\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# weakref_finalize_reference.py\u003c/span\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\"\u003egc\u003c/span\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\"\u003eweakref\u003c/span\u003e\n\u003c/span\u003e\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\"\u003eExpensiveObject\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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__del__\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;(Deleting \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(self))\n\u003c/span\u003e\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\"\u003eon_finalize\u003c/span\u003e(\u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003eargs):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;on_finalize(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{!r}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(args))\n\u003c/span\u003e\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\u003eobj \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eobj_id \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e id(obj)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ef \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e weakref\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efinalize(obj, on_finalize, obj)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ef\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eatexit \u003cspan style=\"color:#5bc4bf\"\u003e=\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:#815ba4\"\u003edel\u003c/span\u003e obj\n\u003c/span\u003e\u003c/span\u003e\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 o \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e gc\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eget_objects():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e id(o) \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e obj_id:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;found uncollected object in gc\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eComme cet exemple le montre, même si la référence explicite vers \u003ccode\u003eobj\u003c/code\u003e est supprimée, l\u0026rsquo;objet est retenu et visible par le ramasse miettes au-travers de \u003ccode\u003ef\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 weakref_finalize_reference.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\u003efound uncollected object in gc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUtiliser une méthode liée à un objet suivi en tant rappel peut également empêcher la finalisation correcte de l\u0026rsquo;objet.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# weakref_finalize_reference_method.py\u003c/span\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\"\u003egc\u003c/span\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\"\u003eweakref\u003c/span\u003e\n\u003c/span\u003e\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\"\u003eExpensiveObject\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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__del__\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;(Deleting \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(self))\n\u003c/span\u003e\u003c/span\u003e\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\"\u003edo_finalize\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;do_finalize\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\u003eobj \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eobj_id \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e id(obj)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ef \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e weakref\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efinalize(obj, obj\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edo_finalize)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ef\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eatexit \u003cspan style=\"color:#5bc4bf\"\u003e=\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:#815ba4\"\u003edel\u003c/span\u003e obj\n\u003c/span\u003e\u003c/span\u003e\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 o \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e gc\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eget_objects():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e id(o) \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e obj_id:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;found uncollected object in gc\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuisque le rappel donné à \u003ccode\u003efinalize\u003c/code\u003e est une méthode liée à l\u0026rsquo;instance \u003ccode\u003eobj\u003c/code\u003e, l\u0026rsquo;objet de finalisation capture une référence  vers \u003ccode\u003eobj\u003c/code\u003e, qui ne peut être supprimé ou collecté par le ramasse miettes.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 weakref_finalize_reference_method.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\u003efound uncollected object in gc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"mandataires\"\u003eMandataires\u003c/h3\u003e\n\u003cp\u003eIl 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# weakref_proxy.py\u003c/span\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\"\u003eweakref\u003c/span\u003e\n\u003c/span\u003e\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\"\u003eExpensiveObject\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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, name):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e 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\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__del__\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;(Deleting \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(self))\n\u003c/span\u003e\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\u003eobj \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;My Object\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003er \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e weakref\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eref(obj)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ep \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e weakref\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eproxy(obj)\n\u003c/span\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;via obj:\u0026#39;\u003c/span\u003e, obj\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;via ref:\u0026#39;\u003c/span\u003e, r()\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;via proxy:\u0026#39;\u003c/span\u003e, p\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edel\u003c/span\u003e obj\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;via proxy:\u0026#39;\u003c/span\u003e, p\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi le mandataire est accédé après que l\u0026rsquo;objet en référence soit supprimé, une erreur d\u0026rsquo;exception \u003ccode\u003eReferenceError\u003c/code\u003e est levé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 weakref_proxy.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\u003evia obj: My Object\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evia ref: My Object\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evia proxy: My Object\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eDeleting \u0026lt;__main__.ExpensiveObject object at 0x1007aa7b8\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\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;weakref_proxy.py\u0026#34;\u003c/span\u003e, line 30, in \u0026lt;module\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;via proxy:\u0026#39;\u003c/span\u003e, p.name\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReferenceError: weakly-referenced object no longer exists\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"mettre-en-cache-des-objets\"\u003eMettre en Cache des Objets\u003c/h3\u003e\n\u003cp\u003eLes classes \u003ccode\u003eref\u003c/code\u003e et \u003ccode\u003eobj\u003c/code\u003e 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 \u003ccode\u003eWeakKeyDictionary\u003c/code\u003e et \u003ccode\u003eWeakValueDictionary\u003c/code\u003e fournissent une API plus appropriée pour créer un cache de plusieurs objets.\u003c/p\u003e\n\u003cp\u003eLa classe \u003ccode\u003eWeakValueDictionary\u003c/code\u003e 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 \u003ccode\u003eWeakValueDictionary\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# weakref_valuedict.py\u003c/span\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\"\u003egc\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\"\u003epprint\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e pprint\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\"\u003eweakref\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egc\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eset_debug(gc\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eDEBUG_UNCOLLECTABLE)\n\u003c/span\u003e\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\"\u003eExpensiveObject\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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, name):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e 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\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__repr__\u003c/span\u003e(self):\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:#48b685\"\u003e\u0026#39;ExpensiveObject(\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(self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\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    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__del__\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;    (Deleting \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(self))\n\u003c/span\u003e\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\"\u003edemo\u003c/span\u003e(cache_factory):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# hold objects so any weak references\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# are not removed immediately\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    all_refs \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# create the cache using the factory\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;CACHE TYPE:\u0026#39;\u003c/span\u003e, cache_factory)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    cache \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e cache_factory()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e name \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;one\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;two\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;three\u0026#39;\u003c/span\u003e]:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        o \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject(name)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        cache[name] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e o\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        all_refs[name] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e o\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003edel\u003c/span\u003e o  \u003cspan style=\"color:#776e71\"\u003e# decref\u003c/span\u003e\n\u003c/span\u003e\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(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;  all_refs =\u0026#39;\u003c/span\u003e, end\u003cspan style=\"color:#5bc4bf\"\u003e=\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    pprint(all_refs)\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  Before, cache contains:\u0026#39;\u003c/span\u003e, list(cache\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ekeys()))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e name, value \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e cache\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(name, value))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003edel\u003c/span\u003e value  \u003cspan style=\"color:#776e71\"\u003e# decref\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# remove all references to the objects except the cache\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  Cleanup:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edel\u003c/span\u003e all_refs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    gc\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ecollect()\n\u003c/span\u003e\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(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e  After, cache contains:\u0026#39;\u003c/span\u003e, list(cache\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ekeys()))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e name, value \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e cache\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(name, value))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;  demo returning\u0026#39;\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\n\u003c/span\u003e\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\u003edemo(dict)\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\u003edemo(weakref\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eWeakValueDictionary)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eToutes 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 \u003ccode\u003eall_refs\u003c/code\u003e est utilisée pour capturer les références afin de prévenir que le ramasse miettes les collecte prématurément.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 weakref_valuedict.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\u003eCACHE TYPE: \u0026lt;class \u003cspan style=\"color:#48b685\"\u003e\u0026#39;dict\u0026#39;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#ef6155\"\u003eall_refs\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;one\u0026#39;\u003c/span\u003e: ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eone\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;three\u0026#39;\u003c/span\u003e: ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ethree\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;two\u0026#39;\u003c/span\u003e: ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etwo\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  Before, cache contains: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;one\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;three\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;two\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\"\u003eone\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eone\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\"\u003ethree\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ethree\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\"\u003etwo\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etwo\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  Cleanup:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  After, cache contains: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;one\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;three\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;two\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\"\u003eone\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eone\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\"\u003ethree\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ethree\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\"\u003etwo\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etwo\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  demo returning\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eDeleting ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eone\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\u003eDeleting ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ethree\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\u003eDeleting ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etwo\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\u003eCACHE TYPE: \u0026lt;class \u003cspan style=\"color:#48b685\"\u003e\u0026#39;weakref.WeakValueDictionary\u0026#39;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#ef6155\"\u003eall_refs\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;one\u0026#39;\u003c/span\u003e: ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eone\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;three\u0026#39;\u003c/span\u003e: ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ethree\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;two\u0026#39;\u003c/span\u003e: ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etwo\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  Before, cache contains: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;one\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;three\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;two\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\"\u003eone\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eone\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\"\u003ethree\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ethree\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\"\u003etwo\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etwo\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  Cleanup:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eDeleting ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eone\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\u003eDeleting ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ethree\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\u003eDeleting ExpensiveObject\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etwo\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  After, cache contains: \u003cspan style=\"color:#5bc4bf\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  demo returning\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa classe \u003ccode\u003eWeakKeyDictionary\u003c/code\u003e fonctionne de manière similaire mais utilise les références faibles pour les clés au lieu des valeurs dans le dictionnaire.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eAttention\u003c/strong\u003e\nLa documentation de la bibliothèque pour \u003ccode\u003eweakref\u003c/code\u003e contient cet avertissement :\nMise en garde : Étant donné qu\u0026rsquo;un \u003ccode\u003eWeakValueDictionary\u003c/code\u003e est construit sur un dictionnaire Python, sa taille ne doit pas changer lors de son itération. Cela peut être difficile à garantir pour un \u003ccode\u003eWeakValueDictionary\u003c/code\u003e 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).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"lire-aussi-10\"\u003eLire aussi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/fr/3.7/library/weakref.html\" rel=\"external\"\u003eDocumentation de la bibliothèque standard pour weakref\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003egc\u003c/a\u003e - le module \u003ccode\u003egc\u003c/code\u003e est l\u0026rsquo;interface pour l\u0026rsquo;interprétateur du ramasse miettes.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.python.org/dev/peps/pep-0205\" rel=\"external\"\u003ePEP 205\u003c/a\u003e - Proposition d\u0026rsquo;amélioration des \u0026ldquo;Références Faibles\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"copy---objets-dupliqués\"\u003ecopy - Objets Dupliqués\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBut\u003c/strong\u003e : Fournir des fonctions pour dupliquer les objets en utilisant une sémantique de copie superficielle ou profonde\u003c/p\u003e\n\u003cp\u003eLe module \u003ccode\u003ecopy\u003c/code\u003e inclut deux fonctions, \u003ccode\u003ecopy()\u003c/code\u003e et \u003ccode\u003edeepcopy()\u003c/code\u003e, pour dupliquer des objets existants.\u003c/p\u003e\n\u003ch3 id=\"copies-superficielles\"\u003eCopies Superficielles\u003c/h3\u003e\n\u003cp\u003eLa \u003cem\u003ecopie superficielle\u003c/em\u003e créée par \u003ccode\u003ecopy()\u003c/code\u003e 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 \u003ccode\u003elist\u003c/code\u003e, une nouvelle \u003ccode\u003elist\u003c/code\u003e est construite et les éléments de l\u0026rsquo;objet original y sont ajoutés.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# copy_shallow.py\u003c/span\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\"\u003ecopy\u003c/span\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\"\u003efunctools\u003c/span\u003e\n\u003c/span\u003e\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@functools.total_ordering\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\"\u003eMyClass\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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, name):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e 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\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__eq__\u003c/span\u003e(self, other):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e other\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\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    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__gt__\u003c/span\u003e(self, other):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e other\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e MyClass(\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\u003emy_list \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [a]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edup \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e copy\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ecopy(my_list)\n\u003c/span\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;             my_list:\u0026#39;\u003c/span\u003e, my_list)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;                 dup:\u0026#39;\u003c/span\u003e, dup)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;      dup is my_list:\u0026#39;\u003c/span\u003e, (dup \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e my_list))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;      dup == my_list:\u0026#39;\u003c/span\u003e, (dup \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e my_list))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;dup[0] is my_list[0]:\u0026#39;\u003c/span\u003e, (dup[\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e my_list[\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e]))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;dup[0] == my_list[0]:\u0026#39;\u003c/span\u003e, (dup[\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e my_list[\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\u003ePour une copie superficielle, l\u0026rsquo;instance \u003ccode\u003eMyClass\u003c/code\u003e n\u0026rsquo;est pas dupliquée, ainsi la référence dans la liste \u003ccode\u003edup\u003c/code\u003e est le même objet que celui qui est dans \u003ccode\u003emy_list\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 copy_shallow.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             my_list: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;__main__.MyClass object at 0x101f9c160\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                 dup: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;__main__.MyClass object at 0x101f9c160\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      dup is my_list: False\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#ef6155\"\u003edup\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e my_list: True\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edup\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e is my_list\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: True\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edup\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e my_list\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: True\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"copies-profondes\"\u003eCopies Profondes\u003c/h3\u003e\n\u003cp\u003eLa \u003cem\u003ecopie profonde\u003c/em\u003e créée par \u003ccode\u003edeepcopy()\u003c/code\u003e est un nouveau conteneur avec des copies des contenus de l\u0026rsquo;objet original. Pour faire une copie profonde d\u0026rsquo;une \u003ccode\u003elist\u003c/code\u003e, une nouvelle \u003ccode\u003elist\u003c/code\u003e est construite, les éléments de la liste originale sont copiés, et ensuite ces copies sont ajoutées à la nouvelle liste.\u003c/p\u003e\n\u003cp\u003eRemplacer l\u0026rsquo;appel de \u003ccode\u003ecopy()\u003c/code\u003e par \u003ccode\u003edeepcopy()\u003c/code\u003e fait la différence dans la sortie apparente.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# copy_deep.py\u003c/span\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\"\u003ecopy\u003c/span\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\"\u003efunctools\u003c/span\u003e\n\u003c/span\u003e\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@functools.total_ordering\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\"\u003eMyClass\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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, name):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e 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\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__eq__\u003c/span\u003e(self, other):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e other\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\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    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__gt__\u003c/span\u003e(self, other):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e other\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e MyClass(\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\u003emy_list \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [a]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edup \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e copy\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeepcopy(my_list)\n\u003c/span\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;             my_list:\u0026#39;\u003c/span\u003e, my_list)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;                 dup:\u0026#39;\u003c/span\u003e, dup)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;      dup is my_list:\u0026#39;\u003c/span\u003e, (dup \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e my_list))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;      dup == my_list:\u0026#39;\u003c/span\u003e, (dup \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e my_list))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;dup[0] is my_list[0]:\u0026#39;\u003c/span\u003e, (dup[\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e my_list[\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e]))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;dup[0] == my_list[0]:\u0026#39;\u003c/span\u003e, (dup[\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e my_list[\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\u003eLe 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 copy_deep.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             my_list: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;__main__.MyClass object at 0x101e9c160\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                 dup: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;__main__.MyClass object at 0x1044e1f98\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      dup is my_list: False\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#ef6155\"\u003edup\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e my_list: True\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edup\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e is my_list\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: False\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edup\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e my_list\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: True\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"personnaliser-le-comportement-des-copies\"\u003ePersonnaliser le Comportement des Copies\u003c/h3\u003e\n\u003cp\u003eIl est possible de contrôler comment les copies sont faites en utilisant les méthodes spéciales \u003ccode\u003e__copy__()\u003c/code\u003e et \u003ccode\u003e__deepcopy__()\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e__copy__()\u003c/code\u003e est appelée sans aucun argument et devrait retourner une copie superficielle de l\u0026rsquo;objet.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e__deepcopy__()\u003c/code\u003e 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 \u003ccode\u003ecopy.deepcopy()\u003c/code\u003e, avec le dictionnaire memo, pour contrôler la récursion. (Le dictionnaire memo est expliqué plus tard en détails).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eL\u0026rsquo;exemple suivant illustre comment les méthodes sont appelé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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# copy_hooks.py\u003c/span\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\"\u003ecopy\u003c/span\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\"\u003efunctools\u003c/span\u003e\n\u003c/span\u003e\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@functools.total_ordering\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\"\u003eMyClass\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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, name):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e 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\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__eq__\u003c/span\u003e(self, other):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e other\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\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    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__gt__\u003c/span\u003e(self, other):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e other\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\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    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__copy__\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;__copy__()\u0026#39;\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 MyClass(self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\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    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__deepcopy__\u003c/span\u003e(self, memo):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;__deepcopy__(\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(memo))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e MyClass(copy\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeepcopy(self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename, memo))\n\u003c/span\u003e\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\u003ea \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e MyClass(\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\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esc \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e copy\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ecopy(a)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edc \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e copy\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeepcopy(a)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe dictionnaire memo est utilisé pour garder la trace des valeurs qui ont été déjà copiées, évitant ainsi une récursion infinie.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 copy_hooks.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__copy__\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e__deepcopy__\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=\"récursion-dans-les-copies-profondes\"\u003eRécursion dans les Copies Profondes\u003c/h3\u003e\n\u003cp\u003ePour éviter les problèmes lors de la duplication récursive des structures de données, \u003ccode\u003edeepcopy()\u003c/code\u003e utilise un dictionnaire pour suivre les objets qui ont déjà été copiés. Le dictionnaire est passé à la méthode \u003ccode\u003e__deepcopy__()\u003c/code\u003e afin qu\u0026rsquo;il puisse être examiné là aussi.\u003c/p\u003e\n\u003cp\u003eLe 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 \u003ccode\u003e__deepcopy__()\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# copy_recursion.py\u003c/span\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\"\u003ecopy\u003c/span\u003e\n\u003c/span\u003e\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\"\u003eGraph\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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, name, connections):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003econnections \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e connections\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eadd_connection\u003c/span\u003e(self, other):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003econnections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eappend(other)\n\u003c/span\u003e\u003c/span\u003e\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__repr__\u003c/span\u003e(self):\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:#48b685\"\u003e\u0026#39;Graph(name=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e, id=\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(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename, id(self))\n\u003c/span\u003e\u003c/span\u003e\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__deepcopy__\u003c/span\u003e(self, memo):\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\"\u003eCalling __deepcopy__ for \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{!r}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(self))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e self \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e memo:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            existing \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e memo\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eget(self)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;  Already copied to \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{!r}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(existing))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e existing\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;  Memo dictionary:\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 memo:\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 memo\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\u003e        \u003cspan style=\"color:#815ba4\"\u003eelse\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;    (empty)\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        dup \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Graph(copy\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeepcopy(self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename, memo), [])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;  Copying to new object \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(dup))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        memo[self] \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e dup\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e c \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003econnections:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            dup\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eadd_connection(copy\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeepcopy(c, memo))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e dup\n\u003c/span\u003e\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\u003eroot \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Graph(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;root\u0026#39;\u003c/span\u003e, [])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Graph(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e, [root])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eb \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Graph(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e, [a, root])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eroot\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eadd_connection(a)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eroot\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eadd_connection(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\u003edup \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e copy\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edeepcopy(root)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa classe \u003ccode\u003eGraph\u003c/code\u003e 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 \u003ccode\u003eadd_connection()\u003c/code\u003e est utilisée pour paramétrer les connexions bidirectionnelles. Elle est aussi utilisée par l\u0026rsquo;opérateur de copie profonde.\u003c/p\u003e\n\u003cp\u003eLa méthode \u003ccode\u003e__deepcopy__()\u003c/code\u003e 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.\u003c/p\u003e\n\u003cp\u003e\n\n            \n                    \n                    \u003cfigure role=\"figure\"\u003e\n    \u003ca href=\"/images/dvp.net/graphviz.png\"\u003e\n        \u003cpicture\u003e\n                \n                    \n                    \u003csource srcset=\"/images/dvp.net/graphviz_hu_b4fba8e0f55bdc31.avif\" type=\"image/avif\"\u003e\n                    \n                    \u003csource srcset=\"/images/dvp.net/graphviz_hu_3530d436950d2837.webp\" type=\"image/webp\"\u003e\n            \u003cimg loading=\"lazy\"\n                    alt=\"Copie profonde d’un graphe objet avec des cycles\"\n                    height=\"251\"\n                    id=\"img_images_dvp.net_graphviz.png_0\"\n                    src=\"/images/dvp.net/graphviz.png\"\n                    width=\"168\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003eLe 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 \u003cem\u003eroot\u003c/em\u003e est copié, il produit la sortie 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 copy_recursion.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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCalling __deepcopy__ \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eroot, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4326183824\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Memo dictionary:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eempty\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Copying to new object Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eroot, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4367233208\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\u003eCalling __deepcopy__ \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ea, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4326186344\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Memo dictionary:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eroot, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4326183824\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\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:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4367233208\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Copying to new object Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ea, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4367234720\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\u003eCalling __deepcopy__ \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eroot, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4326183824\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Already copied to Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eroot, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4367233208\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\u003eCalling __deepcopy__ \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eb, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4326183880\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Memo dictionary:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eroot, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4326183824\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\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:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4367233208\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ea, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4326186344\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ea, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4367234720\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    4326183824: Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eroot, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4367233208\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    4367217936: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eGraph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eroot, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4326183824\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ea,\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\u003e4326186344\u003cspan style=\"color:#5bc4bf\"\u003e)]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    4326186344: Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ea, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4367234720\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Copying to new object Graph\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eb, \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4367235000\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\u003eLa seconde fois où le nœud \u003cem\u003eroot\u003c/em\u003e est rencontré, pendant que le nœud \u003cem\u003ea\u003c/em\u003e soit copié, \u003ccode\u003e__deepcopy__()\u003c/code\u003e détecte la récursion et réutilise la valeur existante du dictionnaire memo au lieu de créer un nouvel objet.\u003c/p\u003e\n\u003ch3 id=\"lire-aussi-11\"\u003eLire aussi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/fr/3.7/library/copy.html\" rel=\"external\"\u003eDocumentation de la bibliothèque standard pour copy\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"pprint---structures-de-données-pretty-print\"\u003epprint - Structures de Données Pretty-Print\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBut\u003c/strong\u003e : Structures de données Pretty-print\u003c/p\u003e\n\u003cp\u003eLe module \u003ccode\u003epprint\u003c/code\u003e 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.\u003c/p\u003e\n\u003cp\u003eLes exemples dans ce chapitre dépendent tous du script \u003ccode\u003epprint_data.py\u003c/code\u003e, qui est montré ici.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# pprint_data.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edata \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:#f99b15\"\u003e1\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;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;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\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    (\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e, {\u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;F\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;g\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;G\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;h\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;H\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;i\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;I\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;j\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;J\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;k\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;K\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;l\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;L\u0026#39;\u003c/span\u003e}),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    (\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e, [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;n\u0026#39;\u003c/span\u003e]),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    (\u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e, [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;o\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;p\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;q\u0026#39;\u003c/span\u003e]),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    (\u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e, [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;r\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;t\u0026#39;\u0026#39;u\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;v\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;x\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;z\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"impression\"\u003eImpression\u003c/h3\u003e\n\u003cp\u003eLa manière la plus simple d\u0026rsquo;utiliser le module est au-travers de la fonction \u003ccode\u003epprint()\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# pprint_pprint.py\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\"\u003epprint\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e pprint\n\u003c/span\u003e\u003c/span\u003e\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\"\u003efrom\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003epprint_data\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e 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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;PRINT:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(data)\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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;PPRINT:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epprint(data)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003epprint()\u003c/code\u003e formate un objet et l\u0026rsquo;écrit dans le flux de données en le passant en argument (ou \u003ccode\u003esys.stdout\u003c/code\u003e 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 pprint_pprint.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\u003ePRINT:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[(\u003c/span\u003e1, \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;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;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e})\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2, \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;f\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;F\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;g\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;G\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;h\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;H\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;I\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;j\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;J\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;k\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;K\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;l\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;L\u0026#39;\u003c/span\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\u003e3, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;n\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e4, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;o\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;p\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;q\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;r\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;tu\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;v\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;x\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;y\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;z\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\u003ePPRINT:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[(\u003c/span\u003e1, \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;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;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\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:#5bc4bf\"\u003e(\u003c/span\u003e2,\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#39;e\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\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;f\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;F\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;g\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;G\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;h\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;H\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;i\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;I\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;j\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;J\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;k\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;K\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;l\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;L\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:#5bc4bf\"\u003e(\u003c/span\u003e3, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;n\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:#5bc4bf\"\u003e(\u003c/span\u003e4, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;o\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;p\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;q\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:#5bc4bf\"\u003e(\u003c/span\u003e5, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;r\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;tu\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;v\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;x\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;z\u0026#39;\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=\"formatage\"\u003eFormatage\u003c/h3\u003e\n\u003cp\u003ePour formater une structure de données sans l\u0026rsquo;écrire directement vers un flux (par exemple, pour la journalisation) utilisez \u003ccode\u003epformat()\u003c/code\u003e pour construire une représentation de chaînes.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# pprint_pformat.py\u003c/span\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\"\u003elogging\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\"\u003epprint\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e pformat\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\"\u003epprint_data\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e 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\u003elogging\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ebasicConfig(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    level\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003elogging\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eDEBUG,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    format\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e%(levelname)-8s\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e%(message)s\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\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\u003elogging\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edebug(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Logging pformatted data\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eformatted \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e pformat(data)\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 formatted\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esplitlines():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    logging\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edebug(line\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003erstrip())\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa chaîne formatée peut alors être imprimée ou journalisée indépendamment.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 pprint_pformat.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\u003eDEBUG    Logging pformatted data\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDEBUG    \u003cspan style=\"color:#5bc4bf\"\u003e[(\u003c/span\u003e1, \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;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;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\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\u003eDEBUG     \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDEBUG      \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;e\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDEBUG       \u003cspan style=\"color:#48b685\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;F\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDEBUG       \u003cspan style=\"color:#48b685\"\u003e\u0026#39;g\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;G\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDEBUG       \u003cspan style=\"color:#48b685\"\u003e\u0026#39;h\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;H\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDEBUG       \u003cspan style=\"color:#48b685\"\u003e\u0026#39;i\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;I\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDEBUG       \u003cspan style=\"color:#48b685\"\u003e\u0026#39;j\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;J\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDEBUG       \u003cspan style=\"color:#48b685\"\u003e\u0026#39;k\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;K\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDEBUG       \u003cspan style=\"color:#48b685\"\u003e\u0026#39;l\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;L\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\u003eDEBUG     \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;n\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\u003eDEBUG     \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e4, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;o\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;p\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;q\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\u003eDEBUG     \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;r\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;tu\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;v\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;x\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;z\u0026#39;\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=\"classes-arbitraires\"\u003eClasses Arbitraires\u003c/h3\u003e\n\u003cp\u003eLa classe \u003ccode\u003ePrettyPrinter\u003c/code\u003e utilisée par \u003ccode\u003epprint()\u003c/code\u003e peut aussi fonctionner avec des classes personnalisées, si elles définissent une méthode \u003ccode\u003e__repr__()\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# pprint_arbitrary_object.py\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\"\u003epprint\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e pprint\n\u003c/span\u003e\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\"\u003enode\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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, name, contents\u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003ename \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003econtents \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e contents[:]\n\u003c/span\u003e\u003c/span\u003e\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__repr__\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#39;node(\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e repr(self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename) \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;, \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            repr(self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003econtents) \u003cspan style=\"color:#5bc4bf\"\u003e+\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etrees \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    node(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;node-1\u0026#39;\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    node(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;node-2\u0026#39;\u003c/span\u003e, [node(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;node-2-1\u0026#39;\u003c/span\u003e)]),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    node(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;node-3\u0026#39;\u003c/span\u003e, [node(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;node-3-1\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\u003epprint(trees)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes représentations de ces objets imbriqués sont combinées par \u003ccode\u003ePrettyPrinter\u003c/code\u003e pour retourner une représentation complète de chaînes.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 pprint_arbitrary_object.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:#5bc4bf\"\u003e[\u003c/span\u003enode\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;node-1\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 node\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;node-2\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003enode\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;node-2-1\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 node\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;node-3\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003enode\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;node-3-1\u0026#39;\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=\"récursion\"\u003eRécursion\u003c/h3\u003e\n\u003cp\u003eLes 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 \u003ccode\u003e\u0026lt;Recursion on typename with id=number\u0026gt;\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# pprint_recursion.py\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\"\u003epprint\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e pprint\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elocal_data \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;b\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elocal_data\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eappend(local_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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;id(local_data) =\u0026gt;\u0026#39;\u003c/span\u003e, id(local_data))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epprint(local_data)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans cet exemple, la liste \u003ccode\u003elocal_data\u003c/code\u003e est ajoutée à elle-même, créant une référence récursive.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 pprint_recursion.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\u003eid\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elocal_data\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u0026gt; \u003cspan style=\"color:#f99b15\"\u003e4358913288\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#39;a\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e, 1, 2, \u0026lt;Recursion on list with \u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e4358913288\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\u003ch3 id=\"limiter-la-sortie-imbriquée\"\u003eLimiter la Sortie Imbriquée\u003c/h3\u003e\n\u003cp\u003ePour 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# pprint_depth.py\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\"\u003epprint\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e pprint\n\u003c/span\u003e\u003c/span\u003e\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\"\u003efrom\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003epprint_data\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e 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\u003epprint(data, depth\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\u003epprint(data, depth\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUtilisez l\u0026rsquo;argument \u003ccode\u003edepth\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 pprint_depth.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:#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, \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, \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\u003e1, \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e...\u003cspan style=\"color:#5bc4bf\"\u003e})\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2, \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e...\u003cspan style=\"color:#5bc4bf\"\u003e})\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e...\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e4, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e...\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5, \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=\"contrôler-la-largeur-de-la-sortie\"\u003eContrôler la Largeur de la Sortie\u003c/h3\u003e\n\u003cp\u003eLa sortie par défaut pour le texte formaté est de 80 colonnes. Pour ajuster la largeur, utilisez l\u0026rsquo;argument \u003ccode\u003ewidth\u003c/code\u003e de \u003ccode\u003epprint()\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# pprint_width.py\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\"\u003epprint\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e pprint\n\u003c/span\u003e\u003c/span\u003e\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\"\u003efrom\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003epprint_data\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e 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\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e width \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e [\u003cspan style=\"color:#f99b15\"\u003e80\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    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;WIDTH =\u0026#39;\u003c/span\u003e, width)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    pprint(data, width\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ewidth)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eQuand 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 pprint_width.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\"\u003eWIDTH\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \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\u003e1, \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;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;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\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:#5bc4bf\"\u003e(\u003c/span\u003e2,\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#39;e\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\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;f\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;F\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;g\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;G\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;h\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;H\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;i\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;I\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;j\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;J\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;k\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;K\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;l\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;L\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:#5bc4bf\"\u003e(\u003c/span\u003e3, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;n\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:#5bc4bf\"\u003e(\u003c/span\u003e4, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;o\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;p\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;q\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:#5bc4bf\"\u003e(\u003c/span\u003e5, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;r\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;tu\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;v\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;x\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;z\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\u003e\u003cspan style=\"color:#ef6155\"\u003eWIDTH\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:#5bc4bf\"\u003e[(\u003c/span\u003e1,\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#39;a\u0026#39;\u003c/span\u003e: \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\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,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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\u003e   \u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\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:#5bc4bf\"\u003e(\u003c/span\u003e2,\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#39;e\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\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;f\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;F\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;g\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;G\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;h\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;H\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;i\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;I\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;j\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;J\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;k\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;K\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;l\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;L\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:#5bc4bf\"\u003e(\u003c/span\u003e3,\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#39;m\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;n\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:#5bc4bf\"\u003e(\u003c/span\u003e4,\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#39;o\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;p\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;q\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:#5bc4bf\"\u003e(\u003c/span\u003e5,\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#39;r\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;s\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;tu\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;v\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;x\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;y\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;z\u0026#39;\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\u003eLe drapeau \u003ccode\u003ecompact\u003c/code\u003e demande à \u003ccode\u003epprint()\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# pprint_compact.py\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\"\u003epprint\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e pprint\n\u003c/span\u003e\u003c/span\u003e\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\"\u003efrom\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003epprint_data\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e 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\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;DEFAULT:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epprint(data, compact\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003eFalse\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\"\u003eCOMPACT:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epprint(data, compact\u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003eCet 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.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 pprint_compact.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\u003eDEFAULT:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[(\u003c/span\u003e1, \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;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;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\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:#5bc4bf\"\u003e(\u003c/span\u003e2,\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#39;e\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\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;f\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;F\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;g\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;G\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;h\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;H\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;i\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;I\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;j\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;J\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;k\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;K\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;l\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;L\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:#5bc4bf\"\u003e(\u003c/span\u003e3, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;n\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:#5bc4bf\"\u003e(\u003c/span\u003e4, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;o\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;p\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;q\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:#5bc4bf\"\u003e(\u003c/span\u003e5, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;r\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;tu\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;v\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;x\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;z\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\u003eCOMPACT:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[(\u003c/span\u003e1, \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;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;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\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:#5bc4bf\"\u003e(\u003c/span\u003e2,\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#39;e\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\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;f\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;F\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;g\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;G\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;h\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;H\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;i\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;I\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;j\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;J\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;k\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;K\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;l\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;L\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:#5bc4bf\"\u003e(\u003c/span\u003e3, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;m\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;n\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e4, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;o\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;p\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;q\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:#5bc4bf\"\u003e(\u003c/span\u003e5, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;r\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;tu\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;v\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;x\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;z\u0026#39;\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[API]: Application Programming Interface - Interface de Programmation Applicative\u003c/li\u003e\n\u003cli\u003e[PEP]: Python Enhancement Proposals - Propositions d\u0026rsquo;Amélioration Python\u003c/li\u003e\n\u003cli\u003e[RSS]: Really Simple Syndication - Syndication de contenu réellement simple\u003c/li\u003e\n\u003cli\u003e[URL]: Uniform Resource Locator - Repère uniforme de ressource\u003c/li\u003e\n\u003cli\u003e[p.ex.]: par exemple\u003c/li\u003e\n\u003c/ul\u003e\n","summary":"Relecture du chapitre 2 - Python 3 Module of the Week pour la communauté DVP","tags":["Traduction","Python"],"date_published":"2019-05-16T21:31:01+01:00","date_modified":"2019-06-11T14:12:01+01:00"},{"id":"tag:doc.huc.fr.eu.org,2019-05-16:/fr/trad/developpez.net/dive-into-python-8-iterateurs-avances#23fb5db006211963012e7273044a7bff84e5c9edaaad28faadf43d5bdebde6f6","url":"https://it-log.fr.eu.org/fr/trad/developpez.net/dive-into-python-8-iterateurs-avances/","title":"Dive Into Python 3 - 8 : Itérateurs avancés","author":{"name":"Stéphane HUC"},"content_text":"Dive Into Python 3 - 8 : Itérateurs avancés Great fleas have little fleas upon their backs to bite ’em, And little fleas have lesser fleas, and so ad infinitum. — Augustus De Morgan\nEn plongée Tout comme les expressions régulières dopent les chaînes aux stéroïdes, le module itertools dopent les itérateurs aux stéroïdes. Mais d\u0026rsquo;abord, je veux vous montrer un puzzle classique :\nHAWAII + IDAHO + IOWA + OHIO == STATES 510199 + 98153 + 9301 + 3593 == 621246 H = 5 A = 1 W = 0 I = 9 D = 8 O = 3 S = 6 T = 2 E = 4 De tels puzzles sont appelés cryptarithmes ou alphamétiques. Les lettres épellent des mots réels, mais si vous remplacez chaque lettre par un chiffre de 0-9, elles « épellent » aussi une équation arithmétique. L\u0026rsquo;astuce consiste à déterminer quelle lettre correspond à chaque chiffre. Toutes les occurrences de chaque lettre doivent correspondre au même chiffre, aucun chiffre ne doit être répété, et aucun « mot » ne peut démarrer avec le chiffre 0.\nDans ce chapitre, nous plongerons en profondeur dans un incroyable programme Python écrit à l’origine par Raymond Hettinger. Ce programme résout les puzzles alphamétiques en seulement 14 lignes de code :\nimport re import itertools def solve(puzzle): words = re.findall(\u0026#39;[A-Z]+\u0026#39;, puzzle.upper()) unique_characters = set(\u0026#39;\u0026#39;.join(words)) assert len(unique_characters) \u0026lt;= 10, \u0026#39;Too many letters\u0026#39; first_letters = {word[0] for word in words} n = len(first_letters) sorted_characters = \u0026#39;\u0026#39;.join(first_letters) + \\ \u0026#39;\u0026#39;.join(unique_characters - first_letters) characters = tuple(ord(c) for c in sorted_characters) digits = tuple(ord(c) for c in \u0026#39;0123456789\u0026#39;) zero = digits[0] for guess in itertools.permutations(digits, len(characters)): if zero not in guess[:n]: equation = puzzle.translate(dict(zip(characters, guess))) if eval(equation): return equation if __name__ == \u0026#39;__main__\u0026#39;: import sys for puzzle in sys.argv[1:]: print(puzzle) solution = solve(puzzle) if solution: print(solution) Vous pouvez exécuter ce programme depuis la ligne de commande. Sous Linux, cela ressemblerait à ceci. (Cela peut prendre un peu de temps, selon la vitesse de votre ordinateur, et comme il n’y a pas de barre de progression, soyez patient !)\nyou@localhost:~/diveintopython3/examples$ python3 alphametics.py \u0026#34;HAWAII + IDAHO + IOWA + OHIO == STATES\u0026#34; HAWAII + IDAHO + IOWA + OHIO = STATES 510199 + 98153 + 9301 + 3593 == 621246 you@localhost:~/diveintopython3/examples$ python3 alphametics.py \u0026#34;I + LOVE + YOU == DORA\u0026#34; I + LOVE + YOU == DORA 1 + 2784 + 975 == 3760 you@localhost:~/diveintopython3/examples$ python3 alphametics.py \u0026#34;SEND + MORE == MONEY\u0026#34; SEND + MORE == MONEY 9567 + 1085 == 10652 Trouver toutes les occurrences d’un motif La première chose que ce résolveur alphamétique fait est de trouver toutes les lettres (A-Z) dans le puzzle.\n\u0026gt;\u0026gt;\u0026gt; import re \u0026gt;\u0026gt;\u0026gt; re.findall(\u0026#39;[0-9]+\u0026#39;, \u0026#39;16 2-by-4s in rows of 8\u0026#39;) ① [\u0026#39;16\u0026#39;, \u0026#39;2\u0026#39;, \u0026#39;4\u0026#39;, \u0026#39;8\u0026#39;] \u0026gt;\u0026gt;\u0026gt; re.findall(\u0026#39;[A-Z]+\u0026#39;, \u0026#39;SEND + MORE == MONEY\u0026#39;) ② [\u0026#39;SEND\u0026#39;, \u0026#39;MORE\u0026#39;, \u0026#39;MONEY\u0026#39;] ① Le module re est une implémentation Python des expressions régulières. Il a une fonction astucieuse appelée findall() qui prend un motif d\u0026rsquo;expression régulière et une chaîne, et trouve toutes les occurrences du motif dans la chaîne. Dans ce cas, le motif correspond aux séquences de nombres. La fonction findall() retourne une liste de toutes les sous-chaînes qui correspondent au motif.\n② Ici est le motif d\u0026rsquo;expression régulière qui correspond aux séquences de lettres. Une fois encore, la valeur de retour est une liste, et chaque item dans la liste est une chaîne qui correspond au motif d’expression régulière.\nVoici un autre exemple qui stimulera un peu votre cerveau.\n\u0026gt;\u0026gt;\u0026gt; re.findall(\u0026#39; s.*? s\u0026#39;, \u0026#34;The sixth sick sheikh\u0026#39;s sixth sheep\u0026#39;s sick.\u0026#34;) [\u0026#39; sixth s\u0026#39;, \u0026#34; sheikh\u0026#39;s s\u0026#34;, \u0026#34; sheep\u0026#39;s s\u0026#34;] Surpris ? L’expression régulière recherche un espace, un s, et ensuite la plus petite série possible de tout caractère (.*?), suivi d’un espace et encore d’un s. Bien, en regardant cette chaîne en entrée, je vois cinq correspondances :\nThe sixth sick sheikh\u0026rsquo;s sixth sheep\u0026rsquo;s sick. The sixth sick sheikh\u0026rsquo;s sixth sheep\u0026rsquo;s sick. The sixth sick sheikh's sixth sheep\u0026rsquo;s sick. The sixth sick sheikh\u0026rsquo;s sixth sheep\u0026rsquo;s sick. The sixth sick sheikh\u0026rsquo;s sixth sheep's sick. Mais la fonction re.findall() ne retourne seulement que trois correspondances. Elle retourne spécifiquement la première, la troisième et la cinquième. Pourquoi cela ? Parce qu’ elle ne renvoie pas les correspondances qui se chevauchent. La première correspondance chevauche la seconde, ainsi la première est retournée et la seconde est sautée. Ensuite, la troisième chevauche la quatrième, ainsi la troisième est retournée et la quatrième est sautée. Finalement, la cinquième est retournée. Trois correspondances et pas cinq.\nCela n\u0026rsquo;a rien à voir avec le résolveur alphamétique ; Je pensais juste que c\u0026rsquo;était intéressant.\nTrouver les items uniques dans une séquence Sets rend trivial la recherche d’items uniques dans une séquence.\n\u0026gt;\u0026gt;\u0026gt; a_list = [\u0026#39;The\u0026#39;, \u0026#39;sixth\u0026#39;, \u0026#39;sick\u0026#39;, \u0026#34;sheik\u0026#39;s\u0026#34;, \u0026#39;sixth\u0026#39;, \u0026#34;sheep\u0026#39;s\u0026#34;, \u0026#39;sick\u0026#39;] \u0026gt;\u0026gt;\u0026gt; set(a_list) ① {\u0026#39;sixth\u0026#39;, \u0026#39;The\u0026#39;, \u0026#34;sheep\u0026#39;s\u0026#34;, \u0026#39;sick\u0026#39;, \u0026#34;sheik\u0026#39;s\u0026#34;} \u0026gt;\u0026gt;\u0026gt; a_string = \u0026#39;EAST IS EAST\u0026#39; \u0026gt;\u0026gt;\u0026gt; set(a_string) ② {\u0026#39;A\u0026#39;, \u0026#39; \u0026#39;, \u0026#39;E\u0026#39;, \u0026#39;I\u0026#39;, \u0026#39;S\u0026#39;, \u0026#39;T\u0026#39;} \u0026gt;\u0026gt;\u0026gt; words = [\u0026#39;SEND\u0026#39;, \u0026#39;MORE\u0026#39;, \u0026#39;MONEY\u0026#39;] \u0026gt;\u0026gt;\u0026gt; \u0026#39;\u0026#39;.join(words) ③ \u0026#39;SENDMOREMONEY\u0026#39; \u0026gt;\u0026gt;\u0026gt; set(\u0026#39;\u0026#39;.join(words)) ④ {\u0026#39;E\u0026#39;, \u0026#39;D\u0026#39;, \u0026#39;M\u0026#39;, \u0026#39;O\u0026#39;, \u0026#39;N\u0026#39;, \u0026#39;S\u0026#39;, \u0026#39;R\u0026#39;, \u0026#39;Y\u0026#39;} ① À une liste donnée de nombreuses chaînes, la fonction set() retournera un ensemble de chaînes uniques depuis la liste. Cela à du sens si vous le considérez comme une boucle for. Prendre le premier item de la liste, et le mettre dans l’ensemble. Le second. Le troisième. Le quatrième. Le cinquième - attendez, c’est déjà dans l’ensemble, donc il n’est répertorié qu’une fois, car les ensembles Python n’autorisent pas les doublons. La sixième. La septième – encore, une dupliquée, qui ne sera listée qu’une fois. Le résultat final ? Chacun des items uniques de la liste originale, sans duplication. La liste originale n\u0026rsquo;a même pas besoin d\u0026rsquo;être triée en premier.\n② La même technique fonctionne avec les chaînes, puisqu’une chaîne est une séquence de caractères.\n③ À une liste donnée de chaînes, ''.join(a_list) concatène toutes les chaînes ensemble en une seule.\n④ Ainsi, à une liste donnée de chaînes, la ligne de code retourne tous les caractères uniques dans toutes les chaînes, sans duplication.\nLe résolveur alphamétique utilise cette technique pour construire un ensemble de tous les caractères uniques dans le puzzle.\nunique_characters = set(\u0026#39;\u0026#39;.join(words)) Cette liste est utilisée plus tard pour assigner des chiffres aux caractères ainsi le résolveur parcourt les solutions possibles.\nCréer des assertions Tout comme beaucoup de langages de programmation, Python a une instruction assert. Voici comment elle fonctionne :\n\u0026gt;\u0026gt;\u0026gt; assert 1 + 1 == 2 ① \u0026gt;\u0026gt;\u0026gt; assert 1 + 1 == 3 ② Traceback (most recent call last): File \u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; AssertionError \u0026gt;\u0026gt;\u0026gt; assert 2 + 2 == 5, \u0026#34;Only for very large values of 2\u0026#34; ③ Traceback (most recent call last): File \u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; AssertionError: Only for very large values of 2 ① L’instruction assert est suivie de toute expression Python valide. Dans ce cas, l’expression 1 + 1 == 2 est évaluée à True, l’instruction assert ne fait rien.\n② Toutefois, si l’expression Python est évaluée à False, l’instruction assert lèvera une AssertionError.\n③ Vous pouvez aussi inclure un message humainement compréhensible qui est affiché si AssertionError est levée.\nDonc, cette ligne de code :\nassert len(unique_characters) \u0026lt;= 10, \u0026#39;Too many letters\u0026#39; … est équivalente à cela :\nif len(unique_characters) \u0026gt; 10: raise AssertionError(\u0026#39;Too many letters\u0026#39;) Le résolveur alphamétique utilise l’instruction exacte assert pour s\u0026rsquo;affranchir rapidement si le puzzle contient plus de dix lettres uniques. Puisque chaque lettre est assignée à un chiffre unique, et qu’il y a seulement dix chiffres, un puzzle avec plus de dix lettres uniques ne peut pas avoir de solution possible.\nGénérateur d’expressions Un générateur d’expression est tout comme un générateur de fonction mais sans fonction.\n\u0026gt;\u0026gt;\u0026gt; unique_characters = {\u0026#39;E\u0026#39;, \u0026#39;D\u0026#39;, \u0026#39;M\u0026#39;, \u0026#39;O\u0026#39;, \u0026#39;N\u0026#39;, \u0026#39;S\u0026#39;, \u0026#39;R\u0026#39;, \u0026#39;Y\u0026#39;} \u0026gt;\u0026gt;\u0026gt; gen = (ord(c) for c in unique_characters) ① \u0026gt;\u0026gt;\u0026gt; gen ② \u0026lt;generator object \u0026lt;genexpr\u0026gt; at 0x00BADC10\u0026gt; \u0026gt;\u0026gt;\u0026gt; next(gen) ③ 69 \u0026gt;\u0026gt;\u0026gt; next(gen) 68 \u0026gt;\u0026gt;\u0026gt; tuple(ord(c) for c in unique_characters) ④ (69, 68, 77, 79, 78, 83, 82, 89) ① Un générateur d’expression est comme une fonction anonyme qui donne des valeurs. L’expression ressemble en elle-même à une liste de compréhension, mais elle est entourée de parenthèses au lieu de crochets.\n② Le générateur d’expression retourne… un itérateur.\n③ L’appel à next(gen) retourne la valeur suivante dans l’itérateur.\n④ Si vous le souhaitez, vous pouvez itérer au-travers toutes les valeurs possibles et retourner un tuple, une liste, ou un ensemble, en soumettant le générateur d’expression à tuple(), list() ou set(). Dans ces cas, vous n’avez pas besoin de parenthèses supplémentaires – il suffit de passer l’expression ord(c) for c in unique_characters telle qu’elle à la fonction tuple(), et Python comprend que c’est un générateur d’expressions.\nUtiliser un générateur d’expressions au lieu d’une liste de compréhension peut soulager à la fois le CPU et la RAM. Si vous construisez une liste pour juste la détruire ensuite (p. ex. pour la passer à tuple() ou set()), utilisez plutôt un générateur d’expression.\nVoici une autre manière d’accomplir la même chose, en utilisant un générateur de fonction :\ndef ord_map(a_string): for c in a_string: yield ord(c) gen = ord_map(unique_characters) Le générateur d’expression est plus compact mais fonctionne de même manière.\nCalculer les Permutations… La manière facile ! Tout d’abord, que sont les permutations ? Les permutations sont un concept mathématique. (Il y a actuellement de nombreuses définitions, selon le type de maths que vous faites. Ici, je parle des combinatoires, mais si cela ne vous dit rien, ne vous inquiétez pas. Comme toujours, Wikipedia est votre ami).\nL’idée est de prendre une liste de choses (qui peuvent être des nombres, des lettres, ou des ours dansants) et de trouver toutes les moyens possibles pour les scinder en petites listes. Toutes ces petites listes ont la même taille, qui peuvent aussi petites que 1 et aussi grandes que le nombre total des items.\nOh, rien ne doit être répété. Les mathématiciens disent des choses telles que « trouvons les permutations de 3 items différents pris 2 à la fois » ce qui signifie que vous avez une séquence de 3 items et que vous devez trouver toutes les paires ordonnées possibles.\n\u0026gt;\u0026gt;\u0026gt; import itertools ① \u0026gt;\u0026gt;\u0026gt; perms = itertools.permutations([1, 2, 3], 2) ② \u0026gt;\u0026gt;\u0026gt; next(perms) ③ (1, 2) \u0026gt;\u0026gt;\u0026gt; next(perms) (1, 3) \u0026gt;\u0026gt;\u0026gt; next(perms) (2, 1) ④ \u0026gt;\u0026gt;\u0026gt; next(perms) (2, 3) \u0026gt;\u0026gt;\u0026gt; next(perms) (3, 1) \u0026gt;\u0026gt;\u0026gt; next(perms) (3, 2) \u0026gt;\u0026gt;\u0026gt; next(perms) ⑤ Traceback (most recent call last): File \u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; StopIteration ① Le module itertools contient toutes sortes de choses amusantes, incluant la fonction permutations() qui fait tout le travail difficile pour trouver les permutations.\n② La fonction permutations() prend une séquence (ici une liste de trois entiers) et un nombre, qui est le nombre d’items que vous voulez dans chaque petit groupe. La fonction retourne un itérateur, que vous pouvez utiliser dans une boucle for ou tout autre code qui itère. Ici, je vais parcourir l\u0026rsquo;itérateur manuellement pour afficher toutes les valeurs.\n③ La première permutation de [1, 2, 3], qui prend 2 à la fois, est (1, 2).\n④ Notez que les permutations sont ordonnées : (2, 1)est différent de (1, 2).\n⑤ C’est tout ! Ce sont toutes les permutations de [1, 2, 3] qui prennent 2 à la fois. Les pairs telles que (1, 1) et (2, 2) ne seront jamais vues, parce qu’elles contiennent des répétitions qui ne sont pas des permutations valides.\nLa fonction permutations() ne nécessite pas de liste. Elle peut prendre n’importe quelle séquence – même une chaîne.\n\u0026gt;\u0026gt;\u0026gt; import itertools \u0026gt;\u0026gt;\u0026gt; perms = itertools.permutations(\u0026#39;ABC\u0026#39;, 3) ① \u0026gt;\u0026gt;\u0026gt; next(perms) (\u0026#39;A\u0026#39;, \u0026#39;B\u0026#39;, \u0026#39;C\u0026#39;) ② \u0026gt;\u0026gt;\u0026gt; next(perms) (\u0026#39;A\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;B\u0026#39;) \u0026gt;\u0026gt;\u0026gt; next(perms) (\u0026#39;B\u0026#39;, \u0026#39;A\u0026#39;, \u0026#39;C\u0026#39;) \u0026gt;\u0026gt;\u0026gt; next(perms) (\u0026#39;B\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;A\u0026#39;) \u0026gt;\u0026gt;\u0026gt; next(perms) (\u0026#39;C\u0026#39;, \u0026#39;A\u0026#39;, \u0026#39;B\u0026#39;) \u0026gt;\u0026gt;\u0026gt; next(perms) (\u0026#39;C\u0026#39;, \u0026#39;B\u0026#39;, \u0026#39;A\u0026#39;) \u0026gt;\u0026gt;\u0026gt; next(perms) Traceback (most recent call last): File \u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; StopIteration \u0026gt;\u0026gt;\u0026gt; list(itertools.permutations(\u0026#39;ABC\u0026#39;, 3)) ③ [(\u0026#39;A\u0026#39;, \u0026#39;B\u0026#39;, \u0026#39;C\u0026#39;), (\u0026#39;A\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;B\u0026#39;), (\u0026#39;B\u0026#39;, \u0026#39;A\u0026#39;, \u0026#39;C\u0026#39;), (\u0026#39;B\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;A\u0026#39;), (\u0026#39;C\u0026#39;, \u0026#39;A\u0026#39;, \u0026#39;B\u0026#39;), (\u0026#39;C\u0026#39;, \u0026#39;B\u0026#39;, \u0026#39;A\u0026#39;)] ① Une chaîne est juste une séquence de caractères. Dans le but de trouver des permutations, la chaîne ‘ABC’ est équivalente à la liste [‘A’, ‘B’, ‘C’].\n② La première permutation de trois items [‘A’, ‘B’, ‘C’], qui prennent 3 à la fois, est (‘A’, ‘B’, ‘C’). Il y a cinq autres permutations. Les trois mêmes caractères dans chaque ordre imaginable.\n③ Puisque la fonction permutations() retourne toujours un itérateur, une manière facile de déboguer les permutations est de passer l’itérateur dans la fonction interne list() pour voir toutes les permutations immédiatement.\nAutres trucs amusants dans le module itertools \u0026gt;\u0026gt;\u0026gt; import itertools \u0026gt;\u0026gt;\u0026gt; list(itertools.product(\u0026#39;ABC\u0026#39;, \u0026#39;123\u0026#39;)) ① [(\u0026#39;A\u0026#39;, \u0026#39;1\u0026#39;), (\u0026#39;A\u0026#39;, \u0026#39;2\u0026#39;), (\u0026#39;A\u0026#39;, \u0026#39;3\u0026#39;), (\u0026#39;B\u0026#39;, \u0026#39;1\u0026#39;), (\u0026#39;B\u0026#39;, \u0026#39;2\u0026#39;), (\u0026#39;B\u0026#39;, \u0026#39;3\u0026#39;), (\u0026#39;C\u0026#39;, \u0026#39;1\u0026#39;), (\u0026#39;C\u0026#39;, \u0026#39;2\u0026#39;), (\u0026#39;C\u0026#39;, \u0026#39;3\u0026#39;)] \u0026gt;\u0026gt;\u0026gt; list(itertools.combinations(\u0026#39;ABC\u0026#39;, 2)) ② [(\u0026#39;A\u0026#39;, \u0026#39;B\u0026#39;), (\u0026#39;A\u0026#39;, \u0026#39;C\u0026#39;), (\u0026#39;B\u0026#39;, \u0026#39;C\u0026#39;)] ① La fonction itertools.product() retourne un itérateur contenant le produit cartésien de deux séquences.\n② La fonction itertools.combinations() retourne un itérateur contenant toutes les combinaisons possibles d’une séquence donnée d’une longueur donnée. Tout comme la fonction itertools.permutations(), excepté que les combinaisons n’incluent pas les items qui sont la copie d’autres items dans un ordre différent. Ainsi, itertools.permutations('ABC', 2) retournera les deux ('A', 'B') et ('B', 'A') (entres autres), mais itertools.combinations('ABC', 2) ne retournera pas ('B', 'A') parce que c’est une copie de ('A', 'B') dans un ordre différent.\n\u0026gt;\u0026gt;\u0026gt; names = list(open(\u0026#39;examples/favorite-people.txt\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;)) ① \u0026gt;\u0026gt;\u0026gt; names [\u0026#39;Dora\\n\u0026#39;, \u0026#39;Ethan\\n\u0026#39;, \u0026#39;Wesley\\n\u0026#39;, \u0026#39;John\\n\u0026#39;, \u0026#39;Anne\\n\u0026#39;, \u0026#39;Mike\\n\u0026#39;, \u0026#39;Chris\\n\u0026#39;, \u0026#39;Sarah\\n\u0026#39;, \u0026#39;Alex\\n\u0026#39;, \u0026#39;Lizzie\\n\u0026#39;] \u0026gt;\u0026gt;\u0026gt; names = [name.rstrip() for name in names] ② \u0026gt;\u0026gt;\u0026gt; names [\u0026#39;Dora\u0026#39;, \u0026#39;Ethan\u0026#39;, \u0026#39;Wesley\u0026#39;, \u0026#39;John\u0026#39;, \u0026#39;Anne\u0026#39;, \u0026#39;Mike\u0026#39;, \u0026#39;Chris\u0026#39;, \u0026#39;Sarah\u0026#39;, \u0026#39;Alex\u0026#39;, \u0026#39;Lizzie\u0026#39;] \u0026gt;\u0026gt;\u0026gt; names = sorted(names) ③ \u0026gt;\u0026gt;\u0026gt; names [\u0026#39;Alex\u0026#39;, \u0026#39;Anne\u0026#39;, \u0026#39;Chris\u0026#39;, \u0026#39;Dora\u0026#39;, \u0026#39;Ethan\u0026#39;, \u0026#39;John\u0026#39;, \u0026#39;Lizzie\u0026#39;, \u0026#39;Mike\u0026#39;, \u0026#39;Sarah\u0026#39;, \u0026#39;Wesley\u0026#39;] \u0026gt;\u0026gt;\u0026gt; names = sorted(names, key=len) ④ \u0026gt;\u0026gt;\u0026gt; names [\u0026#39;Alex\u0026#39;, \u0026#39;Anne\u0026#39;, \u0026#39;Dora\u0026#39;, \u0026#39;John\u0026#39;, \u0026#39;Mike\u0026#39;, \u0026#39;Chris\u0026#39;, \u0026#39;Ethan\u0026#39;, \u0026#39;Sarah\u0026#39;, \u0026#39;Lizzie\u0026#39;, \u0026#39;Wesley\u0026#39;] ① Cet idiome retourne une liste à partir des lignes d’un fichier texte.\n② Malheureusement (dans cet exemple), l’idiome list(open(filename)) inclus aussi le retour chariot à la fin de chaque ligne. Cette liste de compréhension utilise la méthode des chaînes rstrip() pour effacer les espaces de fin de chaque ligne. (Les chaînes ont aussi une méthode lstrip() pour supprimer les espaces en début, et une méthode strip() qui supprime les deux).\n③ La fonction sorted() prend une liste et la retourne triée. Par défaut, le tri est alphabétique.\n④ Mais la fonction sorted() peut aussi prendre une fonction en tant que paramètre key, elle est triée par la clé en question. Dans ce cas, la fonction de tri est len(), ainsi elle est triée par len(each item). Les noms les plus courts sont en premier, puis de plus en plus longs.\nQu\u0026rsquo;est-ce que cela a à voir avec le module itertools ? Je suis content que vous le demandiez.\n…continuing from the previous interactive shell… \u0026gt;\u0026gt;\u0026gt; import itertools \u0026gt;\u0026gt;\u0026gt; groups = itertools.groupby(names, len) ① \u0026gt;\u0026gt;\u0026gt; groups \u0026lt;itertools.groupby object at 0x00BB20C0\u0026gt; \u0026gt;\u0026gt;\u0026gt; list(groups) [(4, \u0026lt;itertools._grouper object at 0x00BA8BF0\u0026gt;), (5, \u0026lt;itertools._grouper object at 0x00BB4050\u0026gt;), (6, \u0026lt;itertools._grouper object at 0x00BB4030\u0026gt;)] \u0026gt;\u0026gt;\u0026gt; groups = itertools.groupby(names, len) ② \u0026gt;\u0026gt;\u0026gt; for name_length, name_iter in groups: ③ … print(\u0026#39;Names with {0:d} letters:\u0026#39;.format(name_length)) … for name in name_iter: … print(name) … Names with 4 letters: Alex Anne Dora John Mike Names with 5 letters: Chris Ethan Sarah Names with 6 letters: Lizzie Wesley ① La fonction itertools.groupby() prend une séquence et une fonction clé, et retourne un itérateur qui génère des paires. Chaque paire contient le résultat de key_function(each item) et un autre itérateur contient tous les items que partage la clé résultante.\n② L’appel à la fonction list() a « épuisé » l’itérateur, c’est-à-dire que vous avez déjà généré chaque élément de l\u0026rsquo;itérateur pour créer la liste. Il n’y a pas de bouton “reset” sur un itérateur ; vous ne pouvez pas juste le démarrer une fois qu’il est épuisé. Si vous voulez le parcourir encore par une boucle (dans une nouvelle boucle for), vous devez appeler encore itertools.groupby() pour créer un nouvel itérateur.\n③ Dans cet exemple, à une liste donnée de noms toujours triée par longueur, itertools.groupby(names, len) sortira tous les noms de 4 lettres dans un itérateur, tous les noms de 5 lettres dans un autre, et ainsi de suite. La fonction groupby() est complètement générique ; elle peut regrouper les chaînes par première lettre, les nombres par nombre de facteurs ou toute autre fonction clé imaginable.\nLa fonction itertools.groupby() fonctionne seulement si la séquence en entrée est déjà triée par la fonction de regroupement. Dans l’exemple ci-dessus, vous avez groupé une liste de noms par la fonction len(). Cela a fonctionné parce que la liste entrée était déjà triée par longueur.\nRegardez de plus prés !\n\u0026gt;\u0026gt;\u0026gt; list(range(0, 3)) [0, 1, 2] \u0026gt;\u0026gt;\u0026gt; list(range(10, 13)) [10, 11, 12] \u0026gt;\u0026gt;\u0026gt; list(itertools.chain(range(0, 3), range(10, 13))) ① [0, 1, 2, 10, 11, 12] \u0026gt;\u0026gt;\u0026gt; list(zip(range(0, 3), range(10, 13))) ② [(0, 10), (1, 11), (2, 12)] \u0026gt;\u0026gt;\u0026gt; list(zip(range(0, 3), range(10, 14))) ③ [(0, 10), (1, 11), (2, 12)] \u0026gt;\u0026gt;\u0026gt; list(itertools.zip_longest(range(0, 3), range(10, 14))) ④ [(0, 10), (1, 11), (2, 12), (None, 13)] ① La fonction itertools.chain() prend deux itérateurs et retourne un itérateur qui contient tous les items du premier itérateur, suivis de ceux du second itérateur. (Actuellement, il peut prendre n’importe quel nombre d’itérateurs, et les enchaîner dans l’ordre où ils sont passés dans la fonction.)\n② La fonction zip() fait quelque chose de prosaïque qui s\u0026rsquo;avère extrêmement utile : elle prend n’importe quel nombre de séquences et retourne un itérateur qui retourne des tuples des premiers items de chaque séquence, ensuite les seconds items de chacune, puis les troisièmes, et ainsi de suite.\n③ La fonction zip() s’arrête à la fin de la plus petite séquence. range(10, 14) a 4 items, mais range(10, 14) en a seulement 3, ainsi la fonction zip() retourne un itérateur de 3 items.\n④ D’un autre côté, la fonction itertools.zip_longest() s’arrête à la fin de la séquence la plus longue, insérant des valeurs None pour les items passés en fin des séquences plus courtes.\nOk, tout cela est très intéressant, mais quel rapport cela a-t-il avec le résolveur d’alphamétique ? Voici comment :\n\u0026gt;\u0026gt;\u0026gt; characters = (\u0026#39;S\u0026#39;, \u0026#39;M\u0026#39;, \u0026#39;E\u0026#39;, \u0026#39;D\u0026#39;, \u0026#39;O\u0026#39;, \u0026#39;N\u0026#39;, \u0026#39;R\u0026#39;, \u0026#39;Y\u0026#39;) \u0026gt;\u0026gt;\u0026gt; guess = (\u0026#39;1\u0026#39;, \u0026#39;2\u0026#39;, \u0026#39;0\u0026#39;, \u0026#39;3\u0026#39;, \u0026#39;4\u0026#39;, \u0026#39;5\u0026#39;, \u0026#39;6\u0026#39;, \u0026#39;7\u0026#39;) \u0026gt;\u0026gt;\u0026gt; tuple(zip(characters, guess)) ① ((\u0026#39;S\u0026#39;, \u0026#39;1\u0026#39;), (\u0026#39;M\u0026#39;, \u0026#39;2\u0026#39;), (\u0026#39;E\u0026#39;, \u0026#39;0\u0026#39;), (\u0026#39;D\u0026#39;, \u0026#39;3\u0026#39;), (\u0026#39;O\u0026#39;, \u0026#39;4\u0026#39;), (\u0026#39;N\u0026#39;, \u0026#39;5\u0026#39;), (\u0026#39;R\u0026#39;, \u0026#39;6\u0026#39;), (\u0026#39;Y\u0026#39;, \u0026#39;7\u0026#39;)) \u0026gt;\u0026gt;\u0026gt; dict(zip(characters, guess)) ② {\u0026#39;E\u0026#39;: \u0026#39;0\u0026#39;, \u0026#39;D\u0026#39;: \u0026#39;3\u0026#39;, \u0026#39;M\u0026#39;: \u0026#39;2\u0026#39;, \u0026#39;O\u0026#39;: \u0026#39;4\u0026#39;, \u0026#39;N\u0026#39;: \u0026#39;5\u0026#39;, \u0026#39;S\u0026#39;: \u0026#39;1\u0026#39;, \u0026#39;R\u0026#39;: \u0026#39;6\u0026#39;, \u0026#39;Y\u0026#39;: \u0026#39;7\u0026#39;} ① À une liste donnée de lettres et une liste de chiffres (chacune représentée ici sous forme de chaînes de 1 caractère), la fonction zip() créera une paire de lettres et de chiffres, dans l’ordre.\n② Pourquoi est-ce cool ? Parce que cette structure de données se trouve être exactement la bonne structure à transmettre à la fonction dict() pour créer un dictionnaire qui utilise des lettres comme clés et leurs chiffres associés comme valeurs. (Ce n’est bien sûr pas la seule manière de faire cela. Vous pouvez utiliser un dictionnaire de compréhension pour créer directement le dictionnaire). Bien que la représentation imprimée du dictionnaire liste les paires dans un ordre différent (les dictionnaires n\u0026rsquo;ont pas d \u0026lsquo;«ordre» en soi), vous pouvez voir que chaque lettre est associée à un chiffre, en fonction de l\u0026rsquo;ordre d\u0026rsquo;origine des séquences characters et guess.\nLe résolveur alphamétique utilise cette technique pour créer un dictionnaire qui fait correspondre chaque lettre dans le puzzle au chiffre, pour chaque solution possible.\ncharacters = tuple(ord(c) for c in sorted_characters) digits = tuple(ord(c) for c in \u0026#39;0123456789\u0026#39;) … for guess in itertools.permutations(digits, len(characters)): … equation = puzzle.translate(dict(zip(characters, guess))) Mais qu’est-ce la méthode translate() ? Ahhh, vous arrivez maintenant la partie réellement amusante.\nUne nouvelle manière de manipuler les chaînes Les chaînes Python ont beaucoup de méthodes. Vous avez appris certaines de ces méthodes dans le chapitre Chaînes : lower(), count(), et format(). Maintenant je veux vous présenter une technique de manipulation puissante mais peu connue : la méthode translate().\n\u0026gt;\u0026gt;\u0026gt; translation_table = {ord(\u0026#39;A\u0026#39;): ord(\u0026#39;O\u0026#39;)} ① \u0026gt;\u0026gt;\u0026gt; translation_table ② {65: 79} \u0026gt;\u0026gt;\u0026gt; \u0026#39;MARK\u0026#39;.translate(translation_table) ③ \u0026#39;MORK\u0026#39; ① La traduction des chaînes débute avec une table de traduction, qui est simplement un dictionnaire qui fait correspondre un caractère avec un autre. Actuellement \u0026ldquo;caractère\u0026rdquo; est incorrect - la table de traduction fait réellement correspondre un octet avec un autre.\n② Rappelez-vous, les octets en Python 3 sont des entiers. La fonction ord() retourne la valeur ASCII d\u0026rsquo;un caractère, qui, dans le cas de A-Z, est toujours un octet de 65 à 90.\n③ La méthode translate() sur une chaîne prend une table de traduction et la parcourt. Pour cela, elle remplace toutes les occurences des clés de la table de traduction avec les valeurs correspondantes. Dans ce cas, elle \u0026ldquo;traduit\u0026rdquo; MARK en MORK.\nQu\u0026rsquo;est-ce que cela a à voir avec la résolution de puzzles alphamétiques ? En fait, tout.\n\u0026gt;\u0026gt;\u0026gt; characters = tuple(ord(c) for c in \u0026#39;SMEDONRY\u0026#39;) ① \u0026gt;\u0026gt;\u0026gt; characters (83, 77, 69, 68, 79, 78, 82, 89) \u0026gt;\u0026gt;\u0026gt; guess = tuple(ord(c) for c in \u0026#39;91570682\u0026#39;) ② \u0026gt;\u0026gt;\u0026gt; guess (57, 49, 53, 55, 48, 54, 56, 50) \u0026gt;\u0026gt;\u0026gt; translation_table = dict(zip(characters, guess)) ③ \u0026gt;\u0026gt;\u0026gt; translation_table {68: 55, 69: 53, 77: 49, 78: 54, 79: 48, 82: 56, 83: 57, 89: 50} \u0026gt;\u0026gt;\u0026gt; \u0026#39;SEND + MORE == MONEY\u0026#39;.translate(translation_table) ④ \u0026#39;9567 + 1085 == 10652\u0026#39; ① En utilisant un générateur d\u0026rsquo;expressions, nous calculons les valeurs d\u0026rsquo;octet pour chaque caractère d\u0026rsquo;une chaîne. characters est un exemple de valeur de sorted_characters dans la fonction alphametics.solve().\n② En utilisant un autre générateur d\u0026rsquo;expression, nous calculons les valeurs d\u0026rsquo;octet de chaque chiffre dans la chaîne. Le résultat, guess, est de la forme retournée par la fonction itertools.permutations() dans la fonction alphametics.solve().\n③ Cette table de traduction est générée par itération de characters et de guess ensemble et en construisant un dictionnaire depuis la séquence de pairs résultante. C\u0026rsquo;est exactement ce que fait la fonction alphametics.solve() à l\u0026rsquo;intérieur de la boucle for.\n④ Enfin, nous passons cette table de traduction à la méthode translate() du puzzle originale de la chaîne. Cela convertit chaque lettre dans la chaîne vers le chiffre correspondant (basé sur les lettres dans characters et les chiffres dans guess). Le résultat est une expression Python valide, tout comme l\u0026rsquo;est une chaîne.\nC\u0026rsquo;est assez impressionnant. Mais que pouvez-vous faire avec une chaîne qui se trouve être une expression Python valide ?\nÉvaluer arbitrairement des chaînes en tant qu\u0026rsquo;expressions Python Ceci est la pièce finale du puzzle (ou plutôt, la pièce finale du résolveur de puzzle). Après toutes ces manipulations sympathiques de chaînes, il nous reste une chaîne telle que '9567 + 1085 == 10652'. Mais c\u0026rsquo;est une chaîne, et qu\u0026rsquo;est-ce qui est bon avec une chaîne ? Tapez eval(), l\u0026rsquo;outil universel Python d\u0026rsquo;évaluation.\n\u0026gt;\u0026gt;\u0026gt; eval(\u0026#39;1 + 1 == 2\u0026#39;) True \u0026gt;\u0026gt;\u0026gt; eval(\u0026#39;1 + 1 == 3\u0026#39;) False \u0026gt;\u0026gt;\u0026gt; eval(\u0026#39;9567 + 1085 == 10652\u0026#39;) True Mais attendez, il y a plus ! La fonction eval() n\u0026rsquo;est pas limitée aux expressions booléennes. Elle peut capturer toute expression Python et retourner tout type de données.\n\u0026gt;\u0026gt;\u0026gt; eval(\u0026#39;\u0026#34;A\u0026#34; + \u0026#34;B\u0026#34;\u0026#39;) \u0026#39;AB\u0026#39; \u0026gt;\u0026gt;\u0026gt; eval(\u0026#39;\u0026#34;MARK\u0026#34;.translate({65: 79})\u0026#39;) \u0026#39;MORK\u0026#39; \u0026gt;\u0026gt;\u0026gt; eval(\u0026#39;\u0026#34;AAAAA\u0026#34;.count(\u0026#34;A\u0026#34;)\u0026#39;) 5 \u0026gt;\u0026gt;\u0026gt; eval(\u0026#39;[\u0026#34;*\u0026#34;] * 5\u0026#39;) [\u0026#39;*\u0026#39;, \u0026#39;*\u0026#39;, \u0026#39;*\u0026#39;, \u0026#39;*\u0026#39;, \u0026#39;*\u0026#39;] Mais attendez, ce n\u0026rsquo;est pas tout !\n\u0026gt;\u0026gt;\u0026gt; x = 5 \u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;x * 5\u0026#34;) ① 25 \u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;pow(x, 2)\u0026#34;) ② 25 \u0026gt;\u0026gt;\u0026gt; import math \u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;math.sqrt(x)\u0026#34;) ③ 2.2360679774997898 ① L\u0026rsquo;expression que prend eval() peut référencer des variables globales définies en-dehors d\u0026rsquo; eval(). Si elle est appelée dans une fonction, elle peut référencer des variables locales, aussi.\n② Et des fonctions.\n③ Et des modules.\nEh, attendez une minute…\n\u0026gt;\u0026gt;\u0026gt; import subprocess \u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;subprocess.getoutput(\u0026#39;ls ~\u0026#39;)\u0026#34;) ① \u0026#39;Desktop Library Pictures \\ Documents Movies Public \\ Music Sites\u0026#39; \u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;subprocess.getoutput(\u0026#39;rm /some/random/file\u0026#39;)\u0026#34;) ② ① Le module subprocess vous permet d\u0026rsquo;exécuter arbitrairement des commandes shell et d\u0026rsquo;avoir le résultat en tant que chaîne Python.\n② Arbitrairement les commandes shell peuvent avoir des conséquences permanentes.\nC\u0026rsquo;est même pire que cela, parce qu\u0026rsquo;il y a la fonction globale __import__() qui prend un nom de module en tant que chaîne, importe le module, et lui retourne une référence. Combinée à la puissance d\u0026rsquo; eval(), vous pouvez construire une expression simple qui supprimera tous vos fichiers :\n\u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;__import__(\u0026#39;subprocess\u0026#39;).getoutput(\u0026#39;rm /some/random/file\u0026#39;)\u0026#34;) ① ① Maintenant, imaginez la sortie de 'rm -rf ~'. En fait, il n’y aurait pas de sortie, mais il ne resterait plus aucun fichier.\neval() is EVIL\nBien, la partie diabolique est d\u0026rsquo;évaluer arbitrairement des expressions depuis des sources non vérifiées. Vous ne devriez utiliser eval() que sur une entrée de confiance. Bien sûr, le truc consiste à déterminer ce qui est «fiable». Mais voici quelque chose que je sais avec certitude : vous NE DEVRIEZ PAS prendre ce résolveur alphamétique et le mettre sur Internet en tant que petit service web sympa. Ne faites pas l\u0026rsquo;erreur de penser : \u0026ldquo;Mon Dieu, la fonction fait beaucoup de manipulation de chaîne avant d\u0026rsquo;obtenir une chaîne à évaluer ; je ne peux pas imaginer comment quelqu\u0026rsquo;un pourrait exploiter cela.\u0026rdquo; Quelqu\u0026rsquo;un comprendra comment passer furtivement du code exécutable nuisible après toute cette manipulation de chaîne (des choses étranges se sont produites), et vous pourrez alors dire adieu à votre serveur.\nMais il existe sûrement un moyen d’évaluer les expressions en toute sécurité ? Mettre eval() dans une sandbox où il ne peut accéder à rien ni endommager le reste du monde ? Eh bien, oui et non.\n\u0026gt;\u0026gt;\u0026gt; x = 5 \u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;x * 5\u0026#34;, {}, {}) ① Traceback (most recent call last): File \u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; File \u0026#34;\u0026lt;string\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; NameError: name \u0026#39;x\u0026#39; is not defined \u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;x * 5\u0026#34;, {\u0026#34;x\u0026#34;: x}, {}) ② 25 \u0026gt;\u0026gt;\u0026gt; import math \u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;math.sqrt(x)\u0026#34;, {\u0026#34;x\u0026#34;: x}, {}) ③ Traceback (most recent call last): File \u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; File \u0026#34;\u0026lt;string\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; NameError: name \u0026#39;math\u0026#39; is not defined ① Le second paramètre et le troisième passés à la fonction eval() agissent dans les espaces de noms global et local pour évaluer l\u0026rsquo;expression. Dans ce cas, les deux sont vides, ce qui signifie alors que, quand la chaîne \u0026quot;x * 5\u0026quot; est évaluée, il n\u0026rsquo;y a pas de référence à x ni dans l\u0026rsquo;espace de nom global ou local, ainsi eval() lève une exception.\n② Vous pouvez sélectivement inclure des valeurs spécifiques dans l\u0026rsquo;espace de noms global en les listant individuellement. Alors ces variables - et seulement celles-là - seront disponibles durant l\u0026rsquo;évaluation.\n③ Même si vous venez d\u0026rsquo;importer le module math, vous ne pouvez l\u0026rsquo;inclure dans l\u0026rsquo;espace de noms à la fonction eval(), ainsi l\u0026rsquo;évaluation échouera.\nPfff, c\u0026rsquo;était facile. Laissez-moi faire un service web alphamétique, maintenant !\n\u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;pow(5, 2)\u0026#34;, {}, {}) ① 25 \u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;__import__(\u0026#39;math\u0026#39;).sqrt(5)\u0026#34;, {}, {}) ② 2.2360679774997898 ① Même si vous avez passé des dictionnaires vides pour les espaces de noms global et local, toutes les fonctions internes de Python seront toujours disponibles durant l\u0026rsquo;évaluation. Ainsi pow(5, 2) fonctionne, parce que 5 et 2 sont des littéraux, et que pow() est une fonction interne.\n② Malheureusement (et même si vous ne voyez pas pourquoi cela est malheureux, lisez la suite), la fonction __import__() est aussi une fonction interne, ainsi cela fonctionne aussi.\nOui, cela signifie que vous pouvez toujours faire des choses méchantes, même si vous configurez explicitement les espaces de noms global et local pour vider les dictionnaires lors de l\u0026rsquo;appel à eval() :\n\u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;__import__(\u0026#39;subprocess\u0026#39;).getoutput(\u0026#39;rm /some/random/file\u0026#39;)\u0026#34;, {}, {}) Oups. Je suis heureux de ne pas avoir créer de service web alphamétique. N\u0026rsquo;y a-t-il aucun moyen d\u0026rsquo;utiliser eval() de manière sécurisée ? Eh bien, oui et non.\n\u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;__import__(\u0026#39;math\u0026#39;).sqrt(5)\u0026#34;, … {\u0026#34;__builtins__\u0026#34;:None}, {}) ① Traceback (most recent call last): File \u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; File \u0026#34;\u0026lt;string\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; NameError: name \u0026#39;__import__\u0026#39; is not defined \u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;__import__(\u0026#39;subprocess\u0026#39;).getoutput(\u0026#39;rm -rf /\u0026#39;)\u0026#34;, … {\u0026#34;__builtins__\u0026#34;:None}, {}) ② Traceback (most recent call last): File \u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; File \u0026#34;\u0026lt;string\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; NameError: name \u0026#39;__import__\u0026#39; is not defined ① Pour évaluer des expressions non vérifiées de manière sûre, vous avez besoin de définir un dictionnaire d\u0026rsquo;espace de noms global qui fait correspondre \u0026quot;__builtins__\u0026quot; à None, une valeur Python null. En interne, les fonctions \u0026ldquo;built-in\u0026rdquo; sont contenues dans un pseudo-module appelé \u0026quot;__builtins__\u0026quot;. Ce pseudo-module (càd l\u0026rsquo;ensemble des fonctions internes) est rendu disponible aux expressions évaluées à moins que vous les surchargiez explicitement.\n② Soyez sûr que vous surchargiez __builtins__. Non pas __builtin__, __built-ins__, ou toute autre variation qui fonctionnera parfaitement mais qui vous expose à des risques catastrophiques.\nAinsi, eval() est sûr maintenant ? Eh bien, oui et non.\n\u0026gt;\u0026gt;\u0026gt; eval(\u0026#34;2 ** 2147483647\u0026#34;, … {\u0026#34;__builtins__\u0026#34;:None}, {}) ① ① Même sans accéder à __builtins__, vous pouvez toujours lancer une attaque par déni de service. Par exemple, essayer de lever 2 à la puissance 2147483647 augmentera l\u0026rsquo;utilisation du CPU de votre serveur à 100% pendant un certain temps. (Si vous essayez cela dans un terminal interactif, appuyez plusieurs fois sur Ctrl-C pour en sortir.) Techniquement cette expression retournera éventuellement une valeur, mais en attendant, votre serveur fera plus rien d\u0026rsquo;autres.\nEnfin, il est possible d\u0026rsquo;évaluer en toute sécurité des expressions Python non vérifiées, pour une définition du terme «sûr» qui ne s\u0026rsquo;avère pas très utile dans la vie réelle. C’est bien si vous vous contentez de jouer, et c’est bien si vous ne transmettez que des données fiables. Mais tout autre ne fait que provoquer des ennuis.\nRésumons cela ensemble Pour récapituler : ce programme résoud des puzzles alphamétiques par force brute, càd, par une recherche exhaustive de toutes les solutions possibles Pour faire cela, il faut…\nTrouver toutes les lettres dans le puzzle avec la fonction re.findall() Trouver toutes les lettres uniques dans le puzzle avec sets et la fonction set() Vérifier qu\u0026rsquo;il n\u0026rsquo;y a pas plus de 10 lettres uniques (ce qui signifie que le puzzle est définitivement non résolvable) avec l\u0026rsquo;instruction assert Convertir les lettres dans leur équivalent ASCII avec un générateur objet. Calculer toutes les solutions possibles avec la fonction itertools.permutations() Convertir chaque solution possible en une expression Python avec la méthode de chaînes translate() Tester chaque solution possible en évaluant l\u0026rsquo;expression Python avec la fonction eval() Retourner la première solution qui évalue à True … en seulement 14 lignes de code.\nLectures complémentaires (en anglais) Le module itertools itertools - Fonctions d\u0026rsquo;Itérateur pour boucles efficientes Regarder la Présentation \u0026ldquo;Easy AI with Python\u0026rdquo; de Raymond Hettinger au PyCon 2009. semble ne plus être disponible Recette 576615: Résolveur Alphamétique, un résolveur alphamétique original de Raymond Hettinger pour Python 2 Plus de recettes de Raymond Hettinger dans le référentiel de codes ActiveState Alphamétiques sur Wikipédia Index Alphamétiques, incluant beaucoup de puzzles et un générateur à fabriquer soi-même. Tout plein de remerciements à Raymond Hettinger pour son accord à modifier la licence de son code, ainsi j\u0026rsquo;ai pu le porter vers Python 3 et l\u0026rsquo;utiliser comme base de ce chapitre.\n© 2001–11 Mark Pilgrim\n*[ASCII]: American Standard Code for Information Interchange - Code américain normalisé pour l\u0026rsquo;échange d\u0026rsquo;information *[CPU]: Central Processing Unit - Processeur *[RAM]: Random Access Memory - Mémoire Vive *[càd]: c\u0026rsquo;est-à-dire\n","content_html":"\u003ch1 id=\"dive-into-python-3---8--itérateurs-avancés\"\u003eDive Into Python 3 - 8 : Itérateurs avancés\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGreat fleas have little fleas upon their backs to bite ’em, And little fleas have lesser fleas, and so ad infinitum. — Augustus De Morgan\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"en-plongée\"\u003eEn plongée\u003c/h2\u003e\n\u003cp\u003eTout comme les \u003ca\u003eexpressions régulières\u003c/a\u003e dopent les \u003ca\u003echaînes\u003c/a\u003e aux stéroïdes, le module \u003ccode\u003eitertools\u003c/code\u003e dopent les \u003ca\u003eitérateurs\u003c/a\u003e aux stéroïdes. Mais d\u0026rsquo;abord, je veux vous montrer un puzzle classique :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\u003eHAWAII \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e IDAHO \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e IOWA \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e OHIO \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e STATES\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e510199\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e98153\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e9301\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3593\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e621246\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eH \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\u003eA \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\u003eW \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\u003eI \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eD \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eO \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\u003eS \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\u003eT \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\u003eE \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\u003eDe tels puzzles sont appelés \u003cem\u003ecryptarithmes\u003c/em\u003e ou \u003cem\u003ealphamétiques\u003c/em\u003e. Les lettres épellent des mots réels, mais si vous remplacez chaque lettre par un chiffre de \u003ccode\u003e0-9\u003c/code\u003e, elles « épellent » aussi une équation arithmétique. L\u0026rsquo;astuce consiste à déterminer quelle lettre correspond à chaque chiffre. Toutes les occurrences de chaque lettre doivent correspondre au même chiffre, aucun chiffre ne doit être répété, et aucun « mot » ne peut démarrer avec le chiffre 0.\u003c/p\u003e\n\u003cp\u003eDans ce chapitre, nous plongerons en profondeur dans un incroyable programme Python écrit à l’origine par Raymond Hettinger. Ce programme résout les puzzles alphamétiques en seulement \u003cem\u003e14 lignes de code\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-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\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eitertools\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003esolve\u003c/span\u003e(puzzle):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    words \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efindall(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[A-Z]+\u0026#39;\u003c/span\u003e, puzzle\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eupper())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    unique_characters \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e set(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin(words))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eassert\u003c/span\u003e len(unique_characters) \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Too many letters\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    first_letters \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {word[\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e] \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e word \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e words}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    n \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e len(first_letters)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    sorted_characters \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin(first_letters) \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;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin(unique_characters \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e first_letters)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    characters \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e tuple(ord(c) \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e c \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e sorted_characters)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    digits \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e tuple(ord(c) \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e c \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;0123456789\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    zero \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e digits[\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\"\u003efor\u003c/span\u003e guess \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e itertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epermutations(digits, len(characters)):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e zero \u003cspan style=\"color:#5bc4bf\"\u003enot\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e guess[:n]:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            equation \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e puzzle\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etranslate(dict(zip(characters, guess)))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e eval(equation):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e equation\n\u003c/span\u003e\u003c/span\u003e\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:#ef6155\"\u003e__name__\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;__main__\u0026#39;\u003c/span\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\"\u003esys\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 puzzle \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e sys\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eargv[\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e:]:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(puzzle)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        solution \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e solve(puzzle)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e solution:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            print(solution)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVous pouvez exécuter ce programme depuis la ligne de commande. Sous Linux, cela ressemblerait à ceci. (Cela peut prendre un peu de temps, selon la vitesse de votre ordinateur, et comme il n’y a pas de barre de progression, soyez patient !)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\u003eyou@localhost:~/diveintopython3/examples$ python3 alphametics.py \u003cspan style=\"color:#48b685\"\u003e\u0026#34;HAWAII + IDAHO + IOWA + OHIO == STATES\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eHAWAII + IDAHO + IOWA + \u003cspan style=\"color:#ef6155\"\u003eOHIO\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STATES\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e510199\u003c/span\u003e + \u003cspan style=\"color:#f99b15\"\u003e98153\u003c/span\u003e + \u003cspan style=\"color:#f99b15\"\u003e9301\u003c/span\u003e + \u003cspan style=\"color:#ef6155\"\u003e3593\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e621246\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eyou@localhost:~/diveintopython3/examples$ python3 alphametics.py \u003cspan style=\"color:#48b685\"\u003e\u0026#34;I + LOVE + YOU == DORA\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eI + LOVE + \u003cspan style=\"color:#ef6155\"\u003eYOU\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e DORA\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\"\u003e2784\u003c/span\u003e + \u003cspan style=\"color:#ef6155\"\u003e975\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3760\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eyou@localhost:~/diveintopython3/examples$ python3 alphametics.py \u003cspan style=\"color:#48b685\"\u003e\u0026#34;SEND + MORE == MONEY\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSEND + \u003cspan style=\"color:#ef6155\"\u003eMORE\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e MONEY\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e9567\u003c/span\u003e + \u003cspan style=\"color:#ef6155\"\u003e1085\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e10652\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"trouver-toutes-les-occurrences-dun-motif\"\u003eTrouver toutes les occurrences d’un motif\u003c/h2\u003e\n\u003cp\u003eLa première chose que ce résolveur alphamétique fait est de trouver toutes les lettres (A-Z) dans le puzzle.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\u003efindall(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[0-9]+\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;16 2-by-4s in rows of 8\u0026#39;\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#39;16\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;2\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;4\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;8\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\u003efindall(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[A-Z]+\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;SEND + MORE == MONEY\u0026#39;\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#39;SEND\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;MORE\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;MONEY\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① Le module \u003ccode\u003ere\u003c/code\u003e est une implémentation Python des \u003ca\u003eexpressions régulières\u003c/a\u003e. Il a une fonction astucieuse appelée \u003ccode\u003efindall()\u003c/code\u003e qui prend un motif d\u0026rsquo;expression régulière et une chaîne, et trouve toutes les occurrences du motif dans la chaîne. Dans ce cas, le motif correspond aux séquences de nombres. La fonction \u003ccode\u003efindall()\u003c/code\u003e retourne une liste de toutes les sous-chaînes qui  correspondent au motif.\u003c/p\u003e\n\u003cp\u003e② Ici est le motif d\u0026rsquo;expression régulière qui correspond aux séquences de lettres. Une fois encore, la valeur de retour est une liste, et chaque item dans la liste est une chaîne qui correspond au motif d’expression régulière.\u003c/p\u003e\n\u003cp\u003eVoici un autre exemple qui stimulera un peu votre cerveau.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\u003efindall(\u003cspan style=\"color:#48b685\"\u003e\u0026#39; s.*? s\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;The sixth sick sheikh\u0026#39;s sixth sheep\u0026#39;s sick.\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#39; sixth s\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34; sheikh\u0026#39;s s\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34; sheep\u0026#39;s s\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSurpris ?\nL’expression régulière recherche un espace, un \u003ccode\u003es\u003c/code\u003e, et ensuite la plus petite série possible de tout caractère \u003ccode\u003e(.*?)\u003c/code\u003e, suivi d’un espace et encore d’un \u003ccode\u003es\u003c/code\u003e. Bien, en regardant cette chaîne en entrée, je vois cinq correspondances :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eThe\u003ccode\u003e sixth s\u003c/code\u003eick sheikh\u0026rsquo;s sixth sheep\u0026rsquo;s sick.\u003c/li\u003e\n\u003cli\u003eThe sixth\u003ccode\u003e sick s\u003c/code\u003eheikh\u0026rsquo;s sixth sheep\u0026rsquo;s sick.\u003c/li\u003e\n\u003cli\u003eThe sixth sick\u003ccode\u003e sheikh's s\u003c/code\u003eixth sheep\u0026rsquo;s sick.\u003c/li\u003e\n\u003cli\u003eThe sixth sick sheikh\u0026rsquo;s\u003ccode\u003e sixth s\u003c/code\u003eheep\u0026rsquo;s sick.\u003c/li\u003e\n\u003cli\u003eThe sixth sick sheikh\u0026rsquo;s sixth\u003ccode\u003e sheep's s\u003c/code\u003eick.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eMais la fonction \u003ccode\u003ere.findall()\u003c/code\u003e ne retourne seulement que trois correspondances. Elle retourne spécifiquement la première, la troisième et la cinquième. Pourquoi cela ?\nParce qu’ \u003cem\u003eelle ne renvoie pas les correspondances qui se chevauchent\u003c/em\u003e. La première correspondance chevauche la seconde, ainsi la première est retournée et la seconde est sautée. Ensuite, la troisième chevauche la quatrième, ainsi la troisième est retournée et la quatrième est sautée. Finalement, la cinquième est retournée. Trois correspondances et pas cinq.\u003c/p\u003e\n\u003cp\u003eCela n\u0026rsquo;a rien à voir avec le résolveur alphamétique ; Je pensais juste que c\u0026rsquo;était intéressant.\u003c/p\u003e\n\u003ch2 id=\"trouver-les-items-uniques-dans-une-séquence\"\u003eTrouver les items uniques dans une séquence\u003c/h2\u003e\n\u003cp\u003e\u003ca\u003eSets\u003c/a\u003e rend trivial la recherche d’items uniques dans une séquence.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 a_list \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;The\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;sixth\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;sick\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sheik\u0026#39;s\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;sixth\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sheep\u0026#39;s\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;sick\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 set(a_list)                      \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#39;sixth\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;The\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sheep\u0026#39;s\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;sick\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sheik\u0026#39;s\u0026#34;\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 a_string \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;EAST IS EAST\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 set(a_string)                    \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#39;A\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;I\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;S\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;T\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 words \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;SEND\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;MORE\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;MONEY\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 \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin(words)                   \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#39;SENDMOREMONEY\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 set(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin(words))              \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#39;E\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;M\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;N\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;S\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;R\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Y\u0026#39;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① À une liste donnée de nombreuses chaînes, la fonction \u003ccode\u003eset()\u003c/code\u003e retournera un ensemble de chaînes uniques depuis la liste. Cela à du sens si vous le considérez comme une boucle \u003ccode\u003efor\u003c/code\u003e. Prendre le premier item de la liste, et le mettre dans l’ensemble. Le second. Le troisième. Le quatrième. Le cinquième - attendez, c’est déjà dans l’ensemble, donc il n’est répertorié qu’une fois, car les ensembles Python n’autorisent pas les doublons. La sixième. La septième – encore, une dupliquée, qui ne sera listée qu’une fois. Le résultat final ? Chacun des items uniques de la liste originale, sans duplication. La liste originale n\u0026rsquo;a même pas besoin d\u0026rsquo;être triée en premier.\u003c/p\u003e\n\u003cp\u003e② La même technique fonctionne avec les chaînes, puisqu’une chaîne est une séquence de caractères.\u003c/p\u003e\n\u003cp\u003e③ À une liste donnée de chaînes, \u003ccode\u003e''.join(a_list)\u003c/code\u003e concatène toutes les chaînes ensemble en une seule.\u003c/p\u003e\n\u003cp\u003e④ Ainsi, à une liste donnée de chaînes, la ligne de code retourne tous les caractères uniques dans toutes les chaînes, sans duplication.\u003c/p\u003e\n\u003cp\u003eLe résolveur alphamétique utilise cette technique pour construire un ensemble de tous les caractères uniques dans le puzzle.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\u003eunique_characters \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e set(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin(words))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCette liste est utilisée plus tard pour assigner des chiffres aux caractères ainsi le résolveur parcourt les solutions possibles.\u003c/p\u003e\n\u003ch2 id=\"créer-des-assertions\"\u003eCréer des assertions\u003c/h2\u003e\n\u003cp\u003eTout comme beaucoup de langages de programmation, Python a une instruction \u003ccode\u003eassert\u003c/code\u003e. Voici  comment elle 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:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eassert\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\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\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eassert\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e                                     \u003cspan style=\"color:#ef6155\"\u003e②\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\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:#ef6155\"\u003eAssertionError\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 \u003cspan style=\"color:#815ba4\"\u003eassert\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Only for very large values of 2\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\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\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:#ef6155\"\u003eAssertionError\u003c/span\u003e: Only \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e very large values of \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① L’instruction \u003ccode\u003eassert\u003c/code\u003e est suivie de toute expression Python valide. Dans ce cas, l’expression \u003ccode\u003e1 + 1 == 2\u003c/code\u003e est évaluée à \u003ccode\u003eTrue\u003c/code\u003e, l’instruction \u003ccode\u003eassert\u003c/code\u003e ne fait rien.\u003c/p\u003e\n\u003cp\u003e② Toutefois, si l’expression Python est évaluée à \u003ccode\u003eFalse\u003c/code\u003e, l’instruction \u003ccode\u003eassert\u003c/code\u003e lèvera une \u003ccode\u003eAssertionError\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e③ Vous pouvez aussi inclure un message humainement compréhensible qui est affiché si \u003ccode\u003eAssertionError\u003c/code\u003e est levée.\u003c/p\u003e\n\u003cp\u003eDonc, cette ligne de 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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eassert\u003c/span\u003e len(unique_characters) \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Too many letters\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e… est équivalente à 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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e len(unique_characters) \u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\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:#815ba4\"\u003eraise\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eAssertionError\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Too many letters\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe résolveur alphamétique utilise l’instruction exacte \u003ccode\u003eassert\u003c/code\u003e pour s\u0026rsquo;affranchir rapidement si le puzzle contient plus de dix lettres uniques. Puisque chaque lettre est assignée à un chiffre unique, et qu’il y a seulement dix chiffres, un puzzle avec plus de dix lettres uniques ne peut pas avoir de solution possible.\u003c/p\u003e\n\u003ch2 id=\"générateur-dexpressions\"\u003eGénérateur d’expressions\u003c/h2\u003e\n\u003cp\u003eUn générateur d’expression est tout comme un \u003ca\u003egénérateur de fonction\u003c/a\u003e mais sans fonction.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 unique_characters \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;M\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;N\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;S\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;R\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Y\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 gen \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (ord(c) \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e c \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e unique_characters)  \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 gen                                        \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\u0026lt;\u003c/span\u003egenerator object \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003egenexpr\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e at \u003cspan style=\"color:#f99b15\"\u003e0x00BADC10\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(gen)                                  \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:#f99b15\"\u003e69\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(gen)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e68\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 tuple(ord(c) \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e c \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e unique_characters)   \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:#f99b15\"\u003e69\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e68\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e77\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e79\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e78\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e83\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e82\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e89\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① Un générateur d’expression est comme une fonction anonyme qui donne des valeurs. L’expression ressemble en elle-même à une \u003ca\u003eliste de compréhension\u003c/a\u003e, mais elle est entourée de parenthèses au lieu de crochets.\u003c/p\u003e\n\u003cp\u003e② Le générateur d’expression retourne… un itérateur.\u003c/p\u003e\n\u003cp\u003e③ L’appel à \u003ccode\u003enext(gen)\u003c/code\u003e retourne la valeur suivante dans l’itérateur.\u003c/p\u003e\n\u003cp\u003e④ Si vous le souhaitez, vous pouvez itérer au-travers toutes les valeurs possibles et retourner un tuple, une liste, ou un ensemble, en soumettant le générateur d’expression à \u003ccode\u003etuple()\u003c/code\u003e, \u003ccode\u003elist()\u003c/code\u003e ou \u003ccode\u003eset()\u003c/code\u003e. Dans ces cas, vous n’avez pas besoin de parenthèses supplémentaires – il suffit de passer l’expression \u003ccode\u003eord(c) for c in unique_characters\u003c/code\u003e telle qu’elle à la fonction \u003ccode\u003etuple()\u003c/code\u003e, et Python comprend que c’est un générateur d’expressions.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUtiliser un générateur d’expressions au lieu d’une liste de compréhension peut soulager à la fois le CPU et la RAM. Si vous construisez une liste pour juste la détruire ensuite (p. ex. pour la passer à \u003ccode\u003etuple()\u003c/code\u003e ou \u003ccode\u003eset()\u003c/code\u003e), utilisez plutôt un générateur d’expression.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eVoici une autre manière d’accomplir la même chose, en utilisant un \u003ca\u003egénérateur de fonction\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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eord_map\u003c/span\u003e(a_string):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e c \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e a_string:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eyield\u003c/span\u003e ord(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\u003egen \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ord_map(unique_characters)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe générateur d’expression est plus compact mais fonctionne de même manière.\u003c/p\u003e\n\u003ch2 id=\"calculer-les-permutations-la-manière-facile\"\u003eCalculer les Permutations… La manière facile !\u003c/h2\u003e\n\u003cp\u003eTout d’abord, que sont les permutations ? Les permutations sont un concept mathématique. (Il y a actuellement de nombreuses définitions, selon le type de maths que vous faites. Ici, je parle des combinatoires, mais si cela ne vous dit rien, ne vous inquiétez pas. Comme toujours, \u003ca href=\"https://fr.wikipedia.org/wiki/Permutation\" rel=\"external\"\u003eWikipedia est votre ami\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003eL’idée est de prendre une liste de choses (qui peuvent être des nombres, des lettres, ou des ours dansants) et de trouver toutes les moyens possibles pour les scinder en petites listes. Toutes ces petites listes ont la même taille, qui peuvent aussi petites que 1 et aussi grandes que le nombre total des items.\u003c/p\u003e\n\u003cp\u003eOh, rien ne doit être répété. Les mathématiciens disent des choses telles que « trouvons les permutations de 3 items différents pris 2 à la fois » ce qui signifie que vous avez une séquence de 3 items et que vous devez trouver toutes les paires ordonnées possibles.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003eitertools\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\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e perms \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e itertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epermutations([\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\"\u003e2\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\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e next(perms)                                   \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:#f99b15\"\u003e1\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\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e next(perms)\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\"\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(perms)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e1\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\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e next(perms)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#f99b15\"\u003e2\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:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e next(perms)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#f99b15\"\u003e3\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:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e next(perms)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#f99b15\"\u003e3\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\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e next(perms)                                   \u003cspan style=\"color:#ef6155\"\u003e⑤\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\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:#ef6155\"\u003eStopIteration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① Le module \u003ccode\u003eitertools\u003c/code\u003e contient toutes sortes de choses amusantes, incluant la fonction \u003ccode\u003epermutations()\u003c/code\u003e qui fait tout le travail difficile pour trouver les permutations.\u003c/p\u003e\n\u003cp\u003e② La fonction \u003ccode\u003epermutations()\u003c/code\u003e prend une séquence (ici une liste de trois entiers) et un nombre, qui est le nombre d’items que vous voulez dans chaque petit groupe. La fonction retourne un itérateur, que vous pouvez utiliser dans une boucle for ou tout autre code qui itère. Ici, je vais parcourir l\u0026rsquo;itérateur manuellement pour afficher toutes les valeurs.\u003c/p\u003e\n\u003cp\u003e③ La première permutation de \u003ccode\u003e[1, 2, 3]\u003c/code\u003e, qui prend 2 à la fois, est \u003ccode\u003e(1, 2)\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e④ Notez que les permutations sont ordonnées : \u003ccode\u003e(2, 1)\u003c/code\u003eest différent de \u003ccode\u003e(1, 2)\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e⑤ C’est tout ! Ce sont toutes les permutations de \u003ccode\u003e[1, 2, 3]\u003c/code\u003e qui prennent 2 à la fois. Les pairs telles que \u003ccode\u003e(1, 1)\u003c/code\u003e et \u003ccode\u003e(2, 2)\u003c/code\u003e ne seront jamais vues, parce qu’elles contiennent des répétitions qui ne sont pas des permutations valides.\u003c/p\u003e\n\u003cp\u003eLa fonction \u003ccode\u003epermutations()\u003c/code\u003e ne nécessite pas de liste. Elle peut prendre n’importe quelle séquence – même une chaîne.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003eitertools\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 perms \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e itertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epermutations(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ABC\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\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\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e next(perms)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;A\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:#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 next(perms)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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;B\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 next(perms)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;B\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)\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(perms)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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)\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(perms)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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:#48b685\"\u003e\u0026#39;B\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 next(perms)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;C\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;A\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 next(perms)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\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:#ef6155\"\u003eStopIteration\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(itertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epermutations(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ABC\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\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#39;A\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;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;B\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;B\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;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),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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:#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;B\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;A\u0026#39;\u003c/span\u003e)]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① Une chaîne est juste une séquence de caractères. Dans le but de trouver des permutations,  la chaîne \u003ccode\u003e‘ABC’\u003c/code\u003e est équivalente à la liste \u003ccode\u003e[‘A’, ‘B’, ‘C’]\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e② La première permutation de trois items \u003ccode\u003e[‘A’, ‘B’, ‘C’]\u003c/code\u003e, qui prennent 3 à la fois, est \u003ccode\u003e(‘A’, ‘B’, ‘C’)\u003c/code\u003e. Il y a cinq autres permutations. Les trois mêmes caractères dans chaque ordre imaginable.\u003c/p\u003e\n\u003cp\u003e③ Puisque la fonction \u003ccode\u003epermutations()\u003c/code\u003e retourne toujours un itérateur, une manière facile de déboguer les permutations est de passer l’itérateur dans la fonction interne \u003ccode\u003elist()\u003c/code\u003e pour voir toutes les permutations immédiatement.\u003c/p\u003e\n\u003ch2 id=\"autres-trucs-amusants-dans-le-module-itertools\"\u003eAutres trucs amusants dans le module \u003ccode\u003eitertools\u003c/code\u003e\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-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\"\u003eitertools\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(itertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eproduct(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ABC\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;123\u0026#39;\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#39;A\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;1\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;2\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;3\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;B\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;1\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;2\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;3\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;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;1\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;2\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;3\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 list(itertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ecombinations(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ABC\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e2\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#39;A\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;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;B\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① La fonction \u003ccode\u003eitertools.product()\u003c/code\u003e retourne un itérateur contenant le produit cartésien de deux séquences.\u003c/p\u003e\n\u003cp\u003e② La fonction \u003ccode\u003eitertools.combinations()\u003c/code\u003e retourne un itérateur contenant toutes les combinaisons possibles d’une séquence donnée d’une longueur donnée. Tout comme la fonction \u003ccode\u003eitertools.permutations()\u003c/code\u003e, excepté que les combinaisons n’incluent pas les items qui sont la copie d’autres items dans un ordre différent. Ainsi, \u003ccode\u003eitertools.permutations('ABC', 2)\u003c/code\u003e retournera les deux \u003ccode\u003e('A', 'B')\u003c/code\u003e et \u003ccode\u003e('B', 'A')\u003c/code\u003e (entres autres), mais \u003ccode\u003eitertools.combinations('ABC', 2)\u003c/code\u003e ne retournera pas \u003ccode\u003e('B', 'A')\u003c/code\u003e parce que c’est une copie de \u003ccode\u003e('A', 'B')\u003c/code\u003e dans un ordre différent.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 names \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e list(open(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;examples/favorite-people.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:#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 names\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Dora\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:#48b685\"\u003e\u0026#39;Ethan\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:#48b685\"\u003e\u0026#39;Wesley\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:#48b685\"\u003e\u0026#39;John\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:#48b685\"\u003e\u0026#39;Anne\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\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;Mike\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:#48b685\"\u003e\u0026#39;Chris\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:#48b685\"\u003e\u0026#39;Sarah\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:#48b685\"\u003e\u0026#39;Alex\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:#48b685\"\u003e\u0026#39;Lizzie\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\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 names \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [name\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003erstrip() \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e name \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e names]                             \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 names\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Dora\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Ethan\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Wesley\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;John\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Anne\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;Mike\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Chris\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Sarah\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Alex\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Lizzie\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 names \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e sorted(names)                                                 \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 names\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Alex\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Anne\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Chris\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Dora\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Ethan\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;John\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Lizzie\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Mike\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Sarah\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Wesley\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 names \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e sorted(names, key\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003elen)                                        \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 names\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Alex\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Anne\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Dora\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;John\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Mike\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;Chris\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Ethan\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Sarah\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Lizzie\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Wesley\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① Cet idiome retourne une liste à partir des lignes d’un fichier texte.\u003c/p\u003e\n\u003cp\u003e② Malheureusement (dans cet exemple), l’idiome \u003ccode\u003elist(open(filename))\u003c/code\u003e inclus aussi le retour chariot à la fin de chaque ligne. Cette liste de compréhension utilise la méthode des chaînes \u003ccode\u003erstrip()\u003c/code\u003e pour effacer les espaces de fin de chaque ligne. (Les chaînes ont aussi une méthode \u003ccode\u003elstrip()\u003c/code\u003e pour supprimer les espaces en début, et une méthode \u003ccode\u003estrip()\u003c/code\u003e qui supprime les deux).\u003c/p\u003e\n\u003cp\u003e③ La fonction \u003ccode\u003esorted()\u003c/code\u003e prend une liste et la retourne triée. Par défaut, le tri est alphabétique.\u003c/p\u003e\n\u003cp\u003e④ Mais la fonction \u003ccode\u003esorted()\u003c/code\u003e peut aussi prendre une fonction en tant que paramètre \u003ccode\u003ekey\u003c/code\u003e, elle est triée par la clé en question. Dans ce cas, la fonction de tri est \u003ccode\u003elen()\u003c/code\u003e, ainsi elle est triée par \u003ccode\u003elen(each item)\u003c/code\u003e. Les noms les plus courts sont en premier, puis de plus en plus longs.\u003c/p\u003e\n\u003cp\u003eQu\u0026rsquo;est-ce que cela a à voir avec le module \u003ccode\u003eitertools\u003c/code\u003e ? Je suis content que vous le demandiez.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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:#ef6155\"\u003e…\u003c/span\u003econtinuing \u003cspan style=\"color:#5bc4bf\"\u003efrom\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003ethe\u003c/span\u003e previous interactive shell\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 \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eitertools\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 groups \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e itertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003egroupby(names, len)   \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 groups\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003eitertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003egroupby object at \u003cspan style=\"color:#f99b15\"\u003e0x00BB20C0\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 list(groups)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[(\u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003eitertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e_grouper object at \u003cspan style=\"color:#f99b15\"\u003e0x00BA8BF0\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:#f99b15\"\u003e5\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003eitertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e_grouper object at \u003cspan style=\"color:#f99b15\"\u003e0x00BB4050\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:#f99b15\"\u003e6\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003eitertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e_grouper object at \u003cspan style=\"color:#f99b15\"\u003e0x00BB4030\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 groups \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e itertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003egroupby(names, len)   \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 \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e name_length, name_iter \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e groups:    \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     print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Names with \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{0:d}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e letters:\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(name_length))\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\"\u003efor\u003c/span\u003e name \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e name_iter:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e         print(name)\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\u003eNames \u003cspan style=\"color:#815ba4\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e letters:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAlex\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAnne\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDora\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eJohn\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMike\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNames \u003cspan style=\"color:#815ba4\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e letters:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChris\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEthan\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSarah\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNames \u003cspan style=\"color:#815ba4\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e letters:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLizzie\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWesley\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① La fonction \u003ccode\u003eitertools.groupby()\u003c/code\u003e prend une séquence et une fonction clé, et retourne un itérateur qui génère des paires. Chaque paire contient le résultat de \u003ccode\u003ekey_function(each item)\u003c/code\u003e et un autre itérateur contient tous les items que partage la clé résultante.\u003c/p\u003e\n\u003cp\u003e② L’appel à la fonction \u003ccode\u003elist()\u003c/code\u003e a « épuisé » l’itérateur, c’est-à-dire que vous avez déjà généré chaque élément de l\u0026rsquo;itérateur pour créer la liste. Il n’y a pas de bouton “reset” sur un itérateur ; vous ne pouvez pas juste le démarrer une fois qu’il est épuisé. Si vous voulez le parcourir encore par une boucle (dans une nouvelle boucle \u003ccode\u003efor\u003c/code\u003e), vous devez appeler encore \u003ccode\u003eitertools.groupby()\u003c/code\u003e  pour créer un nouvel itérateur.\u003c/p\u003e\n\u003cp\u003e③ Dans cet exemple, à une liste donnée de noms toujours triée par longueur, \u003ccode\u003eitertools.groupby(names, len)\u003c/code\u003e sortira tous les noms de 4 lettres dans un itérateur, tous les noms de 5 lettres dans un autre, et ainsi de suite. La fonction \u003ccode\u003egroupby()\u003c/code\u003e est complètement générique ; elle peut regrouper les chaînes par première lettre, les nombres par nombre de facteurs ou toute autre fonction clé imaginable.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLa fonction \u003ccode\u003eitertools.groupby()\u003c/code\u003e fonctionne seulement si la séquence en entrée est déjà triée par la fonction de regroupement. Dans l’exemple ci-dessus, vous avez groupé une liste de noms par la fonction \u003ccode\u003elen()\u003c/code\u003e. Cela a fonctionné parce que la liste entrée était déjà triée par longueur.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eRegardez de plus prés !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 list(range(\u003cspan style=\"color:#f99b15\"\u003e0\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:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e1\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\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e list(range(\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e12\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(itertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003echain(range(\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e), range(\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e13\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:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e12\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(zip(range(\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e), range(\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e13\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:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e), (\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e), (\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e12\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(zip(range(\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e), range(\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e14\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:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e), (\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e), (\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e12\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(itertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ezip_longest(range(\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e), range(\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e14\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:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e), (\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e), (\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e), (\u003cspan style=\"color:#815ba4\"\u003eNone\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e)]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① La fonction \u003ccode\u003eitertools.chain()\u003c/code\u003e prend deux itérateurs et retourne un itérateur qui contient tous les items du premier itérateur, suivis de ceux du second itérateur. (Actuellement, il peut prendre n’importe quel nombre d’itérateurs, et les enchaîner dans l’ordre où ils sont passés dans la fonction.)\u003c/p\u003e\n\u003cp\u003e② La fonction \u003ccode\u003ezip()\u003c/code\u003e fait quelque chose de prosaïque qui s\u0026rsquo;avère extrêmement utile : elle prend n’importe quel nombre de séquences et retourne un itérateur qui retourne des tuples des premiers items de chaque séquence, ensuite les seconds items de chacune, puis les troisièmes, et ainsi de suite.\u003c/p\u003e\n\u003cp\u003e③ La fonction \u003ccode\u003ezip()\u003c/code\u003e s’arrête à la fin de la plus petite séquence. \u003ccode\u003erange(10, 14)\u003c/code\u003e a 4 items, mais \u003ccode\u003erange(10, 14)\u003c/code\u003e en a seulement 3, ainsi la fonction \u003ccode\u003ezip()\u003c/code\u003e retourne un itérateur de 3 items.\u003c/p\u003e\n\u003cp\u003e④ D’un autre côté, la fonction \u003ccode\u003eitertools.zip_longest()\u003c/code\u003e s’arrête à la fin de la séquence la plus longue, insérant des valeurs \u003ccode\u003eNone\u003c/code\u003e pour les items passés en fin des séquences plus courtes.\u003c/p\u003e\n\u003cp\u003eOk, tout cela est très intéressant, mais quel rapport cela a-t-il avec le résolveur d’alphamétique ? Voici comment :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 characters \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;S\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;M\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\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;N\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;R\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Y\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 guess \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;2\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;3\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;4\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;5\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;6\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;7\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 tuple(zip(characters, guess))                            \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#39;S\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e), (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;M\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;2\u0026#39;\u003c/span\u003e), (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;E\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e), (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\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:#48b685\"\u003e\u0026#39;O\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;4\u0026#39;\u003c/span\u003e), (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;N\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;5\u0026#39;\u003c/span\u003e), (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;R\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;6\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;7\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 dict(zip(characters, guess))                             \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#39;E\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;3\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;M\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;2\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;4\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;N\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;5\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;S\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;R\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;6\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;7\u0026#39;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① À une liste donnée de lettres et une liste de chiffres (chacune représentée ici sous forme de chaînes de 1 caractère), la fonction \u003ccode\u003ezip()\u003c/code\u003e créera une paire de lettres et de chiffres, dans l’ordre.\u003c/p\u003e\n\u003cp\u003e② Pourquoi est-ce cool ? Parce que cette structure de données se trouve être exactement la bonne structure à transmettre à la fonction \u003ccode\u003edict()\u003c/code\u003e pour créer un dictionnaire qui utilise des lettres comme clés et leurs chiffres associés comme valeurs. (Ce n’est bien sûr pas la seule manière de faire cela. Vous pouvez utiliser un \u003ca\u003edictionnaire de compréhension\u003c/a\u003e pour créer directement le dictionnaire). Bien que la représentation imprimée du dictionnaire liste les paires dans un ordre différent (les dictionnaires n\u0026rsquo;ont pas d \u0026lsquo;«ordre» en soi), vous pouvez voir que chaque lettre est associée à un chiffre, en fonction de l\u0026rsquo;ordre d\u0026rsquo;origine des séquences \u003ccode\u003echaracters\u003c/code\u003e et \u003ccode\u003eguess\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLe résolveur alphamétique utilise cette technique pour créer un dictionnaire qui fait correspondre chaque lettre dans le puzzle au chiffre, pour chaque solution possible.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\u003echaracters \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e tuple(ord(c) \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e c \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e sorted_characters)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edigits \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e tuple(ord(c) \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e c \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;0123456789\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e guess \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e itertools\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epermutations(digits, len(characters)):\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    equation \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e puzzle\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etranslate(dict(zip(characters, guess)))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMais qu’est-ce la méthode \u003ccode\u003etranslate() \u003c/code\u003e?\nAhhh, vous arrivez maintenant la partie \u003cem\u003eréellement\u003c/em\u003e amusante.\u003c/p\u003e\n\u003ch2 id=\"une-nouvelle-manière-de-manipuler-les-chaînes\"\u003eUne nouvelle manière de manipuler les chaînes\u003c/h2\u003e\n\u003cp\u003eLes chaînes Python ont beaucoup de méthodes. Vous avez appris certaines de ces méthodes dans \u003ca\u003ele chapitre Chaînes\u003c/a\u003e : \u003ccode\u003elower()\u003c/code\u003e, \u003ccode\u003ecount()\u003c/code\u003e, et \u003ccode\u003eformat()\u003c/code\u003e. Maintenant je veux vous présenter une technique de manipulation puissante mais peu connue : la méthode \u003ccode\u003etranslate()\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 translation_table \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {ord(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;A\u0026#39;\u003c/span\u003e): ord(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;O\u0026#39;\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\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e translation_table                         \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:#f99b15\"\u003e65\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e79\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 \u003cspan style=\"color:#48b685\"\u003e\u0026#39;MARK\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etranslate(translation_table)       \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#39;MORK\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① La traduction des chaînes débute avec une table de traduction, qui est simplement un dictionnaire qui fait correspondre un caractère avec un autre. Actuellement \u0026ldquo;caractère\u0026rdquo; est incorrect - la table de traduction fait réellement correspondre un \u003cem\u003eoctet\u003c/em\u003e avec un autre.\u003c/p\u003e\n\u003cp\u003e② Rappelez-vous, les octets en Python 3 sont des entiers. La fonction \u003ccode\u003eord()\u003c/code\u003e retourne la valeur ASCII d\u0026rsquo;un caractère, qui, dans le cas de A-Z, est toujours un octet de 65 à 90.\u003c/p\u003e\n\u003cp\u003e③ La méthode \u003ccode\u003etranslate()\u003c/code\u003e sur une chaîne prend une table de traduction et la parcourt. Pour cela, elle remplace toutes les occurences des clés de la table de traduction avec les valeurs correspondantes. Dans ce cas, elle \u0026ldquo;traduit\u0026rdquo; \u003ccode\u003eMARK\u003c/code\u003e en \u003ccode\u003eMORK\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eQu\u0026rsquo;est-ce que cela a à voir avec la résolution de puzzles alphamétiques ?\nEn fait, tout.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 characters \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e tuple(ord(c) \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e c \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;SMEDONRY\u0026#39;\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\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e characters\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#f99b15\"\u003e83\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e77\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e69\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e68\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e79\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e78\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e82\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e89\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 guess \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e tuple(ord(c) \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e c \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;91570682\u0026#39;\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\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e guess\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#f99b15\"\u003e57\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e49\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e53\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e55\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e48\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e54\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e56\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e50\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 translation_table \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e dict(zip(characters, guess))     \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 translation_table\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#f99b15\"\u003e68\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e55\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e69\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e53\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e77\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e49\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e78\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e54\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e79\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e48\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e82\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e56\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e83\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e57\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e89\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e50\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 \u003cspan style=\"color:#48b685\"\u003e\u0026#39;SEND + MORE == MONEY\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etranslate(translation_table)  \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#39;9567 + 1085 == 10652\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① En utilisant un \u003ca\u003egénérateur d\u0026rsquo;expressions\u003c/a\u003e, nous calculons les valeurs d\u0026rsquo;octet pour chaque caractère d\u0026rsquo;une chaîne. \u003ccode\u003echaracters\u003c/code\u003e est un exemple de valeur de \u003ccode\u003esorted_characters\u003c/code\u003e dans la fonction \u003ccode\u003ealphametics.solve()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e② En utilisant un autre générateur d\u0026rsquo;expression, nous calculons les valeurs d\u0026rsquo;octet de chaque chiffre dans la chaîne. Le résultat, \u003ccode\u003eguess\u003c/code\u003e, est de la \u003ca\u003eforme retournée par la fonction \u003ccode\u003eitertools.permutations()\u003c/code\u003e\u003c/a\u003e dans la fonction \u003ccode\u003ealphametics.solve()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e③ Cette table de traduction est générée par \u003ca\u003eitération de \u003ccode\u003echaracters\u003c/code\u003e et de \u003ccode\u003eguess\u003c/code\u003e ensemble\u003c/a\u003e et en construisant un dictionnaire depuis la séquence de pairs résultante. C\u0026rsquo;est exactement ce que fait la fonction \u003ccode\u003ealphametics.solve()\u003c/code\u003e à l\u0026rsquo;intérieur de la boucle \u003ccode\u003efor\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e④ Enfin, nous passons cette table de traduction à la méthode \u003ccode\u003etranslate()\u003c/code\u003e du puzzle originale de la chaîne. Cela convertit chaque lettre dans la chaîne vers le chiffre correspondant (basé sur les lettres dans \u003ccode\u003echaracters\u003c/code\u003e et les chiffres dans \u003ccode\u003eguess\u003c/code\u003e). Le résultat est une expression Python valide, tout comme l\u0026rsquo;est une chaîne.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est assez impressionnant. Mais que pouvez-vous faire avec une chaîne qui se trouve être une expression Python valide ?\u003c/p\u003e\n\u003ch2 id=\"évaluer-arbitrairement-des-chaînes-en-tant-quexpressions-python\"\u003eÉvaluer arbitrairement des chaînes en tant qu\u0026rsquo;expressions Python\u003c/h2\u003e\n\u003cp\u003eCeci est la pièce finale du puzzle (ou plutôt, la pièce finale du résolveur de puzzle). Après toutes ces manipulations sympathiques de chaînes, il nous reste une chaîne telle que \u003ccode\u003e'9567 + 1085 == 10652'\u003c/code\u003e. Mais c\u0026rsquo;est une chaîne, et qu\u0026rsquo;est-ce qui est bon avec une chaîne ? Tapez \u003ccode\u003eeval()\u003c/code\u003e, l\u0026rsquo;outil universel Python d\u0026rsquo;évaluation.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;1 + 1 == 2\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;1 + 1 == 3\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;9567 + 1085 == 10652\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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\u003eMais attendez, il y a plus ! La fonction \u003ccode\u003eeval()\u003c/code\u003e n\u0026rsquo;est pas limitée aux expressions booléennes. Elle peut capturer toute expression Python et retourner tout type 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-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34;A\u0026#34; + \u0026#34;B\u0026#34;\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;AB\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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34;MARK\u0026#34;.translate(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{65: 79}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\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;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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34;AAAAA\u0026#34;.count(\u0026#34;A\u0026#34;)\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[\u0026#34;*\u0026#34;] * 5\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;*\u0026#39;\u003c/span\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]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMais attendez, ce n\u0026rsquo;est pas tout !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 x \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:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;x * 5\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:#f99b15\"\u003e25\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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;pow(x, 2)\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:#f99b15\"\u003e25\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 \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003emath\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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;math.sqrt(x)\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:#f99b15\"\u003e2.2360679774997898\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① L\u0026rsquo;expression que prend \u003ccode\u003eeval()\u003c/code\u003e peut référencer des variables globales définies en-dehors d\u0026rsquo; \u003ccode\u003eeval()\u003c/code\u003e. Si elle est appelée dans une fonction, elle peut référencer des variables locales, aussi.\u003c/p\u003e\n\u003cp\u003e② Et des fonctions.\u003c/p\u003e\n\u003cp\u003e③ Et des modules.\u003c/p\u003e\n\u003cp\u003eEh, attendez une minute…\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003esubprocess\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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;subprocess.getoutput(\u0026#39;ls ~\u0026#39;)\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#39;Desktop         Library         Pictures \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:#48b685\"\u003e Documents       Movies          Public   \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:#48b685\"\u003e Music           Sites\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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;subprocess.getoutput(\u0026#39;rm /some/random/file\u0026#39;)\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① Le module \u003ccode\u003esubprocess\u003c/code\u003e vous permet d\u0026rsquo;exécuter arbitrairement des commandes shell et d\u0026rsquo;avoir le résultat en tant que chaîne Python.\u003c/p\u003e\n\u003cp\u003e② Arbitrairement les commandes shell peuvent avoir des conséquences permanentes.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est même pire que cela, parce qu\u0026rsquo;il y a la fonction globale \u003ccode\u003e__import__()\u003c/code\u003e qui prend un nom de module en tant que chaîne, importe le module, et lui retourne une référence. Combinée à la puissance d\u0026rsquo; \u003ccode\u003eeval()\u003c/code\u003e, vous pouvez construire une expression simple qui supprimera tous vos fichiers :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;__import__(\u0026#39;subprocess\u0026#39;).getoutput(\u0026#39;rm /some/random/file\u0026#39;)\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① Maintenant, imaginez la sortie de \u003ccode\u003e'rm -rf ~'\u003c/code\u003e. En fait, il n’y aurait pas de sortie, mais il ne resterait plus aucun fichier.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eeval() is EVIL\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eBien, la partie diabolique est d\u0026rsquo;évaluer arbitrairement des expressions depuis des sources non vérifiées. Vous ne devriez utiliser \u003ccode\u003eeval()\u003c/code\u003e que sur une entrée de confiance. Bien sûr, le truc consiste à déterminer ce qui est «fiable». Mais voici quelque chose que je sais avec certitude : vous \u003cstrong\u003eNE DEVRIEZ PAS\u003c/strong\u003e prendre ce résolveur alphamétique et le mettre sur Internet en tant que petit service web sympa. Ne faites pas l\u0026rsquo;erreur de penser : \u0026ldquo;Mon Dieu, la fonction fait beaucoup de manipulation de chaîne avant d\u0026rsquo;obtenir une chaîne à évaluer ; je ne peux pas imaginer comment quelqu\u0026rsquo;un pourrait exploiter cela.\u0026rdquo; Quelqu\u0026rsquo;un \u003cstrong\u003ecomprendra\u003c/strong\u003e comment passer furtivement du code exécutable nuisible après toute cette manipulation de chaîne (\u003ca href=\"http://www.securityfocus.com/blogs/746\" rel=\"external\"\u003edes choses étranges se sont produites\u003c/a\u003e), et vous pourrez alors dire adieu à votre serveur.\u003c/p\u003e\n\u003cp\u003eMais il existe sûrement un moyen d’évaluer les expressions en toute sécurité ?\nMettre \u003ccode\u003eeval()\u003c/code\u003e dans une sandbox où il ne peut accéder à rien ni endommager le reste du monde ?\nEh bien, oui et non.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 x \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:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;x * 5\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\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\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;\u0026lt;string\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\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:#ef6155\"\u003eNameError\u003c/span\u003e: name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;x\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003enot\u003c/span\u003e defined\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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;x * 5\u0026#34;\u003c/span\u003e, {\u003cspan style=\"color:#48b685\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e: x}, {})         \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:#f99b15\"\u003e25\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 \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003emath\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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;math.sqrt(x)\u0026#34;\u003c/span\u003e, {\u003cspan style=\"color:#48b685\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e: x}, {})  \u003cspan style=\"color:#ef6155\"\u003e③\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\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;\u0026lt;string\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\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:#ef6155\"\u003eNameError\u003c/span\u003e: name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;math\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003enot\u003c/span\u003e defined\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① Le second paramètre et le troisième passés à la fonction \u003ccode\u003eeval()\u003c/code\u003e agissent dans les espaces de noms global et local pour évaluer l\u0026rsquo;expression. Dans ce cas, les deux sont vides, ce qui signifie alors que, quand la chaîne \u003ccode\u003e\u0026quot;x * 5\u0026quot;\u003c/code\u003e est évaluée, il n\u0026rsquo;y a pas de référence à \u003ccode\u003ex\u003c/code\u003e ni dans l\u0026rsquo;espace de nom global ou local, ainsi \u003ccode\u003eeval()\u003c/code\u003e lève une exception.\u003c/p\u003e\n\u003cp\u003e② Vous pouvez sélectivement inclure des valeurs spécifiques dans l\u0026rsquo;espace de noms global en les listant individuellement. Alors ces variables - et seulement celles-là - seront disponibles durant l\u0026rsquo;évaluation.\u003c/p\u003e\n\u003cp\u003e③ Même si vous venez d\u0026rsquo;importer le module \u003ccode\u003emath\u003c/code\u003e, vous ne pouvez l\u0026rsquo;inclure dans l\u0026rsquo;espace de noms à la fonction \u003ccode\u003eeval()\u003c/code\u003e, ainsi l\u0026rsquo;évaluation échouera.\u003c/p\u003e\n\u003cp\u003ePfff, c\u0026rsquo;était facile. Laissez-moi faire un service web alphamétique, maintenant !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;pow(5, 2)\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:#f99b15\"\u003e25\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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;__import__(\u0026#39;math\u0026#39;).sqrt(5)\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:#f99b15\"\u003e2.2360679774997898\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① Même si vous avez passé des dictionnaires vides pour les espaces de noms global et local, toutes les fonctions internes de Python seront toujours disponibles durant l\u0026rsquo;évaluation. Ainsi \u003ccode\u003epow(5, 2)\u003c/code\u003e fonctionne, parce que \u003ccode\u003e5\u003c/code\u003e et \u003ccode\u003e2\u003c/code\u003e sont des littéraux, et que \u003ccode\u003epow()\u003c/code\u003e est une fonction interne.\u003c/p\u003e\n\u003cp\u003e② Malheureusement (et même si vous ne voyez pas pourquoi cela est malheureux, lisez la suite), la fonction \u003ccode\u003e__import__()\u003c/code\u003e est aussi une fonction interne, ainsi cela fonctionne aussi.\u003c/p\u003e\n\u003cp\u003eOui, cela signifie que vous pouvez toujours faire des choses méchantes, même si vous configurez explicitement les espaces de noms global et local pour vider les dictionnaires lors de l\u0026rsquo;appel à \u003ccode\u003eeval()\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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;__import__(\u0026#39;subprocess\u0026#39;).getoutput(\u0026#39;rm /some/random/file\u0026#39;)\u0026#34;\u003c/span\u003e, {}, {})\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOups. Je suis heureux de ne pas avoir créer de service web alphamétique.\nN\u0026rsquo;y a-t-il aucun moyen d\u0026rsquo;utiliser \u003ccode\u003eeval()\u003c/code\u003e de manière sécurisée ?\nEh bien, oui et non.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;__import__(\u0026#39;math\u0026#39;).sqrt(5)\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:#48b685\"\u003e\u0026#34;__builtins__\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#815ba4\"\u003eNone\u003c/span\u003e}, {})          \u003cspan style=\"color:#ef6155\"\u003e①\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\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;\u0026lt;string\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\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:#ef6155\"\u003eNameError\u003c/span\u003e: name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;__import__\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003enot\u003c/span\u003e defined\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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;__import__(\u0026#39;subprocess\u0026#39;).getoutput(\u0026#39;rm -rf /\u0026#39;)\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:#48b685\"\u003e\u0026#34;__builtins__\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#815ba4\"\u003eNone\u003c/span\u003e}, {})          \u003cspan style=\"color:#ef6155\"\u003e②\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\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;\u0026lt;string\u0026gt;\u0026#34;\u003c/span\u003e, line \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003emodule\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:#ef6155\"\u003eNameError\u003c/span\u003e: name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;__import__\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003enot\u003c/span\u003e defined\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e① Pour évaluer des expressions non vérifiées de manière sûre, vous avez besoin de définir un dictionnaire d\u0026rsquo;espace de noms global qui fait correspondre \u003ccode\u003e\u0026quot;__builtins__\u0026quot;\u003c/code\u003e à \u003ccode\u003eNone\u003c/code\u003e, une valeur Python \u003ccode\u003enull\u003c/code\u003e. En interne, les fonctions \u0026ldquo;built-in\u0026rdquo; sont contenues dans un pseudo-module appelé \u003ccode\u003e\u0026quot;__builtins__\u0026quot;\u003c/code\u003e. Ce pseudo-module (càd l\u0026rsquo;ensemble des fonctions internes) est rendu disponible aux expressions évaluées à moins que vous les surchargiez explicitement.\u003c/p\u003e\n\u003cp\u003e② Soyez sûr que vous surchargiez \u003ccode\u003e__builtins__\u003c/code\u003e. Non pas \u003ccode\u003e__builtin__\u003c/code\u003e, \u003ccode\u003e__built-ins__\u003c/code\u003e, ou toute autre variation qui fonctionnera parfaitement mais qui vous expose à des risques catastrophiques.\u003c/p\u003e\n\u003cp\u003eAinsi, \u003ccode\u003eeval()\u003c/code\u003e est sûr maintenant ?\nEh bien, oui et non.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 eval(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;2 ** 2147483647\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:#48b685\"\u003e\u0026#34;__builtins__\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#815ba4\"\u003eNone\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① Même sans accéder à \u003ccode\u003e__builtins__\u003c/code\u003e, vous pouvez toujours lancer une attaque par déni de service. Par exemple, essayer de lever \u003ccode\u003e2\u003c/code\u003e à la puissance \u003ccode\u003e2147483647\u003c/code\u003e augmentera l\u0026rsquo;utilisation du CPU de votre serveur à 100% pendant un certain temps. (Si vous essayez cela dans un terminal interactif, appuyez plusieurs fois sur \u003ccode\u003eCtrl-C\u003c/code\u003e pour en sortir.) Techniquement cette expression retournera éventuellement une valeur, mais en attendant, votre serveur fera plus rien d\u0026rsquo;autres.\u003c/p\u003e\n\u003cp\u003eEnfin, il est possible d\u0026rsquo;évaluer en toute sécurité des expressions Python non vérifiées, pour une définition du terme «sûr» qui ne s\u0026rsquo;avère pas très utile dans la vie réelle. C’est bien si vous vous contentez de jouer, et c’est bien si vous ne transmettez que des données fiables. Mais tout autre ne fait que provoquer des ennuis.\u003c/p\u003e\n\u003ch2 id=\"résumons-cela-ensemble\"\u003eRésumons cela ensemble\u003c/h2\u003e\n\u003cp\u003ePour récapituler : ce programme résoud des puzzles alphamétiques par force brute, càd, par une recherche exhaustive de toutes les solutions possibles\nPour faire cela, il faut…\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca\u003eTrouver toutes les lettres dans le puzzle\u003c/a\u003e avec la fonction \u003ccode\u003ere.findall()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eTrouver toutes les lettres uniques dans le puzzle\u003c/a\u003e avec sets et la fonction \u003ccode\u003eset()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eVérifier qu\u0026rsquo;il n\u0026rsquo;y a pas plus de 10 lettres uniques\u003c/a\u003e (ce qui signifie que le puzzle est définitivement non résolvable) avec l\u0026rsquo;instruction \u003ccode\u003eassert\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eConvertir les lettres dans leur équivalent ASCII\u003c/a\u003e avec un générateur objet.\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eCalculer toutes les solutions possibles\u003c/a\u003e avec la fonction \u003ccode\u003eitertools.permutations()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eConvertir chaque solution possible en une expression Python\u003c/a\u003e avec la méthode de chaînes \u003ccode\u003etranslate()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eTester chaque solution possible en évaluant l\u0026rsquo;expression Python\u003c/a\u003e avec la fonction \u003ccode\u003eeval()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRetourner la première solution qui évalue à \u003ccode\u003eTrue\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e… en seulement 14 lignes de code.\u003c/p\u003e\n\u003ch2 id=\"lectures-complémentaires-en-anglais\"\u003eLectures complémentaires (en anglais)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe \u003ca href=\"https://docs.python.org/3.1/library/itertools.html\" rel=\"external\"\u003emodule \u003ccode\u003eitertools\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://pymotw.com/2/itertools/\" rel=\"external\"\u003e\u003ccode\u003eitertools\u003c/code\u003e - Fonctions d\u0026rsquo;Itérateur pour boucles efficientes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRegarder la \u003ca\u003ePrésentation \u0026ldquo;Easy AI with Python\u0026rdquo; de Raymond Hettinger\u003c/a\u003e au PyCon 2009. \u003cem\u003esemble ne plus être disponible\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://code.activestate.com/recipes/576615-alphametics-solver/?in=user-178123\" rel=\"external\"\u003eRecette 576615: Résolveur Alphamétique\u003c/a\u003e, un résolveur alphamétique original de Raymond Hettinger pour Python 2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://code.activestate.com/recipes/users/178123/\" rel=\"external\"\u003ePlus de recettes de Raymond Hettinger\u003c/a\u003e dans le référentiel de codes ActiveState\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Verbal_arithmetic\" rel=\"external\"\u003eAlphamétiques sur Wikipédia\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.tkcs-collins.com/truman/alphamet/index.shtml\" rel=\"external\"\u003eIndex Alphamétiques\u003c/a\u003e, incluant \u003ca href=\"http://www.tkcs-collins.com/truman/alphamet/alphamet.shtml\" rel=\"external\"\u003ebeaucoup de puzzles\u003c/a\u003e et un \u003ca href=\"http://www.tkcs-collins.com/truman/alphamet/alpha_gen.shtml\" rel=\"external\"\u003egénérateur à fabriquer soi-même\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTout plein de remerciements à Raymond Hettinger pour son accord à modifier la licence de son code, ainsi j\u0026rsquo;ai pu le porter vers Python 3 et l\u0026rsquo;utiliser comme base de ce chapitre.\u003c/p\u003e\n\u003cp\u003e© 2001–11 Mark Pilgrim\u003c/p\u003e\n\u003cp\u003e*[ASCII]: American Standard Code for Information Interchange - Code américain normalisé pour l\u0026rsquo;échange d\u0026rsquo;information\n*[CPU]: Central Processing Unit - Processeur\n*[RAM]: Random Access Memory - Mémoire Vive\n*[càd]: c\u0026rsquo;est-à-dire\u003c/p\u003e\n","summary":"Relecture du chapitre 8 - Dive into Python pour la communauté DVP","tags":["Traduction","Python"],"date_published":"2019-05-16T20:27:01+01:00","date_modified":"2019-05-18T19:07:01+01:00"},{"id":"tag:doc.huc.fr.eu.org,2019-05-12:/fr/sec/gpg/gpg-ed25519#0a947ecd8312bf4a9021bc17bc524efc4370a2c4b65e92a46495ee8255dced29","url":"https://it-log.fr.eu.org/fr/sec/gpg/gpg-ed25519/","title":"GPG : Création de clé à Courbes Elliptiques Ed25519","author":{"name":"Stéphane HUC"},"content_text":"Description Il est en effet possible de créer des clés GPG en utilisant l\u0026rsquo;algorithme à courbe elliptique ED25519.\nCe tutoriel fait suite à ce guide de bonnes pratiques de création ; d\u0026rsquo;ailleurs une fois la création terminée, referez-vous y à nouveau.\nAvant, assurez-vous d\u0026rsquo;avoir correctement sécurisé votre configuration GPG !\nCréation parfaite de clés GPG Informations importantes Bien veiller à choisir à la création de clé, l\u0026rsquo;option (9) ECC et ECC - et ensuite, le type de courbe elliptique désiré - option (1) Curve 25519.\nCréation en mode console Pour l\u0026rsquo;instant, c\u0026rsquo;est la seule possibilité de faire. Pour cela, il faut utiliser l\u0026rsquo;option --full-gen-key suivie de l\u0026rsquo;option --expert.\n:$ gpg --full-gen-key --expert gpg (GnuPG) 2.2.10; Copyright (C) 2018 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Sélectionnez le type de clef désiré : (1) RSA et RSA (par défaut) (2) DSA et Elgamal (3) DSA (signature seule) (4) RSA (signature seule) (7) DSA (indiquez vous-même les capacités) (8) RSA (indiquez vous-même les capacités) (9) ECC et ECC (10) ECC (signature seule) (11) ECC (indiquez vous-même les capacités) (13) Clef existante Quel est votre choix ? 9 Sélectionnez le type de courbe elliptique désiré : (1) Curve 25519 (3) NIST P-256 (4) NIST P-384 (5) NIST P-521 (6) Brainpool P-256 (7) Brainpool P-384 (8) Brainpool P-512 (9) secp256k1 Quel est votre choix ? 1 Veuillez indiquer le temps pendant lequel cette clef devrait être valable. 0 = la clef n\u0026#39;expire pas \u0026lt;n\u0026gt; = la clef expire dans n jours \u0026lt;n\u0026gt;w = la clef expire dans n semaines \u0026lt;n\u0026gt;m = la clef expire dans n mois \u0026lt;n\u0026gt;y = la clef expire dans n ans Pendant combien de temps la clef est-elle valable ? (0) 2y La clef expire le Thu Jan 7 14:58:16 2021 CET Est-ce correct ? (o/N) o GnuPG doit construire une identité pour identifier la clef. Nom réel : Stéphane HUC Adresse électronique : ***@stephane-huc.net Commentaire : Vous utilisez le jeu de caractères « utf-8 ». Vous avez sélectionné cette identité : « Stéphane HUC \u0026lt;***@stephane-huc.net\u0026gt; » Changer le (N)om, le (C)ommentaire, l\u0026#39;(A)dresse électronique ou (O)ui/(Q)uitter ? o De nombreux octets aléatoires doivent être générés. Vous devriez faire autre chose (taper au clavier, déplacer la souris, utiliser les disques) pendant la génération de nombres premiers ; cela donne au générateur de nombres aléatoires une meilleure chance d\u0026#39;obtenir suffisamment d\u0026#39;entropie. De nombreux octets aléatoires doivent être générés. Vous devriez faire autre chose (taper au clavier, déplacer la souris, utiliser les disques) pendant la génération de nombres premiers ; cela donne au générateur de nombres aléatoires une meilleure chance d\u0026#39;obtenir suffisamment d\u0026#39;entropie. gpg: clef 0x*********** marquée de confiance ultime. gpg: revocation certificate stored as \u0026#39;/home/***/.gnupg/openpgp-revocs.d/***.rev\u0026#39; les clefs publique et secrète ont été créées et signées. pub ed25519/0x*********** 2019-01-08 [SC] [expire : 2021-01-07] Empreinte de la clef = **** **** **** **** **** **** uid Stéphane HUC \u0026lt;***@stephane-huc.net\u0026gt; sub cv25519/0x********** 2019-01-08 [E] [expire : 2021-01-07] Modification de clé Pour modifier une clé GPG, on utilise l\u0026rsquo;option --edit-key toujours suivie de l\u0026rsquo;option --expert.\nCréation d\u0026rsquo;une sous clé L\u0026rsquo;action à utiliser est : addkey\nVeillez à bien choisir l\u0026rsquo;option (10) ECC (signature seule) puis l\u0026rsquo;option (1) Curve 25519.\n:$ gpg2 --edit-key --expert \u0026#34;fingerprint\u0026#34; gpg (GnuPG) 2.2.12; Copyright (C) 2018 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. La clef secrète est disponible. sec ed25519/0x**************** créé : 2020-01-30 expire : 2022-01-29 utilisation : SC confiance : ultime validité : ultime ssb cv25519/0x**************** créé : 2020-01-30 expire : 2022-01-29 utilisation : E [ ultime ] (1). Nom Prenom \u0026lt;email@domain.tld\u0026gt; gpg\u0026gt; addkey Sélectionnez le type de clef désiré : (3) DSA (signature seule) (4) RSA (signature seule) (5) Elgamal (chiffrement seul) (6) RSA (chiffrement seul) (7) DSA (indiquez vous-même les capacités) (8) RSA (indiquez vous-même les capacités) (10) ECC (signature seule) (11) ECC (indiquez vous-même les capacités) (12) ECC (chiffrement seul) (13) Clef existante Quel est votre choix ? 10 Sélectionnez le type de courbe elliptique désiré : (1) Curve 25519 (3) NIST P-256 (4) NIST P-384 (5) NIST P-521 (6) Brainpool P-256 (7) Brainpool P-384 (8) Brainpool P-512 (9) secp256k1 Quel est votre choix ? 1 Veuillez indiquer le temps pendant lequel cette clef devrait être valable. 0 = la clef n\u0026#39;expire pas \u0026lt;n\u0026gt; = la clef expire dans n jours \u0026lt;n\u0026gt;w = la clef expire dans n semaines \u0026lt;n\u0026gt;m = la clef expire dans n mois \u0026lt;n\u0026gt;y = la clef expire dans n ans Pendant combien de temps la clef est-elle valable ? (0) La clef n\u0026#39;expire pas du tout Est-ce correct ? (o/N) o Faut-il vraiment la créer ? (o/N) o De nombreux octets aléatoires doivent être générés. Vous devriez faire autre chose (taper au clavier, déplacer la souris, utiliser les disques) pendant la génération de nombres premiers ; cela donne au générateur de nombres aléatoires une meilleure chance d\u0026#39;obtenir suffisamment d\u0026#39;entropie. sec ed25519/0x**************** créé : 2020-01-30 expire : 2022-01-29 utilisation : SC confiance : ultime validité : ultime ssb cv25519/0x**************** créé : 2020-01-30 expire : 2022-01-29 utilisation : E ssb ed25519/0x**************** créé : 2020-01-30 expire : jamais utilisation : S [ ultime ] (1). Nom Prenom \u0026lt;email@domain.tld\u0026gt; gpg\u0026gt; save Gestion des préférences de Hash L\u0026rsquo;action à utiliser est : setpref SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed\n:$ gpg2 --edit-key --expert \u0026#34;fingerprint\u0026#34; gpg (GnuPG) 2.2.12; Copyright (C) 2018 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. La clef secrète est disponible. sec ed25519/0x**************** créé : 2020-01-30 expire : 2022-01-29 utilisation : SC confiance : ultime validité : ultime ssb cv25519/0x**************** créé : 2020-01-30 expire : 2022-01-29 utilisation : E ssb ed25519/0x**************** créé : 2020-01-30 expire : jamais utilisation : S [ ultime ] (1). Nom Prenom \u0026lt;email@domain.tld\u0026gt; gpg\u0026gt; setpref SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed Définir la liste de préférences en : Chiffrement : AES256, AES192, AES, 3DES Hachage : SHA512, SHA384, SHA256, SHA1 Compression : ZLIB, BZIP2, ZIP, Non compressé Fonctionnalités : MDC, Serveur de clefs sans modification Faut-il vraiment mettre à jour les préférences ? (o/N) o sec ed25519/0x**************** créé : 2020-01-30 expire : 2022-01-29 utilisation : SC confiance : ultime validité : ultime ssb cv25519/0x**************** créé : 2020-01-30 expire : 2022-01-29 utilisation : E ssb ed25519/0x**************** créé : 2020-01-30 expire : jamais utilisation : S [ ultime ] (1). Nom Prenom \u0026lt;email@domain.tld\u0026gt; gpg\u0026gt; save Autres actions utiles Et, maintenant, pensez à :\najouter une photo pour enfin, partager votre clé publique ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eIl est en effet possible de créer des clés GPG en utilisant l\u0026rsquo;algorithme\nà courbe elliptique ED25519.\u003c/p\u003e\n\u003cp\u003eCe tutoriel fait suite à ce\n\n\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-guide-bonnes-pratiques/\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Guide bonnes pratiques (RSA)'\"\u003eguide de bonnes pratiques de création\u003c/a\u003e\n ;\nd\u0026rsquo;ailleurs une fois la création terminée, referez-vous y à nouveau.\u003c/p\u003e\n\u003cp\u003eAvant, assurez-vous d\u0026rsquo;avoir correctement\n\n\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-usage-securise/\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Du bon usage sécurisé'\"\u003esécurisé votre configuration GPG\u003c/a\u003e\n !\u003c/p\u003e\n\u003ch2 id=\"création-parfaite-de-clés-gpg\"\u003eCréation parfaite de clés GPG\u003c/h2\u003e\n\u003ch3 id=\"informations-importantes\"\u003eInformations importantes\u003c/h3\u003e\n\u003cp\u003eBien veiller à choisir à la création de clé, l\u0026rsquo;option \u003ccode\u003e(9) ECC et ECC\u003c/code\u003e - et\nensuite, le type de courbe elliptique désiré - option \u003ccode\u003e(1) Curve 25519\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"création-en-mode-console\"\u003eCréation en mode console\u003c/h3\u003e\n\u003cp\u003ePour l\u0026rsquo;instant, c\u0026rsquo;est la seule possibilité de faire.\nPour cela, il faut utiliser l\u0026rsquo;option \u003ccode\u003e--full-gen-key\u003c/code\u003e suivie de l\u0026rsquo;option \u003ccode\u003e--expert\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:$ gpg --full-gen-key --expert\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGnuPG\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 2.2.10; Copyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2018\u003c/span\u003e Free Software Foundation, Inc.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThis is free software: you are free to change and redistribute it.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThere is NO WARRANTY, to the extent permitted by law.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSélectionnez le type de clef désiré :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RSA et RSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003epar défaut\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\u003e2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e DSA et Elgamal\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e DSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esignature seule\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\u003e4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esignature seule\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\u003e7\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e DSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eindiquez vous-même les capacités\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\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eindiquez vous-même les capacités\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\u003e9\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e ECC et ECC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e10\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e ECC \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esignature seule\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\u003e11\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e ECC \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eindiquez vous-même les capacités\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\u003e13\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Clef existante\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eQuel est votre choix ? \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSélectionnez le type de courbe elliptique désiré :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Curve \u003cspan style=\"color:#f99b15\"\u003e25519\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e NIST P-256\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e NIST P-384\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e NIST P-521\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Brainpool P-256\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e7\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Brainpool P-384\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Brainpool P-512\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e9\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e secp256k1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eQuel est votre choix ? \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eVeuillez indiquer le temps pendant lequel cette clef devrait être valable.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         \u003cspan style=\"color:#ef6155\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e la clef n\u003cspan style=\"color:#48b685\"\u003e\u0026#39;expire pas\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e      \u0026lt;n\u0026gt;  = la clef expire dans n jours\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e      \u0026lt;n\u0026gt;w = la clef expire dans n semaines\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e      \u0026lt;n\u0026gt;m = la clef expire dans n mois\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e      \u0026lt;n\u0026gt;y = la clef expire dans n ans\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003ePendant combien de temps la clef est-elle valable ? (0) 2y\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eLa clef expire le Thu Jan  7 14:58:16 2021 CET\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eEst-ce correct ? (o/N) o\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\"\u003eGnuPG doit construire une identité pour identifier la clef.\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\"\u003eNom réel : Stéphane HUC\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eAdresse électronique : ***@stephane-huc.net\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eCommentaire :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eVous utilisez le jeu de caractères « utf-8 ».\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eVous avez sélectionné cette identité :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    « Stéphane HUC \u0026lt;***@stephane-huc.net\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\"\u003eChanger le (N)om, le (C)ommentaire, l\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eA\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003edresse électronique\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eou \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eO\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003eui/\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eQ\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003euitter ? o\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDe nombreux octets aléatoires doivent être générés. Vous devriez faire\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eautre chose \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etaper au clavier, déplacer la souris, utiliser les disques\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ependant la génération de nombres premiers ; cela donne au générateur de\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enombres aléatoires une meilleure chance d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;obtenir suffisamment d\u0026#39;\u003c/span\u003eentropie.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDe nombreux octets aléatoires doivent être générés. Vous devriez faire\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eautre chose \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etaper au clavier, déplacer la souris, utiliser les disques\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ependant la génération de nombres premiers ; cela donne au générateur de\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enombres aléatoires une meilleure chance d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;obtenir suffisamment d\u0026#39;\u003c/span\u003eentropie.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg: clef 0x*********** marquée de confiance ultime.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg: revocation certificate stored as \u003cspan style=\"color:#48b685\"\u003e\u0026#39;/home/***/.gnupg/openpgp-revocs.d/***.rev\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eles clefs publique et secrète ont été créées et signées.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epub   ed25519/0x*********** 2019-01-08 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eSC\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eexpire : 2021-01-07\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e Empreinte de la \u003cspan style=\"color:#ef6155\"\u003eclef\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e **** **** **** **** **** ****\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euid                              Stéphane HUC \u0026lt;***@stephane-huc.net\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esub   cv25519/0x********** 2019-01-08 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eE\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eexpire : 2021-01-07\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=\"modification-de-clé\"\u003eModification de clé\u003c/h2\u003e\n\u003cp\u003ePour modifier une clé GPG, on utilise l\u0026rsquo;option \u003ccode\u003e--edit-key\u003c/code\u003e\n\u003cstrong\u003etoujours suivie de\u003c/strong\u003e l\u0026rsquo;option \u003ccode\u003e--expert\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"création-dune-sous-clé\"\u003eCréation d\u0026rsquo;une sous clé\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;action à utiliser est : \u003ccode\u003eaddkey\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVeillez à bien choisir l\u0026rsquo;option \u003ccode\u003e(10) ECC (signature seule)\u003c/code\u003e puis l\u0026rsquo;option\n\u003ccode\u003e(1) Curve 25519\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:$ gpg2 --edit-key --expert \u003cspan style=\"color:#48b685\"\u003e\u0026#34;fingerprint\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGnuPG\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 2.2.12; Copyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2018\u003c/span\u003e Free Software Foundation, Inc.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThis is free software: you are free to change and redistribute it.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThere is NO WARRANTY, to the extent permitted by law.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLa clef secrète est disponible.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esec  ed25519/0x****************\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     créé : 2020-01-30  expire : 2022-01-29  utilisation : SC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     confiance : ultime        validité : ultime\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essb  cv25519/0x****************\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     créé : 2020-01-30  expire : 2022-01-29  utilisation : E\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e  ultime \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e. Nom Prenom \u0026lt;email@domain.tld\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\u003egpg\u0026gt; addkey\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSélectionnez le type de clef désiré :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e DSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esignature seule\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\u003e4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esignature seule\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\u003e5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Elgamal \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003echiffrement seul\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\u003e6\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003echiffrement seul\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\u003e7\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e DSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eindiquez vous-même les capacités\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\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eindiquez vous-même les capacités\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\u003e10\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e ECC \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esignature seule\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\u003e11\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e ECC \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eindiquez vous-même les capacités\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\u003e12\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e ECC \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003echiffrement seul\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\u003e13\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Clef existante\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eQuel est votre choix ? \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSélectionnez le type de courbe elliptique désiré :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Curve \u003cspan style=\"color:#f99b15\"\u003e25519\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e NIST P-256\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e NIST P-384\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e NIST P-521\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Brainpool P-256\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e7\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Brainpool P-384\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Brainpool P-512\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e9\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e secp256k1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eQuel est votre choix ? \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eVeuillez indiquer le temps pendant lequel cette clef devrait être valable.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         \u003cspan style=\"color:#ef6155\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e la clef n\u003cspan style=\"color:#48b685\"\u003e\u0026#39;expire pas\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e      \u0026lt;n\u0026gt;  = la clef expire dans n jours\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e      \u0026lt;n\u0026gt;w = la clef expire dans n semaines\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e      \u0026lt;n\u0026gt;m = la clef expire dans n mois\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e      \u0026lt;n\u0026gt;y = la clef expire dans n ans\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003ePendant combien de temps la clef est-elle valable ? (0)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eLa clef n\u0026#39;\u003c/span\u003eexpire pas du tout\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEst-ce correct ? \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eo/N\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e o\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFaut-il vraiment la créer ? \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eo/N\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e o\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDe nombreux octets aléatoires doivent être générés. Vous devriez faire\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eautre chose \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etaper au clavier, déplacer la souris, utiliser les disques\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ependant la génération de nombres premiers ; cela donne au générateur de\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enombres aléatoires une meilleure chance d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;obtenir suffisamment d\u0026#39;\u003c/span\u003eentropie.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esec  ed25519/0x****************\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     créé : 2020-01-30  expire : 2022-01-29  utilisation : SC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     confiance : ultime        validité : ultime\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essb  cv25519/0x****************\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     créé : 2020-01-30  expire : 2022-01-29  utilisation : E\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essb  ed25519/0x****************\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     créé : 2020-01-30  expire : jamais      utilisation : S\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e  ultime \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e. Nom Prenom \u0026lt;email@domain.tld\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\u003egpg\u0026gt; save\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"gestion-des-préférences-de-hash\"\u003eGestion des préférences de Hash\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;action à utiliser est :\n\u003ccode\u003esetpref SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed\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:$ gpg2 --edit-key --expert \u003cspan style=\"color:#48b685\"\u003e\u0026#34;fingerprint\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGnuPG\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 2.2.12; Copyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2018\u003c/span\u003e Free Software Foundation, Inc.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThis is free software: you are free to change and redistribute it.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThere is NO WARRANTY, to the extent permitted by law.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLa clef secrète est disponible.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esec  ed25519/0x****************\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     créé : 2020-01-30  expire : 2022-01-29  utilisation : SC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     confiance : ultime        validité : ultime\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essb  cv25519/0x****************\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     créé : 2020-01-30  expire : 2022-01-29  utilisation : E\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essb  ed25519/0x****************\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     créé : 2020-01-30  expire : jamais      utilisation : S\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e  ultime \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e. Nom Prenom \u0026lt;email@domain.tld\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\u003egpg\u0026gt; setpref SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDéfinir la liste de préférences en :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     Chiffrement : AES256, AES192, AES, 3DES\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     Hachage : SHA512, SHA384, SHA256, SHA1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     Compression : ZLIB, BZIP2, ZIP, Non compressé\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     Fonctionnalités : MDC, Serveur de clefs sans modification\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFaut-il vraiment mettre à jour les préférences ? \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eo/N\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e o\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esec  ed25519/0x****************\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     créé : 2020-01-30  expire : 2022-01-29  utilisation : SC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     confiance : ultime        validité : ultime\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essb  cv25519/0x****************\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     créé : 2020-01-30  expire : 2022-01-29  utilisation : E\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essb  ed25519/0x****************\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     créé : 2020-01-30  expire : jamais      utilisation : S\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e  ultime \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e. Nom Prenom \u0026lt;email@domain.tld\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\u003egpg\u0026gt; save\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch3 id=\"autres-actions-utiles\"\u003eAutres actions utiles\u003c/h3\u003e\n\u003cp\u003eEt, maintenant, pensez à :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-guide-bonnes-pratiques/#ajout-d-une-photo\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Guide bonnes pratiques (RSA)'\"\u003eajouter une photo\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003epour enfin, \u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-guide-bonnes-pratiques/#partagez-votre-cl%c3%a9-publique\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Guide bonnes pratiques (RSA)'\"\u003epartager votre clé publique\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Tutoriel pour créer une clé GPG en utilisant une courbe elliptique ed25119","tags":["GPG","ed25519"],"date_published":"2019-05-12T11:22:33+01:00","date_modified":"2020-01-30T20:50:00+01:00"},{"id":"tag:doc.huc.fr.eu.org,2019-05-02:/fr/web/nextcloud/nextcloud-php-chroot#bfe857370f94078173cc4da682db6d9b22473f78f7d0e2da6d79bf80f8d097a5","url":"https://it-log.fr.eu.org/fr/web/nextcloud/nextcloud-php-chroot/","title":"Nextcloud Php Chroot OpenBSD (astuce)","author":{"name":"Stéphane HUC"},"content_text":"Présentation du problème Du fait de fonctionner sous OpenBSD, la commande occ ne peut pas s\u0026rsquo;exécuter. En effet, autant le service web que PHP sont tous les deux sous chroot.\nQuand vous exécutez occ, vous obtenez le message d\u0026rsquo;erreur suivant :\nYour data directory is invalid Ensure there is a file called \u0026#34;.ocdata\u0026#34; in the root of the data directory. Cannot create \u0026#34;data\u0026#34; directory This can usually be fixed by giving the webserver write access to the root directory. See https://docs.nextcloud.com/server/16/go.php?to=admin-dir_permissions Résoudre ce problème est simple !\nÉditez le fichier de configuration nextcloud/config/config.php et modifiez la valeur de la variable datadirectory, tel que :\n'datadirectory' =\u0026gt; ((php_sapi_name() == 'cli') ? '/var/www' : '') . '/htdocs/data',\nBien-sûr le chemin /htdocs/data doit correspondre à votre cas réel.\nMaintenant vous pouvez utiliser sans soucis la commande occ\nNéanmoins, n\u0026rsquo;oubliez pas de supprimez la modification avant d\u0026rsquo;utiliser l\u0026rsquo;interface web, sinon vous ne pourrez pas vous connecter !\nProblème remarqué par mes soins : lors du redémarrage du service PHP et/ou web, cela tend à récrire la variable en préfixant la variable datadirectory de /var/www/, empêchant le bon fonctionnement du site web, et provoquant une erreur 500. Si c\u0026rsquo;est votre cas, ré-éditez le fichier de config et supprimez le préfixe en question.\nTL;DR Plus simple :\nPour \u0026ldquo;activer\u0026rdquo; occ : sed -i -e 's#/htdocs#/var/www/htdocs#' nextcloud/config/config.php Pour \u0026ldquo;désactiver\u0026rdquo; occ : sed -i -e 's#/var/www/htdocs#/htdocs#' nextcloud/config/config.php Remerciement Je tiens à remercier @h3artbl33d qui a trouvé l\u0026rsquo;astuce… car pendant des mois, cela m\u0026rsquo;a empêché d\u0026rsquo;utiliser la commande occ.\n","content_html":"\u003ch2 id=\"présentation-du-problème\"\u003ePrésentation du problème\u003c/h2\u003e\n\u003cp\u003eDu fait de fonctionner sous OpenBSD, la commande \u003ccode\u003eocc\u003c/code\u003e ne peut pas s\u0026rsquo;exécuter.\nEn effet, autant le service web que PHP sont tous les deux sous chroot.\u003c/p\u003e\n\u003cp\u003eQuand vous exécutez \u003ccode\u003eocc\u003c/code\u003e, vous obtenez le message d\u0026rsquo;erreur 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\u003eYour data directory is invalid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnsure there is a file called \u003cspan style=\"color:#48b685\"\u003e\u0026#34;.ocdata\u0026#34;\u003c/span\u003e in the root of the data directory.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCannot create \u003cspan style=\"color:#48b685\"\u003e\u0026#34;data\u0026#34;\u003c/span\u003e directory\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThis can usually be fixed by giving the webserver write access to the root directory. See https://docs.nextcloud.com/server/16/go.php?to\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eadmin-dir_permissions\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eRésoudre ce problème est simple !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eÉditez le fichier de configuration \u003ccode\u003enextcloud/config/config.php\u003c/code\u003e et modifiez la\nvaleur de la variable \u003ccode\u003edatadirectory\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e'datadirectory' =\u0026gt; ((php_sapi_name() == 'cli') ? '/var/www' : '') . '/htdocs/data',\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eBien-sûr le chemin \u003ccode\u003e/htdocs/data\u003c/code\u003e doit correspondre à votre cas réel.\u003c/p\u003e\n\u003cp\u003eMaintenant vous pouvez utiliser sans soucis la commande \u003ccode\u003eocc\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eNéanmoins, n\u0026rsquo;oubliez pas de supprimez la modification avant d\u0026rsquo;utiliser\nl\u0026rsquo;interface web, sinon vous ne pourrez pas vous connecter !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eProblème remarqué par mes soins\u003c/strong\u003e : lors du redémarrage du\nservice PHP et/ou web, cela tend à récrire la variable en préfixant la\nvariable \u003cem\u003edatadirectory\u003c/em\u003e de \u003cem\u003e/var/www/\u003c/em\u003e, empêchant le bon fonctionnement\ndu site web, et provoquant une erreur 500. Si c\u0026rsquo;est votre cas,\nré-éditez le fichier de config et supprimez le préfixe en question.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"tldr\"\u003eTL;DR\u003c/h3\u003e\n\u003cp\u003ePlus simple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour \u0026ldquo;activer\u0026rdquo; occ : \u003cbr\u003e\n\u003ccode\u003esed -i -e 's#/htdocs#/var/www/htdocs#' nextcloud/config/config.php\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour \u0026ldquo;désactiver\u0026rdquo; occ : \u003cbr\u003e\n\u003ccode\u003esed -i -e 's#/var/www/htdocs#/htdocs#' nextcloud/config/config.php\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"remerciement\"\u003eRemerciement\u003c/h2\u003e\n\u003cp\u003eJe tiens à remercier \u003ca href=\"https://chargen.one/h3artbl33d/fixing-nextcloud-on-openbsd-with-a-chroot\" rel=\"external\"\u003e@h3artbl33d\u003c/a\u003e\nqui a trouvé l\u0026rsquo;astuce… car pendant des mois, cela m\u0026rsquo;a empêché d\u0026rsquo;utiliser la commande \u003ccode\u003eocc\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n","summary":"Résoudre le problème d'exécution de la commande occ de Nextcloud du fait du chroot sous OpenBSD","tags":["Nextcloud","chroot","OpenBSD","astuce"],"date_published":"2019-05-02T23:11:15+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2019-04-20:/fr/sys/software/firefox-performances#760ee620e190ff4df57852cf498b81c0c2cfbc23ec6b5d8de187ac78906b400e","url":"https://it-log.fr.eu.org/fr/sys/software/firefox-performances/","title":"Firefox : améliorer ses performances","author":{"name":"Stéphane HUC"},"content_text":"Description Un article concernant l\u0026rsquo;amélioration de la Performance de Firefox !\nAttentionLa modification de la configuration de Firefox peut empêcher celui-ci de fonctionner - vous êtes seul responsable de celle-ci, à vous de vous assurez et de vérifier trois fois plutôt qu\u0026rsquo;une de vos modifications ! Dans la barre d\u0026rsquo;adresse, tapez la commande about:config puis nous allons mettre en place différentes informations :\nConfiguration Accélération matérielle AttentionModifier ces configurations peut provoquer des instabilités matérielles ! Préférez mettre ces options sur true - il est probable que FF utilise déjà ces options\nGestion des calques layers.acceleration.force-enabled layers.async-video.enabled layers.offmainthreadcomposition.async-animations layers.offmainthreadcomposition.enabled OMTC - Off Main Thread Compositing html5.offmainthread WebGL webgl.force-enabled Gestion des Animations layout.frame_rate.precise - peut atténuer le défilement instable - préférez sur true Gestion des Images image.mem.max_decoded_image_kb - l\u0026rsquo;impact du nombre d\u0026rsquo;images compressées gérées par FF ; plus la valeur est haute, plus cela améliore la vitesse, au dépend de l\u0026rsquo;utilisation mémoire. Gestion Javascript javascript.options.mem.max : limite la mémoire que Javascript peut consommer - une valeur -1 signifie une gestion automatique javascript.options.mem.high_water_mark : demande au \u0026ldquo;Garbage Collector\u0026rdquo; - purgeur de mémoire de démarrer quand Javascript atteint tel nombre de mémoire Réduction de la Mémoire Gestion du navigateur browser.cache.memory.capacity : limite la taille de la mémoire cache, en Mo browser.download.animateNotifications : désactive ou non les notifications de téléchargement - préférez sur false browser.sessionhistory.max_entries : limite le nombre maximum de pages gardées en mémoire dans l\u0026rsquo;historique de la session. browser.sessionstore.max_tabs_undo : limite le nombre maximum d\u0026rsquo;onglets fermés que vous pouvez ouvrir à nouveau browser.tabs.animate : désactive ou non les animations des onglets - préférez sur false config.trim_on_minimize : réduite l\u0026rsquo;usage de la mémoire lorsque la fenêtre est minimisée - préférez sur true - (utile que sous Windows) Documentations Un récapitulatif en anglais - dont je me suis fortement inspiré - Remerciements merci @Cascador ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUn article concernant l\u0026rsquo;amélioration de la Performance de Firefox !\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eLa modification de la configuration de Firefox peut empêcher\ncelui-ci de fonctionner - \u003cspan class=\"red\"\u003evous êtes seul responsable\u003c/span\u003e\nde\ncelle-ci, à vous de vous assurez et de vérifier trois fois plutôt\nqu\u0026rsquo;une de vos modifications !\u003c/div\u003e\n\n\u003cp\u003eDans la barre d\u0026rsquo;adresse, tapez la commande \u003ccode\u003eabout:config\u003c/code\u003e puis nous\nallons mettre en place différentes informations :\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"accélération-matérielle\"\u003eAccélération matérielle\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eModifier ces configurations peut provoquer des instabilités matérielles !\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003ePréférez\u003c/strong\u003e mettre ces options sur \u003ccode\u003etrue\u003c/code\u003e - \u003cem\u003eil est probable que FF utilise\ndéjà ces options\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGestion des calques\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003elayers.acceleration.force-enabled\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elayers.async-video.enabled\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elayers.offmainthreadcomposition.async-animations\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elayers.offmainthreadcomposition.enabled\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eOMTC - Off Main Thread Compositing\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ehtml5.offmainthread\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eWebGL\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ewebgl.force-enabled\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"gestion-des-animations\"\u003eGestion des Animations\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003elayout.frame_rate.precise\u003c/code\u003e - peut atténuer le défilement instable - \u003cstrong\u003epréférez\u003c/strong\u003e sur \u003ccode\u003etrue\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"gestion-des-images\"\u003eGestion des Images\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eimage.mem.max_decoded_image_kb\u003c/code\u003e - l\u0026rsquo;impact du nombre d\u0026rsquo;images compressées\ngérées par FF ; plus la valeur est haute, plus cela améliore la vitesse,\nau dépend de l\u0026rsquo;utilisation mémoire.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"gestion-javascript\"\u003eGestion Javascript\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ejavascript.options.mem.max\u003c/code\u003e : limite la mémoire que Javascript peut\nconsommer - une valeur \u003ccode\u003e-1\u003c/code\u003e signifie une gestion automatique\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ejavascript.options.mem.high_water_mark\u003c/code\u003e : demande au \u0026ldquo;Garbage Collector\u0026rdquo; -\npurgeur de mémoire de démarrer quand Javascript atteint tel nombre de mémoire\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"réduction-de-la-mémoire\"\u003eRéduction de la Mémoire\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eGestion du navigateur\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ebrowser.cache.memory.capacity\u003c/code\u003e : limite la taille de la mémoire cache, en Mo\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ebrowser.download.animateNotifications\u003c/code\u003e : désactive ou non les notifications\nde téléchargement - \u003cstrong\u003epréférez\u003c/strong\u003e sur \u003ccode\u003efalse\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ebrowser.sessionhistory.max_entries\u003c/code\u003e : limite le nombre maximum de pages\ngardées en mémoire dans l\u0026rsquo;historique de la session.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ebrowser.sessionstore.max_tabs_undo\u003c/code\u003e : limite le nombre maximum d\u0026rsquo;onglets\nfermés que vous pouvez ouvrir à nouveau\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ebrowser.tabs.animate\u003c/code\u003e : désactive ou non les animations des onglets -\n\u003cstrong\u003epréférez\u003c/strong\u003e sur \u003ccode\u003efalse\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econfig.trim_on_minimize\u003c/code\u003e : réduite l\u0026rsquo;usage de la mémoire lorsque la\nfenêtre est minimisée - \u003cstrong\u003epréférez\u003c/strong\u003e sur \u003ccode\u003etrue\u003c/code\u003e - \u003cem\u003e(utile que sous Windows)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUn \u003ca href=\"https://gist.github.com/0XDE57/fbd302cef7693e62c769\" rel=\"external\"\u003erécapitulatif\u003c/a\u003e \u003cem\u003een anglais\u003c/em\u003e - dont je me suis fortement inspiré -\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003emerci @\u003ca href=\"https://www.blog-libre.org/2018/09/22/trucs-et-astuces-volume-2/\" rel=\"external\"\u003eCascador\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Comment améliorer les performances de Firefox","tags":["Firefox","performances","astuce"],"date_published":"2019-04-20T15:06:31+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-12-28:/fr/sys/openbsd/mandoc#adf0a7c637d103c02896ea0102f5368c2b71f5f23e4c1756caa353dd2f5029fd","url":"https://it-log.fr.eu.org/fr/sys/openbsd/mandoc/","title":"Mandoc : ouvrir les manpages aux formats html, markdown, pdf, ps (OpenBSD)","author":{"name":"Stéphane HUC"},"content_text":"Description Lire les manpages n\u0026rsquo;est pas forcément agréable, voire aisé - heureusement il est possible avec des outils natifs à OpenBSD de les agrémenter pour en faire une sortie html, markdown, pdf, postscript puis de les lire dans un lecteur adéquat.\nDe petites fonctions pertinentes à se rajouter dans son ~/.kshrc qui utilisent principalement l\u0026rsquo;outil mandoc.\nAstuceCréer un fichier .fonctions dans votre répertoire personnel, et sourcez-le dans votre .kshrc personnel - pas besoin de le rendre exécutable ;) Dans tous les cas, il est possible de modifier à souhait la variable editor :\nFonction man2html Testé avec firefox, links+.\nman2html() { editor=firefox [ -n \u0026#34;$1\u0026#34; ] \u0026amp;\u0026amp; name=\u0026#34;$1\u0026#34; [ -z \u0026#34;$2\u0026#34; ] \u0026amp;\u0026amp; ext=\u0026#34;1\u0026#34; || ext=\u0026#34;$2\u0026#34; tmp=\u0026#34;/tmp/$name.$ext.html\u0026#34; for dir in /usr/share/man /usr/local/man /usr/X11R6/man; do [ -f \u0026#34;$dir/man$ext/$name.$ext\u0026#34; ] \u0026amp;\u0026amp; { file=\u0026#34;$dir/man$ext/$name.$ext\u0026#34;; break; } done [ -f \u0026#34;$file\u0026#34; ] \u0026amp;\u0026amp; mandoc -K utf-8 -T html -O toc \u0026#34;$file\u0026#34; \u0026gt; \u0026#34;$tmp\u0026#34; [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; $editor \u0026#34;$tmp\u0026#34; unset editor ext file name tmp` } Utilisation man2html nom-manpage numero-section-manpage - s\u0026rsquo;il n\u0026rsquo;y a pas de numéro de section, alors la fonction essaye d\u0026rsquo;appeler le manpage de la section 1.\nExemple : :$ man2html man\nFonction man2md Testé avec geany\nman2md() { editor=geany [ -n \u0026#34;$1\u0026#34; ] \u0026amp;\u0026amp; name=\u0026#34;$1\u0026#34; [ -z \u0026#34;$2\u0026#34; ] \u0026amp;\u0026amp; ext=\u0026#34;1\u0026#34; || ext=\u0026#34;$2\u0026#34; tmp=\u0026#34;/tmp/$name.$ext.md\u0026#34; for dir in /usr/share/man /usr/local/man /usr/X11R6/man; do [ -f \u0026#34;$dir/man$ext/$name.$ext\u0026#34; ] \u0026amp;\u0026amp; { file=\u0026#34;$dir/man$ext/$name.$ext\u0026#34;; break; } done [ -f \u0026#34;$file\u0026#34; ] \u0026amp;\u0026amp; mandoc -K utf-8 -T markdown \u0026#34;$file\u0026#34; \u0026gt; \u0026#34;$tmp\u0026#34; [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; $editor \u0026#34;$tmp\u0026#34; unset editor ext file name tmp` } Utilisation man2md nom-manpage numero-section-manpage - s\u0026rsquo;il n\u0026rsquo;y a pas de numéro de section, alors la fonction essaye d\u0026rsquo;appeler le manpage de la section 1.\nExemple : :$ man2md hostname.if 5\nFonction man2pdf Testé avec evince.\nman2pdf() { editor=evince [ -n \u0026#34;$1\u0026#34; ] \u0026amp;\u0026amp; name=\u0026#34;$1\u0026#34; [ -z \u0026#34;$2\u0026#34; ] \u0026amp;\u0026amp; ext=\u0026#34;1\u0026#34; || ext=\u0026#34;$2\u0026#34; tmp=\u0026#34;/tmp/$name.$ext.pdf\u0026#34; for dir in /usr/share/man /usr/local/man /usr/X11R6/man; do [ -f \u0026#34;$dir/man$ext/$name.$ext\u0026#34; ] \u0026amp;\u0026amp; { file=\u0026#34;$dir/man$ext/$name.$ext\u0026#34;; break; } done [ -f \u0026#34;$file\u0026#34; ] \u0026amp;\u0026amp; mandoc -K utf-8 -T pdf \u0026#34;$file\u0026#34; \u0026gt; \u0026#34;$tmp\u0026#34; [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; $editor \u0026#34;$tmp\u0026#34; \u0026amp;\u0026amp; rm -fP \u0026#34;$tmp\u0026#34; unset editor ext file name tmp` } Utilisation man2pdf nom-manpage numero-section-manpage - s\u0026rsquo;il n\u0026rsquo;y a pas de numéro de section, alors la fonction essaye d\u0026rsquo;appeler le manpage de la section 1.\nExemple : :$ man2pdf man.conf 5\nFonction man2ps Testé avec gs, ghostview\nman2ps() { editor=gs [ -n \u0026#34;$1\u0026#34; ] \u0026amp;\u0026amp; name=\u0026#34;$1\u0026#34; [ -z \u0026#34;$2\u0026#34; ] \u0026amp;\u0026amp; ext=\u0026#34;1\u0026#34; || ext=\u0026#34;$2\u0026#34; tmp=\u0026#34;/tmp/$name.$ext.ps\u0026#34; for dir in /usr/share/man /usr/local/man /usr/X11R6/man; do [ -f \u0026#34;$dir/man$ext/$name.$ext\u0026#34; ] \u0026amp;\u0026amp; { file=\u0026#34;$dir/man$ext/$name.$ext\u0026#34;; break; } done [ -f \u0026#34;$file\u0026#34; ] \u0026amp;\u0026amp; mandoc -K utf-8 -T ps \u0026#34;$file\u0026#34; \u0026gt; \u0026#34;$tmp\u0026#34; [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; $editor \u0026#34;$tmp\u0026#34; unset editor ext file name tmp` } Utilisation man2ps nom-manpage numero-section-manpage - s\u0026rsquo;il n\u0026rsquo;y a pas de numéro de section, alors la fonction essaye d\u0026rsquo;appeler le manpage de la section 1.\nExemple : :$ man2ps dhclient 8\nFonction man2doc LA fonction qui réunit toutes les précédentes !!!\nman2doc() { #ed2html=firefox #ed2md=geany #ed2pdf=evince #ed2ps=gs [ -n \u0026#34;$1\u0026#34; ] \u0026amp;\u0026amp; format=\u0026#34;$1\u0026#34; [ -n \u0026#34;$2\u0026#34; ] \u0026amp;\u0026amp; name=\u0026#34;$2\u0026#34; [ -z \u0026#34;$3\u0026#34; ] \u0026amp;\u0026amp; nb=\u0026#34;1\u0026#34; || nb=\u0026#34;$3\u0026#34; #eval \u0026#34;editor=\\${ed2$format}\u0026#34; tmp=\u0026#34;/tmp/$name.$nb.$format\u0026#34; [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; rm -fP \u0026#34;$tmp\u0026#34; case \u0026#34;$format\u0026#34; in \u0026#34;md\u0026#34;) type=\u0026#34;markdown\u0026#34; ;; *) type=\u0026#34;$format\u0026#34; ;; esac for file in $(find /usr/{local,share,X11R6}/man/ -name $name.$nb); do mandoc -K utf-8 -T \u0026#34;$type\u0026#34; \u0026#34;$file\u0026#34; \u0026gt;\u0026gt; \u0026#34;$tmp\u0026#34;; done [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; xdg-open \u0026#34;$tmp\u0026#34; # $editor unset editor file format name nb tmp } Utilisation À la différence des précédentes fonctions, cette dernière cherchera tous les manpages correspondants, et les incluera les uns à la suite des autres…\nman2doc format-fichier nom-manpage numero-section-manpage.\nformat-fichier : html, md, pdf, ou ps Toujours si le numéro de section n\u0026rsquo;est pas spécifié, la fonction cherchera dans la section 1. Exemples :\n:$ man2doc html man :$ man2doc pdf doas.conf 5 :$ man2doc md makewhatis 8 :$ man2doc ps vmm 4 Inspiré par Mi@mondo\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLire les manpages n\u0026rsquo;est pas forcément agréable, voire aisé - heureusement il\nest possible avec des outils natifs à OpenBSD de les agrémenter pour en faire\nune sortie html, markdown, pdf, postscript puis de les lire dans un lecteur\nadéquat.\u003c/p\u003e\n\u003cp\u003eDe petites fonctions pertinentes à se rajouter dans son \u003ccode\u003e~/.kshrc\u003c/code\u003e qui\nutilisent principalement l\u0026rsquo;outil \u003ccode\u003emandoc\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\"\u003eCréer un fichier \u003ccode\u003e.fonctions\u003c/code\u003e dans votre répertoire personnel, et sourcez-le\ndans votre \u003ccode\u003e.kshrc\u003c/code\u003e personnel - \u003cem\u003epas besoin de le rendre exécutable\u003c/em\u003e ;)\u003c/div\u003e\n\n\u003cp\u003eDans tous les cas, il est possible de modifier à souhait la variable \u003ccode\u003eeditor\u003c/code\u003e :\u003c/p\u003e\n\u003ch2 id=\"fonction-man2html\"\u003eFonction man2html\u003c/h2\u003e\n\u003cp\u003eTesté avec \u003cstrong\u003efirefox\u003c/strong\u003e, \u003cstrong\u003elinks+\u003c/strong\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003eman2html() {\n\n    editor=firefox\n    [ -n \u0026#34;$1\u0026#34; ] \u0026amp;\u0026amp; name=\u0026#34;$1\u0026#34;\n    [ -z \u0026#34;$2\u0026#34; ] \u0026amp;\u0026amp; ext=\u0026#34;1\u0026#34; || ext=\u0026#34;$2\u0026#34;\n        \n    tmp=\u0026#34;/tmp/$name.$ext.html\u0026#34;\n\n    for dir in /usr/share/man /usr/local/man /usr/X11R6/man; do\n        [ -f \u0026#34;$dir/man$ext/$name.$ext\u0026#34; ] \u0026amp;\u0026amp; { file=\u0026#34;$dir/man$ext/$name.$ext\u0026#34;; break; }\n    done\n\n    [ -f \u0026#34;$file\u0026#34; ] \u0026amp;\u0026amp; mandoc -K utf-8 -T html -O toc \u0026#34;$file\u0026#34; \u0026gt; \u0026#34;$tmp\u0026#34;\n    [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; $editor \u0026#34;$tmp\u0026#34;\n\n    unset editor ext file name tmp`\n\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"utilisation\"\u003eUtilisation\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eman2html nom-manpage numero-section-manpage\u003c/code\u003e - s\u0026rsquo;il n\u0026rsquo;y a pas de numéro de\nsection, alors la fonction essaye d\u0026rsquo;appeler le manpage de la section 1.\u003c/p\u003e\n\u003cp\u003eExemple : \u003ccode\u003e:$ man2html man\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"fonction-man2md\"\u003eFonction man2md\u003c/h2\u003e\n\u003cp\u003eTesté avec \u003cstrong\u003egeany\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003eman2md() {\n\n    editor=geany\n    [ -n \u0026#34;$1\u0026#34; ] \u0026amp;\u0026amp; name=\u0026#34;$1\u0026#34;\n    [ -z \u0026#34;$2\u0026#34; ] \u0026amp;\u0026amp; ext=\u0026#34;1\u0026#34; || ext=\u0026#34;$2\u0026#34;\n\n    tmp=\u0026#34;/tmp/$name.$ext.md\u0026#34;\n\n    for dir in /usr/share/man /usr/local/man /usr/X11R6/man; do\n        [ -f \u0026#34;$dir/man$ext/$name.$ext\u0026#34; ] \u0026amp;\u0026amp; { file=\u0026#34;$dir/man$ext/$name.$ext\u0026#34;; break; }\n    done\n\n    [ -f \u0026#34;$file\u0026#34; ] \u0026amp;\u0026amp; mandoc -K utf-8 -T markdown \u0026#34;$file\u0026#34; \u0026gt; \u0026#34;$tmp\u0026#34;\n    [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; $editor \u0026#34;$tmp\u0026#34; \n\n    unset editor ext file name tmp`\n\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"utilisation-1\"\u003eUtilisation\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eman2md nom-manpage numero-section-manpage\u003c/code\u003e - s\u0026rsquo;il n\u0026rsquo;y a pas de numéro\nde section, alors la fonction essaye d\u0026rsquo;appeler le manpage de la section 1.\u003c/p\u003e\n\u003cp\u003eExemple : \u003ccode\u003e:$ man2md hostname.if 5\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"fonction-man2pdf\"\u003eFonction man2pdf\u003c/h2\u003e\n\u003cp\u003eTesté avec \u003cstrong\u003eevince\u003c/strong\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003eman2pdf() {\n\n    editor=evince\n    [ -n \u0026#34;$1\u0026#34; ] \u0026amp;\u0026amp; name=\u0026#34;$1\u0026#34;\n    [ -z \u0026#34;$2\u0026#34; ] \u0026amp;\u0026amp; ext=\u0026#34;1\u0026#34; || ext=\u0026#34;$2\u0026#34;\n\n    tmp=\u0026#34;/tmp/$name.$ext.pdf\u0026#34;\n\n    for dir in /usr/share/man /usr/local/man /usr/X11R6/man; do\n        [ -f \u0026#34;$dir/man$ext/$name.$ext\u0026#34; ] \u0026amp;\u0026amp; { file=\u0026#34;$dir/man$ext/$name.$ext\u0026#34;; break; }\n    done\n\n    [ -f \u0026#34;$file\u0026#34; ] \u0026amp;\u0026amp; mandoc -K utf-8 -T pdf \u0026#34;$file\u0026#34; \u0026gt; \u0026#34;$tmp\u0026#34;\n    [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; $editor \u0026#34;$tmp\u0026#34; \u0026amp;\u0026amp; rm -fP \u0026#34;$tmp\u0026#34;\n\n    unset editor ext file name tmp`\n\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"utilisation-2\"\u003eUtilisation\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eman2pdf nom-manpage numero-section-manpage\u003c/code\u003e - s\u0026rsquo;il n\u0026rsquo;y a pas de\nnuméro de section, alors la fonction essaye d\u0026rsquo;appeler le manpage de la\nsection 1.\u003c/p\u003e\n\u003cp\u003eExemple : \u003ccode\u003e:$ man2pdf man.conf 5\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"fonction-man2ps\"\u003eFonction man2ps\u003c/h2\u003e\n\u003cp\u003eTesté avec \u003cstrong\u003egs\u003c/strong\u003e, \u003cstrong\u003eghostview\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003eman2ps() {\n\n    editor=gs\n    [ -n \u0026#34;$1\u0026#34; ] \u0026amp;\u0026amp; name=\u0026#34;$1\u0026#34;\n    [ -z \u0026#34;$2\u0026#34; ] \u0026amp;\u0026amp; ext=\u0026#34;1\u0026#34; || ext=\u0026#34;$2\u0026#34;\n\n    tmp=\u0026#34;/tmp/$name.$ext.ps\u0026#34;\n\n    for dir in /usr/share/man /usr/local/man /usr/X11R6/man; do\n        [ -f \u0026#34;$dir/man$ext/$name.$ext\u0026#34; ] \u0026amp;\u0026amp; { file=\u0026#34;$dir/man$ext/$name.$ext\u0026#34;; break; }\n    done\n\n    [ -f \u0026#34;$file\u0026#34; ] \u0026amp;\u0026amp; mandoc -K utf-8 -T ps \u0026#34;$file\u0026#34; \u0026gt; \u0026#34;$tmp\u0026#34;\n    [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; $editor \u0026#34;$tmp\u0026#34; \n\n    unset editor ext file name tmp`\n\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"utilisation-3\"\u003eUtilisation\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eman2ps nom-manpage numero-section-manpage\u003c/code\u003e - s\u0026rsquo;il n\u0026rsquo;y a pas de numéro de section,\nalors la fonction essaye d\u0026rsquo;appeler le manpage de la section 1.\u003c/p\u003e\n\u003cp\u003eExemple : \u003ccode\u003e:$ man2ps dhclient 8\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"fonction-man2doc\"\u003eFonction man2doc\u003c/h2\u003e\n\u003cp\u003eLA fonction qui réunit toutes les précédentes !!!\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003eman2doc() {\n\n    #ed2html=firefox \n    #ed2md=geany \n    #ed2pdf=evince \n    #ed2ps=gs\n\n    [ -n \u0026#34;$1\u0026#34; ] \u0026amp;\u0026amp; format=\u0026#34;$1\u0026#34;\n    [ -n \u0026#34;$2\u0026#34; ] \u0026amp;\u0026amp; name=\u0026#34;$2\u0026#34;\n    [ -z \u0026#34;$3\u0026#34; ] \u0026amp;\u0026amp; nb=\u0026#34;1\u0026#34; || nb=\u0026#34;$3\u0026#34;\n\n    #eval \u0026#34;editor=\\${ed2$format}\u0026#34;\n\n    tmp=\u0026#34;/tmp/$name.$nb.$format\u0026#34;\n    [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; rm -fP \u0026#34;$tmp\u0026#34;\n\n    case \u0026#34;$format\u0026#34; in \n        \u0026#34;md\u0026#34;) type=\u0026#34;markdown\u0026#34; ;;\n        *) type=\u0026#34;$format\u0026#34; ;;\n    esac\n\n    for file in $(find /usr/{local,share,X11R6}/man/ -name $name.$nb); do mandoc -K utf-8 -T \u0026#34;$type\u0026#34; \u0026#34;$file\u0026#34; \u0026gt;\u0026gt; \u0026#34;$tmp\u0026#34;; done\n\n    [ -f \u0026#34;$tmp\u0026#34; ] \u0026amp;\u0026amp; xdg-open \u0026#34;$tmp\u0026#34;    # $editor\n\n    unset editor file format name nb tmp\n\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"utilisation-4\"\u003eUtilisation\u003c/h3\u003e\n\u003cp\u003eÀ la différence des précédentes fonctions, cette dernière cherchera tous\nles manpages correspondants, et les incluera les uns à la suite des autres…\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eman2doc format-fichier nom-manpage numero-section-manpage\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eformat-fichier\u003c/code\u003e : \u003ccode\u003ehtml\u003c/code\u003e, \u003ccode\u003emd\u003c/code\u003e, \u003ccode\u003epdf\u003c/code\u003e, ou \u003ccode\u003eps\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eToujours si le numéro de section n\u0026rsquo;est pas spécifié, la fonction cherchera dans la section 1.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eExemples :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e:$ man2doc html man\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e:$ man2doc pdf doas.conf 5\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e:$ man2doc md makewhatis 8\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e:$ man2doc ps vmm 4\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eInspiré par\n\u003ca href=\"https://miamondo.org/2018/12/24/ouvrir-les-pages-man-directement-dans-son-editeur-pour-un-meilleur-confort-de-lecture/\" rel=\"external\"\u003eMi@mondo\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Astuces pour ouvrir les manpages aux formats HTML, MarkDown, PDF, PS grâce à Mandoc sous OpenBSD","tags":["Mandoc","OpenBSD"],"date_published":"2018-12-28T01:35:16+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-12-25:/fr/sys/openbsd/vm-debian-9-stretch#6c3769fef27942f66913fe72c4a64a429587b06bc5ac055459b3d486f1907ba7","url":"https://it-log.fr.eu.org/fr/sys/openbsd/vm-debian-9-stretch/","title":"[OpenBSD :: Virtualisation] Debian Stretch (9.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. Néanmoins, la FAQ Virtualisation (EN) apparaît à partir d\u0026rsquo;OpenBSD 6.4 - (preuve d\u0026rsquo;une certaine maturité !?)\nVersion : native OS : OpenBSD 6.4, 6.5 Installation DangerATTENTION : 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…\nPetites précisions Il existe au moins deux manières d\u0026rsquo;installer Debian dans une VM.\nla première méthode - la plus simple - par le biais de l\u0026rsquo;outil qemu.\nla seconde native à OpenBSD avec la commande vmctl.\nPrécisions de commandes Pour information, les commandes précédées du symbole $ sont à exécuter en tant qu\u0026rsquo;utilisateur ; celles précédées du symbole # le sont avec des droits administrateurs, soit en tant que root, soit par l\u0026rsquo;usage de la commande doas .\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.\nPré-requis Il 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 vm dans notre répertoire personnel, et nous travaillerons à partir de celui-ci : $ mkdir vm \u0026amp;\u0026amp; cd vm\nBien-sûr, vous pouvez travailler à partir de n\u0026rsquo;importe quel répertoire - débrouillez-vous !\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 : # vmctl create ~/vm/debian.qcow2 -s 10G\n(bien-sûr, vous pouvez changer la taille de la nouvelle VM en spécifiant une autre…)\nTéléchargement de l\u0026rsquo;iso Debian AttentionATTENTION, 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/ Et, modifiez en conséquence le code ci-dessous ! Ensuite, téléchargeons l\u0026rsquo;iso Debian : :$ ftp https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/{debian-9.7.0-amd64-netinst.iso,SHA512SUMS}\nUne fois téléchargée, vérifions sa somme de contrôle :\n:$ sha512 -C SHA512SUMS debian-9.7.0-amd64-netinst.iso (SHA512) debian-9.7.0-amd64-netinst.iso: OK Si OK, alors c\u0026rsquo;est bon… sinon, re-téléchargez !\nAvec Qemu Cette méthode est la plus facile, mais non conventionnelle.\nPour pouvoir créer une VM avec cette méthode (ou tout autre distribution GNU/Linux dedans…), il est nécessaire d\u0026rsquo;utiliser le paquet qemu : :# pkg_add qemu\nPuis exécutez qemu pour faire l\u0026rsquo;installation de Debian dans la VM - que nous ne détaillerons pas, puisque c\u0026rsquo;est exactement comme sur toute machine permettant de faire fonctionner Debian : :$ qemu-system-x86_64 -hda ~/vm/debian.qcow2 -cdrom debian*.iso -boot d à un détail près est qu\u0026rsquo;il vaut mieux à la fin de l\u0026rsquo;installation de Debian ne pas redémarrer par le biais de l\u0026rsquo;installateur Debian, mais de choisir le menu \u0026rsquo;exit\u0026rsquo; pour venir dans le shell, et d\u0026rsquo;exécuter la commande : # halt - ou son équivalent # shutdown -h now - qui permettra d\u0026rsquo;arrêter proprement la VM.\nEnsuite, passons à la configuration… puis démarrons la VM debian : :$ vmctl start debian -c\nPuis une fois connecté, avec des droits administrateurs, il faut modifier le fichier /etc/defaut/grub de telle manière :\nGRUB_TIMEOUT=1 GRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;\u0026#34; GRUB_CMDLINE_LINUX=\u0026#34;console=tty1 console=ttyS0,115200\u0026#34; GRUB_TERMINAL=\u0026#34;console serial\u0026#34; GRUB_SERIAL_COMMAND=\u0026#34;serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1\u0026#34; Puis de mettre à jour grub : # update-grub\nRedémarrez votre debian, et profitez de son usage !\nUne fois terminée, vous pouvez en finir avec la configuration… Voilà !\nAvec vmctl Cette méthode est un peu plus \u0026ldquo;sioux\u0026rdquo;, mais ne nécessite que des outils natifs à OpenBSD.\nNous allons utiliser l\u0026rsquo;image de démarrage avec le fichier initrd modifié pour Xen pour fonctionner avec…\nTéléchargement Téléchargeons les fichiers nécessaires :\n:$ ftp http://ftp.debian.org/debian/dists/stretch/main/installer-amd64/current/images/hd-media/boot.img.gz :$ ftp http://ftp.debian.org/debian/dists/stretch/main/installer-amd64/current/images/netboot/xen/initrd.gz :$ ftp http://ftp.debian.org/debian/pool/main/l/linux/virtio-modules-4.9.0-8-amd64-di_4.9.135-1_amd64.udeb AttentionAu moment où vous lirez ce tutoriel, le nom exact du paquet virtio-modules pourrait avoir changé… donc parcourez le site Debian pour trouver la version la plus récente ! Décompressions Occupons-nous des différents phases de décompression des trois fichiers téléchargés :\n:$ gzip -d initrd.gz :$ mkdir stable :$ cd stable :$ ar -x ../virtio-modules-4.9.0-**-1_amd64.udeb data.tar.xz \u0026lt;= remplacez par le nom du paquet `virtio-modules` que vous avez téléchargé ! :$ xz -d data.tar.xz :$ tar xf data.tar :$ rm data.tar :$ find . | cpio -o -A -H sv4cpio -O ../initrd :$ cd .. :$ gzip -9 initrd :$ gzip -d boot.img.gz Modifications Il nous faut monter le fichier boot.img afin de faire les modifications systèmes nécessaires :\n:# vnconfig vnd1 ~/vm/boot.img :# mount /dev/vnd1i /mnt :# cp initrd.gz /mnt/INITRD.GZ :# sed -i -e \u0026#34;s/\\(.*\\)append vga=788 initrd=initrd.gz --- quiet/\\1append vga=off initrd=initrd.gz --- quiet console=ttyS0,115200n8/\u0026#34; /mnt/TXT.CFG :# umount /mnt :# vnconfig -u vnd1 Ensuite, passons à la configuration… puis, démarrons la VM install.\nDémarrage :$ vmctl start install -c\nLorsque le menu d\u0026rsquo;installation est affiché, choisir Install, puis une fois dans l\u0026rsquo;installateur, appuyez sur la touche ESC/ECHAP pour choisir le menu Execute a shell.\nUne fois dans le shell, il faut taper les commandes qui suivent :\ndepmod modprobe virtio_pci virtio_blk lsmod exit puis, continuer la phase d\u0026rsquo;installation selon vos besoins.\nUne fois l\u0026rsquo;installation terminée, ne redémarrez pas par le biais de l\u0026rsquo;installateur, choisissez à nouveau d\u0026rsquo;exécuter le shell, puis écrivez la commande : # halt afin d\u0026rsquo;arrêter la VM proprement !\nRe-démarrage Maintenant, il faut démarrer la VM debian : $ vmctl start debian -c afin de pouvoir voir le menu de Grub et l\u0026rsquo;éditer - si vous le ratez, vous démarrez en mode initramfs et vous serez bon pour recommencer à démarrer la VM afin d\u0026rsquo;arriver à éditer le Grub !\nIl faut éditer le menu Grub ; tapez sur la touche e puis cherchez toutes les occurrences de vdb pour les transformer en vda - ne touchez pas au numéro qui suit , autrement vous vous retrouveriez au prochain démarrage avec le même problème que décrit ci-dessus… Une fois modifié, appuyez sur les touches CTRL+x pour sortir de l\u0026rsquo;éditeur de Grub et démarrez le système Debian fraîchement installé !\nUne fois connecté, avec des droits administrateurs, il faut éditer le fichier /boot/grub/grub.cfg pour remplacer les mêmes occurrences de vdb en vda, puis d\u0026rsquo;exécuter la commande update-grub.\nPour finir, il faut éditer le fichier /etc/network/interfaces pour remplacer le nom de l\u0026rsquo;interface enp0s4 par enp0s3 : # sed -i -e 's/enp0s4/enp0s3/' /etc/network/interfaces\nMaintenant vous pouvez redémarrer votre système Debian pour en profiter convenablement !\nUne fois terminée, vous pouvez en finir avec la configuration… Voilà !\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; ROOT=\u0026#34;/home/$USER/vm\u0026#34; switch \u0026#34;sw\u0026#34; { interface bridge0 } vm \u0026#34;install\u0026#34; { disable memory 1024M disk $ROOT/boot.img disk $ROOT/debian.qcow2 interface { switch \u0026#34;sw\u0026#34; } owner $USER } vm \u0026#34;debian\u0026#34; { disable memory 1024M disk $ROOT/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 faudra démarrer le service vmd.\nIl 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 : add vether0\nvether0 Le fichier relatif est /etc/hostname.vether0 : inet 192.168.0.1 255.255.255.0\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 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(…) 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 1.1.1.1 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é 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 !\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, vous pouvez faire deux choses utiles liés à l\u0026rsquo;édition du fichier /etc/vm.conf :\nSupprimer/commenter toute écriture relative à la déclaration de la VM install…\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.\nUn 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 !\nDépannage vmctl vmm bios firmware not found Vous n\u0026rsquo;avez tout simplement pas installé le firmware vmm !\nDocumentations Merci de lire la documentation officielle FAQ Virtualisation (EN, [FR][2]) 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 , au besoin… Autres Sources http://www.netzbasis.de/openbsd/vmd-debian/ ","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. \u003cbr\u003e\nNéanmoins, la \u003cstrong\u003eFAQ Virtualisation\u003c/strong\u003e (\u003ca href=\"https://www.openbsd.org/faq/faq16.html\" rel=\"external\"\u003eEN\u003c/a\u003e) apparaît à partir d\u0026rsquo;OpenBSD 6.4 -\n\u003cem\u003e(preuve d\u0026rsquo;une certaine maturité !?)\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\u003e6.5\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\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 tutoriel ne documente pas dans les moindres détails les phases\nd\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 et\nd\u0026rsquo;avoir un minimum de compétences, pour comprendre les liens entre les différentes\nbriques !\u003c/p\u003e\n\u003cp\u003eMerci de votre compréhension…\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"petites-précisions\"\u003ePetites précisions\u003c/h3\u003e\n\u003cp\u003eIl existe au moins deux manières d\u0026rsquo;installer Debian dans une VM.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ela première méthode - \u003cem\u003ela plus simple\u003c/em\u003e - par le biais de l\u0026rsquo;outil \u003ca href=\"/fr/sys/openbsd/vm-debian-9-stretch/#avec-qemu\"\u003eqemu\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela seconde native à OpenBSD avec la commande \u003ca href=\"/fr/sys/openbsd/vm-debian-9-stretch/#avec-vmctl\"\u003evmctl\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"précisions-de-commandes\"\u003ePrécisions de commandes\u003c/h3\u003e\n\u003cp\u003ePour information, les commandes précédées du symbole \u003ccode\u003e$\u003c/code\u003e sont à exécuter en tant\nqu\u0026rsquo;utilisateur ; celles précédées du symbole \u003ccode\u003e#\u003c/code\u003e le sont avec des droits\nadministrateurs, soit en tant que \u003cem\u003eroot\u003c/em\u003e, soit par l\u0026rsquo;usage de la commande\n\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\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, cette\nadresse IP sera l\u0026rsquo;adresse de la passerelle pour l\u0026rsquo;interface réseau de la 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 Debian\nest, par convention \u003ccode\u003e1.1.1.1\u003c/code\u003e. C\u0026rsquo;est celui de Cloudfare. Mais il peut être\ntrès bien tout autre, pourvu qu\u0026rsquo;il soit respectueux de la confidentialité… \u003cbr\u003e\ntel 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 de\nflux DNS vers la VM.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"pré-requis\"\u003ePré-requis\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire que votre machine sur laquelle vous souhaitez virtualiser ait\nun CPU compatible avec les fonctions adéquates. Pour le vérifier, tapez dans\nvotre 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, certains\nCPU 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, cela\nimpacte la virtualisation et rend celle-ci impossible. \u003cbr\u003e\nVous pouvez vous retrouver dans la situation où vous auriez un CPU compatible,\nmais dans les faits, la virtualisation ne pourrait être pleinement 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 \u003cem\u003evm\u003c/em\u003e dans notre répertoire personnel, et\nnous travaillerons à partir de celui-ci : \u003cbr\u003e\n\u003ccode\u003e$ mkdir vm \u0026amp;\u0026amp; cd vm\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eBien-sûr, vous pouvez travailler à partir de n\u0026rsquo;importe quel répertoire - \u003cbr\u003e\ndébrouillez-vous !\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"création-de-limage-qcow2\"\u003eCréation de l\u0026rsquo;image qcow2\u003c/h3\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é \u003cem\u003evmctl\u003c/em\u003e : \u003cbr\u003e\n\u003ccode\u003e# vmctl create ~/vm/debian.qcow2 -s 10G\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e(bien-sûr, vous pouvez changer la taille de la nouvelle VM en spécifiant une\nautre…)\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"téléchargement-de-liso-debian\"\u003eTéléchargement de l\u0026rsquo;iso Debian\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eATTENTION, vérifiez à l\u0026rsquo;URL suivante le nom de l\u0026rsquo;image iso de debian : \u003cbr\u003e\n\u003ccode\u003ehttps://cdimage.debian.org/debian-cd/current/amd64/iso-cd/\u003c/code\u003e \u003cbr\u003e\nEt, modifiez en conséquence le code ci-dessous !\u003c/div\u003e\n\n\u003cp\u003eEnsuite, téléchargeons l\u0026rsquo;iso Debian : \u003cbr\u003e\n\u003ccode\u003e:$ ftp https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/{debian-9.7.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\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ sha512 -C SHA512SUMS debian-9.7.0-amd64-netinst.iso\n(SHA512) debian-9.7.0-amd64-netinst.iso: OK\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi \u003cem\u003eOK\u003c/em\u003e, alors c\u0026rsquo;est bon… \u003cbr\u003e\nsinon, re-téléchargez !\u003c/p\u003e\n\u003ch3 id=\"avec-qemu\"\u003eAvec Qemu\u003c/h3\u003e\n\u003cp\u003eCette méthode est la plus facile, mais non conventionnelle.\u003c/p\u003e\n\u003cp\u003ePour pouvoir créer une VM avec cette méthode \u003cem\u003e(ou tout autre\ndistribution GNU/Linux dedans…)\u003c/em\u003e, il est nécessaire d\u0026rsquo;utiliser le\npaquet \u003cem\u003eqemu\u003c/em\u003e : \u003cbr\u003e\n\u003ccode\u003e:# pkg_add qemu\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis exécutez \u003cem\u003eqemu\u003c/em\u003e pour faire l\u0026rsquo;installation de Debian dans la VM -\n\u003cem\u003eque nous ne détaillerons pas, puisque c\u0026rsquo;est exactement comme sur\ntoute machine permettant de faire fonctionner Debian\u003c/em\u003e : \u003cbr\u003e\n\u003ccode\u003e:$ qemu-system-x86_64 -hda ~/vm/debian.qcow2 -cdrom debian*.iso -boot d\u003c/code\u003e \u003cbr\u003e\nà un détail près est qu\u0026rsquo;il vaut mieux à la fin de l\u0026rsquo;installation de\nDebian ne pas redémarrer par le biais de l\u0026rsquo;installateur Debian, mais de\nchoisir le menu \u0026rsquo;exit\u0026rsquo; pour venir dans le shell, et d\u0026rsquo;exécuter la\ncommande : \u003cbr\u003e\n\u003ccode\u003e# halt\u003c/code\u003e - \u003cbr\u003e\n\u003cem\u003eou son équivalent \u003ccode\u003e# shutdown -h now\u003c/code\u003e\u003c/em\u003e - qui permettra d\u0026rsquo;arrêter proprement la VM.\u003c/p\u003e\n\u003cp\u003eEnsuite, passons à la \u003ca href=\"/fr/sys/openbsd/vm-debian-9-stretch/#configuration\"\u003econfiguration\u003c/a\u003e… \u003cbr\u003e\npuis démarrons la VM \u003cem\u003edebian\u003c/em\u003e : \u003cbr\u003e\n\u003ccode\u003e:$ vmctl start debian -c\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis une fois connecté, avec des droits administrateurs, il faut modifier le\nfichier \u003ccode\u003e/etc/defaut/grub\u003c/code\u003e 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\u003e\u003cspan style=\"color:#ef6155\"\u003eGRUB_TIMEOUT\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\"\u003eGRUB_CMDLINE_LINUX_DEFAULT\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\"\u003eGRUB_CMDLINE_LINUX\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;console=tty1 console=ttyS0,115200\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eGRUB_TERMINAL\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;console serial\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eGRUB_SERIAL_COMMAND\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis de mettre à jour grub : \u003ccode\u003e# update-grub\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eRedémarrez votre debian, et profitez de son usage !\u003c/p\u003e\n\u003cp\u003eUne fois terminée, vous pouvez en \u003ca href=\"/fr/sys/openbsd/vm-debian-9-stretch/#pour-finir\"\u003efinir\u003c/a\u003e avec la configuration… \u003cbr\u003e\nVoilà !\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"avec-vmctl\"\u003eAvec vmctl\u003c/h3\u003e\n\u003cp\u003eCette méthode est un peu plus \u0026ldquo;sioux\u0026rdquo;, mais ne nécessite que des outils natifs\nà OpenBSD.\u003c/p\u003e\n\u003cp\u003eNous allons utiliser l\u0026rsquo;image de démarrage avec le fichier \u003ccode\u003einitrd\u003c/code\u003e modifié pour\nXen pour fonctionner avec…\u003c/p\u003e\n\u003ch3 id=\"téléchargement\"\u003eTéléchargement\u003c/h3\u003e\n\u003cp\u003eTéléchargeons les fichiers né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:$ ftp http://ftp.debian.org/debian/dists/stretch/main/installer-amd64/current/images/hd-media/boot.img.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ftp http://ftp.debian.org/debian/dists/stretch/main/installer-amd64/current/images/netboot/xen/initrd.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ftp http://ftp.debian.org/debian/pool/main/l/linux/virtio-modules-4.9.0-8-amd64-di_4.9.135-1_amd64.udeb\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\"\u003eAu moment où vous lirez ce tutoriel, le nom exact du paquet \u003ccode\u003evirtio-modules\u003c/code\u003e\npourrait avoir changé… \u003cbr\u003e\ndonc parcourez le site \u003ca href=\"http://ftp.debian.org/debian/pool/main/l/linux/\" rel=\"external\"\u003eDebian\u003c/a\u003e\npour trouver la version la plus récente !\u003c/div\u003e\n\n\u003ch3 id=\"décompressions\"\u003eDécompressions\u003c/h3\u003e\n\u003cp\u003eOccupons-nous des différents phases de décompression des trois fichiers\ntéléchargés :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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:$ gzip -d initrd.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ mkdir stable\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ cd stable\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ar -x ../virtio-modules-4.9.0-**-1_amd64.udeb data.tar.xz \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e remplacez par le nom du paquet \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003evirtio-modules\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e que vous avez téléchargé !\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ xz -d data.tar.xz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ tar xf data.tar\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ rm data.tar\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ find . | cpio -o -A -H sv4cpio -O ../initrd\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:$ gzip -9 initrd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ gzip -d boot.img.gz\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"modifications\"\u003eModifications\u003c/h3\u003e\n\u003cp\u003eIl nous faut monter le fichier \u003ccode\u003eboot.img\u003c/code\u003e afin de faire les modifications\nsystèmes né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:# vnconfig vnd1 ~/vm/boot.img\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mount /dev/vnd1i /mnt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# cp initrd.gz /mnt/INITRD.GZ\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# sed -i -e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;s/\\(.*\\)append vga=788 initrd=initrd.gz --- quiet/\\1append vga=off initrd=initrd.gz --- quiet console=ttyS0,115200n8/\u0026#34;\u003c/span\u003e /mnt/TXT.CFG\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# umount /mnt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# vnconfig -u vnd1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, passons à la \u003ca href=\"/fr/sys/openbsd/vm-debian-9-stretch/#configuration\"\u003econfiguration\u003c/a\u003e… \u003cbr\u003e\npuis, démarrons la VM \u003cem\u003einstall\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"démarrage\"\u003eDémarrage\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e:$ vmctl start install -c\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLorsque le menu d\u0026rsquo;installation est affiché, choisir \u003cem\u003eInstall\u003c/em\u003e, puis une fois\ndans l\u0026rsquo;installateur, appuyez sur la touche \u003ckey\u003eESC/ECHAP\u003c/key\u003e pour choisir le\nmenu \u003cem\u003eExecute a shell\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eUne fois dans le shell, il faut taper les commandes qui suivent :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edepmod\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emodprobe virtio_pci virtio_blk\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elsmod\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexit\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003epuis, continuer la phase d\u0026rsquo;installation 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 à nouveau d\u0026rsquo;exécuter le shell, puis écrivez la commande : \u003ccode\u003e# halt\u003c/code\u003e\nafin d\u0026rsquo;arrêter la VM proprement !\u003c/p\u003e\n\u003ch3 id=\"re-démarrage\"\u003eRe-démarrage\u003c/h3\u003e\n\u003cp\u003eMaintenant, il faut démarrer la VM \u003cem\u003edebian\u003c/em\u003e : \u003cbr\u003e\n\u003ccode\u003e$ vmctl start debian -c\u003c/code\u003e \u003cbr\u003e\nafin de pouvoir voir le menu de Grub et l\u0026rsquo;éditer - \u003cem\u003esi vous le ratez, vous\ndémarrez en mode \u003ccode\u003einitramfs\u003c/code\u003e et vous serez bon pour recommencer à démarrer la\nVM afin d\u0026rsquo;arriver à éditer le Grub !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eIl faut éditer le menu Grub ; tapez sur la touche \u003ckey\u003ee\u003c/key\u003e puis cherchez\ntoutes les occurrences de \u003ccode\u003evdb\u003c/code\u003e pour les transformer en \u003ccode\u003evda\u003c/code\u003e -\n\u003cspan class=\"red\"\u003ene touchez pas au numéro qui suit\u003c/span\u003e\n, autrement vous\nvous retrouveriez au prochain démarrage avec le même problème que décrit ci-dessus… \u003cbr\u003e\nUne fois modifié, appuyez sur les touches \u003ckey\u003eCTRL+x\u003c/key\u003e pour sortir de\nl\u0026rsquo;éditeur de Grub et démarrez le système Debian fraîchement installé !\u003c/p\u003e\n\u003cp\u003eUne fois connecté, avec des droits administrateurs, il faut éditer le fichier\n\u003ccode\u003e/boot/grub/grub.cfg\u003c/code\u003e pour remplacer les mêmes occurrences de \u003ccode\u003evdb\u003c/code\u003e en \u003ccode\u003evda\u003c/code\u003e,\npuis d\u0026rsquo;exécuter la commande \u003ccode\u003eupdate-grub\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePour finir, il faut éditer le fichier \u003ccode\u003e/etc/network/interfaces\u003c/code\u003e pour\nremplacer le nom de l\u0026rsquo;interface \u003ccode\u003eenp0s4\u003c/code\u003e par \u003ccode\u003eenp0s3\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003e# sed -i -e 's/enp0s4/enp0s3/' /etc/network/interfaces\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMaintenant vous pouvez redémarrer votre système Debian pour en profiter\nconvenablement !\u003c/p\u003e\n\u003cp\u003eUne fois terminée, vous pouvez en \u003ca href=\"/fr/sys/openbsd/vm-debian-9-stretch/#pour-finir\"\u003efinir\u003c/a\u003e avec la configuration… \u003cbr\u003e\nVoilà !\u003c/p\u003e\n\u003chr\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 votre\ncompte identifiant dans la variable \u003ccode\u003eUSER\u003c/code\u003e, cela permettra à votre utilisateur\nd\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-sh\" data-lang=\"sh\"\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\"\u003eROOT\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;install\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 1024M\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    disk \u003cspan style=\"color:#ef6155\"\u003e$ROOT\u003c/span\u003e/boot.img\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    disk \u003cspan style=\"color:#ef6155\"\u003e$ROOT\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\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evm \u003cspan style=\"color:#48b685\"\u003e\u0026#34;debian\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 1024M\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    disk \u003cspan style=\"color:#ef6155\"\u003e$ROOT\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-9-stretch/#interfaces-reseaux\"\u003einterfaces réseaux\u003c/a\u003e, il faudra\ndémarrer le service \u003ccode\u003evmd\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl est assurément utile de s\u0026rsquo;occuper de la \u003ca href=\"/fr/sys/openbsd/vm-debian-9-stretch/#nat\"\u003etraduction d\u0026rsquo;adresses réseaux\u003c/a\u003e,\net aussi des \u003ca href=\"/fr/sys/openbsd/vm-debian-9-stretch/#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 qui\npermettront 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 classe\nprivée IPv4 \u003cem\u003e(A: 10.0/8 ; B: 172.0.0/16 ; C: 192.168.0.0/24)\u003c/em\u003e - nous utiliserons\nun type de classe C privée, telle que \u003ccode\u003e192.168.0.x*\u003c/code\u003e. \u003cbr\u003e\n\u003cem\u003eAprès tout, nous n\u0026rsquo;avons pas plus de 256 VM à administrer\u003c/em\u003e… ;)\u003c/p\u003e\n\u003ch3 id=\"bridge0\"\u003ebridge0\u003c/h3\u003e\n\u003cp\u003eLe fichier relatif est \u003ccode\u003e/etc/hostname.bridge0\u003c/code\u003e : \u003ccode\u003eadd vether0\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"vether0\"\u003evether0\u003c/h3\u003e\n\u003cp\u003eLe fichier relatif est \u003ccode\u003e/etc/hostname.vether0\u003c/code\u003e : \u003ccode\u003einet 192.168.0.1 255.255.255.0\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, puis\ndé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\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# sysctl net.inet.ip.forwarding=1\n:# sysctl net.inet6.ip6.forwarding=1\n\u003c/code\u003e\u003c/pre\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, n\u0026rsquo;activez pas\nla 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 \u003cem\u003e/etc/pf.conf\u003c/em\u003e ajouter\nau moins les règles suivantes :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e(…)\n\nmatch out on egress from vether0:network to any nat-to (egress)\n\n(…)\n\npass in quick proto { udp tcp } from vether0:network to any port domain rdr-to 1.1.1.1 port domain\npass on vether0 from 127.0.0.1 to any\npass on vether0 from vether0:network to any\n\n(…)\n\u003c/code\u003e\u003c/pre\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 du\ngroupe \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 le réseau lié\nà l\u0026rsquo;interface \u003ccode\u003evether0\u003c/code\u003e soit redirigé vers le service en question. \u003cbr\u003e\n\u003cem\u003eL\u0026rsquo;adresse IPv4 \u003ccode\u003e1.1.1.1\u003c/code\u003e est celle du serveur DNS de Cloudflare ; elle\npeut être très bien celle de tout autre serveur DNS\u003c/em\u003e.\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 sur\nl\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=\"pour-finir\"\u003ePour finir\u003c/h2\u003e\n\u003cp\u003eUne fois que vous avez fini l\u0026rsquo;installation de Debian dans votre VM, que vous\navez fait les derniers réglages nécessaires pour son bon fonctionnement, vous\npouvez faire deux choses utiles liés à l\u0026rsquo;édition du 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 de la VM \u003ccode\u003einstall\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 - si vous\ndésirez que la VM correspondante démarre, soit lors du démarrage de votre\nmachine, si et seulement si le service \u003ccode\u003evmd\u003c/code\u003e est bien actif et démarré lors\ndu processus de démarrage machine, soit lorsque vous redémarrez le service\n\u003ccode\u003evmd\u003c/code\u003e lui-même par vos soins.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUn tout petit laïus sur la commande \u003cem\u003evmctl\u003c/em\u003e : \u003ccode\u003e$ man vmctl\u003c/code\u003e pour découvrir les\ndifférentes options bien utiles, dont \u003cem\u003eshow\u003c/em\u003e, \u003cem\u003estatus\u003c/em\u003e, \u003cem\u003estart\u003c/em\u003e, et \u003cem\u003estop\u003c/em\u003e qu\u0026rsquo;il\nsemble nécessaire de maîtriser !\u003c/p\u003e\n\u003chr\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\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMerci de lire la documentation officielle \u003cstrong\u003eFAQ Virtualisation\u003c/strong\u003e\n(\u003ca href=\"https://www.openbsd.org/faq/faq16.html\" rel=\"external\"\u003eEN\u003c/a\u003e, [FR][2]) afin de bien comprendre le sujet, les différentes\ninformations nécessaires à 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,\nrelative à :\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\" title=\"Page du Manuel OpenBSD pour : doas\"\u003edoas\u003c/a\u003e\n, au besoin…\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"autres-sources\"\u003eAutres Sources\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.netzbasis.de/openbsd/vmd-debian/\" rel=\"external\"\u003ehttp://www.netzbasis.de/openbsd/vmd-debian/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Virtualiser Debian Stretch (9.x) sous OpenBSD grâce à vmd","tags":["OpenBSD","Virtualisation","Debian","Stretch","vmd"],"date_published":"2018-12-25T18:04:24+01:00","date_modified":"2019-10-15T23:43:24+01:00"},{"id":"tag:doc.huc.fr.eu.org,2018-12-25:/fr/sys/openbsd/nextcloud#e77fd38a271b7d1f883fa7852e6cacc33e62153e7c20dfb614a127a768441088","url":"https://it-log.fr.eu.org/fr/sys/openbsd/nextcloud/","title":"OpenBSD : Service Nextcloud / nginx ( + Office Online, Talk )","author":{"name":"Stéphane HUC"},"content_text":"Description Nextcloud est un logiciel de nuage informatique afin de partager depuis et sur Internet des fichiers mais aussi un ou plusieurs agendas, des contacts, des notes, etc… de manière modulaire.\nSite web : https://www.nextcloud.com Version installable : depuis les paquets : 6.4 : 14.0.1 ; 6.5 : 15.0.5p1 ; 6.6 : 17.0 depuis le site web ! OS : Testé sur OpenBSD 6.3 =\u0026gt; 6.6 Installation AttentionATTENTION : Ce tutoriel ne documente pas dans les moindres détails les phases d\u0026rsquo;installation, voire de configuration. Ce n\u0026rsquo;est pas accessible aux nouveaux utilisateurs d\u0026rsquo;OpenBSD…\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.\nPar les paquets Installez le paquet nextcloud.\nPar l\u0026rsquo;archive officielle Par convention, disons que nous déposerons l\u0026rsquo;archive dans le répertoire /var/www/htdocs/nextcloud - que vous pouvez/devez modifier/adapter à votre besoin…\n:# mkdir /var/www/htdocs/nextcloud :$ cd /var/www/htdocs/nextcloud Téléchargeons l\u0026rsquo;archive et le fichier de sommes de contrôle sha256 adéquate :\n:$ ftp https://download.nextcloud.com/server/releases/nextcloud-17.0.1.zip{,.sha256}\nPuis vérifions que l\u0026rsquo;archive est bien téléchargée :\n:$ sha256 -C nextcloud-*.sha256 (SHA256) nextcloud-17.0.1.zip: OK Si le message est identique, alors l\u0026rsquo;archive téléchargée est bonne. Nous pouvons donc l\u0026rsquo;utiliser :\n:$ unzip nextcloud*.zip :# mv nextcloud /var/www/htdocs/ :# chown -R www:daemon /var/www/htdocs/nextcloud PHP Il est nécessaire d\u0026rsquo;installer les paquets PHP suivants, tels que : php-bz2 php-curl php-gd php-pdo_sqlite php-intl php-zip pecl72-redis redis libmcrypt oniguruma icu4c-wwwdata\nInfoIl est possible d\u0026rsquo;installer PHP 7.3 ; faites attention à la version du paquet pecl7*-redis ! Bibliothèque sodium Certaines options de Nextcloud nécessitent la gestion de bibliothèque cryptographique ; il nous faut installer la libsodium\nInfoPour PHP 7.x, il est nécessaire de rajouter la bibliothèque pecl7*-libsodium (où 7* est à remplacer par le numéro de version de PHP-7) - qui n\u0026rsquo;existe plus dès PHP 7.3, car ce dernier gére correctement la libsodium. Activer les extensions PHP Ensuite, il faut activer les différentes extensions :\n:$ cd /etc/php-7.3.sample :# for i in *; do ln -sf ../php-7.3.sample/$i ../php-7.2/; done Puis, redémarrer le service PHP-FPM.\nGestion du service PHP Activer le service le service PHP-FPM php73_fpm !\nBases de données Par défaut, Nextcloud fonctionne avec sqlite ; veillez à ce que le package nécessaire soit installé : sqlite3 php-pdo_sqlite php-pdo_odbc\nNéanmoins Nextcloud fonctionne aussi avec les bases de données MySQL/MariaDB, PostgreSQL… à vous de choisir et d\u0026rsquo;installer les paquets correspondants !\nDans tous les cas, il faudra activer les nouvelles extensions php et redémarrer le service adhoc.\nConfiguration Avec nginx La documentation officielle de Nextcloud pour nginx étant bien faite, je vous laisse la regarder !\nFaites simplement attention à bien changer la valeur de root pour qu\u0026rsquo;elle corresponde à votre racine, ici /var/www/htdocs/nextcloud et à adaptez le reste à votre besoin.\nRetrouvez les règles principales de nginx au-travers de ce document que je partage ! Il est bien-sûr nécessaire de l\u0026rsquo;intégrer à votre schéma server…\nPHP-FPM Il est nécessaire, pour que Nextcloud fonctionne bien, de configurer votre fichier php-fpm afin d\u0026rsquo;ajouter :\nallow_url_fopen = on\nenv[PATH] = /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin\npost_max_size = 512M\nupload_max_filesize = 512M\nDe même, si vous utilisez la directive open_basedir, veillez à autoriser l\u0026rsquo;accès à /dev/urandom.\nVeuillez aussi lire les recommandations suivantes : Tune PHP-FPM et Enable PHP OPcache\nRedémarrez le service PHP-FPM…\nNextcloud Chroot PHP Étant donné que PHP est chrooté, la commande occ, ainsi que les jobs cron échouent.\nLorsque occ est exécuté, vous obtenez au moins ce message d\u0026rsquo;erreur :\nCitation :\nYour data directory is invalid Ensure there is a file called \u0026ldquo;.ocdata\u0026rdquo; in the root of the data directory.\nCannot create \u0026ldquo;data\u0026rdquo; directory This can usually be fixed by giving the webserver write access to the root directory. See https://docs.nextcloud.com/server/16/go.php?to=admin-dir_permissions\nRésoudre ce problème est simple : il suffit d\u0026rsquo;éditer le fichier de config de nextcloud, nextcloud/config/config.php pour modifier la valeur de la variable datadirectory. (cf : Nextcloud Php Chroot OpenBSD (astuce) )\nBien sûr, le chemin /data doit correspondre à votre cas, surtout si vous l\u0026rsquo;avez déplacé hors de la racine nextcloud - ce qui est recommandé !\nCe changement étant fait, vous pouvez utiliser sans soucis la commande occ.\nGestion des applications Collabora/CODE À quoi sert Collabora CODE ?\nÀ pouvoir éditer les documents bureautique dans Nextcloud directement. Malheureusement, ne cherchez pas : cela ne fonctionne pas nativement sur OpenBSD !\nJoujou dans la VM Le moyen : dans une VM ! :p\nDeux méthodes Il existe deux méthodes pour pouvoir utiliser Collabora CODE :\nla méthode facile : au-travers d\u0026rsquo;une image docker installable sur Debian\nune méthode longue mais simple, grâce à ce projet officeonline-install.sh\nInfoDe plus, je ne propose des modifications QUE pour nginx ! Par Docker AttentionJe ne vous apprendrais pas à utiliser Docker ! Et, je ne recommande pas du tout cette possibilité… si vous avez envie de rajouter une couche de problèmes, libre à vous ! Une fois dans votre VM Debian, il faut installer docker puis l\u0026rsquo;image fournie par les soins de Collabora.\n:# apt install docker-ce :$ docker pull collabora/code Ensuite il faut exécuter la commande suivante en l\u0026rsquo;adaptant au nom de domaine où se trouve votre instance de Nextcloud : :$ docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=cloud\\\\.nextcloud\\\\.com' --restart always --cap-add MKNOD collabora/code\nAstuceJe propose de créer un petit script shell qui permettra toute modification aisément de la commande au cas où :\n#!/bin/sh docker run -t -d -p 127.0.0.1:9980:9980 -e \u0026#39;domain=nom-domaine.tld\u0026#39; \\--restart always \\--cap-add MKNOD collabora/code Iptables Il est très probable qu\u0026rsquo;il faille modifier iptables tel que, par exemple :\niptables -A FORWARD -i docker0 -o enp0s3 -j ACCEPT iptables -A FORWARD -i enps0s3 -o docker0 -j ACCEPT iptables -A INPUT -i docker0 -j ACCEPT Tests réseaux Depuis votre machine hôte, normalement il est possible de pinger la VM et de tester une requête CURL.\n:$ ping -c3 192.168.0.2 PING 192.168.0.2 (192.168.0.2): 56 data bytes 64 bytes from 192.168.0.2: icmp_seq=0 ttl=64 time=0.254 ms 64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.278 ms 64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.301 ms --- 192.168.0.2 ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/std-dev = 0.254/0.278/0.301/0.019 ms :$ curl -Iv http://192.168.0.2:9980 * Rebuilt URL to: http://192.168.0.2:9980/ * Trying 192.168.0.2... * TCP_NODELAY set * Connected to 192.168.0.2 (192.168.0.2) port 9980 (#0) \u0026gt; HEAD / HTTP/1.1 \u0026gt; Host: 192.168.0.2:9980 \u0026gt; User-Agent: curl/7.61.1 \u0026gt; Accept: */* \u0026gt; * Empty reply from server * Connection #0 to host 192.168.0.2 left intact curl: (52) Empty reply from server Si curl répond ainsi, c\u0026rsquo;est que cela semble bon !\nMaintenant, passons aux modifications du serveur nginx, puis à l\u0026rsquo;administration de Nextcloud.\nUpdate docker Récupère la nouvelle image : $ docker pull collabora/code\nArrêt de l\u0026rsquo;image en cours : :$ docker container ls :$ docker container stop CONTAINER_ID, ou NAMESfonctionne aussi \\:$ docker container rm CONTAINER_ID, ou NAMES`\nOn relance la commande docker run…, vue précédemment ci-dessus !\nModification nginx Les modifications des règles location pour nginx sont fournies dans ce document…\nVeillez à remplacer les écritures http://localhost, par votre schéma\nadresse IPv4 de votre VM ! Puis relancer le service nginx… et administrons Nextcloud !\nPar script shell officeonline Il suffit de cloner le dépôt et d\u0026rsquo;exécuter le script shell officeonline-install.sh.\nL\u0026rsquo;intérêt de ce script est d\u0026rsquo;installer tout ce qui est nécessaire afin de se débarrasser des limitations fournies dans le projet Docker de l\u0026rsquo;entreprise Collabora.\n$ git clone https://github.com/husisusi/officeonlin-install.sh.git $ cd officeonlin-install.sh AttentionATTENTION, ce script demande de grosses ressources machine car la phase de compilation et d\u0026rsquo;installation se déroule durant des heures !\nun minimum de 3.7 Go de RAM un minimum de 13 Go d\u0026rsquo;espace disque vide… Voir le projet sur le forum d\u0026rsquo;entraide de Nextcloud…\nLes valeurs actuellement fonctionnelles, sur une Debian Stretch, du fichier de configuration officeonline-install.cfg sont celles-ci: \\\nset_online_regex=\u0026#39;collabora/collabora-online-4$\u0026#39; #CODE 4 Branch lool_src_commit=\u0026#39;173510fdbf6f52d1d6288b809c8d14bc630afd20\u0026#39; #CODE-4-RC2 set_core_regex=\u0026#39;cp-6.0$\u0026#39; #LibO 6.0.x AttentionATTENTION, ces valeurs peuvent changer très rapidement… veuillez toujours vérifier soit sur le forum d\u0026rsquo;entraide de Nextcloud, soit sur le projet d\u0026rsquo;OfficeOnline. Pensez à modifier aussi la valeur de allowed_domains en début de fichier, en faisant correspondre avec le nom de domaine qui gère votre nextcloud ou le service collabora s\u0026rsquo;il est sur un serveur distinct.\nUne fois le fichier de configuration modifié, exécutez la commande suivante : :# officeonline-install.sh -c officeonline-install.cfg\nPuis, patientez le temps de la phase de compilation et d\u0026rsquo;installation…\nSi à la fin, vous avez un message ressemblant au suivant, alors c\u0026rsquo;est bon :\n(…) ### loolwsd is running. Enjoy!!! Service will be stopped after this ### COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME loolwsd 19422 lool 17u IPv6 320498 0t0 TCP *:9980 (LISTEN) # Redémarrez votre VM, vérifiez votre config nginx, puis modifiez votre configuration de Nextcloud…\nModification Nextcloud Se connecter à l\u0026rsquo;interface web de Nextcloud en tant qu\u0026rsquo;administrateur, puis dans le menu Applications \u0026gt; Section Office \u0026amp; text/Bureautique et installer l\u0026rsquo;application Collabora Office.\nEnsuite, choisir le menu Settings/Paramètres \u0026gt; Collabora Online et spécifier le nom du domaine sur lequel fonctionne la VM Debian ; il doit correspondre ABSOLUMENT selon votre choix de configuration, soit :\nà la mention domain que vous avez rempli lors de l\u0026rsquo;exécution du containeur Docker… à la mention allowed_domains remplie pour la configuration du script officeonline… Talk Pour pouvoir communiquer par vidéo et/ou par chat, il faut installer l\u0026rsquo;application officielle Talk avec un compte administrateur depuis l\u0026rsquo;interface d\u0026rsquo;administration de Nextcloud.\nEnsuite, il faut configurer un serveur Turn\nPour finir, chaque utilisateur inscrit de votre nuage informatique pourra communiquer avec un autre, soit à partir de l\u0026rsquo;application Nextcloud Talk sur un smartphone, soit à partir de l\u0026rsquo;interface web de Nextcloud une fois connecté.\nTurn L\u0026rsquo;installation d\u0026rsquo;un serveur STUN/TURN, pour que l\u0026rsquo;application Talk fonctionne, est expliqué dans mon tutoriel OpenBSD : Service TURN .\nEnsuite, il est nécessaire de paramétrer Nextcloud. Connectez-vous à son interface en tant qu\u0026rsquo;administrateur, puis choisissez le menu Settings/Paramètres \u0026gt; Talk/Discussion.\nVoici en image l\u0026rsquo;interface : Nextcloud : Serveurs STUN Écrivez dans les champs :\nServeur STUN, écrivez : nom-domaine.tld:3478\nServeur TURN, écrivez : nom-domaine.tld:5349, puis le champ suivant le secret d\u0026rsquo;authentification que vous avez configuré pour l\u0026rsquo;option static-auth-secret dans le fichier de configuration du serveur Turn. Puis changez si besoin les protocoles utilisés.\nAttentionBien-sûr, l\u0026rsquo;inscription nom-domaine.tld est à remplacer par votre véritable nom de domaine où le serveur Turn est installé ! Quant au numéro de port du serveur STUN, et du serveur TURN, mettez ceux configurés dans le fichier du serveur Turn ! Une fois configuré, il n\u0026rsquo;y a plus qu\u0026rsquo;à utiliser l\u0026rsquo;application Nextcloud Talk soit sur votre smartphone, soit à-partir de l\u0026rsquo;interface web de Nextcloud depuis votre compte.\nRemerciements Source:\nhttps://nextcloud.com/collaboraonline/ https://www.collaboraoffice.com/code/nginx-reverse-proxy/ https://help.nextcloud.com/t/howto-setup-nextcloud-talk-with-turn-server/30794 https://www.apb-informatique.fr/nextcloud-installation-de-lapplication-collabora-online/ ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eNextcloud\u003c/strong\u003e est un logiciel de nuage informatique afin de partager depuis et\nsur Internet des fichiers mais aussi un ou plusieurs agendas, des contacts, des\nnotes, etc… de manière modulaire.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web : \u003ca href=\"https://www.nextcloud.com\" rel=\"external\"\u003ehttps://www.nextcloud.com\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVersion installable :\n\u003cul\u003e\n\u003cli\u003edepuis les paquets : \u003cstrong\u003e6.4\u003c/strong\u003e : \u003cem\u003e14.0.1\u003c/em\u003e ; \u003cstrong\u003e6.5\u003c/strong\u003e : \u003cem\u003e15.0.5p1\u003c/em\u003e ; \u003cstrong\u003e6.6\u003c/strong\u003e : \u003cem\u003e17.0\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003edepuis le \u003ca href=\"https://nextcloud.com/install/#instructions-server\" rel=\"external\"\u003esite web\u003c/a\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eOS : Testé sur OpenBSD \u003cstrong\u003e6.3\u003c/strong\u003e =\u0026gt; \u003cstrong\u003e6.6\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"installation\"\u003eInstallation\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\u003eATTENTION\u003c/strong\u003e : Ce tutoriel ne documente pas dans les moindres détails les phases\nd\u0026rsquo;installation, voire de configuration. Ce n\u0026rsquo;est pas accessible aux nouveaux\nutilisateurs d\u0026rsquo;OpenBSD…\u003c/p\u003e\n\u003cp\u003eIl est \u003cstrong\u003eVRAIMENT\u003c/strong\u003e nécessaire de faire preuve de réflexion, discernement et\nd\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\u003ch4 id=\"par-les-paquets\"\u003ePar les paquets\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 paquet \u003cstrong\u003enextcloud\u003c/strong\u003e.\u003c/p\u003e\n\u003ch4 id=\"par-larchive-officielle\"\u003ePar l\u0026rsquo;archive officielle\u003c/h4\u003e\n\u003cp\u003ePar convention, disons que nous déposerons l\u0026rsquo;archive dans le répertoire\n\u003ccode\u003e/var/www/htdocs/nextcloud\u003c/code\u003e - \u003cem\u003eque vous pouvez/devez modifier/adapter à votre besoin\u003c/em\u003e…\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# mkdir /var/www/htdocs/nextcloud\n:$ cd /var/www/htdocs/nextcloud\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTéléchargeons l\u0026rsquo;archive et le fichier de sommes de contrôle sha256 adéquate :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ ftp https://download.nextcloud.com/server/releases/nextcloud-17.0.1.zip{,.sha256}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis vérifions que l\u0026rsquo;archive est bien téléchargée :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ sha256 -C nextcloud-*.sha256\n(SHA256) nextcloud-17.0.1.zip: OK\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi le message est identique, alors l\u0026rsquo;archive téléchargée est bonne.\nNous pouvons donc l\u0026rsquo;utiliser :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ unzip nextcloud*.zip\n:# mv nextcloud /var/www/htdocs/\n:# chown -R www:daemon /var/www/htdocs/nextcloud\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"php\"\u003ePHP\u003c/h4\u003e\n\u003cp\u003eIl est nécessaire 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\nles paquets PHP suivants, tels que : \u003cbr\u003e\n\u003cstrong\u003ephp-bz2 php-curl php-gd php-pdo_sqlite php-intl php-zip pecl72-redis redis libmcrypt oniguruma icu4c-wwwdata\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 est possible d\u0026rsquo;installer PHP 7.3 ; faites attention à la version du paquet\n\u003ccode\u003epecl7*-redis\u003c/code\u003e !\u003c/div\u003e\n\n\u003ch5 id=\"bibliothèque-sodium\"\u003eBibliothèque sodium\u003c/h5\u003e\n\u003cp\u003eCertaines options de Nextcloud nécessitent la gestion de bibliothèque\ncryptographique ; il nous faut\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 la \u003cstrong\u003elibsodium\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\"\u003ePour PHP 7.x, il est nécessaire de rajouter la bibliothèque \u003ccode\u003epecl7*-libsodium\u003c/code\u003e\n\u003cem\u003e(où 7* est à remplacer par le numéro de version de PHP-7)\u003c/em\u003e - qui n\u0026rsquo;existe plus\ndès PHP 7.3, car ce dernier gére correctement la libsodium.\u003c/div\u003e\n\n\u003ch5 id=\"activer-les-extensions-php\"\u003eActiver les extensions PHP\u003c/h5\u003e\n\u003cp\u003eEnsuite, il faut activer les différentes extensions :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ cd /etc/php-7.3.sample\n:# for i in *; do ln -sf ../php-7.3.sample/$i ../php-7.2/; done\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuis, redémarrer le service PHP-FPM.\u003c/p\u003e\n\u003ch3 id=\"gestion-du-service-php\"\u003eGestion du service PHP\u003c/h3\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 le service\u003c/a\u003e\n\nle service PHP-FPM \u003cstrong\u003ephp73_fpm\u003c/strong\u003e !\u003c/p\u003e\n\u003ch4 id=\"bases-de-données\"\u003eBases de données\u003c/h4\u003e\n\u003cp\u003ePar défaut, Nextcloud fonctionne avec sqlite ; veillez à ce que le\npackage nécessaire 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 : \u003cbr\u003e\n\u003cstrong\u003esqlite3 php-pdo_sqlite php-pdo_odbc\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eNéanmoins Nextcloud fonctionne aussi avec les bases de données MySQL/MariaDB,\nPostgreSQL… \u003cbr\u003e\nà vous de choisir et d\u0026rsquo;installer les paquets correspondants !\u003c/p\u003e\n\u003cp\u003eDans tous les cas, il faudra \u003ca href=\"/fr/sys/openbsd/nextcloud/#activer-les-extensions-php\"\u003eactiver les nouvelles extensions php\u003c/a\u003e\net redémarrer le service adhoc.\u003c/p\u003e\n\u003ch3 id=\"configuration\"\u003eConfiguration\u003c/h3\u003e\n\u003ch4 id=\"avec-nginx\"\u003eAvec nginx\u003c/h4\u003e\n\u003cp\u003eLa documentation officielle de \u003ca href=\"https://docs.nextcloud.com/server/stable/admin_manual/installation/nginx.html\" rel=\"external\"\u003eNextcloud pour nginx\u003c/a\u003e\nétant bien faite, je vous laisse la regarder !\u003c/p\u003e\n\u003cp\u003eFaites simplement attention à bien changer la valeur de \u003ccode\u003eroot\u003c/code\u003e pour qu\u0026rsquo;elle\ncorresponde à votre racine, ici \u003ccode\u003e/var/www/htdocs/nextcloud\u003c/code\u003e et à adaptez le\nreste à votre besoin.\u003c/p\u003e\n\u003cp\u003eRetrouvez les règles principales de nginx au-travers de ce\n\u003ca href=\"https://cld.stephane-huc.net/s/qi9fc3sm6aRpHiq\" rel=\"external\"\u003edocument\u003c/a\u003e\nque je partage ! \u003cbr\u003e\nIl est bien-sûr nécessaire de l\u0026rsquo;intégrer à votre schéma \u003ccode\u003eserver\u003c/code\u003e…\u003c/p\u003e\n\u003ch4 id=\"php-fpm\"\u003ePHP-FPM\u003c/h4\u003e\n\u003cp\u003eIl est nécessaire, pour que Nextcloud fonctionne bien, de configurer\nvotre fichier php-fpm afin d\u0026rsquo;ajouter :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eallow_url_fopen = on\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eenv[PATH] = /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003epost_max_size = 512M\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eupload_max_filesize = 512M\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDe même, si vous utilisez la directive \u003ccode\u003eopen_basedir\u003c/code\u003e, veillez à autoriser\nl\u0026rsquo;accès à \u003ccode\u003e/dev/urandom\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVeuillez aussi lire les recommandations suivantes : \u003ca href=\"https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/server_tuning.html#tune-php-fpm\" rel=\"external\"\u003eTune PHP-FPM\u003c/a\u003e et \u003ca href=\"https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/server_tuning.html#enable-php-opcache\" rel=\"external\"\u003eEnable PHP OPcache\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRedémarrez le service PHP-FPM…\u003c/p\u003e\n\u003ch4 id=\"nextcloud\"\u003eNextcloud\u003c/h4\u003e\n\u003ch3 id=\"chroot-php\"\u003eChroot PHP\u003c/h3\u003e\n\u003cp\u003eÉtant donné que PHP est chrooté, la commande \u003ccode\u003eocc\u003c/code\u003e, ainsi que les jobs\ncron échouent.\u003c/p\u003e\n\u003cp\u003eLorsque \u003ccode\u003eocc\u003c/code\u003e est exécuté, vous obtenez au moins ce message d\u0026rsquo;erreur :\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\u003eYour data directory is invalid Ensure there is a file called\n\u0026ldquo;.ocdata\u0026rdquo; in the root of the data directory.\u003c/p\u003e\n\u003cp\u003eCannot create \u0026ldquo;data\u0026rdquo; directory This can usually be fixed by giving the\nwebserver write access to the root directory. See\n\u003ca href=\"https://docs.nextcloud.com/server/16/go.php?to=admin-dir_permissions\" rel=\"external\"\u003ehttps://docs.nextcloud.com/server/16/go.php?to=admin-dir_permissions\u003c/a\u003e\u003c/p\u003e\n\n        \u003c/blockquote\u003e\n    \u003c/figure\u003e\n\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003eRésoudre ce problème est simple\u003c/strong\u003e : il suffit d\u0026rsquo;éditer le fichier de config\nde nextcloud, \u003ccode\u003enextcloud/config/config.php\u003c/code\u003e pour modifier la valeur de la\nvariable \u003ccode\u003edatadirectory\u003c/code\u003e. \u003cem\u003e(cf : \n\n\u003ca class=\"inside\" href=\"/fr/web/nextcloud/nextcloud-php-chroot/\" title=\"Lien interne vers l\u0026#39;article : 'Nextcloud Php Chroot OpenBSD (astuce)'\"\u003eNextcloud Php Chroot OpenBSD (astuce)\u003c/a\u003e\n\n)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eBien sûr, le chemin \u003ccode\u003e/data\u003c/code\u003e doit correspondre à votre cas, surtout si vous\nl\u0026rsquo;avez déplacé hors de la racine \u003cem\u003enextcloud\u003c/em\u003e - ce qui est recommandé !\u003c/p\u003e\n\u003cp\u003eCe changement étant fait, vous pouvez utiliser sans soucis la commande \u003ccode\u003eocc\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"gestion-des-applications\"\u003eGestion des applications\u003c/h3\u003e\n\u003ch4 id=\"collaboracode\"\u003eCollabora/CODE\u003c/h4\u003e\n\u003cp\u003eÀ quoi sert \u003ca href=\"https://nextcloud.com/collaboraonline/\" rel=\"external\"\u003eCollabora\u003c/a\u003e CODE ?\u003c/p\u003e\n\u003cp\u003eÀ pouvoir éditer les documents bureautique dans Nextcloud directement. \u003cbr\u003e\n\u003cstrong\u003eMalheureusement, ne cherchez pas : cela ne fonctionne pas nativement sur\nOpenBSD\u003c/strong\u003e !\u003c/p\u003e\n\u003ch3 id=\"joujou-dans-la-vm\"\u003eJoujou dans la VM\u003c/h3\u003e\n\u003cp\u003eLe moyen : dans une \n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/vm-debian-stretch/\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003eVM\u003c/a\u003e\n ! :p\u003c/p\u003e\n\u003ch3 id=\"deux-méthodes\"\u003eDeux méthodes\u003c/h3\u003e\n\u003cp\u003eIl existe deux méthodes pour pouvoir utiliser Collabora CODE :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ela méthode facile : au-travers d\u0026rsquo;une image \u003ca href=\"/fr/sys/openbsd/nextcloud/#par-docker\"\u003edocker\u003c/a\u003e installable\nsur Debian\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eune méthode longue mais simple, grâce à ce projet \u003ca href=\"/fr/sys/openbsd/nextcloud/#par-script-shell-officeonline\"\u003eofficeonline-install.sh\u003c/a\u003e\u003c/p\u003e\n\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\"\u003eDe plus, je ne propose des modifications QUE pour nginx !\u003c/div\u003e\n\n\u003ch3 id=\"par-docker\"\u003ePar Docker\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eJe ne vous apprendrais pas à utiliser Docker ! \u003cbr\u003e\nEt, je ne recommande pas du tout cette possibilité… \u003cbr\u003e\nsi vous avez envie de rajouter une couche de problèmes, libre à vous !\u003c/div\u003e\n\n\u003cp\u003eUne fois dans votre VM Debian, il faut installer docker puis l\u0026rsquo;image fournie\npar les soins de Collabora.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# apt install docker-ce\n:$ docker pull collabora/code\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEnsuite il faut exécuter la commande suivante en l\u0026rsquo;adaptant au nom de domaine\noù se trouve votre instance de Nextcloud : \u003cbr\u003e\n\u003ccode\u003e:$ docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=cloud\\\\.nextcloud\\\\.com' --restart always --cap-add MKNOD collabora/code\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 propose de créer un petit script shell qui permettra toute modification\naisément de la commande au cas où :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/sh\ndocker run -t -d -p 127.0.0.1:9980:9980 -e \u0026#39;domain=nom-domaine.tld\u0026#39; \\--restart always \\--cap-add MKNOD collabora/code\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\n\u003ch4 id=\"iptables\"\u003eIptables\u003c/h4\u003e\n\u003cp\u003eIl est très probable qu\u0026rsquo;il faille modifier \u003cem\u003eiptables\u003c/em\u003e tel que, par exemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A FORWARD -i docker0 -o enp0s3 -j ACCEPT\niptables -A FORWARD -i enps0s3 -o docker0 -j ACCEPT\niptables -A INPUT -i docker0 -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"tests-réseaux\"\u003eTests réseaux\u003c/h4\u003e\n\u003cp\u003eDepuis votre machine hôte, normalement il est possible de pinger la VM et de\ntester une requête CURL.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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:$ ping -c3 192.168.0.2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePING 192.168.0.2 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e192.168.0.2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e56\u003c/span\u003e data bytes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e64\u003c/span\u003e bytes from 192.168.0.2: \u003cspan style=\"color:#ef6155\"\u003eicmp_seq\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ettl\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e64\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etime\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0.254 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e64\u003c/span\u003e bytes from 192.168.0.2: \u003cspan style=\"color:#ef6155\"\u003eicmp_seq\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ettl\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e64\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etime\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0.278 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e64\u003c/span\u003e bytes from 192.168.0.2: \u003cspan style=\"color:#ef6155\"\u003eicmp_seq\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ettl\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e64\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etime\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0.301 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e--- 192.168.0.2 ping statistics ---\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e packets transmitted, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e packets received, 0.0% packet loss\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eround-trip min/avg/max/std-dev \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e 0.254/0.278/0.301/0.019 ms\n\u003c/span\u003e\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 -Iv http://192.168.0.2:9980\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* Rebuilt URL to: http://192.168.0.2:9980/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e*   Trying 192.168.0.2...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* TCP_NODELAY set\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* Connected to 192.168.0.2 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e192.168.0.2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e port \u003cspan style=\"color:#f99b15\"\u003e9980\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#776e71\"\u003e#0)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; HEAD / HTTP/1.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; Host: 192.168.0.2:9980\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; User-Agent: curl/7.61.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; Accept: */*\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* Empty reply from server\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* Connection \u003cspan style=\"color:#776e71\"\u003e#0 to host 192.168.0.2 left intact\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e52\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Empty reply from server\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi \u003cstrong\u003ecurl\u003c/strong\u003e répond ainsi, c\u0026rsquo;est que cela semble bon !\u003c/p\u003e\n\u003cp\u003eMaintenant, passons aux \u003ca href=\"/fr/sys/openbsd/nextcloud/#modifications-nginx\"\u003emodifications du serveur nginx\u003c/a\u003e,\npuis à l\u0026rsquo;administration de Nextcloud.\u003c/p\u003e\n\u003ch5 id=\"update-docker\"\u003eUpdate docker\u003c/h5\u003e\n\u003cp\u003eRécupère la nouvelle image : \u003ccode\u003e$ docker pull collabora/code\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eArrêt de l\u0026rsquo;image en cours :\n\u003ccode\u003e:$ docker container ls \u003c/code\u003e:$ docker container stop CONTAINER_ID\u003ccode\u003e, ou \u003c/code\u003eNAMES\u003ccode\u003efonctionne aussi \\\u003c/code\u003e:$ docker container rm CONTAINER_ID\u003ccode\u003e, ou \u003c/code\u003eNAMES`\u003c/p\u003e\n\u003cp\u003eOn relance la commande \u003ccode\u003edocker run…\u003c/code\u003e, vue précédemment ci-dessus !\u003c/p\u003e\n\u003ch5 id=\"modification-nginx\"\u003eModification nginx\u003c/h5\u003e\n\u003cp\u003eLes modifications des règles \u003ccode\u003elocation\u003c/code\u003e pour nginx sont fournies dans ce\n\u003ca href=\"https://cld.stephane-huc.net/s/2o6SDdYKQtifCYA\" rel=\"external\"\u003edocument\u003c/a\u003e…\u003c/p\u003e\n\u003cp\u003eVeillez à remplacer les écritures \u003ccode\u003ehttp://localhost\u003c/code\u003e, par votre schéma\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eadresse IPv4 de votre VM !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuis relancer le service nginx… et \u003ca href=\"/fr/sys/openbsd/nextcloud/#modification-nextcloud\"\u003eadministrons\u003c/a\u003e\nNextcloud !\u003c/p\u003e\n\u003ch3 id=\"par-script-shell-officeonline\"\u003ePar script shell officeonline\u003c/h3\u003e\n\u003cp\u003eIl suffit de cloner le dépôt et d\u0026rsquo;exécuter le script shell\n\u003cem\u003e\u003ca href=\"https://github.com/husisusi/officeonlin-install.sh\" rel=\"external\"\u003eofficeonline-install.sh\u003c/a\u003e\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;intérêt de ce script est d\u0026rsquo;installer tout ce qui est nécessaire\nafin de se débarrasser des limitations fournies dans le projet Docker de\nl\u0026rsquo;entreprise Collabora.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ git clone https://github.com/husisusi/officeonlin-install.sh.git\n$ cd officeonlin-install.sh\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\"\u003e\u003cp\u003eATTENTION, ce script demande de\n\u003ca href=\"https://github.com/husisusi/officeonlin-install.sh#requirements\" rel=\"external\"\u003egrosses ressources machine\u003c/a\u003e\ncar la phase de compilation et d\u0026rsquo;installation se déroule durant des heures !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eun minimum de 3.7 Go de RAM\u003c/li\u003e\n\u003cli\u003eun minimum de 13 Go d\u0026rsquo;espace disque vide…\u003c/li\u003e\n\u003c/ul\u003e\u003c/div\u003e\n\n\u003cp\u003eVoir \u003ca href=\"https://help.nextcloud.com/t/howto-install-onlineoffice-on-ubuntu-debian-no-docker-no-limitation/8958\" rel=\"external\"\u003ele projet sur le forum\u003c/a\u003e\nd\u0026rsquo;entraide de Nextcloud…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eLes valeurs actuellement fonctionnelles, sur une Debian Stretch, du fichier de\nconfiguration \u003ccode\u003eofficeonline-install.cfg\u003c/code\u003e sont\n\u003ca href=\"https://github.com/husisusi/officeonlin-install.sh/issues/155#issuecomment-451502770\" rel=\"external\"\u003ecelles-ci\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\"\u003eset_online_regex\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;collabora/collabora-online-4$\u0026#39; #CODE 4 Branch\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elool_src_commit\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;173510fdbf6f52d1d6288b809c8d14bc630afd20\u0026#39; #CODE-4-RC2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset_core_regex\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;cp-6.0$\u0026#39; #LibO 6.0.x\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\"\u003eATTENTION, ces valeurs peuvent changer très rapidement… veuillez toujours\nvérifier soit sur le forum d\u0026rsquo;entraide de Nextcloud, soit sur le projet\nd\u0026rsquo;OfficeOnline.\u003c/div\u003e\n\n\u003cp\u003ePensez à modifier aussi la valeur de \u003ccode\u003eallowed_domains\u003c/code\u003e en début de fichier, en\nfaisant correspondre avec le nom de domaine qui gère votre nextcloud ou le\nservice collabora s\u0026rsquo;il est sur un serveur distinct.\u003c/p\u003e\n\u003cp\u003eUne fois le fichier de configuration modifié, exécutez la commande suivante : \u003cbr\u003e\n\u003ccode\u003e:# officeonline-install.sh -c officeonline-install.cfg\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis, patientez le temps de la phase de compilation et d\u0026rsquo;installation…\u003c/p\u003e\n\u003cp\u003eSi à la fin, vous avez un message ressemblant au suivant, alors c\u0026rsquo;est bon :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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:#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:#776e71\"\u003e### loolwsd is running. Enjoy!!! Service will be stopped after this ###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCOMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eloolwsd \u003cspan style=\"color:#f99b15\"\u003e19422\u003c/span\u003e lool   17u  IPv6 \u003cspan style=\"color:#f99b15\"\u003e320498\u003c/span\u003e      0t0  TCP *:9980 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eLISTEN\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#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRedémarrez votre VM, vérifiez votre config nginx, puis modifiez votre\nconfiguration de \u003ca href=\"/fr/sys/openbsd/nextcloud/#modification-nextcloud\"\u003eNextcloud\u003c/a\u003e…\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"modification-nextcloud\"\u003eModification Nextcloud\u003c/h3\u003e\n\u003cp\u003eSe connecter à l\u0026rsquo;interface web de Nextcloud en tant qu\u0026rsquo;administrateur,\npuis dans le menu \u003cem\u003eApplications\u003c/em\u003e \u0026gt; Section \u003cem\u003eOffice \u0026amp;\ntext\u003c/em\u003e/\u003cem\u003eBureautique\u003c/em\u003e et installer l\u0026rsquo;application \u003cem\u003eCollabora Office\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eEnsuite, choisir le menu \u003cem\u003eSettings\u003c/em\u003e/\u003cem\u003eParamètres\u003c/em\u003e \u0026gt; \u003cem\u003eCollabora Online\u003c/em\u003e\net spécifier le nom du domaine sur lequel fonctionne la VM Debian ; il\ndoit correspondre \u003cstrong\u003eABSOLUMENT\u003c/strong\u003e selon votre choix de configuration,\nsoit :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eà la mention \u003ccode\u003edomain\u003c/code\u003e que vous avez rempli lors de l\u0026rsquo;exécution du containeur\nDocker…\u003c/li\u003e\n\u003cli\u003eà la mention \u003ccode\u003eallowed_domains\u003c/code\u003e remplie pour la configuration du script\n\u003ccode\u003eofficeonline\u003c/code\u003e…\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch4 id=\"talk\"\u003eTalk\u003c/h4\u003e\n\u003cp\u003ePour pouvoir communiquer par vidéo et/ou par chat, il faut installer l\u0026rsquo;application\nofficielle \u003cem\u003eTalk\u003c/em\u003e avec un compte administrateur depuis l\u0026rsquo;interface d\u0026rsquo;administration\nde Nextcloud.\u003c/p\u003e\n\u003cp\u003eEnsuite, il faut configurer un serveur \u003ca href=\"/fr/sys/openbsd/nextcloud/#turn\"\u003eTurn\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ePour finir, chaque utilisateur inscrit de votre nuage informatique pourra\ncommuniquer avec un autre, soit à partir de l\u0026rsquo;application \u003cem\u003eNextcloud Talk\u003c/em\u003e sur\nun smartphone, soit à partir de l\u0026rsquo;interface web de Nextcloud une fois connecté.\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"turn\"\u003eTurn\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;installation d\u0026rsquo;un serveur STUN/TURN, pour que l\u0026rsquo;application \u003cstrong\u003e\u003ca href=\"/fr/sys/openbsd/nextcloud/#talk\"\u003eTalk\u003c/a\u003e\u003c/strong\u003e\nfonctionne, est expliqué dans mon tutoriel \n\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/turnserver/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Service TURN'\"\u003eOpenBSD : Service TURN\u003c/a\u003e\n\n.\u003c/p\u003e\n\u003cp\u003eEnsuite, il est nécessaire de paramétrer Nextcloud. Connectez-vous à son\ninterface en tant qu\u0026rsquo;administrateur, puis choisissez le menu\n\u003cem\u003eSettings/Paramètres\u003c/em\u003e \u0026gt; \u003cem\u003eTalk/Discussion\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eVoici en image l\u0026rsquo;interface :\n\u003cfigure\u003e\n    \u003ca href=\"/images/openbsd/nextcloud-stun.png\" title=\"Nextcloud : Serveurs STUN\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openbsd/nextcloud-stun_hu_9f1f1755ca104e21.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Nextcloud : Serveurs STUN\" height=\"150\" loading=\"lazy\" src=\"/images/openbsd/nextcloud-stun_hu_e0fb0e96f89aea54.png\" type=\"image/png\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eNextcloud : Serveurs STUN\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003eÉcrivez dans les champs :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eServeur STUN\u003c/code\u003e, écrivez : \u003ccode\u003enom-domaine.tld:3478\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eServeur TURN\u003c/code\u003e, écrivez : \u003ccode\u003enom-domaine.tld:5349\u003c/code\u003e, puis le champ suivant le\nsecret d\u0026rsquo;authentification que vous avez configuré pour l\u0026rsquo;option \u003ccode\u003estatic-auth-secret\u003c/code\u003e\ndans le fichier de configuration du serveur Turn. Puis changez si besoin\nles protocoles utilisés.\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\"\u003eBien-sûr, l\u0026rsquo;inscription \u003cem\u003enom-domaine.tld\u003c/em\u003e est à remplacer par votre véritable\nnom de domaine où le serveur Turn est installé ! \u003cbr\u003e\nQuant au numéro de port du serveur STUN, et du serveur TURN, mettez ceux\nconfigurés dans le fichier du serveur Turn !\u003c/div\u003e\n\n\u003cp\u003eUne fois configuré, il n\u0026rsquo;y a plus qu\u0026rsquo;à utiliser l\u0026rsquo;application \u003cem\u003eNextcloud \u003ca href=\"/fr/sys/openbsd/nextcloud/#talk\"\u003eTalk\u003c/a\u003e\u003c/em\u003e\nsoit sur votre smartphone, soit à-partir de l\u0026rsquo;interface web de Nextcloud depuis\nvotre compte.\u003c/p\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eSource:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://nextcloud.com/collaboraonline/\" rel=\"external\"\u003ehttps://nextcloud.com/collaboraonline/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.collaboraoffice.com/code/nginx-reverse-proxy/\" rel=\"external\"\u003ehttps://www.collaboraoffice.com/code/nginx-reverse-proxy/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://help.nextcloud.com/t/howto-setup-nextcloud-talk-with-turn-server/30794\" rel=\"external\"\u003ehttps://help.nextcloud.com/t/howto-setup-nextcloud-talk-with-turn-server/30794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.apb-informatique.fr/nextcloud-installation-de-lapplication-collabora-online/\" rel=\"external\"\u003ehttps://www.apb-informatique.fr/nextcloud-installation-de-lapplication-collabora-online/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Mettre en place un service de cloud avec Nextcloud distribué par le serveur web nginx sur OpenBSD","tags":["OpenBSD","Nextcloud","nginx"],"date_published":"2018-12-25T14:25:01+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-12-24:/fr/sys/openbsd/turnserver#e841afb121cf4240d01270ff61222936a5d1bf6c397f7c8813f4cc2cfb9e726a","url":"https://it-log.fr.eu.org/fr/sys/openbsd/turnserver/","title":"OpenBSD : Service TURN","author":{"name":"Stéphane HUC"},"content_text":"Description Un serveur TURN est un serveur de VoIP (Voices and videos over IP) - un serveur de trafic qui passe sur les réseaux NAT (Network Address Translation) et au-travers des passerelles.\nSite web : https://github.com/coturn/coturn Version installée : 4.5.0.7p0 OS : OpenBSD 6.4 Installation Installez le paquet turnserver !\nUn utilisateur _turnserver sans droit système est créé !\nConfiguration Fichier de configuration /etc/turnserver.conf Il faut décommenter ou remplir les options suivantes :\nfingerprint lt-cred-mech use-auth-secret static-auth-secret - pour générer un secret d\u0026rsquo;authentification… realm - écrire le nom de domaine ou sous-domaine total-quota - paramétrer la à la valeur de 100 bps-capacity - valeur de 0 stale-nonce no-loopback-peers no-multicast-peers HTTP ou HTTPS Quelques options à modifier pour avoir une configuration fonctionnelle :\nSi TLS (Transport Layer Secure) / HTTPS (HyperText Transfer Protocol Secure) : tls-listening-port - la valeur par défaut du port est 5349\nAutrement : listening-port - la valeur par défaut du port est 3478\nSi vous utilisez HTTPS , il faut en plus paramétrer ces options :\ncert - chemin vers le certificat HTTPS du serveur\npkey - chemin vers la clé privée liée au certificat HTTPS du serveur\ncipherlist - il est fortement recommandé de modifier cette option à l\u0026rsquo;identique de la configuration de votre serveur web, si vous en avez un actif sur le même serveur. Voici les valeurs minimales : ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5\nil est possible d\u0026rsquo;exclure les versions suivantes des protocoles TLS en utilisant les options suivantes : no-tlsv1 et no-tlsv1_1\nil est possible de configurer un fichier Diffie-Hellman c\u0026rsquo;est l\u0026rsquo;option dh-file - n\u0026rsquo;utilisez pas le même que celui de votre serveur web ; générez-en exprès rien que pour ce service !\nCLI Par défaut, l\u0026rsquo;interface d\u0026rsquo;administration en ligne de commande est activée !\nPour la désactiver, il faut décommenter l\u0026rsquo;option no-cli…\nSinon, décommentez les options suivantes pour ajouter un peu de sécurité dessus :\ncli-ip - la valeur par défaut est 127.0.0.1, sauf à raison contraire, laissez-la telle quelle.\ncli-port - la valeur par défaut est 5766.\ncli-password - si l\u0026rsquo;option reste commentée, il n\u0026rsquo;y aura pas de mot de passe - générez un nouveau mot de passeavec la commande turnadmin et copiez-le…\nAttentionPar défaut, l\u0026rsquo;interface CLI est accessible sur le réseau en clair. Pour administrer de manière plus sécurisée, ouvrez une session ssh sur votre machine, puis administrez votre serveur turn… ;) Bases de données Par défaut, SQLite est utilisée, et les données sont enregistrées dans /var/db/turndb - là, encore, sous OpenBSD, il est nécessaire que l\u0026rsquo;utilisateur _turnserver ait les droits sur ledit fichier.\nPour les bases de données, MySQL/MariaDB, PostgreSQL, Mongo, Redis, veuillez lire le fichier INSTALL !\nLogs Il est possible de gérer les journaux en modifiant/activant les options suivantes :\nno-stdout-log - empêcher que les journaux soient publiés sur la sortie standard\nsyslog - rediriger les sorties vers le journal syslog\nsimple-log\nlog-file - donnez-lui le chemin absolu vers le nom de fichier dans lequel vous désirez que les journaux soient écrits.\nAttentionATTENTION, il est nécessaire que l\u0026rsquo;utilisateur lié au service puisse lire le fichier journal. Il semble qu\u0026rsquo;il ne peut être écrit que dans /var/tmp/turn.log. Secret d\u0026rsquo;authentification Pour générer un secret d\u0026rsquo;authentification, il suffit de se servir de la commande openssl, tel que : :$ openssl rand -hex 32\nFichier Diffie-Hellman Là, aussi, openssl sera notre secours, tel que : $ openssl dhparam -out dhparam_4096.pem 4096 ce qui nous générera un fichier de 4096 bits.\nTurnadmin Pour générer un mot de passe, il faut utiliser l\u0026rsquo;option -P (ou son équivalent : --generate-encrypted-password*) alliée de l\u0026rsquo;option -p (ou son équivalent : --password).\npour l\u0026rsquo;option cli-password : :$ turnadmin -P -p cli-password Dépannage WARNING: cannot find private key file Les journaux indiquent que le fichier relatif à la clé privée du certificat SSL (Secure Sockets Layer) / HTTPS ne peut être lu, tel que :\nDec 19 09:08:17 srvr turnserver: 0: WARNING: cannot find private key file: /etc/ssl/acme/private/mydomain.net.privkey.pem (1) Dec 19 09:08:17 srvr turnserver: 0: WARNING: cannot start TLS and DTLS listeners because private key file is not set properly En effet, lors de la génération par le client acme natif sous OpenBSD, les droits sur ledit fichier appartiennent en lecture seule à root:wheel - or, le serveur fonctionne avec les droits de l\u0026rsquo;utilisateur _turnserver, il ne peut donc pas y accéder… (bien sûr, je n\u0026rsquo;ai pas abordé la génération de certificats TLS avec Lets\u0026rsquo;Encrypt… voici un exemple d\u0026rsquo;explication pour le client acme sous OpenBSD)\nUne des manières est de copier la clé privée de la mettre dans un répertoire où seul l\u0026rsquo;utilisateur _turnserver aura accès avec des droits en lecture seule, et sur le répertoire et sur le fichier de clé privée copié. Une fois fait, indiquez à l\u0026rsquo;option pvkey le nouveau chemin.\nL\u0026rsquo;autre serait de créer un groupe sans droits systèmes, d\u0026rsquo;y ajouter l\u0026rsquo;utilisateur _turnserver et d\u0026rsquo;attribuer les droits 0440 sur le fichier original de la clé privée.\nPersonnellement, je n\u0026rsquo;aime ni l\u0026rsquo;une, ni l\u0026rsquo;autre de ces deux solutions… mais je ne peux proposer mieux !\nDémarrer le service Une fois le fichier configuré, il ne vous reste plus qu\u0026rsquo;à activer le service et le démarrer à l\u0026rsquo;aide de l\u0026rsquo;outil rcctl : :# rcctl start turnserver\nRègles PF La configuration des règles du pare-feu PF est un peu plus délicate. Gardez à l\u0026rsquo;esprit que ce sont des règles à modifier selon vos nécessités :\n(…) host = \u0026#34;ipv4 address server\u0026#34; host6 = \u0026#34;ipv6 address server\u0026#34; cli_port = \u0026#34;5766\u0026#34; turn_port = \u0026#34;3478\u0026#34; turn_tls_port = \u0026#34;5349\u0026#34; (…) # empêcher les connexions sur l\u0026#39;interface CLI block drop in quick log on egress proto { tcp udp } from any to egress port $cli_port label \u0026#34;turn: unwanted connexion to cli\u0026#34; block log pass out (…) pass in quick log on egress proto { tcp udp } from any to { $host $host6 } port { $turn_port $turn_tls_port } flags S/SA modulate state (…) Il est très intéressant de déclarer une table abuse et de modifier la règle qui bloque la connexion à l\u0026rsquo;interface CLI afin que les IP (Internet Protocol) correspondantes soient enregistrées dans la table abuse. Veillez à créer une tâche cron pour purger régulièrement ladite table ;)\nRemerciements Source : https://help.nextcloud.com/t/howto-setup-nextcloud-talk-with-turn-server/30794\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUn serveur TURN est un serveur 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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eVoIP \u003cem\u003e(Voices and videos over IP)\u003c/em\u003e\u003c/span\u003e\n\n\n\n - un serveur de trafic qui\npasse sur les réseaux \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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 et au-travers des passerelles.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web : \u003ca href=\"https://github.com/coturn/coturn\" rel=\"external\"\u003ehttps://github.com/coturn/coturn\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVersion installée : 4.5.0.7p0\u003c/li\u003e\n\u003cli\u003eOS : OpenBSD 6.4\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 paquet \u003cstrong\u003eturnserver\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003eUn utilisateur \u003ccode\u003e_turnserver\u003c/code\u003e sans droit système est créé !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"fichier-de-configuration-etcturnserverconf\"\u003eFichier de configuration \u003ccode\u003e/etc/turnserver.conf\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eIl faut décommenter ou remplir les options suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003efingerprint\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elt-cred-mech\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euse-auth-secret\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic-auth-secret\u003c/code\u003e - pour \u003ca href=\"/fr/sys/openbsd/turnserver/#secret-d-authentification\"\u003egénérer un secret d\u0026rsquo;authentification\u003c/a\u003e…\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erealm\u003c/code\u003e - écrire le nom de domaine ou sous-domaine\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etotal-quota\u003c/code\u003e - paramétrer la à la valeur de \u003ccode\u003e100\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ebps-capacity\u003c/code\u003e - valeur de \u003ccode\u003e0\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estale-nonce\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eno-loopback-peers\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eno-multicast-peers\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"http-ou-https\"\u003eHTTP ou HTTPS\u003c/h3\u003e\n\u003cp\u003eQuelques options à modifier pour avoir une configuration fonctionnelle :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSi \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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\"\u003eTLS \u003cem\u003e(Transport Layer 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\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: \u003ccode\u003etls-listening-port\u003c/code\u003e - la valeur\npar défaut du port est \u003ccode\u003e5349\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAutrement : \u003ccode\u003elistening-port\u003c/code\u003e - la valeur par défaut du port est \u003ccode\u003e3478\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi vous utilisez \n\n\n\n\n\n\n\n\n\n\n\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, il faut en plus paramétrer ces options :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecert\u003c/code\u003e - chemin vers le certificat \n\n\n\n\n\n\n\n\n\n\n\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 du serveur\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003epkey\u003c/code\u003e - chemin vers la clé privée liée au certificat HTTPS du serveur\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecipherlist\u003c/code\u003e - il est fortement recommandé de modifier cette option à\nl\u0026rsquo;identique de la configuration de votre serveur web, si vous en avez un\nactif sur le même serveur. \u003cbr\u003e\nVoici les valeurs minimales : \u003ccode\u003eECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eil est possible d\u0026rsquo;exclure les versions suivantes des 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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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\nen utilisant les options suivantes : \u003ccode\u003eno-tlsv1\u003c/code\u003e et \u003ccode\u003eno-tlsv1_1\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eil est possible de \u003ca href=\"/fr/sys/openbsd/turnserver/#fichier-diffie-hellman\"\u003econfigurer un fichier Diffie-Hellman\u003c/a\u003e\nc\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003edh-file\u003c/code\u003e - \u003cem\u003en\u0026rsquo;utilisez pas le même que celui de votre\nserveur web ; générez-en exprès rien que pour ce service !\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"cli\"\u003eCLI\u003c/h3\u003e\n\u003cp\u003ePar défaut, l\u0026rsquo;interface d\u0026rsquo;administration en ligne de commande est activée !\u003c/p\u003e\n\u003cp\u003ePour la désactiver, il faut décommenter l\u0026rsquo;option \u003ccode\u003eno-cli\u003c/code\u003e…\u003c/p\u003e\n\u003cp\u003eSinon, décommentez les options suivantes pour ajouter un peu de sécurité\ndessus :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecli-ip\u003c/code\u003e - la valeur par défaut est \u003ccode\u003e127.0.0.1\u003c/code\u003e, sauf à raison contraire, laissez-la telle quelle.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecli-port\u003c/code\u003e - la valeur par défaut est \u003ccode\u003e5766\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecli-password\u003c/code\u003e - si l\u0026rsquo;option reste commentée, il n\u0026rsquo;y aura pas de mot de passe -\n\u003ca href=\"/fr/sys/openbsd/turnserver/#turnadmin\"\u003egénérez un nouveau mot de passe\u003c/a\u003eavec la commande \u003ccode\u003eturnadmin\u003c/code\u003e et\ncopiez-le…\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\"\u003ePar défaut, l\u0026rsquo;interface CLI est accessible sur le réseau en clair. \u003cbr\u003e\nPour administrer de manière plus sécurisée, ouvrez une session ssh sur votre\nmachine, puis administrez votre serveur turn… ;)\u003c/div\u003e\n\n\u003ch3 id=\"bases-de-données\"\u003eBases de données\u003c/h3\u003e\n\u003cp\u003ePar défaut, SQLite est utilisée, et les données sont enregistrées dans\n\u003ccode\u003e/var/db/turndb\u003c/code\u003e - là, encore, sous OpenBSD, il est nécessaire que l\u0026rsquo;utilisateur\n\u003ccode\u003e_turnserver\u003c/code\u003e ait les droits sur ledit fichier.\u003c/p\u003e\n\u003cp\u003ePour les bases de données, MySQL/MariaDB, PostgreSQL, Mongo, Redis,\nveuillez lire le fichier \u003ca href=\"https://github.com/coturn/coturn/blob/master/INSTALL\" rel=\"external\"\u003eINSTALL\u003c/a\u003e !\u003c/p\u003e\n\u003ch3 id=\"logs\"\u003eLogs\u003c/h3\u003e\n\u003cp\u003eIl est possible de gérer les journaux en modifiant/activant les options\nsuivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eno-stdout-log\u003c/code\u003e - empêcher que les journaux soient publiés sur la sortie\nstandard\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003esyslog\u003c/code\u003e - rediriger les sorties vers le journal syslog\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003esimple-log\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003elog-file\u003c/code\u003e - donnez-lui le chemin absolu vers le nom de fichier dans lequel\nvous désirez que les journaux soient écrits.\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, il est nécessaire que l\u0026rsquo;utilisateur lié au service puisse lire le\nfichier journal. Il semble qu\u0026rsquo;il ne peut être écrit que dans \u003ccode\u003e/var/tmp/turn.log\u003c/code\u003e.\u003c/div\u003e\n\n\u003ch3 id=\"secret-dauthentification\"\u003eSecret d\u0026rsquo;authentification\u003c/h3\u003e\n\u003cp\u003ePour générer un secret d\u0026rsquo;authentification, il suffit de se servir de la\ncommande \u003cem\u003eopenssl\u003c/em\u003e, tel que : \u003cbr\u003e\n\u003ccode\u003e:$ openssl rand -hex 32\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"fichier-diffie-hellman\"\u003eFichier Diffie-Hellman\u003c/h3\u003e\n\u003cp\u003eLà, aussi, \u003cem\u003eopenssl\u003c/em\u003e sera notre secours, tel que : \u003cbr\u003e\n\u003ccode\u003e$ openssl dhparam -out dhparam_4096.pem 4096\u003c/code\u003e \u003cbr\u003e\nce qui nous générera un fichier de 4096 bits.\u003c/p\u003e\n\u003ch3 id=\"turnadmin\"\u003eTurnadmin\u003c/h3\u003e\n\u003cp\u003ePour générer un mot de passe, il faut utiliser l\u0026rsquo;option \u003ccode\u003e-P\u003c/code\u003e\n\u003cem\u003e(ou son équivalent : \u003ccode\u003e--generate-encrypted-password*\u003c/code\u003e)\u003c/em\u003e\nalliée de l\u0026rsquo;option \u003ccode\u003e-p\u003c/code\u003e \u003cem\u003e(ou son équivalent : \u003ccode\u003e--password\u003c/code\u003e)\u003c/em\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour l\u0026rsquo;option \u003ccode\u003ecli-password\u003c/code\u003e : \u003ccode\u003e:$ turnadmin -P -p cli-password\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"warning-cannot-find-private-key-file\"\u003eWARNING: cannot find private key file\u003c/h3\u003e\n\u003cp\u003eLes journaux indiquent que le fichier relatif à la clé privée du certificat\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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\"\u003eSSL \u003cem\u003e(Secure Sockets Layer)\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\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 ne peut être lu, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-log\" data-lang=\"log\"\u003eDec 19 09:08:17 srvr turnserver: 0: WARNING: cannot find private key file: /etc/ssl/acme/private/mydomain.net.privkey.pem (1)\nDec 19 09:08:17 srvr turnserver: 0: WARNING: cannot start TLS and DTLS listeners because private key file is not set properly\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEn effet, lors de la génération par le client acme natif sous OpenBSD, les droits\nsur ledit fichier appartiennent en lecture seule à \u003ccode\u003eroot:wheel\u003c/code\u003e - or, le serveur\nfonctionne avec les droits de l\u0026rsquo;utilisateur \u003ccode\u003e_turnserver\u003c/code\u003e, il ne peut donc pas\ny accéder… \u003cbr\u003e\n\u003cem\u003e(bien sûr, je n\u0026rsquo;ai pas abordé la génération de certificats \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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\navec Lets\u0026rsquo;Encrypt… voici un exemple d\u0026rsquo;explication pour le \u003ca href=\"https://ybad.name/ah/doku.php/4-httpd/ssl\" rel=\"external\"\u003eclient acme sous OpenBSD\u003c/a\u003e)\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUne des manières est de copier la clé privée de la mettre dans un répertoire\noù seul l\u0026rsquo;utilisateur \u003ccode\u003e_turnserver\u003c/code\u003e aura accès avec des droits en lecture\nseule, et sur le répertoire et sur le fichier de clé privée copié. \u003cbr\u003e\nUne fois fait, indiquez à l\u0026rsquo;option \u003ccode\u003epvkey\u003c/code\u003e le nouveau chemin.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;autre serait de créer un groupe sans droits systèmes, d\u0026rsquo;y ajouter l\u0026rsquo;utilisateur\n\u003ccode\u003e_turnserver\u003c/code\u003e et d\u0026rsquo;attribuer les droits 0440 sur le fichier original de la\nclé privée.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003ePersonnellement, je n\u0026rsquo;aime ni l\u0026rsquo;une, ni l\u0026rsquo;autre de ces deux solutions\u003c/em\u003e… \u003cbr\u003e\nmais je ne peux proposer mieux !\u003c/p\u003e\n\u003ch2 id=\"démarrer-le-service\"\u003eDémarrer le service\u003c/h2\u003e\n\u003cp\u003eUne fois le fichier configuré, il ne vous reste plus qu\u0026rsquo;à activer le\nservice et le démarrer à l\u0026rsquo;aide de l\u0026rsquo;outil \u003ccode\u003ercctl\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003e:# rcctl start turnserver\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"règles-pf\"\u003eRègles PF\u003c/h2\u003e\n\u003cp\u003eLa configuration des règles du pare-feu PF est un peu plus délicate. Gardez à\nl\u0026rsquo;esprit que ce sont des \u003cem\u003erègles à modifier selon vos nécessités\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\"\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\"\u003ehost\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ipv4 address server\u0026#34;\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\"\u003e\u0026#34;ipv6 address 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\u003cspan style=\"color:#06b6ef\"\u003ecli_port\u003c/span\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;5766\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eturn_port\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;3478\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eturn_tls_port\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;5349\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\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# empêcher les connexions sur l\u0026#39;interface CLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock drop in quick log on egress proto { tcp udp } from any to egress port $cli_port label \u0026#34;turn: unwanted connexion to cli\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 log\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 log on egress proto { tcp udp } from any to { $host $host6 } port { $turn_port $turn_tls_port } flags S/SA modulate 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:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl est très intéressant de déclarer une table abuse et de modifier la règle qui\nbloque la connexion à l\u0026rsquo;interface CLI afin que les \n\n\n\n\n\n\n\n\n\n\n\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 correspondantes\nsoient enregistrées dans la table abuse. \u003cbr\u003e\nVeillez à créer une tâche cron pour purger régulièrement ladite table ;)\u003c/p\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eSource : \u003ca href=\"https://help.nextcloud.com/t/howto-setup-nextcloud-talk-with-turn-server/30794\" rel=\"external\"\u003ehttps://help.nextcloud.com/t/howto-setup-nextcloud-talk-with-turn-server/30794\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Mettre en place un serveur TURN sous OpenBSD","tags":["OpenBSD","TURN","VoIP"],"date_published":"2018-12-24T21:28:03+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-11-13:/fr/dev/php/sitemap-gz#3ae4cc1e811c097048c918e1ba8e32353b3ea76aa48130a1c1d602c0d835c3bd","url":"https://it-log.fr.eu.org/fr/dev/php/sitemap-gz/","title":"PHP5|7 : un fichier sitemap.xml, ou sitemap.xml.gz","author":{"name":"Stéphane HUC"},"content_text":"Description Ou comment créer un fichier sitemap.xml - ou sa version compressée sitemap.xml.gz en PHP.\nSitemap.xml basique Voyons comment écrire en PHP un sitemap.xml très basique :\n\u0026lt;?php ### créons les constantes utiles # détection du protocole utilisé : scheme if ( empty($_SERVER[\u0026#39;HTTPS\u0026#39;]) ) define(\u0026#39;SCHEME\u0026#39;, \u0026#39;http\u0026#39;); else define(\u0026#39;SCHEME\u0026#39;, \u0026#39;https\u0026#39;); # détection du nom d\u0026#39;hôte et écriture de la base URL define(\u0026#39;HOST\u0026#39;, $_SERVER[\u0026#39;HTTP_HOST\u0026#39;]); define(\u0026#39;BASE\u0026#39;, SCHEME.\u0026#34;://\u0026#34;.HOST); # détection du chemin absolu, réel du script define(\u0026#39;ROOT\u0026#39;, realpath(getenv(\u0026#39;DOCUMENT_ROOT\u0026#39;))); # écriture de l\u0026#39;entête XML $flux = \u0026#39;\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; $flux .= \u0026#39;\u0026lt;urlset xmlns=\u0026#34;http://www.google.com/schemas/sitemap/0.9\u0026#34; xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34; xsi:schemaLocation=\u0026#34;http://www.google.com/schemas/sitemap/0.9 http://www.google.com/schemas/sitemap/0.9/sitemap.xsd\u0026#34;\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # on récupère les informations du fichier index $file_mtime = date (\u0026#34;c\u0026#34;, filemtime(ROOT.\u0026#39;/index.php\u0026#39;)); # écriture du flux, relatif au fichier index $flux .= \u0026#39; \u0026lt;url\u0026gt; \u0026lt;loc\u0026gt;\u0026#39;.BASE.\u0026#39;\u0026lt;/loc\u0026gt; \u0026lt;lastmod\u0026gt;\u0026#39;.$file_mtime.\u0026#39;\u0026lt;/lastmod\u0026gt; \u0026lt;priority\u0026gt;1\u0026lt;/priority\u0026gt; \u0026lt;/url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # écriture finale du flux XML $flux .= \u0026#39;\u0026lt;/urlset\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # on envoie le flux avec le bon entête et le bon encodage header(\u0026#34;Content-Type: application/xml; charset=utf-8\u0026#34;); echo $flux; ?\u0026gt; Bien-sûr l\u0026rsquo;écriture du fichier sitemap.xml est basique, non compressé, et ne sert - dans ce cas - qu\u0026rsquo;à indexer le fichier index.php - cas peu utile, avouons-le !\nParcours de répertoire Maintenant, admettons que nous avons un répertoire \u0026lsquo;outils\u0026rsquo;, dans lequel nous avons différents scripts PHP que nous souhaitons indexer, eux aussi ;)\nPour cela, nous allons utiliser les Itérateurs par parcourir le répertoire, puis récupérer les informations de fichier par le biais de la classe SPL !\n\u0026lt;?php # créons un tableau... $folders = array (\u0026#39;tools\u0026#39;); # parcours du tableau et exécutions d\u0026#39;instructions relatives... foreach($folders as $name) { switch($name) { case \u0026#39;tools\u0026#39;: $pattern = \u0026#39;/^.+\\.php$/i\u0026#39;; break; } # Utilisons les fonctions Iterator pour parcourir le bon répertoire depuis sa racine absolue. $Directory = new RecursiveDirectoryIterator(ROOT.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;); $Iterator = new RecursiveIteratorIterator($Directory); $dirs = new RegexIterator($Iterator, $pattern, RecursiveRegexIterator::GET_MATCH); # parcours de l\u0026#39;objet Iterateur, pour écrire le flux XML nécessaire, foreach($dirs as $dir =\u0026gt; $dirs) { $flux .= \u0026#39; \u0026lt;url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; $info = new SplFileInfo($dir); # construction de l\u0026#39;URL visible $flux .= \u0026#34; \u0026lt;loc\u0026gt;\u0026#34;.BASE.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;.$info-\u0026gt;getBasename().\u0026#34;\u0026lt;/loc\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; # récupération de la date de dernière modification du fichier - cf, l\u0026#39;argument \u0026#39;\u0026#39;c\u0026#39;\u0026#39; permet de restituer directement la date au bon format attendu $flux .= \u0026#34; \u0026lt;lastmod\u0026gt;\u0026#34;.date (\u0026#34;c\u0026#34;, $info-\u0026gt;getCTime()).\u0026#34;\u0026lt;/lastmod\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; ### l\u0026#39;ancienne méthode donnerait ce code PHP #$flux .= \u0026#34; \u0026lt;loc\u0026gt;\u0026#34;.BASE.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;.basename($dir).\u0026#34;\u0026lt;/loc\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; #$flux .= \u0026#34; \u0026lt;lastmod\u0026gt;\u0026#34;.date (\u0026#34;c\u0026#34;, filemtime($dir)).\u0026#34;\u0026lt;/lastmod\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; $flux .= \u0026#39; \u0026lt;/url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; } } ?\u0026gt; Bien-sûr, ce code PHP de parcours de dossier et de restitution d\u0026rsquo;informations fichiers, envoyé dans le flux XML nécessaire, est à intégrer après le code relatif au fichier index et avant le code de fermeture du flux XML.\nCompression du sitemap.xml Maintenant, voyons comment compresser de manière simple et rapide le flux XML pour créer un fichier sitemap.xml.gz nécessaire :\n\u0026lt;?php # on prend le flux XML dans son ensemble pour l\u0026#39;encoder en gz $gzdata = gzencode($flux, 9); ?\u0026gt; Ensuite pour envoyer les données, utilisons les bons entêtes, puis affichons le flux encodé :\n\u0026lt;?php # déclaration des entêtes nécessaires header(\u0026#34;Content-Type: application/x-gzip\u0026#34;); header(\u0026#34;Content-Encoding: gzip\u0026#34;); header(\u0026#34;Content-Disposition: attachment; filename=sitemap.xml.gz\u0026#34;); # affichage du flux encodé - et non pas du flux normal !!! echo $gzdata; ?\u0026gt; TL;DR Voici la version finale du code PHP pour créer dynamiquement un fichier sitemap.xml, et sa version compressée sitemap.xml.gz :\n\u0026lt;?php ### les constantes utiles if ( empty($_SERVER[\u0026#39;HTTPS\u0026#39;]) ) define(\u0026#39;SCHEME\u0026#39;, \u0026#39;http\u0026#39;); else define(\u0026#39;SCHEME\u0026#39;, \u0026#39;https\u0026#39;); define(\u0026#39;HOST\u0026#39;, $_SERVER[\u0026#39;HTTP_HOST\u0026#39;]); define(\u0026#39;BASE\u0026#39;, SCHEME.\u0026#34;://\u0026#34;.HOST); define(\u0026#39;ROOT\u0026#39;, realpath(getenv(\u0026#39;DOCUMENT_ROOT\u0026#39;))); # écriture de l\u0026#39;entête XML $flux = \u0026#39;\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; $flux .= \u0026#39;\u0026lt;urlset xmlns=\u0026#34;http://www.google.com/schemas/sitemap/0.9\u0026#34; xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34; xsi:schemaLocation=\u0026#34;http://www.google.com/schemas/sitemap/0.9 http://www.google.com/schemas/sitemap/0.9/sitemap.xsd\u0026#34;\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # on récupère les informations du fichier index $file_mtime = date (\u0026#34;c\u0026#34;, filemtime(ROOT.\u0026#39;/index.php\u0026#39;)); $flux .= \u0026#39; \u0026lt;url\u0026gt; \u0026lt;loc\u0026gt;\u0026#39;.BASE.\u0026#39;\u0026lt;/loc\u0026gt; \u0026lt;lastmod\u0026gt;\u0026#39;.$file_mtime.\u0026#39;\u0026lt;/lastmod\u0026gt; \u0026lt;priority\u0026gt;1\u0026lt;/priority\u0026gt; \u0026lt;/url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # gestion du répertoire \u0026#39;outils\u0026#39; $folders = array (\u0026#39;tools\u0026#39;); foreach($folders as $name) { switch($name) { case \u0026#39;tools\u0026#39;: $pattern = \u0026#39;/^.+\\.php$/i\u0026#39;; break; } $Directory = new RecursiveDirectoryIterator(ROOT.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;); $Iterator = new RecursiveIteratorIterator($Directory); $dirs = new RegexIterator($Iterator, $pattern, RecursiveRegexIterator::GET_MATCH); foreach($dirs as $dir =\u0026gt; $dirs) { $flux .= \u0026#39; \u0026lt;url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; $info = new SplFileInfo($dir); $flux .= \u0026#34; \u0026lt;loc\u0026gt;\u0026#34;.BASE.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;.$info-\u0026gt;getBasename().\u0026#34;\u0026lt;/loc\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; $flux .= \u0026#34; \u0026lt;lastmod\u0026gt;\u0026#34;.date (\u0026#34;c\u0026#34;, $info-\u0026gt;getCTime()).\u0026#34;\u0026lt;/lastmod\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; $flux .= \u0026#39; \u0026lt;/url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; } } $flux .= \u0026#39;\u0026lt;/urlset\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # création du flux encodé $gzdata = gzencode($flux, 9); # envoi du flux if(!empty($gzdata)) { header(\u0026#34;Content-Type: application/x-gzip\u0026#34;); header(\u0026#34;Content-Encoding: gzip\u0026#34;); header(\u0026#34;Content-Disposition: attachment; filename=sitemap.xml.gz\u0026#34;); echo $gzdata; } else { header(\u0026#34;Content-Type: application/xml; charset=utf-8\u0026#34;); echo $flux; } ?\u0026gt; Et, voilà ! :D\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOu comment créer un fichier \u003cstrong\u003e\u003ca href=\"https://www.sitemaps.org/fr/\" rel=\"external\"\u003esitemap.xml\u003c/a\u003e\u003c/strong\u003e - ou sa version compressée\n\u003cstrong\u003esitemap.xml.gz\u003c/strong\u003e en PHP.\u003c/p\u003e\n\u003ch2 id=\"sitemapxml-basique\"\u003eSitemap.xml basique\u003c/h2\u003e\n\u003cp\u003eVoyons comment écrire en PHP un sitemap.xml très 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-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### créons les constantes utiles\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# détection du protocole utilisé : scheme\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e ( \u003cspan style=\"color:#815ba4\"\u003eempty\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$_SERVER\u003c/span\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HTTPS\u0026#39;\u003c/span\u003e]) ) \u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;SCHEME\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;http\u0026#39;\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 \u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;SCHEME\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;https\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# détection du nom d\u0026#39;hôte et écriture de la base URL\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HOST\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$_SERVER\u003c/span\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HTTP_HOST\u0026#39;\u003c/span\u003e]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;BASE\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eSCHEME\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:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eHOST\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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étection du chemin absolu, réel du script\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ROOT\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003erealpath\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003egetenv\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;DOCUMENT_ROOT\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# écriture de l\u0026#39;entête XML\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u0026#39;\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\\n\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\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;urlset xmlns=\u0026#34;http://www.google.com/schemas/sitemap/0.9\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e xsi:schemaLocation=\u0026#34;http://www.google.com/schemas/sitemap/0.9\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e http://www.google.com/schemas/sitemap/0.9/sitemap.xsd\u0026#34;\u0026gt;\u0026#39;\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\\n\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# on récupère les informations du fichier index\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$file_mtime\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edate\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#34;c\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003efilemtime\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/index.php\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# écriture du flux, relatif au fichier index\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;url\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;loc\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eBASE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/loc\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;lastmod\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$file_mtime\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/lastmod\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;priority\u0026gt;1\u0026lt;/priority\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    \u0026lt;/url\u0026gt;\u0026#39;\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\\n\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# écriture finale du flux XML\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/urlset\u0026gt;\u0026#39;\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\\n\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# on envoie le flux avec le bon entête et le bon encodage\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Type: application/xml; charset=utf-8\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien-sûr l\u0026rsquo;écriture du fichier \u003ccode\u003esitemap.xml\u003c/code\u003e est basique, non compressé,\net ne sert - \u003cem\u003edans ce cas\u003c/em\u003e - qu\u0026rsquo;à indexer le fichier \u003ccode\u003eindex.php\u003c/code\u003e - \u003cem\u003ecas peu utile,\navouons-le\u003c/em\u003e !\u003c/p\u003e\n\u003ch2 id=\"parcours-de-répertoire\"\u003eParcours de répertoire\u003c/h2\u003e\n\u003cp\u003eMaintenant, admettons que nous avons un répertoire \u0026lsquo;outils\u0026rsquo;, dans lequel\nnous avons différents scripts PHP que nous souhaitons indexer, eux aussi ;)\u003c/p\u003e\n\u003cp\u003ePour cela, nous allons utiliser les Itérateurs par parcourir le répertoire,\npuis récupérer les informations de fichier par le biais de la classe SPL !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# créons un tableau...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$folders\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003earray\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;tools\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# parcours du tableau et exécutions d\u0026#39;instructions relatives...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eforeach\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$folders\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eswitch\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$name\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#39;tools\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$pattern\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;/^.+\\.php$/i\u0026#39;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\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:#776e71\"\u003e# Utilisons les fonctions Iterator pour parcourir le bon répertoire depuis sa racine absolue.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e$Directory\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRecursiveDirectoryIterator\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\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    \u003cspan style=\"color:#ef6155\"\u003e$Iterator\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRecursiveIteratorIterator\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$Directory\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRegexIterator\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$Iterator\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$pattern\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eRecursiveRegexIterator\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eGET_MATCH\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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# parcours de l\u0026#39;objet Iterateur, pour écrire le flux XML nécessaire,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eforeach\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$dir\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;url\u0026gt;\u0026#39;\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\\n\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\"\u003e$info\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eSplFileInfo\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$dir\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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# construction de l\u0026#39;URL visible\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;      \u0026lt;loc\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eBASE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$info\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003egetBasename\u003c/span\u003e()\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;/loc\u0026gt;\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\\n\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# récupération de la date de dernière modification du fichier - cf, l\u0026#39;argument \u0026#39;\u0026#39;c\u0026#39;\u0026#39; permet de restituer directement la date au bon format attendu\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;      \u0026lt;lastmod\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003edate\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#34;c\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$info\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003egetCTime\u003c/span\u003e())\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;/lastmod\u0026gt;\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\\n\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### l\u0026#39;ancienne méthode donnerait ce code PHP\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#$flux .= \u0026#34;      \u0026lt;loc\u0026gt;\u0026#34;.BASE.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;.basename($dir).\u0026#34;\u0026lt;/loc\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#$flux .= \u0026#34;      \u0026lt;lastmod\u0026gt;\u0026#34;.date (\u0026#34;c\u0026#34;, filemtime($dir)).\u0026#34;\u0026lt;/lastmod\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;;\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\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;/url\u0026gt;\u0026#39;\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\\n\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\n\u003c/span\u003e\u003c/span\u003e\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?\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien-sûr, ce code PHP de parcours de dossier et de restitution d\u0026rsquo;informations\nfichiers, envoyé dans le flux XML nécessaire, est à intégrer après le code\nrelatif au fichier index et avant le code de fermeture du flux XML.\u003c/p\u003e\n\u003ch2 id=\"compression-du-sitemapxml\"\u003eCompression du sitemap.xml\u003c/h2\u003e\n\u003cp\u003eMaintenant, voyons comment compresser de manière simple et rapide le flux\nXML pour créer un fichier \u003cstrong\u003esitemap.xml.gz\u003c/strong\u003e 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-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# on prend le flux XML dans son ensemble pour l\u0026#39;encoder en gz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$gzdata\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003egzencode\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite pour envoyer les données, utilisons les bons entêtes, puis affichons le flux encodé :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# déclaration des entêtes nécessaires\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Type: application/x-gzip\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Encoding: gzip\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Disposition: attachment; filename=sitemap.xml.gz\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# affichage du flux encodé - et non pas du flux normal !!!\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$gzdata\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"tldr\"\u003eTL;DR\u003c/h2\u003e\n\u003cp\u003eVoici la version finale du code PHP pour créer dynamiquement un fichier\n\u003cstrong\u003esitemap.xml\u003c/strong\u003e, et sa version compressée \u003cstrong\u003esitemap.xml.gz\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-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### les constantes utiles\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e ( \u003cspan style=\"color:#815ba4\"\u003eempty\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$_SERVER\u003c/span\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HTTPS\u0026#39;\u003c/span\u003e]) ) \u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;SCHEME\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;http\u0026#39;\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 \u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;SCHEME\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;https\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HOST\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$_SERVER\u003c/span\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HTTP_HOST\u0026#39;\u003c/span\u003e]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;BASE\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eSCHEME\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:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eHOST\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ROOT\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003erealpath\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003egetenv\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;DOCUMENT_ROOT\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# écriture de l\u0026#39;entête XML\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u0026#39;\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\\n\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\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;urlset xmlns=\u0026#34;http://www.google.com/schemas/sitemap/0.9\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e xsi:schemaLocation=\u0026#34;http://www.google.com/schemas/sitemap/0.9\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e http://www.google.com/schemas/sitemap/0.9/sitemap.xsd\u0026#34;\u0026gt;\u0026#39;\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\\n\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# on récupère les informations du fichier index\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$file_mtime\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edate\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#34;c\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003efilemtime\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/index.php\u0026#39;\u003c/span\u003e));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;url\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;loc\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eBASE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/loc\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;lastmod\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$file_mtime\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/lastmod\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;priority\u0026gt;1\u0026lt;/priority\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    \u0026lt;/url\u0026gt;\u0026#39;\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\\n\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# gestion du répertoire \u0026#39;outils\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$folders\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003earray\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;tools\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\"\u003eforeach\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$folders\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eswitch\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$name\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#39;tools\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$pattern\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;/^.+\\.php$/i\u0026#39;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\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:#ef6155\"\u003e$Directory\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRecursiveDirectoryIterator\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\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    \u003cspan style=\"color:#ef6155\"\u003e$Iterator\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRecursiveIteratorIterator\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$Directory\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRegexIterator\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$Iterator\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$pattern\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eRecursiveRegexIterator\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eGET_MATCH\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eforeach\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$dir\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;url\u0026gt;\u0026#39;\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\\n\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\"\u003e$info\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eSplFileInfo\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$dir\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;      \u0026lt;loc\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eBASE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$info\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003egetBasename\u003c/span\u003e()\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;/loc\u0026gt;\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\\n\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\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;      \u0026lt;lastmod\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003edate\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#34;c\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$info\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003egetCTime\u003c/span\u003e())\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;/lastmod\u0026gt;\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\\n\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\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;/url\u0026gt;\u0026#39;\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\\n\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\n\u003c/span\u003e\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:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/urlset\u0026gt;\u0026#39;\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\\n\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# création du flux encodé\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$gzdata\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003egzencode\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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# envoi du flux\n\u003c/span\u003e\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:#815ba4\"\u003eempty\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$gzdata\u003c/span\u003e)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Type: application/x-gzip\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Encoding: gzip\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Disposition: attachment; filename=sitemap.xml.gz\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$gzdata\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\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:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Type: application/xml; charset=utf-8\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\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?\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt, voilà ! :D\u003c/p\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Générer un fichier sitemap et sa version compressée en PHP 5 et 7","tags":["PHP5","PHP7","sitemap"],"date_published":"2018-11-13T19:10:51+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-11-13:/fr/post/sitemap-gz#cef0cd40b05719a428c1fe5702ce343371e8ef1e09abdae1669e78f9bbf9a3c2","url":"https://it-log.fr.eu.org/fr/post/sitemap-gz/","title":"PHP5|7 : un fichier sitemap.xml, ou sitemap.xml.gz","author":{"name":"Stéphane HUC"},"content_text":"Description Ou comment créer un fichier sitemap.xml - ou sa version compressée sitemap.xml.gz en PHP.\nSitemap.xml basique Voyons comment écrire en PHP un sitemap.xml très basique :\n\u0026lt;?php ### créons les constantes utiles # détection du protocole utilisé : scheme if ( empty($_SERVER[\u0026#39;HTTPS\u0026#39;]) ) define(\u0026#39;SCHEME\u0026#39;, \u0026#39;http\u0026#39;); else define(\u0026#39;SCHEME\u0026#39;, \u0026#39;https\u0026#39;); # détection du nom d\u0026#39;hôte et écriture de la base URL define(\u0026#39;HOST\u0026#39;, $_SERVER[\u0026#39;HTTP_HOST\u0026#39;]); define(\u0026#39;BASE\u0026#39;, SCHEME.\u0026#34;://\u0026#34;.HOST); # détection du chemin absolu, réel du script define(\u0026#39;ROOT\u0026#39;, realpath(getenv(\u0026#39;DOCUMENT_ROOT\u0026#39;))); # écriture de l\u0026#39;entête XML $flux = \u0026#39;\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; $flux .= \u0026#39;\u0026lt;urlset xmlns=\u0026#34;http://www.google.com/schemas/sitemap/0.9\u0026#34; xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34; xsi:schemaLocation=\u0026#34;http://www.google.com/schemas/sitemap/0.9 http://www.google.com/schemas/sitemap/0.9/sitemap.xsd\u0026#34;\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # on récupère les informations du fichier index $file_mtime = date (\u0026#34;c\u0026#34;, filemtime(ROOT.\u0026#39;/index.php\u0026#39;)); # écriture du flux, relatif au fichier index $flux .= \u0026#39; \u0026lt;url\u0026gt; \u0026lt;loc\u0026gt;\u0026#39;.BASE.\u0026#39;\u0026lt;/loc\u0026gt; \u0026lt;lastmod\u0026gt;\u0026#39;.$file_mtime.\u0026#39;\u0026lt;/lastmod\u0026gt; \u0026lt;priority\u0026gt;1\u0026lt;/priority\u0026gt; \u0026lt;/url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # écriture finale du flux XML $flux .= \u0026#39;\u0026lt;/urlset\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # on envoie le flux avec le bon entête et le bon encodage header(\u0026#34;Content-Type: application/xml; charset=utf-8\u0026#34;); echo $flux; ?\u0026gt; Bien-sûr l\u0026rsquo;écriture du fichier sitemap.xml est basique, non compressé, et ne sert - dans ce cas - qu\u0026rsquo;à indexer le fichier index.php - cas peu utile, avouons-le !\nParcours de répertoire Maintenant, admettons que nous avons un répertoire \u0026lsquo;outils\u0026rsquo;, dans lequel nous avons différents scripts PHP que nous souhaitons indexer, eux aussi ;)\nPour cela, nous allons utiliser les Itérateurs par parcourir le répertoire, puis récupérer les informations de fichier par le biais de la classe SPL !\n\u0026lt;?php # créons un tableau... $folders = array (\u0026#39;tools\u0026#39;); # parcours du tableau et exécutions d\u0026#39;instructions relatives... foreach($folders as $name) { switch($name) { case \u0026#39;tools\u0026#39;: $pattern = \u0026#39;/^.+\\.php$/i\u0026#39;; break; } # Utilisons les fonctions Iterator pour parcourir le bon répertoire depuis sa racine absolue. $Directory = new RecursiveDirectoryIterator(ROOT.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;); $Iterator = new RecursiveIteratorIterator($Directory); $dirs = new RegexIterator($Iterator, $pattern, RecursiveRegexIterator::GET_MATCH); # parcours de l\u0026#39;objet Iterateur, pour écrire le flux XML nécessaire, foreach($dirs as $dir =\u0026gt; $dirs) { $flux .= \u0026#39; \u0026lt;url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; $info = new SplFileInfo($dir); # construction de l\u0026#39;URL visible $flux .= \u0026#34; \u0026lt;loc\u0026gt;\u0026#34;.BASE.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;.$info-\u0026gt;getBasename().\u0026#34;\u0026lt;/loc\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; # récupération de la date de dernière modification du fichier - cf, l\u0026#39;argument \u0026#39;\u0026#39;c\u0026#39;\u0026#39; permet de restituer directement la date au bon format attendu $flux .= \u0026#34; \u0026lt;lastmod\u0026gt;\u0026#34;.date (\u0026#34;c\u0026#34;, $info-\u0026gt;getCTime()).\u0026#34;\u0026lt;/lastmod\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; ### l\u0026#39;ancienne méthode donnerait ce code PHP #$flux .= \u0026#34; \u0026lt;loc\u0026gt;\u0026#34;.BASE.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;.basename($dir).\u0026#34;\u0026lt;/loc\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; #$flux .= \u0026#34; \u0026lt;lastmod\u0026gt;\u0026#34;.date (\u0026#34;c\u0026#34;, filemtime($dir)).\u0026#34;\u0026lt;/lastmod\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; $flux .= \u0026#39; \u0026lt;/url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; } } ?\u0026gt; Bien-sûr, ce code PHP de parcours de dossier et de restitution d\u0026rsquo;informations fichiers, envoyé dans le flux XML nécessaire, est à intégrer après le code relatif au fichier index et avant le code de fermeture du flux XML.\nCompression du sitemap.xml Maintenant, voyons comment compresser de manière simple et rapide le flux XML pour créer un fichier sitemap.xml.gz nécessaire :\n\u0026lt;?php # on prend le flux XML dans son ensemble pour l\u0026#39;encoder en gz $gzdata = gzencode($flux, 9); ?\u0026gt; Ensuite pour envoyer les données, utilisons les bons entêtes, puis affichons le flux encodé :\n\u0026lt;?php # déclaration des entêtes nécessaires header(\u0026#34;Content-Type: application/x-gzip\u0026#34;); header(\u0026#34;Content-Encoding: gzip\u0026#34;); header(\u0026#34;Content-Disposition: attachment; filename=sitemap.xml.gz\u0026#34;); # affichage du flux encodé - et non pas du flux normal !!! echo $gzdata; ?\u0026gt; TL;DR Voici la version finale du code PHP pour créer dynamiquement un fichier sitemap.xml, et sa version compressée sitemap.xml.gz :\n\u0026lt;?php ### les constantes utiles if ( empty($_SERVER[\u0026#39;HTTPS\u0026#39;]) ) define(\u0026#39;SCHEME\u0026#39;, \u0026#39;http\u0026#39;); else define(\u0026#39;SCHEME\u0026#39;, \u0026#39;https\u0026#39;); define(\u0026#39;HOST\u0026#39;, $_SERVER[\u0026#39;HTTP_HOST\u0026#39;]); define(\u0026#39;BASE\u0026#39;, SCHEME.\u0026#34;://\u0026#34;.HOST); define(\u0026#39;ROOT\u0026#39;, realpath(getenv(\u0026#39;DOCUMENT_ROOT\u0026#39;))); # écriture de l\u0026#39;entête XML $flux = \u0026#39;\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; $flux .= \u0026#39;\u0026lt;urlset xmlns=\u0026#34;http://www.google.com/schemas/sitemap/0.9\u0026#34; xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34; xsi:schemaLocation=\u0026#34;http://www.google.com/schemas/sitemap/0.9 http://www.google.com/schemas/sitemap/0.9/sitemap.xsd\u0026#34;\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # on récupère les informations du fichier index $file_mtime = date (\u0026#34;c\u0026#34;, filemtime(ROOT.\u0026#39;/index.php\u0026#39;)); $flux .= \u0026#39; \u0026lt;url\u0026gt; \u0026lt;loc\u0026gt;\u0026#39;.BASE.\u0026#39;\u0026lt;/loc\u0026gt; \u0026lt;lastmod\u0026gt;\u0026#39;.$file_mtime.\u0026#39;\u0026lt;/lastmod\u0026gt; \u0026lt;priority\u0026gt;1\u0026lt;/priority\u0026gt; \u0026lt;/url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # gestion du répertoire \u0026#39;outils\u0026#39; $folders = array (\u0026#39;tools\u0026#39;); foreach($folders as $name) { switch($name) { case \u0026#39;tools\u0026#39;: $pattern = \u0026#39;/^.+\\.php$/i\u0026#39;; break; } $Directory = new RecursiveDirectoryIterator(ROOT.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;); $Iterator = new RecursiveIteratorIterator($Directory); $dirs = new RegexIterator($Iterator, $pattern, RecursiveRegexIterator::GET_MATCH); foreach($dirs as $dir =\u0026gt; $dirs) { $flux .= \u0026#39; \u0026lt;url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; $info = new SplFileInfo($dir); $flux .= \u0026#34; \u0026lt;loc\u0026gt;\u0026#34;.BASE.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;.$info-\u0026gt;getBasename().\u0026#34;\u0026lt;/loc\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; $flux .= \u0026#34; \u0026lt;lastmod\u0026gt;\u0026#34;.date (\u0026#34;c\u0026#34;, $info-\u0026gt;getCTime()).\u0026#34;\u0026lt;/lastmod\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;; $flux .= \u0026#39; \u0026lt;/url\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; } } $flux .= \u0026#39;\u0026lt;/urlset\u0026gt;\u0026#39;.\u0026#34;\\n\u0026#34;; # création du flux encodé $gzdata = gzencode($flux, 9); # envoi du flux if(!empty($gzdata)) { header(\u0026#34;Content-Type: application/x-gzip\u0026#34;); header(\u0026#34;Content-Encoding: gzip\u0026#34;); header(\u0026#34;Content-Disposition: attachment; filename=sitemap.xml.gz\u0026#34;); echo $gzdata; } else { header(\u0026#34;Content-Type: application/xml; charset=utf-8\u0026#34;); echo $flux; } ?\u0026gt; Et, voilà ! :D\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOu comment créer un fichier \u003cstrong\u003e\u003ca href=\"https://www.sitemaps.org/fr/\" rel=\"external\"\u003esitemap.xml\u003c/a\u003e\u003c/strong\u003e - ou sa version compressée\n\u003cstrong\u003esitemap.xml.gz\u003c/strong\u003e en PHP.\u003c/p\u003e\n\u003ch2 id=\"sitemapxml-basique\"\u003eSitemap.xml basique\u003c/h2\u003e\n\u003cp\u003eVoyons comment écrire en PHP un sitemap.xml très 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-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### créons les constantes utiles\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# détection du protocole utilisé : scheme\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e ( \u003cspan style=\"color:#815ba4\"\u003eempty\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$_SERVER\u003c/span\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HTTPS\u0026#39;\u003c/span\u003e]) ) \u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;SCHEME\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;http\u0026#39;\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 \u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;SCHEME\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;https\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# détection du nom d\u0026#39;hôte et écriture de la base URL\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HOST\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$_SERVER\u003c/span\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HTTP_HOST\u0026#39;\u003c/span\u003e]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;BASE\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eSCHEME\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:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eHOST\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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étection du chemin absolu, réel du script\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ROOT\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003erealpath\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003egetenv\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;DOCUMENT_ROOT\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# écriture de l\u0026#39;entête XML\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u0026#39;\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\\n\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\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;urlset xmlns=\u0026#34;http://www.google.com/schemas/sitemap/0.9\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e xsi:schemaLocation=\u0026#34;http://www.google.com/schemas/sitemap/0.9\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e http://www.google.com/schemas/sitemap/0.9/sitemap.xsd\u0026#34;\u0026gt;\u0026#39;\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\\n\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# on récupère les informations du fichier index\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$file_mtime\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edate\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#34;c\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003efilemtime\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/index.php\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# écriture du flux, relatif au fichier index\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;url\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;loc\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eBASE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/loc\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;lastmod\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$file_mtime\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/lastmod\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;priority\u0026gt;1\u0026lt;/priority\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    \u0026lt;/url\u0026gt;\u0026#39;\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\\n\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# écriture finale du flux XML\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/urlset\u0026gt;\u0026#39;\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\\n\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# on envoie le flux avec le bon entête et le bon encodage\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Type: application/xml; charset=utf-8\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien-sûr l\u0026rsquo;écriture du fichier \u003ccode\u003esitemap.xml\u003c/code\u003e est basique, non compressé,\net ne sert - \u003cem\u003edans ce cas\u003c/em\u003e - qu\u0026rsquo;à indexer le fichier \u003ccode\u003eindex.php\u003c/code\u003e - \u003cem\u003ecas peu utile,\navouons-le\u003c/em\u003e !\u003c/p\u003e\n\u003ch2 id=\"parcours-de-répertoire\"\u003eParcours de répertoire\u003c/h2\u003e\n\u003cp\u003eMaintenant, admettons que nous avons un répertoire \u0026lsquo;outils\u0026rsquo;, dans lequel\nnous avons différents scripts PHP que nous souhaitons indexer, eux aussi ;)\u003c/p\u003e\n\u003cp\u003ePour cela, nous allons utiliser les Itérateurs par parcourir le répertoire,\npuis récupérer les informations de fichier par le biais de la classe SPL !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# créons un tableau...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$folders\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003earray\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;tools\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# parcours du tableau et exécutions d\u0026#39;instructions relatives...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eforeach\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$folders\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eswitch\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$name\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#39;tools\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$pattern\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;/^.+\\.php$/i\u0026#39;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\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:#776e71\"\u003e# Utilisons les fonctions Iterator pour parcourir le bon répertoire depuis sa racine absolue.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e$Directory\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRecursiveDirectoryIterator\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\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    \u003cspan style=\"color:#ef6155\"\u003e$Iterator\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRecursiveIteratorIterator\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$Directory\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRegexIterator\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$Iterator\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$pattern\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eRecursiveRegexIterator\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eGET_MATCH\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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# parcours de l\u0026#39;objet Iterateur, pour écrire le flux XML nécessaire,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eforeach\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$dir\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;url\u0026gt;\u0026#39;\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\\n\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\"\u003e$info\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eSplFileInfo\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$dir\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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# construction de l\u0026#39;URL visible\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;      \u0026lt;loc\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eBASE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$info\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003egetBasename\u003c/span\u003e()\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;/loc\u0026gt;\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\\n\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# récupération de la date de dernière modification du fichier - cf, l\u0026#39;argument \u0026#39;\u0026#39;c\u0026#39;\u0026#39; permet de restituer directement la date au bon format attendu\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;      \u0026lt;lastmod\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003edate\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#34;c\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$info\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003egetCTime\u003c/span\u003e())\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;/lastmod\u0026gt;\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\\n\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### l\u0026#39;ancienne méthode donnerait ce code PHP\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#$flux .= \u0026#34;      \u0026lt;loc\u0026gt;\u0026#34;.BASE.\u0026#39;/\u0026#39;.$name.\u0026#39;/\u0026#39;.basename($dir).\u0026#34;\u0026lt;/loc\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#$flux .= \u0026#34;      \u0026lt;lastmod\u0026gt;\u0026#34;.date (\u0026#34;c\u0026#34;, filemtime($dir)).\u0026#34;\u0026lt;/lastmod\u0026gt;\u0026#34;.\u0026#34;\\n\u0026#34;;\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\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;/url\u0026gt;\u0026#39;\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\\n\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\n\u003c/span\u003e\u003c/span\u003e\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?\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien-sûr, ce code PHP de parcours de dossier et de restitution d\u0026rsquo;informations\nfichiers, envoyé dans le flux XML nécessaire, est à intégrer après le code\nrelatif au fichier index et avant le code de fermeture du flux XML.\u003c/p\u003e\n\u003ch2 id=\"compression-du-sitemapxml\"\u003eCompression du sitemap.xml\u003c/h2\u003e\n\u003cp\u003eMaintenant, voyons comment compresser de manière simple et rapide le flux\nXML pour créer un fichier \u003cstrong\u003esitemap.xml.gz\u003c/strong\u003e 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-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# on prend le flux XML dans son ensemble pour l\u0026#39;encoder en gz\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$gzdata\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003egzencode\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite pour envoyer les données, utilisons les bons entêtes, puis affichons le\nflux encodé :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# déclaration des entêtes nécessaires\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Type: application/x-gzip\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Encoding: gzip\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Disposition: attachment; filename=sitemap.xml.gz\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# affichage du flux encodé - et non pas du flux normal !!!\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$gzdata\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"tldr\"\u003eTL;DR\u003c/h2\u003e\n\u003cp\u003eVoici la version finale du code PHP pour créer dynamiquement un fichier\n\u003cstrong\u003esitemap.xml\u003c/strong\u003e, et sa version compressée \u003cstrong\u003esitemap.xml.gz\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-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### les constantes utiles\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e ( \u003cspan style=\"color:#815ba4\"\u003eempty\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$_SERVER\u003c/span\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HTTPS\u0026#39;\u003c/span\u003e]) ) \u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;SCHEME\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;http\u0026#39;\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 \u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;SCHEME\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;https\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HOST\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$_SERVER\u003c/span\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;HTTP_HOST\u0026#39;\u003c/span\u003e]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;BASE\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eSCHEME\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:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eHOST\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefine\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ROOT\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003erealpath\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003egetenv\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;DOCUMENT_ROOT\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# écriture de l\u0026#39;entête XML\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u0026#39;\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\\n\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\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;urlset xmlns=\u0026#34;http://www.google.com/schemas/sitemap/0.9\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e xsi:schemaLocation=\u0026#34;http://www.google.com/schemas/sitemap/0.9\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e http://www.google.com/schemas/sitemap/0.9/sitemap.xsd\u0026#34;\u0026gt;\u0026#39;\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\\n\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# on récupère les informations du fichier index\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$file_mtime\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edate\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#34;c\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003efilemtime\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/index.php\u0026#39;\u003c/span\u003e));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;url\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;loc\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eBASE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/loc\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;lastmod\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$file_mtime\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/lastmod\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        \u0026lt;priority\u0026gt;1\u0026lt;/priority\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    \u0026lt;/url\u0026gt;\u0026#39;\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\\n\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# gestion du répertoire \u0026#39;outils\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$folders\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003earray\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;tools\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\"\u003eforeach\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$folders\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eswitch\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$name\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#39;tools\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$pattern\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;/^.+\\.php$/i\u0026#39;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\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:#ef6155\"\u003e$Directory\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRecursiveDirectoryIterator\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\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    \u003cspan style=\"color:#ef6155\"\u003e$Iterator\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRecursiveIteratorIterator\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$Directory\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eRegexIterator\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$Iterator\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$pattern\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eRecursiveRegexIterator\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e::\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eGET_MATCH\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eforeach\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$dir\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$dirs\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;url\u0026gt;\u0026#39;\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\\n\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\"\u003e$info\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eSplFileInfo\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$dir\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;      \u0026lt;loc\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eBASE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$info\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003egetBasename\u003c/span\u003e()\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;/loc\u0026gt;\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\\n\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\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;      \u0026lt;lastmod\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003edate\u003c/span\u003e (\u003cspan style=\"color:#48b685\"\u003e\u0026#34;c\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$info\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003egetCTime\u003c/span\u003e())\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026lt;/lastmod\u0026gt;\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\\n\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\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026lt;/url\u0026gt;\u0026#39;\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\\n\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\n\u003c/span\u003e\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:#ef6155\"\u003e$flux\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e.=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/urlset\u0026gt;\u0026#39;\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\\n\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# création du flux encodé\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$gzdata\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003egzencode\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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# envoi du flux\n\u003c/span\u003e\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:#815ba4\"\u003eempty\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$gzdata\u003c/span\u003e)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Type: application/x-gzip\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Encoding: gzip\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Disposition: attachment; filename=sitemap.xml.gz\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$gzdata\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\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:#06b6ef\"\u003eheader\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Type: application/xml; charset=utf-8\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$flux\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\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?\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt, voilà ! :D\u003c/p\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Générer un fichier sitemap et sa version compressée en PHP 5 et 7","tags":["PHP5","PHP7","sitemap"],"date_published":"2018-11-13T19:10:51+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-11-03:/fr/sys/openbsd/smtpd-config-auth#5d5b78b1e1e6d7627c8950861f24485f353d041b5710174f27863d30d9fa8933","url":"https://it-log.fr.eu.org/fr/sys/openbsd/smtpd-config-auth/","title":"OpenBSD : Configurer smtpd.conf pour l'authentification (depuis OpenBSD ≥ 6.4)","author":{"name":"Stéphane HUC"},"content_text":"Description Ou, comment configurer sa machine locale pour envoyer un mail depuis votre console, depuis OpenBSD, actuellement dans sa version 6.4, en se connectant à un service nécessitant une identification ?\nPrésentation OpenSMTPD est une libre implémentation du protocole SMTP côté serveur, 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 parlant le protocole SMTP.\nInformations :\nSite web : https://www.opensmtpd.org OS : OpenBSD 6.4 → 7.8 Testé avec efficacité auprès des services de Gandi, de l\u0026rsquo;association L\u0026rsquo;autre.net, puis sur mes propres serveurs MX.\nInstallation OpenBSD, depuis sa version 6.4, embarque nativement la nouvelle version d\u0026rsquo;OpenSMTPD… il n\u0026rsquo;y a donc rien de plus à installer, cela fait partie du système de base.\nDonc, un coup de # rcctl start smtpd et c\u0026rsquo;est partie le service SMTP fonctionnera normalement sur votre machine !\nUne petite précision sur les fichiers :\nle fichier de configuration est : /etc/mail/smtpd.conf. le fichier log est /var/log/maillog et permet de surveiller toute l\u0026rsquo;activité liée à SMTP, vous y retrouverez aussi les erreurs d\u0026rsquo;envois. Configuration Pour envoyer un mail par SMTP à un service de mails nécessitant une identification, tel que celui de Gandi, 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.\nLe manpage nous donne un exemple de ce qu\u0026rsquo;il faut faire - regardez le premier exemple, si besoin, mais je le restitue ici - :\nFichier secrets Il nous faut créer ce fichier /etc/mail/secrets : :# touch /etc/mail/secrets\nDonnons lui les droits adéquats pour le \u0026ldquo;sécuriser\u0026rdquo;, selon la section \u0026ldquo;Exemples\u0026rdquo; du manpage :\n:# chmod 640 /etc/mail/secrets :# chown root:_smtpd /etc/mail/secrets Ensuite, il est nécessaire de le remplir de telle manière : identifiant username:password n'é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 ; admettons pour l\u0026rsquo;exemple que ce sera la chaine de caractères : perso. 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 0400 sur le fichier.\nMême si l\u0026rsquo;accès au fichier par smtpd peut sans soucis être fait avec vos droits personnels $USER:$USER, si vous l\u0026rsquo;avez mis ailleurs, tel que dans votre $HOME, il est préférable de mettre à minima les droits avec le groupe _smtpd.\nFichier smtpd.conf Maintenant modifions le fichier /etc/mail/smtpd.conf\n# $OpenBSD: smtpd.conf,v 1.14 2019/11/26 20:14:38 gilles Exp $ # This is the smtpd server system-wide configuration file. # See smtpd.conf(5) for more information. table aliases file:/etc/mail/aliases table secrets file:/etc/mail/secrets queue compression # To accept external mail, replace with: listen on all # ## add on 6.7 listen on socket listen on lo0 action \u0026#34;local_mail\u0026#34; mbox alias \u0026lt;aliases\u0026gt; action \u0026#34;unbound\u0026#34; relay host smtp+tls://identifiant@serveur 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; ### 6.6 writings #match for local action \u0026#34;local_mail\u0026#34; #match for any action \u0026#34;unbound\u0026#34; ### 6.7 writings match from local for local action \u0026#34;local_mail\u0026#34; match from local for any action \u0026#34;outbound\u0026#34; Explications\nPar rapport à la version originale, nous avons donc rajouté :\nla ligne table secrets qui appelle le fichier /etc/mail/secrets - ou son équivalent, si vous l\u0026rsquo;avez personnalisé… la ligne action unbound qui nous permet de définir l\u0026rsquo;action nécessaire vers l\u0026rsquo;hôte relais par lequel nous enverrons les mails… REMARQUEZ l\u0026rsquo;écriture identifiant@serveur : c\u0026rsquo;est justement là qu\u0026rsquo;il faut remplacer la chaîne identifiant par celle que vous avez créée dans votre fichier secrets. Dans le contexte de notre exemple, il faudra écrire la chaine de caractères perso. quant à la chaîne serveur, c\u0026rsquo;est le nom du serveur SMTP qu\u0026rsquo;il faut renseigner. dans le cas de Gandi, il faut la remplacer par l\u0026rsquo;adresse de l\u0026rsquo;hôte mail de Gandi, à savoir : 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… si vous avez besoin d\u0026rsquo;utiliser un autre protocole, je vous renvoie à la liste de ceux gérés par OpenSMTPD… la chaîne auth permet de spécifier la table secrets fournissant les données d\u0026rsquo;identification mail nécessaires. la 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… la ligne match … action \u0026quot;unbound\u0026quot; est l\u0026rsquo;action qui sera déclenchée lors de l\u0026rsquo;envoi de mails à l\u0026rsquo;extérieur ! Changements 6.7 La v6.7 d\u0026rsquo;OpenBSD a apporté de légers changements de syntaxe :\najout de listen on socket smtpd.conf(5)#listen~2 modification de actions de correspondances du gestionnaire de queues local smtpd.conf(5)#match : match from local for local action \u0026quot;local_mail\u0026quot; match from local for any action \u0026quot;outbound\u0026quot; \\ Changements 6.4 \u0026gt; 6.6 La syntaxe des noms d\u0026rsquo;actions a légèrement changé entre les versions 6.4 et 6.6 :\nlocal devient local_mail relay devient unbound Gestion des alias Il est intéressant de gérer l\u0026rsquo;alias relatif à votre compte root voire celui de votre utilisateur principal…\nÉditez le fichier /etc/mail/aliases, et 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… avec des droits administrateurs !\nUtilisation AttentionAvant de redémarrer le service smtpd pour qu\u0026rsquo;il prenne en compte les modifications faites, il nous faut tester l\u0026rsquo;écriture de la configuration : # smtpd -n qui 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 !\nPartons du principe que tout est bon, il suffit de redémarrer le service :\n:# rcctl restart smtpd smtpd(ok) smtpd(ok) Le journal quant à lui indiquera le bon redémarrage par une ligne d\u0026rsquo;information semblable à la suivante : Apr 3 07:17:05 sh1 smtpd[68810]: info: OpenSMTPD 7.0.0 starting\nDe même, pensez à utiliser le contrôleur smtpctl… je vous renvoie à son manpage qui est très complet !\nTests d\u0026rsquo;envois Soit :\necho \u0026quot;Test d'envois de mail on $(hostname); date: $(date)\u0026quot; | mail -s \u0026quot;Test de mail\u0026quot; adresse_mail_à_qui_envoyer 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, par exemple :\nApr 3 07:20:20 sh1 smtpd[56183]: 2cda1df4efff97f2 mta connecting address=smtp+tls://89.234.141.148:587 host=mail2.automario.eu Apr 3 07:20:20 sh1 smtpd[56183]: 2cda1df4efff97f2 mta connected Apr 3 07:20:21 sh1 smtpd[56183]: 2cda1df4efff97f2 mta tls ciphers=TLSv1.3:AEAD-CHACHA20-POLY1305-SHA256:256 Apr 3 07:20:21 sh1 smtpd[56183]: 2cda1df4efff97f2 mta cert-check result=\u0026#34;valid\u0026#34; fingerprint=\u0026#34;SHA256:17af91bcb27a530cc278cd8be90551593bee38ebaf6ade68053a508b14a8f817\u0026#34; Apr 3 07:20:21 sh1 smtpd[56183]: 2cda1df4efff97f2 mta delivery evpid=4138560f4bd626cf from=\u0026lt;***@huc.fr.eu.org\u0026gt; to=\u0026lt;***@stephane-huc.net\u0026gt; rcpt=\u0026lt;-\u0026gt; source=\u0026#34;46.23.90.29\u0026#34; relay=\u0026#34;89.234.141.148 (mail2.automario.eu)\u0026#34; delay=1s result=\u0026#34;Ok\u0026#34; stat=\u0026#34;250 2.0.0 eb1a48cf Message accepted for delivery\u0026#34; Gestion des erreurs Retrouvez ci-dessous les erreurs communes liées à une mauvaise configuration :\nError: authentication failed Vérifiez, re-vérifiez votre couple d\u0026rsquo;identification username, password écrits dans votre fichier secret !\nError: Cannot parse smarthost Ce message d\u0026rsquo;erreur est adressé parce que le service SMTP n\u0026rsquo;arrive pas à comprendre l\u0026rsquo;ensemble identifiant@serveur dans votre règle action.\nVérifiez vos écritures, afin que :\nvotre table secrets renseigne bien le bon nom de fichier à interroger ! vous avez bien écrit une écriture de type identifiant username:password dans votre fichier secrets vous avez bien remplacez la chaîne identifiant par celle que vous avez créée… idem pour la chaîne serveur : assurez-vous de l\u0026rsquo;existence du nom de l\u0026rsquo;hôte relais. Error: Sender address rejected: Domain not found Ce message d\u0026rsquo;erreur vous est adressé lorsque le service SMTP ne trouve pas de correspondance avec le nom de domaine.\nL\u0026rsquo;astuce est d\u0026rsquo;utiliser le paramètre mail-from, dans la règle action, de manière à cibler votre nom de domaine, tel que mail-from \u0026quot;@votre-domaine.tld\u0026quot; n\u0026rsquo;oubliez pas la présence du symbole @ (arobase). Documentations 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) , smtpctl(8) Autres informations Retrouvez les différents changements de syntaxe induits par la nouvelle version d\u0026rsquo;OpenSMTPD : en Anglais. ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOu, \u003cstrong\u003ecomment configurer sa machine locale pour envoyer un mail depuis\nvotre console, depuis OpenBSD, actuellement dans sa version 6.4, en se\nconnectant à un service nécessitant une identification ?\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"présentation\"\u003ePrésentation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpenSMTPD\u003c/strong\u003e est une libre implémentation du protocole SMTP\ncôté serveur, tel que défini dans la \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\nquelques extensions standards additionnels. Il permet à des\nmachines ordinaire d\u0026rsquo;échanger des mails avec d\u0026rsquo;autres systèmes\nparlant le protocole SMTP.\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\u003cli\u003eOS : OpenBSD \u003cdel\u003e6.4\u003c/del\u003e → \u003cstrong\u003e7.8\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eTesté avec efficacité auprès des services de \u003ca href=\"https://gandi.net\" rel=\"external\"\u003eGandi\u003c/a\u003e, de l\u0026rsquo;association\n\u003ca href=\"https://lautre.net\" rel=\"external\"\u003eL\u0026rsquo;autre.net\u003c/a\u003e, puis sur mes propres serveurs MX.\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eOpenBSD, depuis sa version 6.4, embarque nativement la nouvelle version\nd\u0026rsquo;OpenSMTPD… il n\u0026rsquo;y a donc rien de plus à installer, cela fait partie du\nsystème de base.\u003c/p\u003e\n\u003cp\u003eDonc, un coup de \u003ccode\u003e# rcctl start smtpd\u003c/code\u003e et c\u0026rsquo;est partie le service SMTP\nfonctionnera normalement sur votre machine !\u003c/p\u003e\n\u003cp\u003eUne petite précision sur les fichiers :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele fichier de configuration est : \u003ccode\u003e/etc/mail/smtpd.conf\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ele fichier log est \u003ccode\u003e/var/log/maillog\u003c/code\u003e et permet de surveiller toute\nl\u0026rsquo;activité liée à SMTP, vous y retrouverez aussi les erreurs d\u0026rsquo;envois.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePour envoyer un mail par SMTP à un service de mails nécessitant une\nidentification, tel que celui de Gandi, il est nécessaire de créer dans\nun premier temps, un fichier \u003ccode\u003esecrets\u003c/code\u003e avec les droits adéquats sur\nvotre système, ensuite il nous reste à configurer le fichier\n\u003ccode\u003esmtpd.conf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLe manpage nous donne un \u003ca href=\"https://man.openbsd.org/smtpd.conf#EXAMPLES\" rel=\"external\"\u003eexemple\u003c/a\u003e\nde ce qu\u0026rsquo;il faut faire - regardez le premier exemple, si besoin, mais je\nle restitue ici - :\u003c/p\u003e\n\u003ch3 id=\"fichier-secrets\"\u003eFichier secrets\u003c/h3\u003e\n\u003cp\u003eIl nous faut créer ce fichier \u003ccode\u003e/etc/mail/secrets\u003c/code\u003e :\n\u003ccode\u003e:# touch /etc/mail/secrets\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDonnons lui les droits adéquats pour le \u0026ldquo;sécuriser\u0026rdquo;, selon la section\n\u0026ldquo;Exemples\u0026rdquo; du manpage\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:# chmod \u003cspan style=\"color:#f99b15\"\u003e640\u003c/span\u003e /etc/mail/secrets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chown root:_smtpd /etc/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 \u003cbr\u003e\n\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 ;\n\u003cem\u003eadmettons pour l\u0026rsquo;exemple que ce sera la chaine de caractères :\n\u003cstrong\u003eperso\u003c/strong\u003e.\u003c/em\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 modifier\nen conséquence.\u003c/p\u003e\n\u003cp\u003eDe même, je vous encourage fortement à ne mettre QUE des droits \u003cstrong\u003e0400\u003c/strong\u003e\nsur le fichier.\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,\nsi vous l\u0026rsquo;avez mis ailleurs, tel que dans votre \u003ccode\u003e$HOME\u003c/code\u003e, il est préférable\nde mettre à minima les droits avec le groupe \u003ccode\u003e_smtpd\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"fichier-smtpdconf\"\u003eFichier \u003ccode\u003esmtpd.conf\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eMaintenant modifions le fichier \u003ccode\u003e/etc/mail/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.14 2019/11/26 20:14:38 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/mail/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:/etc/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\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## add on 6.7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elisten on socket\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 lo0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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_mail\u0026#34; mbox 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;unbound\u0026#34; relay host smtp+tls://identifiant@serveur 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:#776e71\"\u003e### 6.6 writings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#match for local action \u0026#34;local_mail\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#match for any action \u0026#34;unbound\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### 6.7 writings\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 local action \u0026#34;local_mail\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;outbound\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\u003ela ligne  \u003ccode\u003etable secrets\u003c/code\u003e qui appelle le fichier \u003ccode\u003e/etc/mail/secrets\u003c/code\u003e -\n\u003cem\u003eou son équivalent, si vous l\u0026rsquo;avez personnalisé\u003c/em\u003e…\u003c/li\u003e\n\u003cli\u003ela ligne \u003ccode\u003eaction unbound\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…\n\u003cul\u003e\n\u003cli\u003eREMARQUEZ l\u0026rsquo;écriture  \u003ccode\u003eidentifiant@serveur\u003c/code\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.\n\u003cem\u003eDans le contexte de notre exemple, il faudra écrire la chaine\nde caractères \u003cstrong\u003eperso\u003c/strong\u003e.\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003equant à la chaîne \u003ccode\u003eserveur\u003c/code\u003e, c\u0026rsquo;est le nom du serveur SMTP qu\u0026rsquo;il\nfaut renseigner.\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003edans le cas de Gandi, il faut la\nremplacer par l\u0026rsquo;adresse de l\u0026rsquo;hôte mail de Gandi, à savoir : \u003cbr\u003e\n\u003ccode\u003email.gandi.net\u003c/code\u003e\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ela chaîne \u003ca href=\"https://man.openbsd.org/smtpd.conf#host\" rel=\"external\"\u003esmtp+tls\u003c/a\u003e est\nle protocol que nous utilisons pour nous connecter au service de\nl\u0026rsquo;hôte mail relais… \u003cbr\u003e\n\u003cem\u003esi vous avez besoin d\u0026rsquo;utiliser un autre protocole, je vous renvoie\nà la liste de ceux gérés par OpenSMTPD…\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003ela chaîne \u003ca href=\"https://man.openbsd.org/smtpd.conf#auth\" rel=\"external\"\u003eauth\u003c/a\u003e permet de\nspécifier la table \u003ccode\u003esecrets\u003c/code\u003e fournissant les données d\u0026rsquo;identification\nmail nécessaires.\u003c/li\u003e\n\u003cli\u003ela chaîne \u003ca href=\"https://man.openbsd.org/smtpd.conf#mail_-from\" rel=\"external\"\u003email-from\u003c/a\u003e\nnous permet de spécifier le nom de domaine - ce qui permet d\u0026rsquo;éviter\nl\u0026rsquo;erreur \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/li\u003e\n\u003cli\u003ela ligne \u003ccode\u003ematch … action \u0026quot;unbound\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/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"changements-67\"\u003eChangements 6.7\u003c/h4\u003e\n\u003cp\u003eLa v6.7 d\u0026rsquo;OpenBSD a apporté de légers changements de syntaxe :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eajout de \u003ccode\u003elisten on socket\u003c/code\u003e \u003cem\u003e\n\u003ca class=\"\" href=\"https://man.openbsd.org/smtpd.conf.5#listen~2\" title=\"Page du Manuel OpenBSD pour : smtpd.conf\"\u003esmtpd.conf(5)#listen~2\u003c/a\u003e\n\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003emodification de actions de correspondances du gestionnaire de queues \u003cstrong\u003elocal\u003c/strong\u003e \u003cem\u003e\n\u003ca class=\"\" href=\"https://man.openbsd.org/smtpd.conf.5#match\" title=\"Page du Manuel OpenBSD pour : smtpd.conf\"\u003esmtpd.conf(5)#match\u003c/a\u003e\n\u003c/em\u003e : \u003cbr\u003e\n\u003ccode\u003ematch from local for local action \u0026quot;local_mail\u0026quot;\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003ematch from local for any action \u0026quot;outbound\u0026quot;\u003c/code\u003e \\\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"changements-64--66\"\u003eChangements 6.4 \u0026gt; 6.6\u003c/h4\u003e\n\u003cp\u003eLa syntaxe des noms d\u0026rsquo;actions a légèrement changé entre les versions 6.4 et 6.6 :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003elocal\u003c/code\u003e devient \u003ccode\u003elocal_mail\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erelay\u003c/code\u003e devient \u003ccode\u003eunbound\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"gestion-des-alias\"\u003eGestion des alias\u003c/h3\u003e\n\u003cp\u003eIl est intéressant de gérer l\u0026rsquo;alias relatif à votre compte \u003ccode\u003eroot\u003c/code\u003e voire\ncelui de votre utilisateur principal…\u003c/p\u003e\n\u003cp\u003eÉditez le fichier \u003ccode\u003e/etc/mail/aliases\u003c/code\u003e, et vers la fin du fichier,\nmodifiez \u003ccode\u003eroot\u003c/code\u003e en lui indiquant vers quelle adresse mail, vous désirez\nque les messages systèmes adressés au compte root vous soit envoyé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… avec des droits administrateurs !\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 smtpd pour qu\u0026rsquo;il prenne en compte les\nmodifications faites, il nous faut tester l\u0026rsquo;écriture de la\nconfiguration : \u003ccode\u003e# smtpd -n\u003c/code\u003e qui devrait réponde par : \u003ccode\u003econfiguration OK\u003c/code\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\u003ePartons du principe que tout est bon, il suffit de 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:# rcctl restart smtpd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmtpd\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eok\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmtpd\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eok\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 journal quant à lui indiquera le bon redémarrage par une ligne d\u0026rsquo;information\nsemblable à la suivante : \u003cbr\u003e\n\u003ccode\u003eApr  3 07:17:05 sh1 smtpd[68810]: info: OpenSMTPD 7.0.0 starting\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eDe même, pensez à utiliser le contrôleur \u003ccode\u003esmtpctl\u003c/code\u003e… je vous renvoie à son\nmanpage qui est très complet !\u003c/p\u003e\n\u003ch3 id=\"tests-denvois\"\u003eTests d\u0026rsquo;envois\u003c/h3\u003e\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\u003e\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, par exemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-log\" data-lang=\"log\"\u003eApr  3 07:20:20 sh1 smtpd[56183]: 2cda1df4efff97f2 mta connecting address=smtp+tls://89.234.141.148:587 host=mail2.automario.eu\nApr  3 07:20:20 sh1 smtpd[56183]: 2cda1df4efff97f2 mta connected\nApr  3 07:20:21 sh1 smtpd[56183]: 2cda1df4efff97f2 mta tls ciphers=TLSv1.3:AEAD-CHACHA20-POLY1305-SHA256:256\nApr  3 07:20:21 sh1 smtpd[56183]: 2cda1df4efff97f2 mta cert-check result=\u0026#34;valid\u0026#34; fingerprint=\u0026#34;SHA256:17af91bcb27a530cc278cd8be90551593bee38ebaf6ade68053a508b14a8f817\u0026#34;\nApr  3 07:20:21 sh1 smtpd[56183]: 2cda1df4efff97f2 mta delivery evpid=4138560f4bd626cf from=\u0026lt;***@huc.fr.eu.org\u0026gt; to=\u0026lt;***@stephane-huc.net\u0026gt; rcpt=\u0026lt;-\u0026gt; source=\u0026#34;46.23.90.29\u0026#34; relay=\u0026#34;89.234.141.148 (mail2.automario.eu)\u0026#34; delay=1s result=\u0026#34;Ok\u0026#34; stat=\u0026#34;250 2.0.0 eb1a48cf Message accepted for delivery\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"gestion-des-erreurs\"\u003eGestion des erreurs\u003c/h2\u003e\n\u003cp\u003eRetrouvez ci-dessous les erreurs communes liées à une mauvaise configuration :\u003c/p\u003e\n\u003ch3 id=\"error-authentication-failed\"\u003eError: authentication failed\u003c/h3\u003e\n\u003cp\u003eVérifiez, re-vérifiez votre couple d\u0026rsquo;identification \u003ccode\u003eusername\u003c/code\u003e, \u003ccode\u003epassword\u003c/code\u003e\nécrits dans votre \u003ca href=\"/fr/sys/openbsd/smtpd-config-auth/#fichier-etc-mail-secrets\"\u003efichier secret\u003c/a\u003e !\u003c/p\u003e\n\u003ch3 id=\"error-cannot-parse-smarthost\"\u003eError: Cannot parse smarthost\u003c/h3\u003e\n\u003cp\u003eCe message d\u0026rsquo;erreur est adressé parce que le service SMTP n\u0026rsquo;arrive pas à\ncomprendre l\u0026rsquo;ensemble \u003ccode\u003eidentifiant@serveur\u003c/code\u003e dans votre règle action.\u003c/p\u003e\n\u003cp\u003eVérifiez vos écritures, afin que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003evotre \u003ccode\u003etable secrets\u003c/code\u003e renseigne bien le bon nom de fichier à interroger !\u003c/li\u003e\n\u003cli\u003evous avez bien écrit une écriture de type \u003ccode\u003eidentifiant username:password\u003c/code\u003e\ndans votre fichier \u003ccode\u003esecrets\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003evous avez bien remplacez la chaîne \u003ccode\u003eidentifiant\u003c/code\u003e par celle que vous\navez créée…\u003c/li\u003e\n\u003cli\u003eidem pour la chaîne \u003ccode\u003eserveur\u003c/code\u003e : assurez-vous de l\u0026rsquo;existence du nom de\nl\u0026rsquo;hôte relais.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"error-sender-address-rejected-domain-not-found\"\u003eError: Sender address rejected: Domain not found\u003c/h3\u003e\n\u003cp\u003eCe message d\u0026rsquo;erreur vous est adressé lorsque le service SMTP ne trouve\npas de correspondance avec le nom de domaine.\u003c/p\u003e\n\u003cdl\u003e\n\u003cdt\u003eL\u0026rsquo;astuce est d\u0026rsquo;utiliser le paramètre \u003ca href=\"https://man.openbsd.org/smtpd.conf#mail_-from\" rel=\"external\"\u003email-from\u003c/a\u003e,\u003c/dt\u003e\n\u003cdt\u003edans la règle action, de manière à cibler votre nom de domaine, tel que\u003c/dt\u003e\n\u003cdd\u003e\u003ccode\u003email-from \u0026quot;@votre-domaine.tld\u0026quot;\u003c/code\u003e \u003cbr\u003e\n\u003cstrong\u003en\u0026rsquo;oubliez pas la présence du symbole \u003ccode\u003e@\u003c/code\u003e \u003cem\u003e(arobase)\u003c/em\u003e.\u003c/strong\u003e\u003c/dd\u003e\n\u003c/dl\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, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/smtpctl.8\" title=\"Page du Manuel OpenBSD pour : smtpctl\"\u003esmtpctl(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"autres-informations\"\u003eAutres informations\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRetrouvez les différents changements de syntaxe induits par la nouvelle\nversion d\u0026rsquo;OpenSMTPD : en \u003ca href=\"https://www.openbsd.org/faq/upgrade64.html\" rel=\"external\"\u003eAnglais\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Comment configurer le service smtpd avec authentification mail sous OpenBSD (≥ v6.4), pour permettre l'accès à vos services de messagerie mails.","tags":["OpenBSD","smtpd","auth","mail"],"date_published":"2018-11-03T21:38:54+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-23:/fr/sys/openbsd/unbound-control#f22e313ec82471142811929d04a0a45f11946540e9514ed96717344971ad4ade","url":"https://it-log.fr.eu.org/fr/sys/openbsd/unbound-control/","title":"OpenBSD : Unbound control","author":{"name":"Stéphane HUC"},"content_text":"Description Le but de cet article est de montrer comment obtenir les différentes informations qu\u0026rsquo;unbound permet de surveiller, et se base sur l\u0026rsquo;outil unbound-control.\nConfiguration Pour rappel :\nle fichier de configuration est normalement : /var/unbound/etc/unbound.conf la commande pour tester la configuration est : unbound-checkconf Je ne rappellerai pas comment configurer pleinement Unbound, lisez cet article OpenBSD : utiliser Unbound et celui-ci pour plus de \u0026ldquo;sécurité\u0026rdquo; autour des communications DNS OpenBSD : Unbound en mode DNSSEC \u0026#43; DNS/TLS ;-)\nunbound-control-setup La première chose, à faire sur votre serveur, est l\u0026rsquo;usage de l\u0026rsquo;outil unbound-control-setup, afin de générer les clés et certificats nécessaires pour gérer le service :\n# unbound-control-setup setup in directory /var/unbound/etc 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 Les clés et certificats étant générés, il ne reste plus qu\u0026rsquo;à retoucher le fichier de configuration pour activer le service de gestion de contrôle, qui permet de le gérer aussi à distance !\nunbound-control Ouvrons le fichier de configuration d\u0026rsquo;unbound, pour le modifier de manière adéquate - par défaut, il se présente ainsi :\nremote-control: control-enable: yes control-use-cert: no control-interface: /var/run/unbound.sock Pour pouvoir l\u0026rsquo;administrer localement, il est nécessaire de commenter la déclaration control-interface et d\u0026rsquo;ajouter celles-ci :\n#control-interface: /var/run/unbound.sock control-interface: 127.0.0.1 control-interface: ::1 Il est bien sûr possible de spécifier l\u0026rsquo;adresse IPv4 ou IPv6 du serveur, celles de votre LAN, ou celles accessibles sur Internet. Lire les règles de pare-feu envisageables pour sécuriser la connexion.\nMaintenant, après avoir vérifié le fichier de configuration et recharger/relancer le service unbound, il est possible au moins localement d\u0026rsquo;utiliser l\u0026rsquo;outil unbound-control.\nLisez ABSOLUMENT le manpage pour savoir quelles sont les différentes options, voici les plus utiles :\n-c : spécifier un fichier de configuration alternatif -h : obtenir l\u0026rsquo;aide -s : cibler le serveur à interroger ; fonctionne sur IPv4 et IPv6 : server[@port] : si le port n\u0026rsquo;est pas spécifié, ce sera celui par défaut 8953, sinon modifiez-le dans le fichier de configuration. Ensuite, il est possible d\u0026rsquo;envoyer des commandes qui interagiront avec le serveur, de telle manière : :$ unbound-control -s 127.0.0.1 command_name\nIl y a beaucoup de commande possibles, voici certaines :\nstart : démarrer le serveur\nstop : arrêter le serveur\nreload : purge le cache et recharge la configuration\nstats : affiche les statistiques et remets à zéro les compteurs internes\nstats_noreset : affiche les statistiques sans remettre à zéro les compteurs internes\nstatus : affiche le status du serveur\n0, s\u0026rsquo;il fonctionne 1, s\u0026rsquo;il y a une erreur 3, soit s\u0026rsquo;il ne fonctionne pas, soit si la connexion est refusée. dump_cache permet d\u0026rsquo;afficher/imprimer le contenu du cache ; il est ainsi possible de le rediriger vers un fichier pour enregistrer ces données.\nload_cache charge le contenu d\u0026rsquo;un cache depuis stdin… aide au débogage.\nget_option //option// pour obtenir la valeur d\u0026rsquo;une option, où option est le nom de l\u0026rsquo;option\nset_option //option:valeur// permet de définir la valeur d\u0026rsquo;une option… où option est le nom de l\u0026rsquo;option, et valeur, sa valeur adéquate.\nLes options paramétrables sont :\nadd-holddown, cache-max-ttl, cache-max-negative-ttl, cache-min-ttl del-holddown, do-not-query-localhost, harden-below-nxdomain, harden-dnssec-stripped, harden-glue, harden-large-queries, harden-referral-path, harden-short-bufsize, hide-identity, hide-version, identity, ignore-cd-flag, ip-ratelimit, keep-missing, log-queries, val-log-level, val-log-squelch, max-udp-size, prefetch, prefetch-key, ratelimit, statistics-cumulative, statistics-interval, ssl-upstream, tcp-upstream, version, Ensuite, il est possible de gèrer :\nles zones locales local-zone et leurs données local-data, toutes les options auth_*, dump_*, flush_*, forward_*, insecure_*, list_*, *ratelimit_*, stub_*, view_* mais là, encore une fois, je vous invite à relire le manpage. ;)\nExemples status : $ unbound-control -s ::1 status version: 1.8.1 verbosity: 1 threads: 2 modules: 2 [ validator iterator ] uptime: 49932 seconds options: reuseport control unbound (pid 99951) is running… get_option : :$ unbound-control -s ::1 get_option harden-glue yes dump_cache : :$ unbound-control -s ::1 dump_cache \u0026gt; dump.unbound il ne vous reste plus qu\u0026rsquo;à lire le fichier dump.unbound ; bien sûr, il peut porter tout autre nom que vous désirez. PF Voici quelques règles - d\u0026rsquo;exemples - pour le pare-feu PF (Packet Filter) :\nPF : côté serveur Si vous utilisez l\u0026rsquo;option control-interface en permettant que ce soit l\u0026rsquo;IP publique sur Internet ou sur votre LAN qui soit consultable, il est fortement recommandé de modifier vos règles PF, afin de n\u0026rsquo;autoriser que le flux venant d\u0026rsquo;une machine autorisée, telle que :\n(…) myhost = \u0026#34;192.168.1.1\u0026#34; unbound_ctlr = \u0026#34;8953\u0026#34; (…) table \u0026lt;t_adm\u0026gt; const { 192.168.1.3, fd0::3 } (…) blog log pass out (…) pass in quick on egress proto tcp from \u0026lt;t_adm\u0026gt; to $myhost port $unbound_ctlr flags S/SA modulate state Autrement dit, on autorise le flux entrant sur l\u0026rsquo;interface egress depuis les adresses IPv4|6 intégrées dans la table \u0026lt;t_adm\u0026gt; vers le serveur $myhost sur le port $unbound_ctlr.\nPF : côté station Pour votre station autorisée ayant, par exemple, l\u0026rsquo;adresse IPv4 192.168.1.3 :\n(…) myhost = \u0026#34;192.168.1.3\u0026#34; server = \u0026#34;192.168.1.1\u0026#34; unbound_ctlr = \u0026#34;8953\u0026#34; (…) blog log pass out (…) pass out quick on egress inet proto tcp from $myhost to $server port $unbound_ctlr flags S/SA modulate state On autorise le flux sortant de votre machine autorisée vers le serveur sur le port adéquate… Bien-sûr, faites de même pour IPv6.\nDocumentations OpenBSD : utiliser Unbound OpenBSD : Unbound en mode DNSSEC \u0026#43; DNS/TLS Manpage unbound-control(8) ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe but de cet article est de montrer comment obtenir les différentes informations\nqu\u0026rsquo;unbound permet de surveiller, et se base sur l\u0026rsquo;outil \u003ccode\u003eunbound-control\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePour rappel :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele fichier de configuration est normalement : \u003ccode\u003e/var/unbound/etc/unbound.conf\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ela commande pour tester la configuration est : \u003ccode\u003eunbound-checkconf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eJe ne rappellerai pas comment configurer pleinement Unbound, lisez cet\narticle \u003cstrong\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/unbound/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : utiliser Unbound'\"\u003eOpenBSD : utiliser Unbound\u003c/a\u003e\n\n\u003c/strong\u003e et celui-ci pour plus\nde \u0026ldquo;sécurité\u0026rdquo; autour des communications DNS \u003cstrong\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/unbound-dnssec-dns-over-tls/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Unbound en mode DNSSEC \u0026#43; DNS/TLS'\"\u003eOpenBSD : Unbound en mode DNSSEC \u0026#43; DNS/TLS\u003c/a\u003e\n\n\u003c/strong\u003e ;-)\u003c/p\u003e\n\u003ch3 id=\"unbound-control-setup\"\u003eunbound-control-setup\u003c/h3\u003e\n\u003cp\u003eLa première chose, à faire sur votre serveur, est l\u0026rsquo;usage de l\u0026rsquo;outil\n\u003ccode\u003eunbound-control-setup\u003c/code\u003e, afin de générer les clés et certificats nécessaires\npour gérer 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# unbound-control-setup\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esetup in directory /var/unbound/etc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egenerating unbound_server.key\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eGenerating RSA private key, \u003cspan style=\"color:#f99b15\"\u003e3072\u003c/span\u003e bit long modulus\n\u003c/span\u003e\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\u003ee is \u003cspan style=\"color:#f99b15\"\u003e65537\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x10001\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egenerating unbound_control.key\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eGenerating RSA private key, \u003cspan style=\"color:#f99b15\"\u003e3072\u003c/span\u003e bit long modulus\n\u003c/span\u003e\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\u003ee is \u003cspan style=\"color:#f99b15\"\u003e65537\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x10001\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecreate unbound_server.pem \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eself signed certificate\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecreate unbound_control.pem \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esigned client certificate\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSignature ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003esubject\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/CN\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eunbound-control\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eGetting CA Private Key\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSetup success. Certificates created. Enable in unbound.conf file to use\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes clés et certificats étant générés, il ne reste plus qu\u0026rsquo;à retoucher\nle fichier de configuration pour activer le service de gestion de contrôle,\nqui permet de le gérer aussi à distance !\u003c/p\u003e\n\u003ch3 id=\"unbound-control\"\u003eunbound-control\u003c/h3\u003e\n\u003cp\u003eOuvrons le fichier de configuration d\u0026rsquo;unbound, pour le modifier de manière\nadéquate - par défaut, il se présente 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eremote-control:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    control-enable: yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    control-use-cert: no\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    control-interface: /var/run/unbound.sock\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour pouvoir l\u0026rsquo;administrer localement, il est nécessaire de commenter la\ndéclaration \u003ccode\u003econtrol-interface\u003c/code\u003e et d\u0026rsquo;ajouter celles-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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#control-interface: /var/run/unbound.sock\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    control-interface: 127.0.0.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    control-interface: ::1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl est bien sûr possible de spécifier l\u0026rsquo;adresse IPv4 ou IPv6 du serveur,\ncelles de votre LAN, ou celles accessibles sur Internet. \u003cbr\u003e\nLire les règles de \u003ca href=\"/fr/sys/openbsd/unbound-control/#pf\"\u003epare-feu\u003c/a\u003e envisageables pour sécuriser la connexion.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eMaintenant, après avoir vérifié le fichier de configuration et recharger/relancer\nle service unbound, il est possible au moins localement d\u0026rsquo;utiliser l\u0026rsquo;outil\n\u003ccode\u003eunbound-control\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLisez ABSOLUMENT le manpage pour savoir quelles sont les différentes options,\nvoici les plus utiles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-c\u003c/code\u003e : spécifier un fichier de configuration alternatif\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-h\u003c/code\u003e : obtenir l\u0026rsquo;aide\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-s\u003c/code\u003e : cibler le serveur à interroger ; \u003cem\u003efonctionne sur IPv4 et IPv6\u003c/em\u003e :\n\u003ccode\u003eserver[@port]\u003c/code\u003e :\n\u003cul\u003e\n\u003cli\u003esi le port n\u0026rsquo;est pas spécifié, ce sera celui par défaut \u003ccode\u003e8953\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003esinon modifiez-le dans le fichier de configuration.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEnsuite, il est possible d\u0026rsquo;envoyer des commandes qui interagiront avec\nle serveur, de telle manière : \u003cbr\u003e\n\u003ccode\u003e:$ unbound-control -s 127.0.0.1 command_name\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl y a beaucoup de commande possibles, voici certaines :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003estart\u003c/code\u003e : démarrer le serveur\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003estop\u003c/code\u003e : arrêter le serveur\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ereload\u003c/code\u003e : purge le cache et recharge la configuration\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003estats\u003c/code\u003e : affiche les statistiques et remets à zéro les compteurs internes\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003estats_noreset\u003c/code\u003e : affiche les statistiques sans remettre à zéro les\ncompteurs internes\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003estatus\u003c/code\u003e : affiche le status du serveur\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e0\u003c/code\u003e, s\u0026rsquo;il fonctionne\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e1\u003c/code\u003e, s\u0026rsquo;il y a une erreur\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e3\u003c/code\u003e, soit s\u0026rsquo;il ne fonctionne pas, soit si la connexion est refusée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003edump_cache\u003c/code\u003e permet d\u0026rsquo;afficher/imprimer le contenu du cache ; il est\nainsi possible de le rediriger vers un fichier pour enregistrer ces données.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eload_cache\u003c/code\u003e charge le contenu d\u0026rsquo;un cache depuis stdin… aide au débogage.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eget_option //option//\u003c/code\u003e pour obtenir la valeur d\u0026rsquo;une option, où \u003ccode\u003eoption\u003c/code\u003e\nest le nom de l\u0026rsquo;option\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eset_option //option:valeur//\u003c/code\u003e permet de définir la valeur d\u0026rsquo;une option… \u003cbr\u003e\noù \u003ccode\u003eoption\u003c/code\u003e est le nom de l\u0026rsquo;option, et \u003ccode\u003evaleur\u003c/code\u003e, sa valeur adéquate.\u003c/p\u003e\n\u003cp\u003eLes options paramétrables sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eadd-holddown\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecache-max-ttl\u003c/code\u003e, \u003ccode\u003ecache-max-negative-ttl\u003c/code\u003e, \u003ccode\u003ecache-min-ttl\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edel-holddown\u003c/code\u003e, \u003ccode\u003edo-not-query-localhost\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eharden-below-nxdomain\u003c/code\u003e, \u003ccode\u003eharden-dnssec-stripped\u003c/code\u003e, \u003ccode\u003eharden-glue\u003c/code\u003e,\n\u003ccode\u003eharden-large-queries\u003c/code\u003e, \u003ccode\u003eharden-referral-path\u003c/code\u003e, \u003ccode\u003eharden-short-bufsize\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehide-identity\u003c/code\u003e, \u003ccode\u003ehide-version\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eidentity\u003c/code\u003e, \u003ccode\u003eignore-cd-flag\u003c/code\u003e, \u003ccode\u003eip-ratelimit\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ekeep-missing\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elog-queries\u003c/code\u003e, \u003ccode\u003eval-log-level\u003c/code\u003e, \u003ccode\u003eval-log-squelch\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emax-udp-size\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eprefetch\u003c/code\u003e, \u003ccode\u003eprefetch-key\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eratelimit\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatistics-cumulative\u003c/code\u003e, \u003ccode\u003estatistics-interval\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003essl-upstream\u003c/code\u003e, \u003ccode\u003etcp-upstream\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eversion\u003c/code\u003e,\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEnsuite, il est possible de gèrer :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles zones locales \u003ccode\u003elocal-zone\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet leurs données \u003ccode\u003elocal-data\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003etoutes les options \u003ccode\u003eauth_*\u003c/code\u003e, \u003ccode\u003edump_*\u003c/code\u003e, \u003ccode\u003eflush_*\u003c/code\u003e, \u003ccode\u003eforward_*\u003c/code\u003e, \u003ccode\u003einsecure_*\u003c/code\u003e,\n\u003ccode\u003elist_*\u003c/code\u003e, \u003ccode\u003e*ratelimit_*\u003c/code\u003e, \u003ccode\u003estub_*\u003c/code\u003e, \u003ccode\u003eview_*\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003emais là, encore une fois, je vous invite à relire le manpage. ;)\u003c/p\u003e\n\u003ch4 id=\"exemples\"\u003eExemples\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatus\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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ unbound-control -s ::1 status\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eversion: 1.8.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003everbosity: \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ethreads: \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emodules: \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e validator iterator \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euptime: \u003cspan style=\"color:#f99b15\"\u003e49932\u003c/span\u003e seconds\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoptions: reuseport control\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eunbound \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003epid 99951\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e is running…\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eget_option\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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ unbound-control -s ::1 get_option harden-glue\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eyes\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edump_cache\u003c/code\u003e :\n\u003ccode\u003e:$ unbound-control -s ::1 dump_cache \u0026gt; dump.unbound\u003c/code\u003e \u003cbr\u003e\nil ne vous reste plus qu\u0026rsquo;à lire le fichier \u003ccode\u003edump.unbound\u003c/code\u003e ;\n\u003cem\u003ebien sûr, il peut porter tout autre nom que vous désirez\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\u003cp\u003eVoici quelques règles - d\u0026rsquo;exemples - pour le pare-feu \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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\u003ch4 id=\"pf--côté-serveur\"\u003ePF : côté serveur\u003c/h4\u003e\n\u003cp\u003eSi vous utilisez l\u0026rsquo;option \u003ccode\u003econtrol-interface\u003c/code\u003e en permettant que ce soit\nl\u0026rsquo;IP publique sur Internet ou sur votre LAN qui soit consultable, il est\nfortement recommandé de modifier vos règles PF, afin de n\u0026rsquo;autoriser que le flux\nvenant d\u0026rsquo;une machine autorisée, 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(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003emyhost\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;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:#06b6ef\"\u003eunbound_ctlr\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;8953\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\"\u003etable \u0026lt;t_adm\u0026gt; const { 192.168.1.3, fd0::3 }\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\"\u003eblog log\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out\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\"\u003epass in quick on egress  proto tcp from \u0026lt;t_adm\u0026gt;  to $myhost port $unbound_ctlr 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\u003eAutrement dit, on autorise le flux entrant sur l\u0026rsquo;interface \u003ccode\u003eegress\u003c/code\u003e\ndepuis les adresses IPv4|6 intégrées dans la table \u003ccode\u003e\u0026lt;t_adm\u0026gt;\u003c/code\u003e vers le\nserveur \u003ccode\u003e$myhost\u003c/code\u003e sur le port \u003ccode\u003e$unbound_ctlr\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"pf--côté-station\"\u003ePF : côté station\u003c/h4\u003e\n\u003cp\u003ePour votre station autorisée ayant, par exemple, l\u0026rsquo;adresse IPv4 \u003ccode\u003e192.168.1.3\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\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003emyhost\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\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\u003cspan style=\"color:#06b6ef\"\u003eserver\u003c/span\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;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:#06b6ef\"\u003eunbound_ctlr\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;8953\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\"\u003eblog log\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out\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\"\u003epass out quick on egress inet  proto tcp from $myhost  to $server  port $unbound_ctlr 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\u003eOn autorise le flux sortant de votre machine autorisée vers le serveur sur\nle port adéquate… Bien-sûr, faites de même pour IPv6.\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/unbound/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : utiliser Unbound'\"\u003eOpenBSD : utiliser Unbound\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/unbound-dnssec-dns-over-tls/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Unbound en mode DNSSEC \u0026#43; DNS/TLS'\"\u003eOpenBSD : Unbound en mode DNSSEC \u0026#43; DNS/TLS\u003c/a\u003e\n\n\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/unbound-control.8\" title=\"Page du Manuel OpenBSD pour : unbound-control\"\u003eunbound-control(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment contrôler son service unbound, sous OpenBSD, avec la commande `unbound-control`","tags":["OpenBSD","unbound","supervision"],"date_published":"2018-10-23T15:08:43+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-22:/fr/sys/openbsd/unbound-dnssec-dns-over-tls#915960997370796ea6af592056c3095f25646c9ed360e929953bc453e5277852","url":"https://it-log.fr.eu.org/fr/sys/openbsd/unbound-dnssec-dns-over-tls/","title":"OpenBSD : Unbound en mode DNSSEC + DNS/TLS","author":{"name":"Stéphane HUC"},"content_text":"Description Cet article a pour but de montrer comment configurer le service unbound pour que celui fasse ses requêtes en tenant compte du protocole DNSSEC, protocol de chiffrement des données, et aussi pour qu\u0026rsquo;elles soient transmises en tenant compte du protocol de chiffrement TLS.\nConfiguration Pour rappel :\nle fichier de configuration est normalement : /var/unbound/etc/unbound.conf la commande pour tester la configuration est : unbound-checkconf Je ne rappellerai pas comment configurer pleinement Unbound, lisez cet article : OpenBSD : utiliser Unbound DNSSEC La gestion DNSSEC se fait par l\u0026rsquo;usage de l\u0026rsquo;outil unbound-anchor qui crée un fichier de clé nécessaire et l\u0026rsquo;ajout de la variable auto-trust-anchor-file qui pointe vers ledit fichier de clés, dans votre fichier de configuration, tel quel :\nauto-trust-anchor-file: \u0026#34;/var/unbound/db/root.key\u0026#34; Auquel, il faut ajouté le mode de validation DNSSEC : module-config: \u0026#34;validator iterator\u0026#34; AstuceMême si sous OpenBSD, ce fichier de clé est généré automatiquement dès le premier démarrage, pour générer le fichier de clé :\n# unbound-anchor -u _unbound -a \u0026quot;/var/unbound/db/root.key\u0026quot;\nL\u0026rsquo;option -u utilise ici le nom utilisateur, par défaut lié au projet unbound, sous OpenBSD, à savoir _unbound.\nDe même, il faut ajouter les variables suivantes à votre propre fichier de configuration :\nharden-below-nxdomain: yes harden-dnssec-stripped: yes harden-referral-path: yes Explications\nL\u0026rsquo;option harden-referral-path\u0026rsquo; renforce la validation DNSSEC - c\u0026rsquo;est une option expérimentale, sans norme RFC, et peut poser des problèmes de performances ! Depuis la version 1.7.0, unbound a une nouvelle option : aggressive-nsec qui met en cache les enregistrements NSEC pour générer les réponses rapidement. Depuis OpenBSD 6.4, unbound est fourni en version 1.8.1, donc profitez-en : aggressive-nsec: yes DNS over TLS Oui, unbound est capable de communiquer aussi avec les serveurs DNS, en mode protocolaire DoT !\nInfoIl est nécessaire de bien comprendre l\u0026rsquo;impact de l\u0026rsquo;usage de ce mode de communication. Du fait d\u0026rsquo;utiliser TLS, la communication semble \u0026ldquo;ralentie\u0026rdquo;, donner la sensation de lenteur…\nCela est plus ou moins sensible selon la puissance de votre machine et des serveurs interrogés, de la qualité du réseau, etc.\nIl faut configurer unbound ainsi, dans un premier temps :\ndo-tcp: yes ssl-upstream: yes Explications :\ndo-tcp indique de communiquer sur le protocole TCP ssl-upstream ou tls-upstream oblige à communiquer sur le protocole TLS. Il est important que le(s) serveur(s) DNS interrogés sachent communiquer sur ce protocole, autrement les requêtes échoueront ! Si les deux options *-upstream sont indiquées, seule la dernière sera prise en compte. Forward Ensuite, il est nécessaire de décommenter - si ce n\u0026rsquo;est pas déjà fait - la partie forward-zone, pour indiquer le(s) serveur(s) à interroger sur le port adéquat - par défaut : 853 - tel(s) que :\nforward-zone: name: \u0026#34;.\u0026#34; # use for ALL queries forward-ssl-upstream: yes # FDN DoT ## https://www.fdn.fr/ouverture-des-services-dot-doh/ 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 # Others forward-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 (…) Explications :\nforward-ssl-upstream ou son pendant forward-tls-upstream - (cette dernière semble n\u0026rsquo;être pas reconnue… sous OpenBSD) oblige toutes les requêtes name: \u0026quot;.\u0026quot; à communiquer en mode DoT - normalement la documentation unbound informe qu\u0026rsquo;il faut aussi configurer l\u0026rsquo;option ssl-cert-bundle, ou son pendant tls-cert-bundle, voire l\u0026rsquo;option tls-win-cert pour authentifier les connexions. Cela ne semble pas nécessaire sous OpenBSD. (\u0026lt;= à confirmer !) InfoLes serveurs DNS indiqués le sont à titre d\u0026rsquo;exemples et fonctionnels… mais vous pouvez très bien en ajouter, supprimer d\u0026rsquo;autres, ne le faire que sur une des deux couches réseaux (soit pour IPv4, soit pour IPv6)… Tests DNSSEC Dig Un premier test à faire est l\u0026rsquo;usage de la commande dig, tel que :\n$ dig com. SOA +dnssec ; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.10.3-P4-Debian \u0026lt;\u0026lt;\u0026gt;\u0026gt; com. SOA +dnssec ;; global options: +cmd ;; Got answer: ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NOERROR, id: 60764 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 14, ADDITIONAL: 1 (…) Ce qu\u0026rsquo;il faut repérer dans la sortie complète de la commande dig est sur la ligne flags: : il faut la présence du drapeau ad - si celui-ci figure bien, c\u0026rsquo;est bon signe ! :D\n$ dig com. SOA +dnssec | grep \u0026#34;;; flags\u0026#34; ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 Unbound-host L\u0026rsquo;autre commande à utiliser est la commande unbound-host qui permet de s\u0026rsquo;assurer du même résultat, tel que :\n$ unbound-host -v -f /var/unbound/db/root.key com. com. has no address (secure) com. has no IPv6 address (secure) com. has no mail handler record (secure) $ unbound-host -v -f /var/unbound/db/root.key www.ripe.net www.ripe.net has address 193.0.6.139 (secure) www.ripe.net has IPv6 address 2001:67c:2e8:22::c100:68b (secure) www.ripe.net has no mail handler record (secure) $ unbound-host -v -f /var/unbound/db/root.key www.afnic.fr www.afnic.fr is an alias for lb01-1.nic.fr. (secure) lb01-1.nic.fr has address 192.134.5.24 (secure) lb01-1.nic.fr has IPv6 address 2001:67c:2218:30::24 (secure) lb01-1.nic.fr has no mail handler record (secure) $ unbound-host -v -f /var/unbound/db/root.key dnssec.cz dnssec.cz has address 217.31.205.51 (secure) dnssec.cz has IPv6 address 2001:1488:0:3::5 (secure) dnssec.cz mail is handled by 10 mail.nic.cz. (secure) dnssec.cz mail is handled by 15 mx.nic.cz. (secure) dnssec.cz mail is handled by 20 bh.nic.cz. (secure) # unbound-host -v -C /var/unbound/etc/unbound.conf dnssec.cz dnssec.cz has address 217.31.205.51 (secure) dnssec.cz has IPv6 address 2001:1488:0:3::5 (secure) dnssec.cz mail is handled by 10 mail.nic.cz. (secure) dnssec.cz mail is handled by 15 mx.nic.cz. (secure) dnssec.cz mail is handled by 20 bh.nic.cz. (secure) Navigateur internet Un moyen visuel est d\u0026rsquo;ouvrir votre navigateur internet favori, puis d\u0026rsquo;aller sur les sites suivants :\nhttp://www.dnssec.cz : si, sur la partie droite, vous voyez une clé verte, c\u0026rsquo;est tout autant bon signe ! https://en.internet.nl : cliquez sur le lien titré \u0026ldquo;Test my internet connection\u0026rdquo; Documentations Pour savoir comment :\ncontrôler le service unbound Manpage dig unbound(8) , unbound.conf(5) , unbound-checkconf(8) , unbound-anchor(8) , unbound-host ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eCet article a pour but de montrer comment configurer le service unbound\npour que celui fasse ses requêtes en tenant compte du protocole DNSSEC,\nprotocol de chiffrement des données, et aussi pour qu\u0026rsquo;elles soient transmises\nen tenant compte du protocol de chiffrement TLS.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePour rappel :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele fichier de configuration est normalement : \u003ccode\u003e/var/unbound/etc/unbound.conf\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ela commande pour tester la configuration est : \u003ccode\u003eunbound-checkconf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eJe ne rappellerai pas comment configurer pleinement Unbound, lisez cet\narticle : \u003cstrong\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/unbound/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : utiliser Unbound'\"\u003eOpenBSD : utiliser Unbound\u003c/a\u003e\n\n\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"dnssec\"\u003eDNSSEC\u003c/h3\u003e\n\u003cp\u003eLa gestion DNSSEC se fait par l\u0026rsquo;usage de l\u0026rsquo;outil \u003ccode\u003eunbound-anchor\u003c/code\u003e qui crée\nun fichier de clé nécessaire et l\u0026rsquo;ajout de la variable \u003ccode\u003eauto-trust-anchor-file\u003c/code\u003e\nqui pointe vers ledit fichier de clés, dans votre fichier de configuration,\ntel quel :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003eauto-trust-anchor-file: \u0026#34;/var/unbound/db/root.key\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAuquel, il faut ajouté le mode de validation DNSSEC : \u003cbr\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\"\u003emodule-config: \u0026#34;validator iterator\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\"\u003e\u003cp\u003eMême si sous OpenBSD, ce fichier de clé est généré automatiquement dès\nle premier démarrage, pour générer le fichier de clé :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# unbound-anchor -u _unbound -a \u0026quot;/var/unbound/db/root.key\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;option \u003ccode\u003e-u\u003c/code\u003e utilise ici le nom utilisateur, par défaut lié au projet\nunbound, sous OpenBSD, à savoir \u003ccode\u003e_unbound\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eDe même, il faut ajouter les variables suivantes à votre propre fichier\nde 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\"\u003eharden-below-nxdomain: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eharden-dnssec-stripped: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eharden-referral-path: yes\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\u003eL\u0026rsquo;option \u003ccode\u003eharden-referral-path\u003c/code\u003e\u0026rsquo; renforce la validation DNSSEC -\n\u003cem\u003ec\u0026rsquo;est une option expérimentale, sans norme RFC, et peut poser des problèmes de performances\u003c/em\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDepuis la version 1.7.0, unbound a une nouvelle option : \u003ccode\u003eaggressive-nsec\u003c/code\u003e\nqui met en cache les enregistrements NSEC pour générer les réponses rapidement.\nDepuis OpenBSD 6.4, unbound est fourni en version 1.8.1, donc profitez-en :  \u003cbr\u003e\n\u003ccode\u003eaggressive-nsec: yes\u003c/code\u003e \u003cbr\u003e\u003c/p\u003e\n\u003ch3 id=\"dns-over-tls\"\u003eDNS over TLS\u003c/h3\u003e\n\u003cp\u003eOui, unbound est capable de communiquer aussi avec les serveurs DNS, en\nmode protocolaire \u003cstrong\u003e\u003cabbr title=\"DNS-over-TLS\"\u003eDoT\u003c/abbr\u003e\n\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\u003eIl est nécessaire de \u003cstrong\u003ebien comprendre l\u0026rsquo;impact de l\u0026rsquo;usage de ce mode de communication\u003c/strong\u003e.\nDu fait d\u0026rsquo;utiliser TLS, la communication semble \u0026ldquo;ralentie\u0026rdquo;, donner la\nsensation de lenteur…\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCela est plus ou moins sensible selon la puissance de votre machine et\ndes serveurs interrogés, de la qualité du réseau, etc.\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eIl faut configurer unbound ainsi, dans un premier temps :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003edo-tcp: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003essl-upstream: yes\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\u003ccode\u003edo-tcp\u003c/code\u003e indique de communiquer sur le protocole TCP\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003essl-upstream\u003c/code\u003e ou \u003ccode\u003etls-upstream\u003c/code\u003e oblige à communiquer sur le protocole TLS.\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003cem\u003eIl est important que le(s) serveur(s) DNS interrogés sachent\ncommuniquer sur ce protocole\u003c/em\u003e, autrement les requêtes échoueront !\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eSi les deux options \u003ccode\u003e*-upstream\u003c/code\u003e sont indiquées, seule la dernière\nsera prise en compte.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"forward\"\u003eForward\u003c/h4\u003e\n\u003cp\u003eEnsuite, il est nécessaire de décommenter - \u003cem\u003esi ce n\u0026rsquo;est pas déjà fait\u003c/em\u003e -\nla partie \u003ccode\u003eforward-zone\u003c/code\u003e, pour indiquer le(s) serveur(s) à interroger sur\nle port adéquat - par défaut : 853 - tel(s) 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\"\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;                               # use for ALL queries\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-ssl-upstream: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\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:#776e71\"\u003e## https://www.fdn.fr/ouverture-des-services-dot-doh/\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# Others\u003c/span\u003e\n\u003c/span\u003e\u003c/span\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\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\u003cstrong\u003eExplications :\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eforward-ssl-upstream\u003c/code\u003e ou son pendant \u003ccode\u003eforward-tls-upstream\u003c/code\u003e -\n\u003cem\u003e(cette dernière semble n\u0026rsquo;être pas reconnue… sous OpenBSD)\u003c/em\u003e oblige\ntoutes les requêtes \u003ccode\u003ename: \u0026quot;.\u0026quot;\u003c/code\u003e à communiquer en mode DoT -\nnormalement la documentation unbound informe qu\u0026rsquo;il faut aussi configurer\nl\u0026rsquo;option \u003ccode\u003essl-cert-bundle\u003c/code\u003e, ou son pendant \u003ccode\u003etls-cert-bundle\u003c/code\u003e,\nvoire l\u0026rsquo;option \u003ccode\u003etls-win-cert\u003c/code\u003e pour authentifier les connexions. \u003cbr\u003e\nCela ne semble pas nécessaire sous OpenBSD. \u003cem\u003e(\u0026lt;= à confirmer !)\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\"\u003eLes serveurs DNS indiqués le sont à titre d\u0026rsquo;exemples et fonctionnels…\nmais vous pouvez très bien en ajouter, supprimer d\u0026rsquo;autres, ne le faire\nque sur une des deux couches réseaux (soit pour IPv4, soit pour IPv6)…\u003c/div\u003e\n\n\u003ch2 id=\"tests-dnssec\"\u003eTests DNSSEC\u003c/h2\u003e\n\u003ch3 id=\"dig\"\u003eDig\u003c/h3\u003e\n\u003cp\u003eUn premier test à faire est l\u0026rsquo;usage de la commande \u003ccode\u003edig\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$ dig com. SOA +dnssec \n\u003c/span\u003e\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;\u0026lt;\u0026gt;\u0026gt; DiG 9.10.3-P4-Debian \u0026lt;\u0026lt;\u0026gt;\u0026gt; com. SOA +dnssec \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; global options: +cmd \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; Got answer: \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; -\u0026gt;\u0026gt;HEADER\u003cspan style=\"color:#48b685\"\u003e\u0026lt;\u0026lt;- opco\u003c/span\u003ede: QUERY, status: NOERROR, id: \u003cspan style=\"color:#f99b15\"\u003e60764\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 14, ADDITIONAL: \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…\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\u003eCe qu\u0026rsquo;il faut repérer dans la sortie complète de la commande \u003ccode\u003edig\u003c/code\u003e est\nsur la ligne \u003ccode\u003eflags:\u003c/code\u003e : il faut la présence du drapeau \u003ccode\u003ead\u003c/code\u003e -\n\u003cstrong\u003esi celui-ci figure bien, c\u0026rsquo;est bon signe !\u003c/strong\u003e :D\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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$ dig com. SOA +dnssec | grep \u003cspan style=\"color:#48b685\"\u003e\u0026#34;;; flags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: \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=\"unbound-host\"\u003eUnbound-host\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;autre commande à utiliser est la commande \u003ccode\u003eunbound-host\u003c/code\u003e qui permet de\ns\u0026rsquo;assurer du même résultat, 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$ unbound-host -v -f /var/unbound/db/root.key com.                                                                                         \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom. has no address \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom. has no IPv6 address \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom. has no mail handler record \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\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$ unbound-host -v -f /var/unbound/db/root.key www.ripe.net        \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww.ripe.net has address 193.0.6.139 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww.ripe.net has IPv6 address 2001:67c:2e8:22::c100:68b \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww.ripe.net has no mail handler record \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\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$ unbound-host -v -f /var/unbound/db/root.key www.afnic.fr \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww.afnic.fr is an alias \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e lb01-1.nic.fr. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elb01-1.nic.fr has address 192.134.5.24 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elb01-1.nic.fr has IPv6 address 2001:67c:2218:30::24 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elb01-1.nic.fr has no mail handler record \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\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$ unbound-host -v -f /var/unbound/db/root.key dnssec.cz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz has address 217.31.205.51 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz has IPv6 address 2001:1488:0:3::5 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e mail.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e mx.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e bh.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\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# unbound-host -v -C /var/unbound/etc/unbound.conf dnssec.cz                                                                          \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz has address 217.31.205.51 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz has IPv6 address 2001:1488:0:3::5 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e mail.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e mx.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e bh.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\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=\"navigateur-internet\"\u003eNavigateur internet\u003c/h3\u003e\n\u003cp\u003eUn moyen visuel est d\u0026rsquo;ouvrir votre navigateur internet favori, puis d\u0026rsquo;aller\nsur les sites suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.dnssec.cz\" rel=\"external\"\u003ehttp://www.dnssec.cz\u003c/a\u003e : si, sur la partie droite, vous\nvoyez une clé verte, c\u0026rsquo;est tout autant bon signe !\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.internet.nl\" rel=\"external\"\u003ehttps://en.internet.nl\u003c/a\u003e :  cliquez sur le lien titré \u0026ldquo;Test my internet connection\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cp\u003ePour savoir comment :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/unbound-control/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Unbound control'\"\u003econtrôler le service unbound\u003c/a\u003e\n\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/dig\" title=\"Page du Manuel OpenBSD pour : dig\"\u003edig\u003c/a\u003e\n\u003c/li\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, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/unbound-checkconf.8\" title=\"Page du Manuel OpenBSD pour : unbound-checkconf\"\u003eunbound-checkconf(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/unbound-anchor.8\" title=\"Page du Manuel OpenBSD pour : unbound-anchor\"\u003eunbound-anchor(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/unbound-host\" title=\"Page du Manuel OpenBSD pour : unbound-host\"\u003eunbound-host\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Configurer le service unbound, sous OpenBSD, pour avoir les requêtes en mode DNSSEC, et DNS/TLS","tags":["OpenBSD","unbound","DNSSEC","DNS","DoT","TLS"],"date_published":"2018-10-22T15:08:43+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-20:/fr/post/upgrade-hardened-openbsd#095ca140b750b81f6ddc4a54fabb993f0c8548047c21319d1793ed4dec406e84","url":"https://it-log.fr.eu.org/fr/post/upgrade-hardened-openbsd/","title":"Mettre à niveau son OpenBSD ayant un FS durci","author":{"name":"Stéphane HUC"},"content_text":"Description Dans le contexte de mon projet NAS **OpenBSD Multimedias View-IT que j\u0026rsquo;ai présenté, il y a quelques jours, j\u0026rsquo;ai durci le système de fichiers OpenBSD .\nL\u0026rsquo;expérience m\u0026rsquo;apprenant que mettre à niveau son OpenBSD sur un système de fichiers durci n\u0026rsquo;est pas si simple qu\u0026rsquo;on pourrait le croire - et ce n\u0026rsquo;est pas la faute directement de l\u0026rsquo;installateur d\u0026rsquo;OpenBSD.\nÀ quoi faut-il penser ?\nà commenter vos écritures dans les fichiers /etc/rc.local, etc/rc.shutdown, voire /etc/daily.local, ou à les déplacer le temps de la mise à niveau ! (en effet, les services et autres scripts inscrits dedans pourraient démarrer, s\u0026rsquo;arrêter inutilement, voire de manière impromptue, surtout indésirée !) à remettre le système de fichiers en écriture… Pourquoi ?\nLe problème ne se situe pas lors de la mise à jour du système après avoir récupérer le nouveau bsd.rd, l\u0026rsquo;avoir vérifié, puis démarré dessus ; il se situe après le démarrage du nouveau noyau, lors de l\u0026rsquo;exécution de certains scripts, qui eux ont besoin d\u0026rsquo;écrire et d\u0026rsquo;interagir sur le système, mais qui ne le peuvent !\nDonc, voici mon nouvel article qui explique comment faire pour mettre à niveau sereinement son système de fichiers durci, par quelles étapes passer, et les raisons de celles-ci ;-)\n[Mini-Tuto] Upgrade Hardened OpenBSD ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eDans le contexte de mon projet NAS **\u003ca class=\"inside\" href=\"/fr/sys/openbsd/omv-it-nas/\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003eOpenBSD Multimedias View-IT\u003c/a\u003e\n\nque j\u0026rsquo;ai présenté, il y a quelques jours, j\u0026rsquo;ai \u003ca class=\"inside\" href=\"/fr/sys/openbsd/harden-openbsd/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : durcir le système de fichier'\"\u003edurci le système de fichiers OpenBSD\u003c/a\u003e\n.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;expérience m\u0026rsquo;apprenant que mettre à niveau son OpenBSD sur un système\nde fichiers durci n\u0026rsquo;est pas si simple qu\u0026rsquo;on pourrait le croire - et ce\nn\u0026rsquo;est pas la faute directement de l\u0026rsquo;installateur d\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003cp\u003eÀ quoi faut-il penser ?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eà commenter vos écritures dans les fichiers \u003ccode\u003e/etc/rc.local\u003c/code\u003e, \u003ccode\u003eetc/rc.shutdown\u003c/code\u003e,\nvoire \u003ccode\u003e/etc/daily.local\u003c/code\u003e, ou à les déplacer le temps de la mise à niveau !\n\u003cem\u003e(en effet, les services et autres scripts inscrits dedans pourraient\ndémarrer, s\u0026rsquo;arrêter inutilement, voire de manière impromptue, surtout indésirée !)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eà remettre le système de fichiers en écriture…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePourquoi ?\u003c/p\u003e\n\u003cp\u003eLe problème ne se situe pas lors de la mise à jour du système après avoir\nrécupérer le nouveau \u003cstrong\u003ebsd.rd\u003c/strong\u003e, l\u0026rsquo;avoir vérifié, puis démarré dessus ;\nil se situe après le démarrage du nouveau noyau, lors de l\u0026rsquo;exécution de\ncertains scripts, qui eux ont besoin d\u0026rsquo;écrire et d\u0026rsquo;interagir sur le système,\nmais qui ne le peuvent !\u003c/p\u003e\n\u003cp\u003eDonc, voici mon nouvel \u003ca class=\"inside\" href=\"/fr/sys/openbsd/upgrade-hardened-openbsd/\" title=\"Lien interne vers l\u0026#39;article : '[Mini-Tuto] Upgrade Hardened OpenBSD'\"\u003earticle\u003c/a\u003e\n\nqui explique comment faire pour mettre à niveau sereinement son système\nde fichiers durci, par quelles étapes passer, et les raisons de celles-ci ;-)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/upgrade-hardened-openbsd/\" title=\"Lien interne vers l\u0026#39;article : '[Mini-Tuto] Upgrade Hardened OpenBSD'\"\u003e[Mini-Tuto] Upgrade Hardened OpenBSD\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","tags":["OpenBSD","harden","upgrade"],"date_published":"2018-10-20T20:10:00+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-19:/fr/sys/openbsd/upgrade-hardened-openbsd#18b7cb306f06388fb4fadc7be002c89bfa6c87ce0adcb7d183c425be919441a1","url":"https://it-log.fr.eu.org/fr/sys/openbsd/upgrade-hardened-openbsd/","title":"[Mini-Tuto] Upgrade Hardened OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"Securelevel Officiellement, il faut éditer le fichier /etc/rc.securelevel et lui écrire : sysctl -w kern.securelevel=1 puis redémarrer la machine !\nSystème de fichiers en lecture seule Si vous avez eu la bonne idée de durcir votre FS par l\u0026rsquo;usage - principalement - de l\u0026rsquo;option de montage ro sur les principales partitions de votre système, il va falloir user de l\u0026rsquo;astuce suivante :\nSi vous avez une copie de votre fichier /etc/fstab, telle que montrée dans mon article OpenBSD : durcir le système de fichier , alors faites tout simplement en premier : # mv /etc/fstab /root/fstab ; mv /root/fstab.origin /etc/fstab ; chmod 0644 /etc/fstab\nSinon, si vous n\u0026rsquo;avez pas fait de copie, ce n\u0026rsquo;est pas bien grave, éditez votre fichier /etc/fstab pour transformer toutes les écritures de l\u0026rsquo;option ro en rw et mettre en commentaire la ligne déclarant le fichier de swap mfs pour /dev. Soit vous le faites à la main, soit vous utilisez ce one-liner : # sed -i -e 's/ro/rw/g;s/swap \\/dev mfs \\(.*\\)/#swap \\/dev mfs \\1/g' /etc/fstab\nCeci étant fait, vérifiez l\u0026rsquo;écriture de votre système de fichier dans le fichier /etc/fstab, afin d\u0026rsquo;être bien sûr de l\u0026rsquo;écriture de celui-ci !\nPensez à mettre de côté les scripts /etc/rc.local, /etc/rc.shutdown, voire /etc/daily.local, - si vous en avez créé - afin d\u0026rsquo;être tranquille lors de la mise à niveau !\nPuis faites votre procédure de mise à niveau selon le Guide de Migration fourni par l\u0026rsquo;équipe OpenBSD - par exemple, celui de la 6.4…\nPourquoi remettre le système de fichier en écriture ? En fait, l\u0026rsquo;installateur d\u0026rsquo;OpenBSD passe en rw lors de la mise à niveau ; le problème se pose après le redémarrage du système mise à niveau. En effet, logiquement le système va faire exécuter ses routines liées au script /etc/sysmerge et /etc/rc.firsttime qu\u0026rsquo;il renomme pour l\u0026rsquo;occasion en *.run respectivement - ce qui a normalement pour propos d\u0026rsquo;exécuter les utilitaires sysmerge, fw_update principalement…\nSi le système est initialement en mode lecture seule avant la mise à niveau, lesdits processus échoueront et vous avertiront par des messages d\u0026rsquo;erreurs vous informant que le système ne peut pas renommer les deux scripts en *.run, ni exécuter de fait leur contenu, et donc ne peut finaliser correctement la mise à niveau !\nIl ne vous restera plus qu\u0026rsquo;à appeler vous-même l\u0026rsquo;exécution des binaires sysmerge, fw_updates en espérant que tout se passe correctement… :(\nPuis vous pourrez terminer le processus de migration en mettant à jour les packages ; ceci une fois fait, il ne vous restera plus qu\u0026rsquo;à faire une analyse de l\u0026rsquo;ensemble du système grâce aux deux outils, l\u0026rsquo;un natif pkg_check, l\u0026rsquo;autre à installer sysclean.\nOU, alors, à relancer à nouveau la mise à niveau de votre système, en appelant le binaire bsd.rd au redémarrage de la machine, SEULEMENT après avoir pris les précautions nécessaires pour remettre le système de fichiers en écriture avant le redémarrage !\nRemettez en place vos fichiers /etc/rc.local, /etc/rc.shutdown, voire /etc/daily.local, en veillant à ce que les droits utilisateurs soient bien liés à root:wheel et en 0644. Remettez votre système de fichier en lecture seule ! Et, redémarrez votre machine, puis profitez de l\u0026rsquo;utilisation pendant environ 6 mois, sans avoir à redémarrer ! :p ","content_html":"\u003ch2 id=\"securelevel\"\u003eSecurelevel\u003c/h2\u003e\n\u003cp\u003eOfficiellement, il faut éditer le fichier \u003ccode\u003e/etc/rc.securelevel\u003c/code\u003e et lui\nécrire : \u003ccode\u003esysctl -w kern.securelevel=1\u003c/code\u003e puis redémarrer la machine !\u003c/p\u003e\n\u003ch2 id=\"système-de-fichiers-en-lecture-seule\"\u003eSystème de fichiers en lecture seule\u003c/h2\u003e\n\u003cp\u003eSi vous avez eu la bonne idée de durcir votre FS par l\u0026rsquo;usage - \u003cstrong\u003eprincipalement\u003c/strong\u003e -\nde l\u0026rsquo;option de montage \u003ccode\u003ero\u003c/code\u003e sur les principales\npartitions de votre système, il va falloir user de l\u0026rsquo;astuce suivante :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSi vous avez une copie de votre fichier \u003ccode\u003e/etc/fstab\u003c/code\u003e, telle que montrée\ndans mon article \u003cstrong\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/harden-openbsd/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : durcir le système de fichier'\"\u003eOpenBSD : durcir le système de fichier\u003c/a\u003e\n\n\u003c/strong\u003e, alors\nfaites tout simplement en premier : \u003cbr\u003e\n\u003ccode\u003e# mv /etc/fstab /root/fstab ; mv /root/fstab.origin /etc/fstab ; chmod 0644 /etc/fstab\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSinon, si vous n\u0026rsquo;avez pas fait de copie, ce n\u0026rsquo;est pas bien grave, éditez\nvotre fichier \u003ccode\u003e/etc/fstab\u003c/code\u003e pour transformer toutes les écritures de\nl\u0026rsquo;option \u003ccode\u003ero\u003c/code\u003e en \u003ccode\u003erw\u003c/code\u003e et mettre en commentaire la ligne déclarant le fichier\nde swap mfs pour \u003ccode\u003e/dev\u003c/code\u003e. Soit vous le faites à la main, soit vous utilisez\nce one-liner : \u003cbr\u003e\n\u003ccode\u003e# sed -i -e 's/ro/rw/g;s/swap \\/dev mfs \\(.*\\)/#swap \\/dev mfs \\1/g' /etc/fstab\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCeci étant fait, vérifiez l\u0026rsquo;écriture de votre système de fichier dans\nle fichier \u003ccode\u003e/etc/fstab\u003c/code\u003e, afin d\u0026rsquo;être bien sûr de l\u0026rsquo;écriture de\ncelui-ci !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePensez à mettre de côté les scripts \u003ccode\u003e/etc/rc.local\u003c/code\u003e, \u003ccode\u003e/etc/rc.shutdown\u003c/code\u003e,\nvoire \u003ccode\u003e/etc/daily.local\u003c/code\u003e, - \u003cstrong\u003esi vous en avez créé\u003c/strong\u003e - afin d\u0026rsquo;être\ntranquille lors de la mise à niveau !\u003c/p\u003e\n\u003cp\u003ePuis faites votre procédure de mise à niveau selon le Guide de Migration\nfourni par l\u0026rsquo;équipe OpenBSD - \u003cstrong\u003epar exemple, celui de la \u003ca href=\"https://www.openbsd.org/faq/upgrade64.html\" rel=\"external\"\u003e6.4\u003c/a\u003e\u003c/strong\u003e…\u003c/p\u003e\n\u003ch4 id=\"pourquoi-remettre-le-système-de-fichier-en-écriture-\"\u003ePourquoi remettre le système de fichier en écriture ?\u003c/h4\u003e\n\u003cp\u003eEn fait, l\u0026rsquo;installateur d\u0026rsquo;OpenBSD passe en \u003ccode\u003erw\u003c/code\u003e lors de la mise à\nniveau ; le problème se pose après le redémarrage du système mise à\nniveau. En effet, logiquement le système va faire exécuter ses routines\nliées au script \u003ccode\u003e/etc/sysmerge\u003c/code\u003e et \u003ccode\u003e/etc/rc.firsttime\u003c/code\u003e qu\u0026rsquo;il renomme\npour l\u0026rsquo;occasion en \u003ccode\u003e*.run\u003c/code\u003e respectivement - ce qui a normalement pour\npropos d\u0026rsquo;exécuter les utilitaires \u003ccode\u003esysmerge\u003c/code\u003e, \u003ccode\u003efw_update\u003c/code\u003e\nprincipalement…\u003c/p\u003e\n\u003cp\u003eSi le système est initialement en mode lecture seule avant la mise à\nniveau, lesdits processus échoueront et vous avertiront par des messages\nd\u0026rsquo;erreurs vous informant que le système ne peut pas renommer les deux\nscripts en \u003ccode\u003e*.run\u003c/code\u003e, ni exécuter de fait leur contenu, et donc ne peut\nfinaliser correctement la mise à niveau !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eIl ne vous restera plus qu\u0026rsquo;à appeler vous-même l\u0026rsquo;exécution des\nbinaires \u003ccode\u003esysmerge\u003c/code\u003e, \u003ccode\u003efw_updates\u003c/code\u003e en espérant que tout se passe\ncorrectement… :(\u003c/p\u003e\n\u003cp\u003ePuis vous pourrez terminer le processus de migration en mettant à jour\nles packages ; ceci une fois fait, il ne vous restera plus qu\u0026rsquo;à faire\nune analyse de l\u0026rsquo;ensemble du système grâce aux deux outils, l\u0026rsquo;un natif\n\u003ccode\u003epkg_check\u003c/code\u003e, l\u0026rsquo;autre à installer \u003ccode\u003esysclean\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOU\u003c/strong\u003e, alors, à relancer à nouveau la mise à niveau de votre\nsystème, en appelant le binaire \u003ccode\u003ebsd.rd\u003c/code\u003e au redémarrage de la\nmachine, \u003cstrong\u003eSEULEMENT\u003c/strong\u003e après avoir pris les précautions\nnécessaires pour remettre le système de fichiers en écriture\navant le redémarrage !\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eRemettez en place vos fichiers \u003ccode\u003e/etc/rc.local\u003c/code\u003e, \u003ccode\u003e/etc/rc.shutdown\u003c/code\u003e,\nvoire \u003ccode\u003e/etc/daily.local\u003c/code\u003e, en veillant à ce que les droits utilisateurs\nsoient bien liés à \u003ccode\u003eroot:wheel\u003c/code\u003e et en \u003ccode\u003e0644\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eRemettez votre \u003ca class=\"inside\" href=\"/fr/sys/openbsd/harden-openbsd/#syst%c3%a8me-de-fichiers-en-lecture-seule\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : durcir le système de fichier'\"\u003esystème de fichier en lecture seule\u003c/a\u003e\n !\u003c/li\u003e\n\u003cli\u003eEt, redémarrez votre machine, puis profitez de l\u0026rsquo;utilisation pendant\nenviron 6 mois, sans avoir à redémarrer ! :p\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment mettre à jour une machine durcie sous OpenBSD","tags":["OpenBSD","Harden","mini-tuto"],"date_published":"2018-10-19T01:17:25+01:00","date_modified":"2020-05-21T15:05:40+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-16:/fr/sys/debian/depot-mfp-epson#5a02260e2f84e60670d207e0429e7809cb8eddd18a1f0de19ad83a1d43816f25","url":"https://it-log.fr.eu.org/fr/sys/debian/depot-mfp-epson/","title":"Debian : Gestion des Imprimantes MFP Epson par depôt","author":{"name":"Stéphane HUC"},"content_text":"Description Cet article devait vous permettre d\u0026rsquo;avoir des binaires debian, pour votre imprimante multi-fonctions, appelés MFP , depuis le site de téléchargement de l\u0026rsquo;entreprise Seiko Epson.\nAstuceSi votre imprimante utilise le protocole \u0026ldquo;ESC/P-R\u0026rdquo;, vous pouvez installer le pilote générique printer-driver-escpr, anciennement epson-inkjet-printer-espcr, fonctionnel pour beaucoup d\u0026rsquo;imprimantes MFP Epson. Pour ce qui est de configurer la partie Scanner, lisez MFP Scanner Epson sous Debian/Devuan.\nConfiguration Obsolète Cette documentation 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 ! Création du fichier sources.list AttentionCette partie était utile jusqu\u0026rsquo;à Jessie. Elle ne fonctionnera pas pour toute version Debian supérieure, voire Sid ! Avec les droits administrateur, modifiez le fichier sources.list ou mieux créez un fichier epson.list correspondant :\n:# apt edit-sources epson deb http://download.ebz.epson.net/dsc/op/stable/debian/ lsb3.2 main La clé GPG est celle-là :\n:# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 8AA65D56\nAttentionSi vous avez correctement configuré votre fichier personnel ~/.gnupg/gpg.conf, il est très possible que vous ayez ce message d\u0026rsquo;erreur concernant la clé GPG fournie par Epson : Signature by key E5220FB7014D0FBDA50DFC2BE5E86C008AA65D56 uses weak digest algorithm (SHA1)\nCela signifie simplement que leur clé a été créé avec le protocole par défaut SHA1… bref, une clé peu fiable !!!\nVous ne devriez probablement pas l\u0026rsquo;utiliser, mais c\u0026rsquo;est le seul moyen fourni par eux ; à vous de voir, si vous voulez lui faire confiance ; en tout cas, ne signez pas une telle clé !!!\ncf : gpg.conf Puis mettez à jour votre système !\nLa partie Imprimante Tous les pilotes EPSON, pour Debian et assimilés, sont disponibles à partir de l\u0026rsquo;URL suivante : http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX\nInfoJusqu\u0026rsquo;à Debian Jessie : Il est nécessaire d\u0026rsquo;avoir le paquet lsb, voire lsb-base, installé dans le système… Si ce n\u0026rsquo;est pas fait, faites-le ! Certains pilotes sont spécifiques à plusieurs imprimantes ; d\u0026rsquo;autres sont plus génériques.\nL\u0026rsquo;information correspondant au nom de votre MFP est signifiée dans l\u0026rsquo;onglet Description de la fenêtre Propriétés des binaires proposés, ou la partie Information de l\u0026rsquo;outil Synaptic.\nAutrement, avec l\u0026rsquo;outil apt, faites d\u0026rsquo;abord une recherche : :# apt-cache search nom_modele Où nom_modele est le nom du modèle de votre imprimante, tels que BX525WD, SX210, WF-7510, etc…\nSi la recherche ne restitue rien, c\u0026rsquo;est que votre modèle n\u0026rsquo;est pas géré… à moins que votre imprimante gère le protocole ESC/P-R, tel que noté ci-dessus ! Si la recherche restitue une information, installez le pilote correspondant ! Une fois le(s) pilote(s) installé(s), il vous faut utiliser l\u0026rsquo;outil de configuration Imprimantes, à partir du menu Systèmes, ou à partir du navigateur web à l\u0026rsquo;adresse : http://localhost:631, pour installer et configurer votre MFP.\nProtocoles réseaux Le protocole qui fonctionnera à tous les coups est le protocole lpd, tel que : lpd://adr_ip/PASSTHRU\nD\u0026rsquo;autres protocoles peuvent fonctionner, tel que :\nipp : ipp://adr_ip:631/ipp/print http : http://adr_ip:631/ipp/print voire AppSocket/HP JetDirect : socket://adr_ip:9100 les versions \u0026ldquo;sécurisées\u0026rdquo; des protocoles ipp et http, à savoir ipps et https doivent fonctionner, à condition de les configurer correctement. Même si la détection par protocole dnssd semble fonctionner sans soucis, si les paquets correspondants sont installés, je ne suis personnellement pas arrivé à utiliser celui-ci au quotidien.\nLa partie Scanner Retrouvez les informations concernant l\u0026rsquo;utilisation et la configuration de la partie scanner de votre MFP : MFP Scanner Epson sous Debian/Devuan\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eCet article devait vous permettre d\u0026rsquo;avoir des binaires debian, pour votre\nimprimante multi-fonctions, appelés \u003cabbr title=\"Multi Function Printer\"\u003eMFP\u003c/abbr\u003e\n,\ndepuis le site de téléchargement de l\u0026rsquo;entreprise Seiko Epson.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cstrong\u003eSi votre imprimante utilise le protocole \u0026ldquo;ESC/P-R\u0026rdquo;, vous pouvez installer\nle pilote générique \u003ccode\u003eprinter-driver-escpr\u003c/code\u003e, anciennement \u003cem\u003eepson-inkjet-printer-espcr\u003c/em\u003e,\nfonctionnel pour beaucoup d\u0026rsquo;imprimantes MFP Epson.\u003c/strong\u003e\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003ePour ce qui est de configurer la partie Scanner, lisez\n\u003ca class=\"inside\" href=\"/fr/sys/debian/mfp-scanner-epson/\" title=\"Lien interne vers l\u0026#39;article : 'MFP Scanner Epson sous Debian/Devuan'\"\u003eMFP Scanner Epson sous Debian/Devuan\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\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\u003eCette documentation 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\u003ch3 id=\"création-du-fichier-sourceslist\"\u003eCréation du fichier \u003ccode\u003esources.list\u003c/code\u003e\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eCette partie était utile jusqu\u0026rsquo;à Jessie. Elle ne fonctionnera pas pour toute\nversion Debian supérieure, voire Sid !\u003c/div\u003e\n\n\u003cp\u003eAvec les droits administrateur, modifiez le fichier \u003ccode\u003esources.list\u003c/code\u003e ou\nmieux créez un fichier \u003ccode\u003eepson.list\u003c/code\u003e correspondant :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# apt edit-sources epson\ndeb http://download.ebz.epson.net/dsc/op/stable/debian/ lsb3.2 main\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLa clé GPG est celle-là :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 8AA65D56\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\u003cp\u003eSi vous avez correctement configuré votre fichier personnel \u003ccode\u003e~/.gnupg/gpg.conf\u003c/code\u003e,\nil est très possible que vous ayez ce message d\u0026rsquo;erreur concernant la clé\nGPG fournie par Epson : \u003cbr\u003e\n\u003ccode\u003eSignature by key E5220FB7014D0FBDA50DFC2BE5E86C008AA65D56 uses weak digest algorithm (SHA1)\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCela signifie simplement que leur clé a été créé avec le protocole par\ndéfaut SHA1… bref, \u003cspan class=\"red\"\u003eune clé peu fiable !!!\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003eVous ne devriez probablement pas l\u0026rsquo;utiliser, mais c\u0026rsquo;est le seul moyen fourni\npar eux ; à vous de voir, si vous voulez lui faire confiance ;\nen tout cas, \u003cspan class=\"red\"\u003ene signez pas une telle clé\u003c/span\u003e\n!!!\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ecf :\n\u003ca class=\"inside\" href=\"/fr/sec/gpg/du-bon-usage-securise-de-gpg/\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003egpg.conf\u003c/a\u003e\n\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003ePuis mettez à jour votre système !\u003c/p\u003e\n\u003ch3 id=\"la-partie-imprimante\"\u003eLa partie Imprimante\u003c/h3\u003e\n\u003cp\u003eTous les pilotes EPSON, pour Debian et assimilés, sont disponibles à\npartir de l\u0026rsquo;URL suivante : \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\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eJusqu\u0026rsquo;à Debian Jessie : Il est nécessaire d\u0026rsquo;avoir le paquet \u003ccode\u003elsb\u003c/code\u003e, voire\n\u003ccode\u003elsb-base\u003c/code\u003e, installé dans le système… Si ce n\u0026rsquo;est pas fait, faites-le !\u003c/div\u003e\n\n\u003cp\u003eCertains pilotes sont spécifiques à plusieurs imprimantes ; d\u0026rsquo;autres\nsont plus génériques.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;information correspondant au nom de votre MFP est signifiée dans\nl\u0026rsquo;onglet \u003cem\u003eDescription\u003c/em\u003e de la fenêtre \u003cem\u003ePropriétés\u003c/em\u003e des binaires\nproposés, ou la partie \u003cem\u003eInformation\u003c/em\u003e de l\u0026rsquo;outil \u003cem\u003eSynaptic\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eAutrement, avec l\u0026rsquo;outil apt, faites d\u0026rsquo;abord une recherche : \u003cbr\u003e\n\u003ccode\u003e:# apt-cache search nom_modele\u003c/code\u003e \u003cbr\u003e\nOù \u003ccode\u003enom_modele\u003c/code\u003e est le nom du modèle de votre imprimante, tels que \u003cstrong\u003eBX525WD\u003c/strong\u003e,\n\u003cstrong\u003eSX210\u003c/strong\u003e, \u003cstrong\u003eWF-7510\u003c/strong\u003e, etc…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi la recherche ne restitue rien, c\u0026rsquo;est que votre modèle n\u0026rsquo;est pas géré…\nà moins que votre imprimante gère le protocole ESC/P-R, tel que noté ci-dessus !\u003c/li\u003e\n\u003cli\u003eSi la recherche restitue une information, installez le pilote correspondant !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eUne fois le(s) pilote(s) installé(s), il vous faut utiliser l\u0026rsquo;outil de\nconfiguration Imprimantes, à partir du menu Systèmes, ou à partir du\nnavigateur web à l\u0026rsquo;adresse : \u003ccode\u003ehttp://localhost:631\u003c/code\u003e, pour installer et\nconfigurer votre MFP.\u003c/p\u003e\n\u003ch4 id=\"protocoles-réseaux\"\u003eProtocoles réseaux\u003c/h4\u003e\n\u003cp\u003eLe protocole qui fonctionnera à tous les coups est le protocole \u003cstrong\u003elpd\u003c/strong\u003e,\ntel que : \u003ccode\u003elpd://adr_ip/PASSTHRU\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eD\u0026rsquo;autres protocoles peuvent fonctionner, tel que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eipp\u003c/strong\u003e : \u003ccode\u003eipp://adr_ip:631/ipp/print\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ehttp\u003c/strong\u003e : \u003ccode\u003ehttp://adr_ip:631/ipp/print\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003evoire \u003cstrong\u003eAppSocket/HP JetDirect\u003c/strong\u003e : \u003ccode\u003esocket://adr_ip:9100\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eles versions \u0026ldquo;sécurisées\u0026rdquo; des protocoles \u003cstrong\u003eipp\u003c/strong\u003e et \u003cstrong\u003ehttp\u003c/strong\u003e, à savoir\n\u003cstrong\u003eipps\u003c/strong\u003e et \u003cstrong\u003ehttps\u003c/strong\u003e doivent fonctionner, à condition de les configurer\ncorrectement.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMême si la détection par protocole \u003cstrong\u003ednssd\u003c/strong\u003e semble fonctionner sans soucis,\nsi les paquets correspondants sont installés, je ne suis personnellement pas\narrivé à utiliser celui-ci au quotidien.\u003c/p\u003e\n\u003ch3 id=\"la-partie-scanner\"\u003eLa partie Scanner\u003c/h3\u003e\n\u003cp\u003eRetrouvez les informations concernant l\u0026rsquo;utilisation et la configuration\nde la partie scanner de votre MFP : \u003ca class=\"inside\" href=\"/fr/sys/debian/mfp-scanner-epson/\" title=\"Lien interne vers l\u0026#39;article : 'MFP Scanner Epson sous Debian/Devuan'\"\u003eMFP Scanner Epson sous Debian/Devuan\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment installer sous Debian une imprimante multifonctions Epson par le biais des dépôts ","tags":["Debian","Epson","dépôt","MFP"],"date_published":"2018-10-16T23:08:40+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-16:/fr/sys/debian/mfp-epson#add5881bd53cfee11684de8436b35c6564179dd4ca1003db3941b0b1740d4287","url":"https://it-log.fr.eu.org/fr/sys/debian/mfp-epson/","title":"Debian : Gestion des imprimantes de marque EPSON (MFP)","author":{"name":"Stéphane HUC"},"content_text":"Description Il existe trois moyens différents pour arriver à installer/configurer une imprimante Epson :\nLa première méthode d\u0026rsquo;installation utilise le pilote Gutenprint Par le biais du projet OpenPrinting de la Fondation Linux Par le biais des dépôts de la société Seiko Epson - mais cette méthode n\u0026rsquo;est pas conseillée, car elle dépend d\u0026rsquo;anciens paquets relatifs à LSB (Linux Standard Base) , et ne seront probablement pas installables. Installation InfoIl est possible que le fait de connecter votre imprimante sur un port USB3 l\u0026rsquo;empêche de fonctionner correctement. Si vous avez un soucis, essayez de la connecter sur un port USB2. AstuceSi votre imprimante utilise le protocole \u0026ldquo;ESC/P-R\u0026rdquo;, vous pouvez installer le pilote générique printer-driver-escpr, anciennement epson-inkjet-printer-espcr, fonctionnel pour beaucoup d\u0026rsquo;imprimantes MFP Epson. Gutenprint Vérifiez que votre imprimante apparaisse dans la liste suivante sur la page du projet…\nSi c\u0026rsquo;est le cas, il vous suffit de :\nconnecter votre imprimante à l\u0026rsquo;ordinateur, par le biais du port USB d\u0026rsquo;allumer celle-ci ensuite, utilisez le Gestionnaire des Imprimantes pour Ajouter votre imprimante Si cela n\u0026rsquo;est pas le cas, vérifier que le paquet soit installé : printer-driver-gutenprint\nPour information :\nIl peut-être complété des paquets ijsgutenprint (qui est le pilote GhostScript pour Gutenprint) et ijsgutenprint-ppds ainsi que du paquet foomatic-db-gutenprint Le paquet gutenprint-locales fournit la gestion internationale des langues. Il existe aussi le paquet escputil pour assurer la maintenance des modèles Stylus (nettoyage, alignement des têtes et niveaux d\u0026rsquo;encres). Pour finir, si vous utilisez le logiciel Gimp, vous avez le paquet gimp-gutenprint qui se trouve être un greffon pour assurer correctement l\u0026rsquo;impression à partir de ce logiciel. Cette méthode permet aussi de gérer votre imprimante si elle fonctionne sur le réseau. Si celle-ci est supportée, restituez son adresse IP, dans le Gestionnaire d\u0026rsquo;Imprimantes !\nSi malgré tout l\u0026rsquo;imprimante n\u0026rsquo;est pas supporté, essayez soit la méthode par le biais des dépôts d\u0026rsquo;Epson, soit par ceux d\u0026rsquo;OpenPrinting.\nOpenPrinting OpenPrinting est le site référence de la Fondation Linux qui recense les imprimantes, certaines marques, certains modèles fonctionnels sous Linux, grâce principalement au projet Gutenprint.\nDans un premier temps, recherchez dans la page Epson si votre imprimante est listée. Si c\u0026rsquo;est le cas, cliquez sur le lien correspondant… à votre imprimante, pour de plus amples informations.\nDe deux choses l\u0026rsquo;une, soit votre imprimante est :\ndans la catégorie Perfectly - très bon signe - ou la catégorie Mostly - un peu moins bon, mais fonctionnel… dans la catégorie Partially - support très moyen, voire nul - ou la catégorie Paperweight - et là, c\u0026rsquo;est encore plus le drame. Si elle n\u0026rsquo;apparaît nulle part … il y a vraiment peu d\u0026rsquo;espoir ! Désolé … soit il vous faudra patienter, soit elle ne sera jamais supportée !\nSi votre imprimante Epson est référencée dans les deux premières catégories principalement, tant mieux.\nLa page \u0026lsquo;Downloads\u0026rsquo; du site permet de télécharger des fichiers PPD, mais aussi Foomatic, voire des pilotes IJS. Normalement, votre distribution propose depuis ses dépôts officiels, les-dits fichiers.\nAinsi, par exemple, il est possible d\u0026rsquo;installer les paquets suivants :\nfoomatic-db openprinting-ppds Seiko Epson Obsolète Cette documentation 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 ! Cette méthode consiste, pour les imprimantes dites MFP - MultiFunctions Printers, en anglais - Imprimantes Multifonctions -, relativement récentes, à utiliser les dépôts que fourni la société Seiko Epson pour installer et gérer correctement.\nVeuillez lire le tuto relatif : Debian : Gestion des Imprimantes MFP Epson par depôt Configuration Une fois le(s) pilote(s) installé(s), il vous faut utiliser l\u0026rsquo;outil de configuration Imprimantes, à partir du menu \u0026ldquo;Système\u0026rdquo;, ou à partir du navigateur web à l\u0026rsquo;adresse : http://localhost:631, pour installer et configurer votre MFP.\nAprès la phase de configuration, parfois l\u0026rsquo;imprimante ou la partie scanner ne répond pas. Pensez à redémarrer le service udev… ou, au pire à redémarrer votre ordinateur !\nDivers Si malgré ces trois méthodes, votre imprimante de marque Epson n\u0026rsquo;est pas gérée… Dommage ! Il semble exister un logiciel payant, nommé TurboPrint for Linux qui apporte du support - (cf : la liste des Epson supportées.) celui-ci gère aussi la colorimétrie de manière professionnelle - à vous de voir… je n\u0026rsquo;en parlerai pas plus.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eIl existe \u003cstrong\u003etrois moyens différents pour arriver à installer/configurer\nune imprimante Epson\u003c/strong\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLa première méthode d\u0026rsquo;installation utilise le pilote \u003ca href=\"/fr/sys/debian/mfp-epson/#gutenprint\"\u003eGutenprint\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePar le biais du projet \u003ca href=\"/fr/sys/debian/mfp-epson/#openprinting\"\u003eOpenPrinting\u003c/a\u003e de la Fondation Linux\u003c/li\u003e\n\u003cli\u003ePar le biais \u003ca href=\"/fr/sys/debian/mfp-epson/#seiko-epson\"\u003edes dépôts de la société Seiko Epson\u003c/a\u003e -\n\u003cem\u003emais cette méthode n\u0026rsquo;est pas conseillée, car elle dépend d\u0026rsquo;anciens\npaquets relatifs à \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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\"\u003eLSB \u003cem\u003e(Linux Standard Base)\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, et ne seront probablement pas\ninstallables\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eIl est possible que le fait de connecter votre imprimante sur un port USB3\nl\u0026rsquo;empêche de fonctionner correctement. Si vous avez un soucis, essayez de\nla connecter sur un port USB2.\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cstrong\u003eSi votre imprimante utilise le protocole \u0026ldquo;ESC/P-R\u0026rdquo;, vous pouvez installer\nle pilote générique \u003ccode\u003eprinter-driver-escpr\u003c/code\u003e, anciennement \u003cem\u003eepson-inkjet-printer-espcr\u003c/em\u003e,\nfonctionnel pour beaucoup d\u0026rsquo;imprimantes MFP Epson.\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch3 id=\"gutenprint\"\u003eGutenprint\u003c/h3\u003e\n\u003cp\u003eVérifiez que votre imprimante apparaisse dans la liste suivante sur la\n\u003ca href=\"http://gimp-print.sourceforge.net/p_Supported_Printers.php\" rel=\"external\"\u003epage du projet\u003c/a\u003e…\u003c/p\u003e\n\u003cp\u003eSi c\u0026rsquo;est le cas, il vous suffit de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003econnecter votre imprimante à l\u0026rsquo;ordinateur, par le biais du port USB\u003c/li\u003e\n\u003cli\u003ed\u0026rsquo;allumer celle-ci\u003c/li\u003e\n\u003cli\u003eensuite, utilisez le Gestionnaire des Imprimantes pour Ajouter votre imprimante\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi cela n\u0026rsquo;est pas le cas, vérifier que le paquet soit installé : \u003ccode\u003eprinter-driver-gutenprint\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour information :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIl peut-être complété des paquets \u003ccode\u003eijsgutenprint\u003c/code\u003e \u003cem\u003e(qui est le pilote\nGhostScript pour Gutenprint)\u003c/em\u003e et \u003ccode\u003eijsgutenprint-ppds\u003c/code\u003e ainsi que du\npaquet \u003ccode\u003efoomatic-db-gutenprint\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLe paquet \u003ccode\u003egutenprint-locales\u003c/code\u003e fournit la gestion internationale des langues.\u003c/li\u003e\n\u003cli\u003eIl existe aussi le paquet \u003ccode\u003eescputil\u003c/code\u003e pour assurer la maintenance des\nmodèles Stylus \u003cem\u003e(nettoyage, alignement des têtes et niveaux d\u0026rsquo;encres)\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003ePour finir, si vous utilisez le logiciel Gimp, vous avez le paquet \u003ccode\u003egimp-gutenprint\u003c/code\u003e\nqui se trouve être un greffon pour assurer correctement l\u0026rsquo;impression\nà partir de ce logiciel.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCette méthode permet aussi de gérer votre imprimante si elle fonctionne\nsur le réseau. Si celle-ci est supportée, restituez son adresse IP, dans\nle Gestionnaire d\u0026rsquo;Imprimantes !\u003c/p\u003e\n\u003cp\u003eSi malgré tout l\u0026rsquo;imprimante n\u0026rsquo;est pas supporté, essayez soit la\nméthode par le biais des dépôts d\u0026rsquo;Epson, soit par ceux d\u0026rsquo;OpenPrinting.\u003c/p\u003e\n\u003ch3 id=\"openprinting\"\u003eOpenPrinting\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eOpenPrinting\u003c/strong\u003e est le site référence de la \u003cstrong\u003eFondation Linux\u003c/strong\u003e qui recense\nles imprimantes, certaines marques, certains modèles fonctionnels sous Linux,\ngrâce principalement au projet Gutenprint.\u003c/p\u003e\n\u003cp\u003eDans un premier temps, recherchez dans \u003ca href=\"https://www.openprinting.org/printers/manufacturer/Epson/\" rel=\"external\"\u003ela page Epson\u003c/a\u003e\nsi votre imprimante est listée. Si c\u0026rsquo;est le cas, cliquez sur le lien\ncorrespondant… à votre imprimante, pour de plus amples informations.\u003c/p\u003e\n\u003cp\u003eDe deux choses l\u0026rsquo;une, soit votre imprimante est :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edans la catégorie \u003ccode\u003ePerfectly\u003c/code\u003e - très bon signe -\u003c/li\u003e\n\u003cli\u003eou la catégorie \u003ccode\u003eMostly\u003c/code\u003e - un peu moins bon, mais fonctionnel…\u003c/li\u003e\n\u003cli\u003edans la catégorie \u003ccode\u003ePartially\u003c/code\u003e - support très moyen, voire nul -\u003c/li\u003e\n\u003cli\u003eou la catégorie \u003ccode\u003ePaperweight\u003c/code\u003e - et là, c\u0026rsquo;est encore plus le drame.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi elle n\u0026rsquo;apparaît nulle part … il y a vraiment peu d\u0026rsquo;espoir ! \u003cbr\u003e\nDésolé … soit il vous faudra patienter, soit elle ne sera jamais\nsupportée !\u003c/p\u003e\n\u003cp\u003eSi votre imprimante Epson est référencée dans les deux premières\ncatégories principalement, tant mieux.\u003c/p\u003e\n\u003cp\u003eLa page \u0026lsquo;\u003ca href=\"https://openprinting.github.io/downloads/\" rel=\"external\"\u003eDownloads\u003c/a\u003e\u0026rsquo; du site\npermet de télécharger des fichiers PPD, mais aussi \u003cstrong\u003eFoomatic\u003c/strong\u003e, voire des\npilotes \u003cstrong\u003eIJS\u003c/strong\u003e. Normalement, votre distribution propose depuis ses dépôts\nofficiels, les-dits fichiers.\u003cbr\u003e\nAinsi, par exemple, il est possible d\u0026rsquo;installer les paquets suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003efoomatic-db\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopenprinting-ppds\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"seiko-epson\"\u003eSeiko Epson\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\u003eCette documentation 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\u003eCette méthode consiste, pour les imprimantes dites MFP -\n\u003cem\u003eMultiFunctions Printers, en anglais\u003c/em\u003e - \u003cem\u003eImprimantes Multifonctions\u003c/em\u003e\n-, relativement récentes, à utiliser les dépôts que fourni la société\nSeiko Epson pour installer et gérer correctement.\u003c/p\u003e\n\u003cp\u003eVeuillez lire le tuto relatif : \n\n\u003ca class=\"inside\" href=\"/fr/sys/debian/depot-mfp-epson/\" title=\"Lien interne vers l\u0026#39;article : 'Debian : Gestion des Imprimantes MFP Epson par depôt'\"\u003eDebian : Gestion des Imprimantes MFP Epson par depôt\u003c/a\u003e\n\n\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eUne fois le(s) pilote(s) installé(s), il vous faut utiliser l\u0026rsquo;outil de\nconfiguration Imprimantes, à partir du menu \u0026ldquo;Système\u0026rdquo;, ou à partir du\nnavigateur web à l\u0026rsquo;adresse : \u003ccode\u003ehttp://localhost:631\u003c/code\u003e, pour installer et\nconfigurer votre MFP.\u003c/p\u003e\n\u003cp\u003eAprès la phase de configuration, parfois l\u0026rsquo;imprimante ou la partie\nscanner ne répond pas. Pensez à redémarrer le service \u003ccode\u003eudev\u003c/code\u003e… ou, au\npire à redémarrer votre ordinateur !\u003c/p\u003e\n\u003ch2 id=\"divers\"\u003eDivers\u003c/h2\u003e\n\u003cp\u003eSi malgré ces trois méthodes, votre imprimante de marque Epson n\u0026rsquo;est\npas gérée… \u003cspan class=\"red\"\u003eDommage !\u003c/span\u003e\n\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eIl semble exister un logiciel payant, nommé \u003cstrong\u003eTurboPrint for Linux\u003c/strong\u003e qui apporte\ndu support -\n\u003cem\u003e(cf : la liste des \u003ca href=\"https://www.turboprint.info/printers_Epson.html\" rel=\"external\"\u003eEpson supportées\u003c/a\u003e.)\u003c/em\u003e \u003cbr\u003e\ncelui-ci gère aussi la colorimétrie de manière professionnelle - \u003cem\u003eà vous de voir…\nje n\u0026rsquo;en parlerai pas plus\u003c/em\u003e.\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment gérer les imprimantes multifonctions Epson sous Debian","tags":["Debian","Epson","MFP"],"date_published":"2018-10-16T22:40:34+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-15:/fr/sys/openbsd/nas#16815c207c6c346ec109497c9522ffa953c23d103e20e629c0c83963e70151a1","url":"https://it-log.fr.eu.org/fr/sys/openbsd/nas/","title":"OpenBSD : Faire d'OpenBSD son NAS - en mode Raid 1C","author":{"name":"Stéphane HUC"},"content_text":"Description Voici mon projet de NAS, basé sur… OpenBSD !\nCe NAS fait fonction de :\nserveur de fichiers, avec Samba, voire NFS, et mieux par SSH Versions logicielles OS : OpenBSD 6.3 ⇒ 7.2 Samba : 4.16.6 SSH : OpenSSH, LibreSSL (natifs, intégrés) Installation Démarrons sur une clé USB, pour installer le système sur une clé USB voire un SSD chiffré… qui servira à enregistrer/diffuser les données, tels que fichiers documents, audio, vidéo, etc…\nAttentionATTENTION : Soyez conscient que du fait d\u0026rsquo;avoir le système d\u0026rsquo;exploitation sur une clé USB, celui-ci sera \u0026ldquo;plus lent\u0026rdquo; que si nous avions un disque dur dédié ! AstuceÉtant donné que nous faisons un serveur : lors de l\u0026rsquo;installation, au moment de choisir les jeux d\u0026rsquo;installation, ne les choisissez pas tous, cela ne sert strictement à rien. Le gain de place ne sera pas énorme, mais ce sera toujours cela de pris ; voici les sets à choisir : -game* -x* +xbase* +xfont*, voire plus court -g* -x* +xb* +xf* ! Configuration Durcir le système À la fois, pour soulager la clé, mais aussi pour empêcher toute écriture non désirée ou involontaire, et donc toute modification potentielle du système, on va modifier le système de fichier de telle manière que l\u0026rsquo;on ne puisse ni écrire, ni exécuter quoique ce soit sur l\u0026rsquo;ensemble du système de fichiers.\nmise en lecture seule ro des partitions suivantes : /, /usr, /usr/ et toutes les autres partitions /usr/* créées logiquement par l\u0026rsquo;installateur\nmise en nodev,noexec,nosuid des partitions /tmp, et /var\nmise en nodev,noexec,nosuid de la partition /home - nous pourrions mettre l\u0026rsquo;option ro néanmoins cela complexifie encore plus le processus, surtout à la connexion SSH, voire sur les autres protocoles.\nEnsuite il faut veiller à monter les périphériques /dev dans un système de fichier temporaire swap de type mfs afin de ne pas avoir de problèmes avec les périphériques, avec certains services qui ont besoin de \u0026ldquo;monter\u0026rdquo; dynamiquement, tel SSH… autrement dans ce cas, les connexions auraient dû mal à se faire, voire à ne pas s\u0026rsquo;exécuter.\nLire mon article \u0026ldquo; OpenBSD : durcir le système de fichier \u0026rdquo; - retrouvez le script sysmount dans la section Fichiers de configuration ci-dessous, en fin d\u0026rsquo;article…\nChiffrer le disque dur Personnellement, j\u0026rsquo;utilise deux disques durs en mode Raid 1C (à savoir Raid 1 + chiffrement).\nPuis, un troisième qui sert de sauvegarde, lui aussi chiffré.\nDans ce contexte, j\u0026rsquo;utilise une seule clé USB pour assumer le déchiffrement.\nInfoVeuillez lire mon article \u0026quot;\nOpenBSD : monter un disque dur chiffré automatiquement\n\u0026ldquo;… vous y retrouverez comment chiffrer, mais aussi les informations nécessaires pour le montage automatique de ces disques.\nN\u0026rsquo;oubliez pas de modifier les fichiers /etc/rc.local et /etc/rc.shutdown pour attacher et monter le disque dur au démarrage et respectivement le démonter puis le détacher à l\u0026rsquo;extinction du serveur.\nRetrouvez ces scripts ainsi que le script bioctlr modifié, dans la section Fichiers de configuration ci-dessous, en fin d\u0026rsquo;article…\nArborescence Choisissez une arborescence du disque dur NAS chiffré, une fois attaché et monté sur /mnt/nas, par exemple, tel que :\n/mnt/nas/Documents - répertoire de tout document numérique crée par les utilisateurs, dans leur propre répertoire /mnt/nas/Medias - qui est le répertoire qui recevra tous les fichiers images, audios, et vidéos, chacuns dans leur répertoire respectif /mnt/nas/P2P - qui sert à déposer les fichiers torrents… :# mkdir -p /mnt/nas/{Documents,Medias,P2P} :# mkdir -p /mnt/nas/Medias/{Images,Music,Video} :# mkdir /mnt/nas/P2P/torrents Dans le répertoire de documents, créez autant de répertoires nécessaires que d\u0026rsquo;utilisateurs qui se serviront de votre NAS, et liez symboliquement ces répertoires vers les répertoires home des utilisateurs :\n:# mkdir /mnt/nas/Documents/$user :# chown $user /mnt/nas/Documents/$user :# chmod 0700 /mnt/nas/Documents/$user :# ln -s /mnt/nas/Documents/$user /home/$user/Documents Ensuite, liez symboliquement les différents répertoires de médias, et celui des torrents avec votre utilisateur principal - le premier utilisateur que vous aurez créé, qui seul aura le droit d\u0026rsquo;écrire dedans.\n:# chown -R $user /mnt/nas/{Medias,P2P} :# for name in Images Music Video; do ln -s /mnt/nas/Medias/$name /home/$user/$name; done AstuceSi jamais vous voulez que chacun des utilisateurs systèmes que vous créerez ait son propre répertoire dans les différents répertoires des médias, appliquez la même méthode que le code ci-dessus pour la création des répertoires utilisateurs dans le répertoire des documents, mais faites-le sur le répertoire des médias, tel que :\n:# for name in Images Music Video; do mkdir -p /mnt/nas/Medias/$user/$name \u0026amp;\u0026amp; ln -s /mnt/nas/Medias/$user/$name /home/$user/$name; done :# chown -R $user /mnt/nas/Medias/$user :# chmod 0700 /mnt/nas/Medias/$user Dans la suite de ce tutoriel, nous resterons sur la situation simple où seul l\u0026rsquo;utilisateur principal a des droits en écriture sur les trois répertoires enfants…\nEn cas où vous avez un énième disque dur, qui lui servirait de sauvegarde des données écrites sur le disque NAS, le script de montage automatique est profondément modifié pour pouvoir attacher et monter cet autre disque dur, qui lui aussi sera chiffré, bien sûr !\nActuellement, j\u0026rsquo;utilise Borg pour effectuer ma sauvegarde.\nFichiers de configuration Retrouvez les différents fichiers de configuration disponibles, tels que :\nScript de montage en lecture seule et/ou accès en écriture du système : sysmount Script de montage automatique : bioctlr Scripts rc.local, rc.shutdown, daily.local Gestion des services AttentionALERTE : Tous ces services seront automatiquement démarrés que si et seulement si le disque dur chiffré est attaché ET monté. En effet, cela ne sert à rien de les activer et de les démarrer si le disque dur n\u0026rsquo;est pas correctement monté ; ils se mettraient en échec inutilement !\nIls seront donc activé à partir du script /etc/rc.local et arrêté avant l\u0026rsquo;extinction machine, depuis le script /etc/rc.shutdown.\nMiniDLNA Si vous souhaitez en faire un serveur multimédia, j\u0026rsquo;explique l\u0026rsquo;installation et surtout la configuration du service MiniDLNA dans l\u0026rsquo;article suivant : \u0026ldquo; MiniDLNA (OpenBSD) \u0026rdquo;.\nPour ce qui est de la configuration du fichier /etc/minidlna.conf, voici les modifications faites :\nfriendly_name=OpenBSD Multimedia View-IT media_dir=A,/mnt/nas/Medias/your-user/Music media_dir=V,/mnt/nas/Medias/your-user/Video max_connections=7 Samba Les explications d\u0026rsquo;installation de base sont fournies dans cet article \u0026ldquo; OpenBSD : Introduction à Samba \u0026rdquo;.\nAstuceJe vous invite à créer un groupe dédié, dans lequel ajouter les différents utilisateurs - ainsi, nous utiliserons les options d\u0026rsquo;autorisations par groupe, plutôt que par utilisateurs autorisés :\n:# groupadd _smb :# usermod -G _smb $user Concernant les modifications du fichier /etc/samba/smb.conf :\nSection [Global] interfaces : décommentez-la, et écrivez votre réseau lan IPv4, et si vous avez la bonne idée d\u0026rsquo;avoir un réseau IPv6 ULA, (de type fd0::/64, par exemple) alors faites les ajouts adéquats.\nnommons le serveur : server string = OpenBSD NAS\nrenommons le groupe de travail, ou pas : workgroup - personnellement, je le fais en le renommant par une seule lettre, me facilitant la vie ;)\net, n\u0026rsquo;autorisons QUE les adresses IP venant seulements de notre réseau local : hosts allow = 192.168.1. fd0::/64 - Attention à bien modifier selon vos propres adressages IP…\nSection [homes] Utilisons la section [Homes] pour autoriser la connexion à nos différents utilisateurs, à leurs répertoires Documents.\nSection [homes] browseable = No comment = Documents create mask = 0644 directory mask = 0700 force directory mode = 0700 hide dot files = No hide special files = Yes hosts allow = path = /mnt/nas/Documents/ read only = No valid users = write list = Explications browseable = no : le parcours du répertoire par tout autre que les utilisateurs autorisés est interdit ;\ncreate mask force le chmod sur les fichiers créés/ajoutés/modifiés\ndirectory mask et force directory mode obligent le chmod en question sur les répertoires.\nhide dot files = No autorise la lecture des fichiers et répertoires cachés - ce qui pour un utilisateur autorisé, sur ses propres fichiers, est normal.\nhide special files = Yes empêche la lecture de tout fichier spécial\nhosts allow indiquons IMPÉRATIVEMENT les adresses IP des machines autorisées à se connecter à ce partage…\nread only : étant que nous voulons autoriser les utilisateurs à écrire/ajouter leurs propres documents, laissons/mettons la sur no\nvalid users renfermera les utilisateurs, ou le groupe samba dédié, autorisés à se connecter à ce partage - à remplir impérativement - c\u0026rsquo;est ici que nous ajouterons, de préférence, le groupe smb que je vous ai invité à créer dans l\u0026rsquo;astuce au début de ce chapitre, tel que : valid users = @_smb\nwrite list autorisera seuls les utilisateurs renseignés à pouvoir écrire dans ce partage ! - c\u0026rsquo;est ici qu\u0026rsquo;il est préférable d\u0026rsquo;ajouter le groupe samba dédié, créé plutôt, tel que : write list = @_smb\nSections [Music] et [Video] Maintenant occupons nous des partages Samba pour les documents audios, et vidéos - la configuration sera exactement la même, seul le nom de section change ainsi que les options comment, path… !\nNous appellerons, par préférence, :\npour les documents sonores la section correspondante : Section [Music], et pour les fichiers vidéos : Section [Video]. À la différence du partage [homes], permettons que ces partages multimédias soient parcourables par tous : browseable = yes, et guest ok = yes\nMais nous ne voulons pas que d\u0026rsquo;aucun puisse écrire dedans, l\u0026rsquo;option read only = yes nous y aidera. De même que l\u0026rsquo;option printable = no empêchera toute tentative d\u0026rsquo;impression des documents…\nDe même, nous empêcherons toute lecture de fichiers cachés et/ou spéciaux : hide dot files = yes et hide special files = yes\nL\u0026rsquo;option write list nous permettra d\u0026rsquo;autoriser au moins votre utilisateur à écrire dedans ! :p\nSection [Music] [Music] browseable = yes comment = Musique create mask = 0664 directory mask = 0755 ea support = no force directory mode = 0755 guest ok = yes hide dot files = yes hide special files = yes inherit acls = yes inherit permissions = no path = /mnt/nas/Medias/Music/ printable = no read only = yes store dos attributes = no write list = Section [Video] [Video] browseable = yes comment = Videos create mask = 0664 directory mask = 0755 ea support = no force directory mode = 0755 guest ok = yes hide dot files = yes hide special files = yes inherit acls = yes inherit permissions = no path = /mnt/nas/Medias/Video/ printable = no read only = yes store dos attributes = no write list = SSH À la différence des autres services, celui-ci sera bel et bien monté normalement dès le démarrage de la machine… et donc géré depuis le fichier /etc/rc.conf.local par le biais de l\u0026rsquo;outil rcctl.\nEn effet, nous voulons pouvoir y accèder à tout moment…\nAstuceVeuillez lire mon article suivant sur comment avoir une\nconfiguration et générer des clés sécurisées , actuellement !\nSSHFS Étant donné que mon utilisateur système principal est autorisé à se connecter en SSH sur le serveur, il est facile de monter localement le système de fichier, soit par SSHFS en mode console, soit avec un outil graphique, tel que Gigolo.\nC\u0026rsquo;est plus lent qu\u0026rsquo;avec le partage Samba, ce qui est normal du fait de la couche \u0026ldquo;sécurité\u0026rdquo; lié aux chiffrements de la connexion… mais c\u0026rsquo;est aussi pratique ET à ma préférence ! :D\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVoici mon projet de NAS, basé sur… OpenBSD !\u003c/p\u003e\n\u003cp\u003eCe NAS fait fonction de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eserveur de fichiers, avec Samba, voire NFS, et mieux par SSH\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"versions-logicielles\"\u003eVersions logicielles\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eOS : OpenBSD \u003cem\u003e\u003cdel\u003e6.3 ⇒\u003c/del\u003e\u003c/em\u003e \u003cstrong\u003e7.2\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eSamba : \u003cstrong\u003e4.16.6\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eSSH : OpenSSH, LibreSSL \u003cem\u003e(natifs, intégrés)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eDémarrons sur une clé USB, pour installer le système sur une clé USB voire\nun SSD chiffré…\nqui servira à enregistrer/diffuser les données, tels que fichiers documents,\naudio, vidéo, etc…\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eATTENTION : Soyez conscient que du fait d\u0026rsquo;avoir le système d\u0026rsquo;exploitation\nsur une clé USB, celui-ci sera \u0026ldquo;plus lent\u0026rdquo; que si nous avions un disque dur\ndédié !\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eÉtant donné que nous faisons un serveur : lors de l\u0026rsquo;installation, au moment de\nchoisir les jeux d\u0026rsquo;installation, ne les choisissez pas tous, cela ne sert\nstrictement à rien. Le gain de  place ne sera pas énorme, mais ce sera toujours\ncela de pris ; voici les sets à choisir : \u003cbr\u003e\n\u003ccode\u003e-game* -x* +xbase* +xfont*\u003c/code\u003e, voire plus court \u003ccode\u003e-g* -x* +xb* +xf*\u003c/code\u003e !\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"durcir-le-système\"\u003eDurcir le système\u003c/h3\u003e\n\u003cp\u003eÀ la fois, pour soulager la clé, mais aussi pour empêcher toute écriture\nnon désirée ou involontaire, et donc toute modification potentielle du système,\non va modifier le système de fichier de telle manière que l\u0026rsquo;on ne puisse\nni écrire, ni exécuter quoique ce soit sur l\u0026rsquo;ensemble du système de fichiers.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003emise en lecture seule \u003ccode\u003ero\u003c/code\u003e des partitions suivantes : \u003ccode\u003e/\u003c/code\u003e, \u003ccode\u003e/usr\u003c/code\u003e, \u003ccode\u003e/usr/\u003c/code\u003e\net toutes les autres partitions \u003ccode\u003e/usr/*\u003c/code\u003e créées logiquement par l\u0026rsquo;installateur\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003emise en \u003ccode\u003enodev,noexec,nosuid\u003c/code\u003e des partitions \u003ccode\u003e/tmp\u003c/code\u003e, et \u003ccode\u003e/var\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003emise en \u003ccode\u003enodev,noexec,nosuid\u003c/code\u003e de la partition  \u003ccode\u003e/home\u003c/code\u003e - \u003cem\u003enous pourrions\nmettre l\u0026rsquo;option \u003ccode\u003ero\u003c/code\u003e néanmoins cela complexifie encore plus le processus,\nsurtout à la connexion SSH, voire sur les autres protocoles\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEnsuite il faut veiller à monter les périphériques \u003ccode\u003e/dev\u003c/code\u003e dans un système\nde fichier temporaire swap de type \u003ccode\u003emfs\u003c/code\u003e afin de ne pas avoir de problèmes\navec les périphériques, avec certains services qui ont besoin de \u0026ldquo;monter\u0026rdquo;\ndynamiquement, tel SSH… autrement dans ce cas, les connexions auraient dû\nmal à se faire, voire à ne pas s\u0026rsquo;exécuter.\u003c/p\u003e\n\u003cp\u003eLire mon article \u0026ldquo;\n\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/harden-openbsd/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : durcir le système de fichier'\"\u003eOpenBSD : durcir le système de fichier\u003c/a\u003e\n\n\u0026rdquo; -\n\u003cem\u003eretrouvez le script \u003ccode\u003esysmount\u003c/code\u003e dans la section\n\u003ca href=\"/fr/sys/openbsd/nas/#fichiers-de-configuration\"\u003eFichiers de configuration\u003c/a\u003e\nci-dessous, en fin d\u0026rsquo;article…\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"chiffrer-le-disque-dur\"\u003eChiffrer le disque dur\u003c/h3\u003e\n\u003cp\u003ePersonnellement, j\u0026rsquo;utilise deux disques durs en mode Raid 1C \u003cem\u003e(à savoir\nRaid 1 + chiffrement)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003ePuis, un troisième qui sert de sauvegarde, lui aussi chiffré.\u003c/p\u003e\n\u003cp\u003eDans ce contexte, j\u0026rsquo;utilise une seule clé USB pour assumer le déchiffrement.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eVeuillez lire mon article \u0026quot;\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/mount-crypt-hd/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : monter un disque dur chiffré automatiquement'\"\u003eOpenBSD : monter un disque dur chiffré automatiquement\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;…\nvous y retrouverez comment chiffrer, mais aussi les informations nécessaires\npour le montage automatique de ces disques.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas de modifier les fichiers \u003ccode\u003e/etc/rc.local\u003c/code\u003e et \u003ccode\u003e/etc/rc.shutdown\u003c/code\u003e\npour attacher et monter le disque dur au démarrage et respectivement le\ndémonter puis le détacher à l\u0026rsquo;extinction du serveur.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRetrouvez ces scripts ainsi que le script \u003ccode\u003ebioctlr\u003c/code\u003e modifié, dans\nla section \u003ca href=\"/fr/sys/openbsd/nas/#fichiers-de-configuration\"\u003eFichiers de configuration\u003c/a\u003e\nci-dessous, en fin d\u0026rsquo;article…\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"arborescence\"\u003eArborescence\u003c/h3\u003e\n\u003cp\u003eChoisissez une arborescence du disque dur NAS chiffré, une fois attaché et\nmonté sur \u003ccode\u003e/mnt/nas\u003c/code\u003e, par exemple, tel que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/mnt/nas/Documents\u003c/code\u003e  - répertoire de tout document numérique crée par\nles utilisateurs, dans leur propre répertoire\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/mnt/nas/Medias\u003c/code\u003e - qui est le répertoire qui recevra tous les fichiers\nimages, audios, et vidéos, chacuns dans leur répertoire respectif\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/mnt/nas/P2P\u003c/code\u003e - qui sert à déposer les fichiers torrents…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# mkdir -p /mnt/nas/{Documents,Medias,P2P}\n:# mkdir -p /mnt/nas/Medias/{Images,Music,Video}\n:# mkdir /mnt/nas/P2P/torrents\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDans le répertoire de documents, créez autant de répertoires nécessaires\nque d\u0026rsquo;utilisateurs qui se serviront de votre \u003cstrong\u003eNAS\u003c/strong\u003e,\net liez symboliquement ces répertoires vers les répertoires home des utilisateurs :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# mkdir /mnt/nas/Documents/$user\n:# chown $user /mnt/nas/Documents/$user\n:# chmod 0700 /mnt/nas/Documents/$user\n:# ln -s /mnt/nas/Documents/$user /home/$user/Documents\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEnsuite, liez symboliquement les différents répertoires de médias, et celui\ndes torrents avec votre utilisateur principal - le premier utilisateur que\nvous aurez créé, qui seul aura le droit d\u0026rsquo;écrire dedans.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# chown -R $user /mnt/nas/{Medias,P2P}\n:# for name in Images Music Video; do ln -s /mnt/nas/Medias/$name /home/$user/$name; done\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\"\u003e\u003cp\u003eSi jamais vous voulez que chacun des utilisateurs systèmes que vous créerez\nait son propre répertoire dans les différents répertoires des médias,\nappliquez la même méthode que le code ci-dessus pour la création des répertoires\nutilisateurs dans le répertoire des documents, mais faites-le sur le répertoire\ndes médias, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# for name in Images Music Video; do mkdir -p /mnt/nas/Medias/$user/$name \u0026amp;\u0026amp; ln -s /mnt/nas/Medias/$user/$name /home/$user/$name; done\n:# chown -R $user /mnt/nas/Medias/$user\n:# chmod 0700 /mnt/nas/Medias/$user\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\n\u003cp\u003eDans la suite de ce tutoriel, nous resterons sur la situation simple où\nseul l\u0026rsquo;utilisateur principal a des droits en écriture sur les trois répertoires\nenfants…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eEn cas où vous avez un énième disque dur, qui lui servirait de sauvegarde\ndes données écrites sur le disque NAS, le script de montage automatique\nest profondément modifié pour pouvoir attacher et monter cet autre disque\ndur, qui lui aussi sera chiffré, bien sûr !\u003c/p\u003e\n\u003cp\u003eActuellement, j\u0026rsquo;utilise \u003cstrong\u003eBorg\u003c/strong\u003e pour effectuer ma sauvegarde.\u003c/p\u003e\n\u003ch3 id=\"fichiers-de-configuration\"\u003eFichiers de configuration\u003c/h3\u003e\n\u003cp\u003eRetrouvez les différents fichiers de configuration disponibles, tels que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eScript de montage en lecture seule et/ou accès en écriture du système : \u003ca href=\"https://framagit.org/hucste/omv-it/blob/master/Administration/sysmount\" rel=\"external\"\u003esysmount\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eScript de montage automatique : \u003ca href=\"https://framagit.org/hucste/omv-it/blob/master/Administration/bioctlr\" rel=\"external\"\u003ebioctlr\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eScripts \u003ca href=\"https://framagit.org/hucste/omv-it/blob/master/etc/rc.local\" rel=\"external\"\u003erc.local\u003c/a\u003e, \u003ca href=\"https://framagit.org/hucste/omv-it/blob/master/etc/rc.shutdown\" rel=\"external\"\u003erc.shutdown\u003c/a\u003e, \u003ca href=\"https://framagit.org/hucste/omv-it/blob/master/etc/daily.local\" rel=\"external\"\u003edaily.local\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"gestion-des-services\"\u003eGestion des services\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\u003eALERTE\u003c/strong\u003e : Tous ces services seront automatiquement démarrés que\n\u003cstrong\u003esi et seulement si\u003c/strong\u003e le disque dur chiffré est attaché \u003cstrong\u003eET\u003c/strong\u003e monté.\nEn effet, cela ne sert à rien de les activer et de les démarrer si le\ndisque dur n\u0026rsquo;est pas correctement monté ;\nils se mettraient en échec inutilement !\u003c/p\u003e\n\u003cp\u003eIls seront donc activé à partir du script \u003ccode\u003e/etc/rc.local\u003c/code\u003e et arrêté avant\nl\u0026rsquo;extinction machine, depuis le script \u003ccode\u003e/etc/rc.shutdown\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"minidlna\"\u003eMiniDLNA\u003c/h3\u003e\n\u003cp\u003eSi vous souhaitez en faire un serveur multimédia, j\u0026rsquo;explique l\u0026rsquo;installation\net surtout la configuration du service MiniDLNA dans l\u0026rsquo;article suivant : \u003cbr\u003e\n\u0026ldquo;\n\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/minidlna/\" title=\"Lien interne vers l\u0026#39;article : 'MiniDLNA (OpenBSD)'\"\u003eMiniDLNA (OpenBSD)\u003c/a\u003e\n\n\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003ePour ce qui est de la configuration du fichier \u003ccode\u003e/etc/minidlna.conf\u003c/code\u003e,\nvoici les modifications faites :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003efriendly_name=OpenBSD Multimedia View-IT\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emedia_dir=A,/mnt/nas/Medias/your-user/Music\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emedia_dir=V,/mnt/nas/Medias/your-user/Video\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emax_connections=7\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"samba\"\u003eSamba\u003c/h3\u003e\n\u003cp\u003eLes explications d\u0026rsquo;installation de base sont fournies dans cet article\n\u0026ldquo;\n\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/samba/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Introduction à Samba'\"\u003eOpenBSD : Introduction à Samba\u003c/a\u003e\n\n\u0026rdquo;.\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 invite à créer un groupe dédié, dans lequel ajouter les différents\nutilisateurs - ainsi, nous utiliserons les options d\u0026rsquo;autorisations par groupe,\nplutôt que par utilisateurs autorisés :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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:# groupadd _smb\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# usermod -G _smb \u003cspan style=\"color:#ef6155\"\u003e$user\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\n\u003cp\u003eConcernant les modifications du fichier \u003ccode\u003e/etc/samba/smb.conf\u003c/code\u003e :\u003c/p\u003e\n\u003ch4 id=\"section-global\"\u003eSection [Global]\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003einterfaces\u003c/code\u003e : décommentez-la, et écrivez votre réseau lan IPv4, et si\nvous avez la bonne idée d\u0026rsquo;avoir un réseau IPv6 ULA, \u003cem\u003e(de type \u003ccode\u003efd0::/64\u003c/code\u003e,\npar exemple)\u003c/em\u003e alors faites les ajouts adéquats.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003enommons le serveur : \u003ccode\u003eserver string = OpenBSD NAS\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003erenommons le groupe de travail, ou pas : \u003ccode\u003eworkgroup\u003c/code\u003e - \u003cem\u003epersonnellement,\nje le fais en le renommant par une seule lettre, me facilitant la vie\u003c/em\u003e ;)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eet, n\u0026rsquo;autorisons QUE les adresses IP venant seulements de notre réseau\nlocal : \u003ccode\u003ehosts allow = 192.168.1. fd0::/64\u003c/code\u003e - \u003cem\u003eAttention à bien modifier\nselon vos propres adressages IP…\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"section-homes\"\u003eSection [homes]\u003c/h4\u003e\n\u003cp\u003eUtilisons la \u003cstrong\u003esection [Homes]\u003c/strong\u003e pour autoriser la connexion à nos différents\nutilisateurs, à leurs répertoires \u003cstrong\u003eDocuments\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\"\u003eSection [homes]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ebrowseable\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eNo\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        comment = Documents\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        create mask = 0644\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        directory mask = 0700\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        force directory mode = 0700\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        hide dot files = No\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        hide special files = Yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        hosts allow =\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        path = /mnt/nas/Documents/\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        read only = No\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        valid users =\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        write list =\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch5 id=\"explications\"\u003eExplications\u003c/h5\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ebrowseable = no\u003c/code\u003e : le parcours du répertoire par tout autre que les\nutilisateurs autorisés est interdit ;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecreate mask\u003c/code\u003e force le chmod sur les fichiers créés/ajoutés/modifiés\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003edirectory mask\u003c/code\u003e et \u003ccode\u003eforce directory mode\u003c/code\u003e obligent le chmod en question\nsur les répertoires.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ehide dot files = No\u003c/code\u003e autorise la lecture des fichiers et répertoires\ncachés - ce qui pour un utilisateur autorisé, sur ses propres fichiers,\nest normal.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ehide special files = Yes\u003c/code\u003e empêche la lecture de tout fichier spécial\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ehosts allow\u003c/code\u003e indiquons IMPÉRATIVEMENT les adresses IP des machines\nautorisées à se connecter à ce partage…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eread only\u003c/code\u003e : étant que nous voulons autoriser les utilisateurs à écrire/ajouter\nleurs propres documents, laissons/mettons la sur \u003ccode\u003eno\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003evalid users\u003c/code\u003e renfermera les utilisateurs, ou le groupe samba dédié,\nautorisés à se connecter à ce partage - \u003cstrong\u003eà remplir impérativement\u003c/strong\u003e - \u003cbr\u003e\nc\u0026rsquo;est ici que nous ajouterons, \u003cem\u003ede préférence\u003c/em\u003e, le groupe \u003ccode\u003esmb\u003c/code\u003e que\nje vous ai invité à créer dans l\u0026rsquo;astuce au début de ce chapitre,\ntel que : \u003ccode\u003evalid users = @_smb\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ewrite list\u003c/code\u003e autorisera seuls les utilisateurs renseignés à pouvoir écrire\ndans ce partage ! - \u003cbr\u003e\nc\u0026rsquo;est ici qu\u0026rsquo;il est préférable d\u0026rsquo;ajouter le groupe samba dédié, créé\nplutôt, tel que : \u003ccode\u003ewrite list = @_smb\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"sections-music-et-video\"\u003eSections [Music] et [Video]\u003c/h4\u003e\n\u003cp\u003eMaintenant occupons nous des partages Samba pour les documents audios, et\nvidéos - la configuration sera exactement la même, seul le nom de section\nchange ainsi que les options \u003ccode\u003ecomment\u003c/code\u003e, \u003ccode\u003epath\u003c/code\u003e… !\u003c/p\u003e\n\u003cp\u003eNous appellerons, \u003cem\u003epar préférence\u003c/em\u003e, :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour les documents sonores la section correspondante : \u003ccode\u003eSection [Music]\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003eet pour les fichiers vidéos : \u003ccode\u003eSection [Video]\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eÀ la différence du partage \u003ccode\u003e[homes]\u003c/code\u003e, permettons que ces partages multimédias\nsoient parcourables par tous : \u003ccode\u003ebrowseable = yes\u003c/code\u003e, et \u003ccode\u003eguest ok = yes\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMais nous ne voulons pas que d\u0026rsquo;aucun puisse écrire dedans, l\u0026rsquo;option\n\u003ccode\u003eread only = yes\u003c/code\u003e nous y aidera. De même que l\u0026rsquo;option \u003ccode\u003eprintable = no\u003c/code\u003e\nempêchera toute tentative d\u0026rsquo;impression des documents…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDe même, nous empêcherons toute lecture de fichiers cachés et/ou spéciaux :\n\u003ccode\u003ehide dot files = yes\u003c/code\u003e et \u003ccode\u003ehide special files = yes\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;option \u003ccode\u003ewrite list\u003c/code\u003e nous permettra d\u0026rsquo;autoriser au moins votre utilisateur\nà écrire dedans ! :p\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5 id=\"section-music\"\u003eSection [Music]\u003c/h5\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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[Music]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ebrowseable\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eyes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    comment = Musique\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    create mask = 0664\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    directory mask = 0755\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    ea support = no\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    force directory mode = 0755\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    guest ok = yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    hide dot files = yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    hide special files = yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    inherit acls = yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    inherit permissions = no\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    path = /mnt/nas/Medias/Music/\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    printable = no\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    read only = yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    store dos attributes = no\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    write list =\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch5 id=\"section-video\"\u003eSection [Video]\u003c/h5\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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[Video]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ebrowseable\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eyes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    comment = Videos\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    create mask = 0664\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    directory mask = 0755\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    ea support = no\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    force directory mode = 0755\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    guest ok = yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    hide dot files = yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    hide special files = yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    inherit acls = yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    inherit permissions = no\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    path = /mnt/nas/Medias/Video/\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    printable = no\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    read only = yes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    store dos attributes = no\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    write list =\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"ssh\"\u003eSSH\u003c/h3\u003e\n\u003cp\u003eÀ la différence des autres services, celui-ci sera bel et bien monté normalement\ndès le démarrage de la machine… et donc géré depuis le fichier \u003ccode\u003e/etc/rc.conf.local\u003c/code\u003e\npar le biais de l\u0026rsquo;outil \u003ccode\u003ercctl\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eEn effet, nous voulons pouvoir y accèder à tout moment…\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eVeuillez lire mon article suivant sur comment avoir une\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sec/ssh/configuration-securisee/\" title=\"Lien interne vers l\u0026#39;article : 'SSH : Configuration Sécurisée'\"\u003econfiguration et générer des clés sécurisées\u003c/a\u003e\n,\nactuellement !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"sshfs\"\u003eSSHFS\u003c/h4\u003e\n\u003cp\u003eÉtant donné que mon utilisateur système principal est autorisé à se connecter\nen SSH sur le serveur, il est facile de monter localement le système de fichier,\nsoit par \u003ca href=\"https://doc.huc.fr.eu.org/fr/sys/openbsd/sshfs/\" rel=\"external\"\u003eSSHFS\u003c/a\u003e en mode console, soit avec un outil graphique, tel\nque \u003ca href=\"https://doc.huc.fr.eu.org/fr/sys/openbsd/gigolo/\" rel=\"external\"\u003eGigolo\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est plus lent qu\u0026rsquo;avec le partage Samba, ce qui est normal du fait de la\ncouche \u0026ldquo;sécurité\u0026rdquo; lié aux chiffrements de la connexion… \u003cbr\u003e\nmais c\u0026rsquo;est aussi pratique ET à ma préférence ! :D\u003c/p\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Fabriquons un NAS, serveur multimédia, serveur de stockage, sous OpenBSD, en utilisant des disques durs chiffrés, dont le mode Raid 1C","tags":["OpenBSD","NAS","Raid1C"],"date_published":"2018-10-15T19:32:40+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-13:/fr/sys/openbsd/samba#005922002e3b5fb47b7675700ea979ea226fbe7c69293889452dc646d7ffbb7f","url":"https://it-log.fr.eu.org/fr/sys/openbsd/samba/","title":"OpenBSD : Introduction à Samba","author":{"name":"Stéphane HUC"},"content_text":"Description La suite Samba est un ensemble de programmes qui implémentent un serveur pour les protocoles de partage de fichiers, d’imprimantes Windows (SMB /CIFS ) ainsi que de contrôleur de domaine compatible avec Active Directory.\nSite web : https://www.samba.org/ OS : *OpenBSD 6.3 ⇒ 7.3 Version installée : 4.16.6 6.6, 6.7, 6.8 : 4.9.18 6.4, 6.5 : 4.8.5p1, 4.8.11p0 Installation Installez le paquet samba !\nModification système Il va être nécessaire de créer le répertoire /var/run/samba et d\u0026rsquo;attribuer les droits systèmes 0755 sur les répertoires /var/samba et /var/cache/samba.\nGestion des utilisateurs Il faut créer un premier utilisateur qui sera autorisé :\n# pdbedit -a -u $user\nLa commande pdbedit est utile pour gérer, non seulement les utilisateurs mais aussi pour vérifier certaines choses, grâce au jeu des options :\n-a ou --create : pour créer un nouvel utilisateur ; il est nécessaire d\u0026rsquo;ajouter l\u0026rsquo;option -u avant de spécifier le nom de l\u0026rsquo;utilisateur\n-L ou --list liste les différents utilisateurs gérés, dans un format simple, abrégé.\n-L -v affiche toutes les informations liées aux différentes informations utilisateurs, de manière complète. La version contractée -Lv est fonctionnelle.\n-c ou --account-control permet de spécifier les propriétés du compte utilisateur… plusieurs drapeaux définissent le contrôle\n-D ou --drive permet de définir la lettre de mappage du lecteur réseau à utiliser, tel que -D \u0026quot;H: \u0026quot;\n-h ou --homedir permet de redéfinir le chemin réseau du répertoire personnel d\u0026rsquo;un utilisateur\n-l ou --log-basename=/repertoire_des_logs spécifie le répertoire du fichier journal\n-s ou --configfile=nom_de_fichier_config spécifie le fichier de configuration.\n-v ou --verbose est le mode verbeux\n-x ou --delete pour supprimer un utilisateur…\nBien sûr, il existe d\u0026rsquo;autres options intéressantes ; lisez le manpage, installé en même temps que le logiciel samba.\nAstuceFaites coïncider les noms utilisateurs Samba avec ceux sur votre système en veillant à utiliser les mêmes mots de passe ; ça vous facilitera la vie. Configuration Contrairement à ce qu\u0026rsquo;on pense, la configuration n\u0026rsquo;est pas compliquée - un peu longue, mais pas compliquée ;)\nAttentionIl semble que le service WINS ne soit pas supporté sous OpenBSD, donc cela ne sert à rien de modifier les options wins:* - laissez-les commenter ! Tout se fait principalement dans le fichier /etc/samba/smb.conf :\n# This is the main Samba configuration file. You should read the # smb.conf(5) manual page in order to understand the options listed # here. Samba has a huge number of configurable options (perhaps too # many!) most of which are not shown in this example # # For a step to step guide on installing, configuring and using samba, # read the Samba-HOWTO-Collection. This may be obtained from: # http://www.samba.org/samba/docs/Samba-HOWTO-Collection.pdf # # Many working examples of smb.conf files can be found in the # Samba-Guide which is generated daily and can be downloaded from: # http://www.samba.org/samba/docs/Samba-Guide.pdf # # Any line which starts with a ; (semi-colon) or a # (hash) # is a comment and is ignored. In this example we will use a # # for commentry and a ; for parts of the config file that you # may wish to enable # # NOTE: Whenever you modify this file you should run the command \u0026#34;testparm\u0026#34; # to check that you have not made any basic syntactic errors. # #======================= Global Settings ===================================== [global] # workgroup = NT-Domain-Name or Workgroup-Name, eg: MIDEARTH workgroup = Workgroup # server string is the equivalent of the NT Description field server string = Samba Server # Server role. Defines in which mode Samba will operate. Possible # values are \u0026#34;standalone server\u0026#34;, \u0026#34;member server\u0026#34;, \u0026#34;classic primary # domain controller\u0026#34;, \u0026#34;classic backup domain controller\u0026#34;, \u0026#34;active # directory domain controller\u0026#34;. # # Most people will want \u0026#34;standalone server\u0026#34; or \u0026#34;member server\u0026#34;. # Running as \u0026#34;active directory domain controller\u0026#34; will require first # running \u0026#34;samba-tool domain provision\u0026#34; to wipe databases and create a # new domain. server role = standalone server # This option is important for security. It allows you to restrict # connections to machines which are on your local network. The # following example restricts access to two C class networks and # the \u0026#34;loopback\u0026#34; interface. For more examples of the syntax see # the smb.conf man page ; hosts allow = 192.168.1. 192.168.2. 127. # Uncomment this if you want a guest account, you must add this to /etc/passwd # otherwise the user \u0026#34;nobody\u0026#34; is used ; guest account = pcguest # this tells Samba to use a separate log file for each machine # that connects log file = /var/log/samba/smbd.%m # Put a capping on the size of the log files (in Kb). max log size = 50 # Specifies the Kerberos or Active Directory realm the host is part of ; realm = MY_REALM # Backend to store user information in. New installations should # use either tdbsam or ldapsam. smbpasswd is available for backwards # compatibility. tdbsam requires no further configuration. ; passdb backend = tdbsam # Using the following line enables you to customise your configuration # on a per machine basis. The %m gets replaced with the netbios name # of the machine that is connecting. # Note: Consider carefully the location in the configuration file of # this line. The included file is read at that point. ; include = /usr/local/samba/lib/smb.conf.%m # Configure Samba to use multiple interfaces # If you have multiple network interfaces then you must list them # here. See the man page for details. ; interfaces = 192.168.12.2/24 192.168.13.2/24 # Where to store roving profiles (only for Win95 and WinNT) # %L substitutes for this servers netbios name, %U is username # You must uncomment the [Profiles] share below ; logon path = \\\\%L\\Profiles\\%U # Windows Internet Name Serving Support Section: # WINS Support - Tells the NMBD component of Samba to enable it\u0026#39;s WINS Server ; wins support = yes # WINS Server - Tells the NMBD components of Samba to be a WINS Client # Note: Samba can be either a WINS Server, or a WINS Client, but NOT both ; wins server = w.x.y.z # WINS Proxy - Tells Samba to answer name resolution queries on # behalf of a non WINS capable client, for this to work there must be # at least one WINS Server on the network. The default is NO. ; wins proxy = yes # DNS Proxy - tells Samba whether or not to try to resolve NetBIOS names # via DNS nslookups. The default is NO. dns proxy = no # These scripts are used on a domain controller or stand-alone # machine to add or delete corresponding unix accounts ; add user script = /usr/sbin/useradd %u ; add group script = /usr/sbin/groupadd %g ; add machine script = /usr/sbin/adduser -n -g machines -c Machine -d /dev/null -s /bin/false %u ; delete user script = /usr/sbin/userdel %u ; delete user from group script = /usr/sbin/deluser %u %g ; delete group script = /usr/sbin/groupdel %g #============================ Share Definitions ============================== [homes] comment = Home Directories browseable = no ; follow symlinks = yes ; wide links = yes writable = yes (…) Les options importantes en terme de sécurité sont :\nhosts allow permet de restreindre l\u0026rsquo;accès à un réseau local, une adresse IP précise, et empêchera tout autre hôte à se connecter. interfaces permet de cibler sur quelle interface réseau les services de Samba seront diffusés et autorisés. valid users permet de spécifier quels utilisateurs ou groupe d\u0026rsquo;utilisateurs ont le droit d\u0026rsquo;accéder aux différents partages, ou services fournis. AttentionGarder à l\u0026rsquo;esprit que le fichier de configuration est, de base, minimaliste, et dans l\u0026rsquo;état n\u0026rsquo;offre aucune sécurité !\nJ\u0026rsquo;attire votre attention sur le manpage très long de smb.conf(5), disponible de par l\u0026rsquo;installation du paquet samba.\nPour les besoins de test de fonctionnement, ne pas toucher au reste de la configuration…\nTest La commande testparm est utile pour vérifier que le configuration du fichier soit correcte.\nÀ exécuter AVANT de démarrer le service, et APRÈS toute modification…\nWeak crypto allowed Si testparm se plaint du message suivant : Weak crypto is allowed Sachez qu\u0026rsquo;il n\u0026rsquo;est rien possible de faire, à moins d\u0026rsquo;utiliser le mode FIPS seulement.\nCela ne signifie pas que Samba utilise une cryptographie faible, ou qu\u0026rsquo;elle est permise. Dans les faits, Samba utilise GnuTLS, qui dans des contextes de compatibilité, basculera sur de faibles algorithmes cryptographiques autorisés par GnuTLS.\nEt, oui, le message n\u0026rsquo;est pas clair !\nPour plus d\u0026rsquo;informations:\nlire la MR #12537 le thread \u0026ldquo;weak crypto is allowed\u0026rdquo; et suivre les messages. Limites systèmes Il est nécessaire de reconfigurer les limites systèmes en ajoutant :\nle fichier /etc/login.conf.d/samba pour y ajouter le bloc suivant : samba:\\ :openfiles-max=16384:\\ :tc=daemon: le fichier /etc/sysctl.conf pour modifier de manière permanente kern.maxfiles : kern.maxfiles=16384 Ces modifications systèmes nécessitent au plus simple de redémarrer votre machine !\nPF Les règles pour le pare-feu PF sont très simples à paramétrer :\n# lan: IPv4 lan=\u0026#34;192.168.1.0/24\u0026#34; # adress IPv4 of my host myhost=\u0026#34;192.168.1.1\u0026#34; smb_ports_tcp = \u0026#34;{ 135 137 139 445 }\u0026#34; smb_ports_udp = \u0026#34;{ 135 137 138 445 }\u0026#34; (...) pass in quick on egress proto tcp from $lan to $myhost port $smb_ports_tcp flags S/SA modulate state pass in quick on egress proto udp from $lan to $myhost port $smb_ports_udp allow-opts pass in quick on egress inet proto udp from $myhost to $lan port 138 allow-opts pass out quick on egress proto tcp from $myhost to $lan port $smb_ports_tcp flags S/SA modulate state pass out quick on egress proto udp from $myhost to $lan port $smb_ports_udp allow-opts Elles sont à configurer et sur le serveur Samba, et sur votre station.\nBien sûr, ces règles sont un exemple ; il faut les adapter à vos besoins.\nAstuceFaire de même pour la pile IPv6 - afin de différencier facilement les règles relatives aux deux couches réseau - même si PF sait très bien gérer, avec une règle simple… Dépannage 6.5: smbd(timeouts) Sous OpenBSD 6.5, il y a un problème avec le lancement de Samba, créant des timeouts.\nJ\u0026rsquo;explique sur le forum de la communauté française \u0026ldquo;OpenBSD Pour Tous\u0026rdquo; la raison et le fait qu\u0026rsquo;il est nécessaire de lancer à nouveau le service samba ; pas de le relancer, juste le démarrer !\n# rcctl start samba smbd(timeout) # rcctl check samba smbd(ok) nmbd(failed) # rcctl start samba nmbd(ok) #rcctl check samba smbd(ok) nmbd(ok) Il est possible de vérifier que les processus soient bien lancés : $ ps auxw | grep mbd (faites le après le timeout et après la deuxième exécution du start, vous comprendrez !)\nDocumentations Manpages man 8 pdbedit, man 5 smb.conf Samba Ainsi que le met en exergue le manpage de smb.conf, il est fortement conseillé de lire les deux guides suivants, fournis par le projet :\nSur le wiki officiel le Guide Samba-HOWTO-Collection à-propos des différentes étapes d\u0026rsquo;installation, de configuration et d\u0026rsquo;usage de Samba. le Guide Samba qui fournit beaucoup d\u0026rsquo;exemples… Ces guides sont basés sur Samba v3. Et, même si nous utilisons une version supérieure, il y a toujours quelque chose de bon à en tirer, à en apprendre…\nLocalement sur le système, retrouvez les fichiers de :\npkg-readme : /usr/local/share/doc/pkg-readmes/samba et d\u0026rsquo;exemple : /usr/local/share/examples/samba/smb.conf.default ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLa suite \u003cstrong\u003eSamba\u003c/strong\u003e est un ensemble de programmes qui implémentent un serveur\npour les protocoles de partage de fichiers, d’imprimantes Windows\n\u003cem\u003e(\u003cabbr title=\"Server Message Block\"\u003eSMB\u003c/abbr\u003e\n/\u003cabbr title=\"Common Internet File System\"\u003eCIFS\u003c/abbr\u003e\n)\u003c/em\u003e\nainsi que de contrôleur de domaine  compatible avec Active Directory.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web : \u003ca href=\"https://www.samba.org/\" rel=\"external\"\u003ehttps://www.samba.org/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eOS : *\u003cem\u003eOpenBSD \u003cem\u003e\u003cdel\u003e6.3\u003c/del\u003e ⇒ 7.3\u003c/em\u003e\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eVersion installée :\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e4.16.6\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e\u003cdel\u003e6.6, 6.7, 6.8 : \u003cstrong\u003e4.9.18\u003c/strong\u003e\u003c/del\u003e\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e\u003cdel\u003e6.4, 6.5 : \u003cstrong\u003e4.8.5p1, 4.8.11p0\u003c/strong\u003e\u003c/del\u003e\u003c/em\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\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\u003esamba\u003c/code\u003e\u003c/strong\u003e !\u003c/p\u003e\n\u003ch3 id=\"modification-système\"\u003eModification système\u003c/h3\u003e\n\u003cp\u003eIl va être nécessaire de créer le répertoire \u003ccode\u003e/var/run/samba\u003c/code\u003e et\nd\u0026rsquo;attribuer les droits systèmes \u003ccode\u003e0755\u003c/code\u003e sur les répertoires \u003ccode\u003e/var/samba\u003c/code\u003e\net \u003ccode\u003e/var/cache/samba\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"gestion-des-utilisateurs\"\u003eGestion des utilisateurs\u003c/h3\u003e\n\u003cp\u003eIl faut créer un premier utilisateur qui sera autorisé :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# pdbedit -a -u $user\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLa commande \u003ccode\u003epdbedit\u003c/code\u003e est utile pour gérer, non seulement les utilisateurs\nmais aussi pour vérifier certaines choses, grâce au jeu des options :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e-a\u003c/code\u003e ou \u003ccode\u003e--create\u003c/code\u003e : pour créer un nouvel utilisateur ; il est nécessaire\nd\u0026rsquo;ajouter l\u0026rsquo;option \u003ccode\u003e-u\u003c/code\u003e avant de spécifier le nom de l\u0026rsquo;utilisateur\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e-L\u003c/code\u003e ou \u003ccode\u003e--list\u003c/code\u003e liste les différents utilisateurs gérés, dans un format\nsimple, abrégé.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e-L -v\u003c/code\u003e affiche toutes les informations liées aux différentes informations\nutilisateurs, de manière complète. La version contractée \u003ccode\u003e-Lv\u003c/code\u003e est\nfonctionnelle.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e-c\u003c/code\u003e ou \u003ccode\u003e--account-control\u003c/code\u003e permet de spécifier les propriétés du compte\nutilisateur… plusieurs drapeaux définissent le contrôle\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e-D\u003c/code\u003e ou \u003ccode\u003e--drive\u003c/code\u003e permet de définir la lettre de mappage du lecteur réseau\nà utiliser, tel que \u003ccode\u003e-D \u0026quot;H: \u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e-h\u003c/code\u003e ou \u003ccode\u003e--homedir\u003c/code\u003e permet de redéfinir le chemin réseau du répertoire\npersonnel d\u0026rsquo;un utilisateur\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e-l\u003c/code\u003e ou \u003ccode\u003e--log-basename=/repertoire_des_logs\u003c/code\u003e spécifie le répertoire\ndu fichier journal\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e-s\u003c/code\u003e ou \u003ccode\u003e--configfile=nom_de_fichier_config\u003c/code\u003e spécifie le fichier de\nconfiguration.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e-v\u003c/code\u003e ou \u003ccode\u003e--verbose\u003c/code\u003e est le mode verbeux\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e-x\u003c/code\u003e ou \u003ccode\u003e--delete\u003c/code\u003e pour supprimer un utilisateur…\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBien sûr, il existe d\u0026rsquo;autres options intéressantes ; lisez le manpage,\n\u003cem\u003einstallé en même temps que le logiciel samba.\u003c/em\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eFaites coïncider les noms utilisateurs Samba avec ceux sur votre système\nen veillant à utiliser les mêmes mots de passe ; ça vous facilitera la vie.\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eContrairement à ce qu\u0026rsquo;on pense, la configuration n\u0026rsquo;est pas compliquée -\nun peu longue, mais pas compliquée ;)\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eIl semble que le service WINS ne soit pas supporté sous OpenBSD, donc cela\nne sert à rien de modifier les options \u003ccode\u003ewins:*\u003c/code\u003e - laissez-les commenter !\u003c/div\u003e\n\n\u003cp\u003eTout se fait principalement dans le fichier \u003ccode\u003e/etc/samba/smb.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# This is the main Samba configuration file. You should read the\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# smb.conf(5) manual page in order to understand the options listed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# here. Samba has a huge number of configurable options (perhaps too\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# many!) most of which are not shown in this example\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 a step to step guide on installing, configuring and using samba,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# read the Samba-HOWTO-Collection. This may be obtained from:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#  http://www.samba.org/samba/docs/Samba-HOWTO-Collection.pdf\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# Many working examples of smb.conf files can be found in the\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Samba-Guide which is generated daily and can be downloaded from:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#  http://www.samba.org/samba/docs/Samba-Guide.pdf\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# Any line which starts with a ; (semi-colon) or a # (hash)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# is a comment and is ignored. In this example we will use a #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# for commentry and a ; for parts of the config file that you\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# may wish to enable\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# NOTE: Whenever you modify this file you should run the command \u0026#34;testparm\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# to check that you have not made any basic syntactic errors.\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#======================= Global Settings =====================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[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# workgroup = NT-Domain-Name or Workgroup-Name, eg: MIDEARTH\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#06b6ef\"\u003eworkgroup\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eWorkgroup\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# server string is the equivalent of the NT Description field\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#06b6ef\"\u003eserver string\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eSamba Server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Server role. Defines in which mode Samba will operate. Possible\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# values are \u0026#34;standalone server\u0026#34;, \u0026#34;member server\u0026#34;, \u0026#34;classic primary\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# domain controller\u0026#34;, \u0026#34;classic backup domain controller\u0026#34;, \u0026#34;active\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# directory domain controller\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# Most people will want \u0026#34;standalone server\u0026#34; or \u0026#34;member server\u0026#34;.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Running as \u0026#34;active directory domain controller\u0026#34; will require first\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# running \u0026#34;samba-tool domain provision\u0026#34; to wipe databases and create a\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# new domain.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#06b6ef\"\u003eserver role\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003estandalone server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 option is important for security. It allows you to restrict\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# connections to machines which are on your local network. The\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# following example restricts access to two C class networks and\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# the \u0026#34;loopback\u0026#34; interface. For more examples of the syntax see\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# the smb.conf man page\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;   hosts allow = 192.168.1. 192.168.2. 127.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 this if you want a guest account, you must add this to /etc/passwd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# otherwise the user \u0026#34;nobody\u0026#34; is used\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;  guest account = pcguest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 tells Samba to use a separate log file for each machine\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# that connects\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#06b6ef\"\u003elog file\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/var/log/samba/smbd.%m\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Put a capping on the size of the log files (in Kb).\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#06b6ef\"\u003emax log size\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e50\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Specifies the Kerberos or Active Directory realm the host is part of\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;   realm = MY_REALM\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Backend to store user information in. New installations should\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# use either tdbsam or ldapsam. smbpasswd is available for backwards\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# compatibility. tdbsam requires no further configuration.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;   passdb backend = tdbsam\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Using the following line enables you to customise your configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# on a per machine basis. The %m gets replaced with the netbios name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# of the machine that is connecting.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Note: Consider carefully the location in the configuration file of\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#       this line.  The included file is read at that point.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;   include = /usr/local/samba/lib/smb.conf.%m\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Configure Samba to use multiple interfaces\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# If you have multiple network interfaces then you must list them\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# here. See the man page for details.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;   interfaces = 192.168.12.2/24 192.168.13.2/24\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Where to store roving profiles (only for Win95 and WinNT)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#        %L substitutes for this servers netbios name, %U is username\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#        You must uncomment the [Profiles] share below\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;   logon path = \\\\%L\\Profiles\\%U\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Windows Internet Name Serving Support Section:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# WINS Support - Tells the NMBD component of Samba to enable it\u0026#39;s WINS Server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;   wins support = 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# WINS Server - Tells the NMBD components of Samba to be a WINS Client\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#       Note: Samba can be either a WINS Server, or a WINS Client, but NOT both\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;   wins server = w.x.y.z\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# WINS Proxy - Tells Samba to answer name resolution queries on\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# behalf of a non WINS capable client, for this to work there must be\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# at least one  WINS Server on the network. The default is NO.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;   wins proxy = 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# DNS Proxy - tells Samba whether or not to try to resolve NetBIOS names\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# via DNS nslookups. The default is NO.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#06b6ef\"\u003edns proxy\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\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# These scripts are used on a domain controller or stand-alone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# machine to add or delete corresponding unix accounts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;  add user script = /usr/sbin/useradd %u\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;  add group script = /usr/sbin/groupadd %g\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;  add machine script = /usr/sbin/adduser -n -g machines -c Machine -d /dev/null -s /bin/false %u\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;  delete user script = /usr/sbin/userdel %u\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;  delete user from group script = /usr/sbin/deluser %u %g\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;  delete group script = /usr/sbin/groupdel %g\u003c/span\u003e\n\u003c/span\u003e\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#============================ Share Definitions ==============================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[homes]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#06b6ef\"\u003ecomment\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eHome Directories\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e   browseable = no\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;   follow symlinks = yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e;   wide links = yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#06b6ef\"\u003ewritable\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eyes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\u003chr\u003e\n\u003cp\u003eLes options importantes en terme de sécurité sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ehosts allow\u003c/code\u003e permet de restreindre l\u0026rsquo;accès à un réseau local, une adresse\nIP précise, et empêchera tout autre hôte à se connecter.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einterfaces\u003c/code\u003e permet de cibler sur quelle interface réseau les services\nde Samba seront diffusés et autorisés.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evalid users\u003c/code\u003e permet de spécifier quels utilisateurs ou groupe d\u0026rsquo;utilisateurs\nont le droit d\u0026rsquo;accéder aux différents partages, ou services fournis.\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\u003eGarder à l\u0026rsquo;esprit que le fichier de configuration est, de base, minimaliste,\net dans l\u0026rsquo;état n\u0026rsquo;offre aucune sécurité !\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;attire votre attention sur le manpage très long de smb.conf(5),\ndisponible de par l\u0026rsquo;installation du paquet samba.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003ePour les besoins de test de fonctionnement, ne pas toucher au reste de la configuration…\u003c/p\u003e\n\u003ch3 id=\"test\"\u003eTest\u003c/h3\u003e\n\u003cp\u003eLa commande \u003ccode\u003etestparm\u003c/code\u003e est utile pour vérifier que le configuration du\nfichier soit correcte.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eÀ exécuter AVANT de démarrer le service, et APRÈS toute modification…\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"weak-crypto-allowed\"\u003eWeak crypto allowed\u003c/h3\u003e\n\u003cp\u003eSi \u003cstrong\u003etestparm\u003c/strong\u003e se plaint du message suivant :\n\u003ccode\u003eWeak crypto is allowed\u003c/code\u003e \u003cbr\u003e\nSachez qu\u0026rsquo;il n\u0026rsquo;est rien possible de faire, à moins d\u0026rsquo;utiliser le mode FIPS\nseulement.\u003c/p\u003e\n\u003cp\u003eCela ne signifie pas que Samba utilise une cryptographie faible, ou qu\u0026rsquo;elle\nest permise. Dans les faits, Samba utilise GnuTLS, qui dans des contextes\nde compatibilité, basculera sur de faibles algorithmes cryptographiques\nautorisés par GnuTLS.\u003c/p\u003e\n\u003cp\u003eEt, oui, le message n\u0026rsquo;est pas clair !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePour plus d\u0026rsquo;informations:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003elire la \u003ca href=\"https://gitlab.com/samba-team/samba/-/merge_requests/2537\" rel=\"external\"\u003eMR #12537\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ele thread \u0026ldquo;\u003ca href=\"https://www.spinics.net/lists/samba/msg174767.html\" rel=\"external\"\u003eweak crypto is allowed\u003c/a\u003e\u0026rdquo;\net suivre les messages.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"limites-systèmes\"\u003eLimites systèmes\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire de reconfigurer les limites systèmes en ajoutant :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele fichier \u003ccode\u003e/etc/login.conf.d/samba\u003c/code\u003e pour y ajouter le bloc suivant :\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\"\u003esamba:\\\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\"\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:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003ele fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e pour modifier de manière permanente\n\u003ccode\u003ekern.maxfiles\u003c/code\u003e : \u003cbr\u003e \u003ccode\u003ekern.maxfiles=16384\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCes modifications systèmes nécessitent au plus simple de redémarrer\nvotre machine !\u003c/p\u003e\n\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\u003cp\u003eLes règles pour le pare-feu \u003cabbr title=\"Packet Filter\"\u003ePF\u003c/abbr\u003e\n sont très\nsimples à paramétrer :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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# lan: IPv4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elan\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;192.168.1.0/24\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# adress IPv4 of my host\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003emyhost\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;192.168.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\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\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\"\u003epass in quick on egress  proto tcp from $lan  to $myhost   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 $lan  to $myhost   port $smb_ports_udp 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 inet  proto udp from $myhost  to $lan  port 138 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 out quick on egress  proto tcp from $myhost to $lan  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 quick on egress  proto udp from $myhost to $lan  port $smb_ports_udp allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eElles sont à configurer et sur le serveur Samba, et sur votre station.\u003c/p\u003e\n\u003cp\u003eBien sûr, ces règles sont un exemple ; il faut les adapter à vos besoins.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eFaire de même pour la pile IPv6 - afin de différencier facilement les règles\nrelatives aux deux couches réseau - même si PF sait très bien gérer, avec\nune règle simple…\u003c/div\u003e\n\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"65-smbdtimeouts\"\u003e6.5: smbd(timeouts)\u003c/h3\u003e\n\u003cp\u003eSous OpenBSD 6.5, il y a un problème avec le lancement de Samba, créant des\n\u003ccode\u003etimeouts\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;explique sur le \u003ca href=\"https://forum.openbsd.fr.eu.org/showthread.php?tid=2322\u0026amp;pid=18303#pid18303\" rel=\"external\"\u003eforum de la communauté française \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;\u003c/a\u003e\nla raison et le fait qu\u0026rsquo;il est nécessaire de lancer à nouveau le service samba ;\npas de le relancer, \u003cstrong\u003ejuste le démarrer\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 start samba\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmbd\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003etimeout\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# rcctl check samba\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmbd\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eok\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enmbd\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003efailed\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# rcctl start samba\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enmbd\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eok\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#rcctl check samba\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmbd\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eok\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enmbd\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eok\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\u003eIl est possible de vérifier que les processus soient bien lancés : \u003cbr\u003e\n\u003ccode\u003e$ ps auxw | grep mbd\u003c/code\u003e \u003cbr\u003e\n\u003cem\u003e(faites le après le timeout et après la deuxième exécution du start,\nvous comprendrez !)\u003c/em\u003e\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\u003ccode\u003eman 8 pdbedit\u003c/code\u003e, \u003ccode\u003eman 5 smb.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"samba\"\u003eSamba\u003c/h3\u003e\n\u003cp\u003eAinsi que le met en exergue le manpage de \u003ccode\u003esmb.conf\u003c/code\u003e, il est fortement\nconseillé de lire les deux guides suivants, fournis par le projet :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSur le \u003ca href=\"https://wiki.samba.org/index.php/Main_Page\" rel=\"external\"\u003ewiki officiel\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ele Guide \u003cstrong\u003e\u003ca href=\"http://www.samba.org/samba/docs/Samba-HOWTO-Collection.pdf\" rel=\"external\"\u003eSamba-HOWTO-Collection\u003c/a\u003e\u003c/strong\u003e à-propos des différentes étapes\nd\u0026rsquo;installation, de configuration et d\u0026rsquo;usage de Samba.\u003c/li\u003e\n\u003cli\u003ele \u003cstrong\u003e\u003ca href=\"http://www.samba.org/samba/docs/Samba-Guide.pdf\" rel=\"external\"\u003eGuide Samba\u003c/a\u003e\u003c/strong\u003e qui fournit beaucoup d\u0026rsquo;exemples…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCes guides sont basés sur Samba v3. Et, même si nous utilisons une version\nsupérieure, il y a toujours quelque chose de bon à en tirer, à en apprendre…\u003c/p\u003e\n\u003cp\u003eLocalement sur le système, retrouvez les fichiers de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epkg-readme : \u003ccode\u003e/usr/local/share/doc/pkg-readmes/samba\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet d\u0026rsquo;exemple : \u003ccode\u003e/usr/local/share/examples/samba/smb.conf.default\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Guide de démarrage : Faire fonctionner le serveur Samba sous OpenBSD","tags":["OpenBSD","Samba","Introduction","Guide"],"date_published":"2018-10-13T19:32:40+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-11:/fr/sys/openbsd/harden-openbsd#9a22822bc0cc387490639fdf415faccee1090e53b3627dff402f9ce0fd109560","url":"https://it-log.fr.eu.org/fr/sys/openbsd/harden-openbsd/","title":"OpenBSD : durcir le système de fichier","author":{"name":"Stéphane HUC"},"content_text":"Securelevel Par défaut, actuellement le niveau de sécurité par défaut d\u0026rsquo;OpenBSD semble être déjà un acquis.\nLe manpage securelevel nous restitue une information pertinente. Il est possible d\u0026rsquo;augmenter ce niveau en utilisant la commande sysctl, telle que :\n# sysctl -w kern.securelevel=2 Mais soyez conscient des difficultés créées :\nImpossible de modifier l\u0026rsquo;horloge système - (pensez à la synchronisation NTP, par exemple…) -, ou vos règles PF si jamais vous les avez configurées, etc… Système de fichiers en lecture seule AttentionATTENTION : Avec OpenBSD 6.4, il semble que cela pose plus d\u0026rsquo;un soucis. Les sockets qui ne peuvent être copiées ; les services qui ne peuvent être démarrés, voire redémarrés ; la régénération du kernel qui ne se fait pas ; les logs PF non consultables, etc…\net unveil(2) qui logiquement se plaint !\n(…) unveil: Read-only file system\nUn autre moyen est de rester en securelevel par défaut à 1, mais d\u0026rsquo;utiliser les options de montage, tel que ro principalement, mais aussi nodev,noexec,nosuid sur les différentes partitions du système de fichier ffs.\nPour cela, il faut d\u0026rsquo;abord modifier le fichier /etc/fstab, de manière à ce que soit créé au démarrage un système de fichier mfs (swap) pour monter les périphériques /dev dedans\nNe pas oublier cette écriture, sinon, vous aurez quelques difficultés pour \"monter\" dynamiquement certains périphériques spéciaux , parfois nécessaires, pour certains services, tel SSH !\nCopiez votre fichier /etc/fstab de manière à en faire une sauvegarde - cela pourrait être utile plus tard !\n# cp /etc/fstab /root/fstab.origin ; chmod 0400 /root/fstab.origin Modification du fichier /etc/fstab duid_info.b none swap sw duid_info.a / ffs ro 1 1 duid_info.k /home ffs ro,nodev,noexec,nosuid 1 2 duid_info.d /tmp ffs rw,nodev,noexec,nosuid 1 2 duid_info.f /usr ffs ro,nodev 1 2 duid_info.g /usr/X11R6 ffs ro,nodev 1 2 duid_info.h /usr/local ffs ro,nodev,wxallowed 1 2 duid_info.j /usr/obj ffs ro,nodev,nosuid 1 2 duid_info.i /usr/src ffs ro,nodev,nosuid 1 2 duid_info.e /var ffs rw,nodev,noexec,nosuid 1 2 swap /dev mfs rw,-i=1024,-P=/dev,-s=32m 0 0 AttentionATTENTION à ces deux points essentiels :\nla partition /tmp, et /var ont besoin de rester en écriture ; néanmoins, il n\u0026rsquo;est pas nécessaire d\u0026rsquo;avoir des droits en exécution, ni suid, ni d\u0026rsquo;écriture de périphériques spéciaux. la partition /home peut être en lecture seule ; néanmoins, soyez conscient que cela vous compliquera la tâche pour ajouter/créer/détruire tout fichier dans votre répertoire personnel, surtout dans le contexte d\u0026rsquo;une machine. De même si vous souhaitez tester du code (python, shell, …) après avoir cloné des dépôts git, compiler des binaires pour les tester… dans ce cas-là, c\u0026rsquo;est l\u0026rsquo;option noexec qui vous empêchera une telle activité, somme toute légitime. À vous de voir… Création du fichier sysmount Le script sysmount nous facilitera la vie, pour autoriser l\u0026rsquo;écriture et verrouiller des différentes partitions le nécessitant :\n#!/bin/sh #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: 2018/10/10 # ### arg=\u0026#34;$1\u0026#34; ################################################################################ ### ## # FUNCTIONS ## ### ################################################################################ # mount FS in rw mode rw() { printf \u0026#34;%s \\n\u0026#34; \u0026#34;*** Mount FS in rw mode! ***\u0026#34; mount -uw / mount -uw /usr mount -uw /usr/X11R6 mount -uw /usr/local printf \u0026#34;%s \\n\u0026#34; \u0026#34;--- DONE! ---\u0026#34; } #mount FS in ro mode ro() { printf \u0026#34;%s \\n\u0026#34; \u0026#34;*** Mount FS in ro mode! ***\u0026#34; mount -ur /usr/local mount -ur /usr/X11R6 mount -ur /usr mount -ur / printf \u0026#34;%s \\n\u0026#34; \u0026#34;--- DONE! ---\u0026#34; } ################################################################################ ### ## # EXECUTION ## ### ################################################################################ if [ \u0026#34;${arg}\u0026#34; = \u0026#34;rw\u0026#34; ]; then rw; elif [ \u0026#34;${arg}\u0026#34; = \u0026#34;ro\u0026#34; ]; then ro; fi L\u0026rsquo;usage en est très simple : avant l\u0026rsquo;installation d\u0026rsquo;un binaire, ou la modification d\u0026rsquo;un fichier de configuration, un coup de :\n./sysmount rw pour autoriser l\u0026rsquo;écriture sur le système de fichier, puis ensuite de ./sysmount ro pour l\u0026rsquo;empêcher à nouveau` et, voilà !\nAttentionSoyez attentif au fait que ce script ne gère QUE les droits d\u0026rsquo;écriture sur la racine ainsi que les partitions /usr/ principales…\nIl vous faudra le modifier en conséquence pour gérer soit d\u0026rsquo;autres partitions, soit d\u0026rsquo;autres options !\nLorsqu\u0026rsquo;il faudra mettre à niveau le système d\u0026rsquo;exploitation, veuillez lire cet autre article : [Mini-Tuto] Upgrade Hardened OpenBSD Documentations Manpages securelevel , unveil(2) Remerciements Un petit \u0026ldquo;gros\u0026rdquo; merci @Vincent pour ces tutoriels sur le durcissement du système de fichier OpenBSD : ici ou là.\n","content_html":"\u003ch2 id=\"securelevel\"\u003eSecurelevel\u003c/h2\u003e\n\u003cp\u003ePar défaut, actuellement le niveau de sécurité par défaut d\u0026rsquo;OpenBSD\nsemble être déjà un acquis.\u003c/p\u003e\n\u003cp\u003eLe manpage \u003cstrong\u003esecurelevel\u003c/strong\u003e nous restitue une information pertinente. Il\nest possible d\u0026rsquo;augmenter ce niveau en utilisant la commande \u003ccode\u003esysctl\u003c/code\u003e,\ntelle 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:#776e71\"\u003e# sysctl -w kern.securelevel=2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMais soyez conscient des difficultés créées :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eImpossible de modifier l\u0026rsquo;horloge système - \u003cem\u003e(pensez à la synchronisation\nNTP, par exemple…)\u003c/em\u003e -,\u003c/li\u003e\n\u003cli\u003eou vos règles PF si jamais vous les avez configurées,\u003c/li\u003e\n\u003cli\u003eetc…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"système-de-fichiers-en-lecture-seule\"\u003eSystème de fichiers en lecture seule\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 : Avec OpenBSD 6.4, il semble que cela pose plus\nd\u0026rsquo;un soucis. Les sockets qui ne peuvent être copiées ; les\nservices qui ne peuvent être démarrés, voire redémarrés ; la\nrégénération du kernel qui ne se fait pas ; les logs PF non\nconsultables, etc…\u003c/p\u003e\n\u003cp\u003eet unveil(2) qui logiquement se plaint !\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e(…) unveil: Read-only file system\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eUn autre moyen est de rester en \u003ccode\u003esecurelevel\u003c/code\u003e par défaut à \u003ccode\u003e1\u003c/code\u003e, mais\nd\u0026rsquo;utiliser les options de montage, tel que \u003ccode\u003ero\u003c/code\u003e principalement, mais\naussi \u003ccode\u003enodev,noexec,nosuid\u003c/code\u003e sur les différentes partitions du système de\nfichier ffs.\u003c/p\u003e\n\u003cp\u003ePour cela, il faut d\u0026rsquo;abord modifier le fichier \u003ccode\u003e/etc/fstab\u003c/code\u003e, de manière\nà ce que soit créé au démarrage un système de fichier \u003ccode\u003emfs\u003c/code\u003e \u003cem\u003e(swap)\u003c/em\u003e\npour monter les périphériques \u003ccode\u003e/dev\u003c/code\u003e dedans\u003c/p\u003e\n\u003cp\u003e\u003cspan class=\"red\"\u003eNe pas oublier cette écriture, sinon, vous aurez quelques \ndifficultés pour \"monter\" dynamiquement certains périphériques spéciaux\u003c/span\u003e\n,\nparfois nécessaires, pour certains services, tel SSH !\u003c/p\u003e\n\u003cp\u003eCopiez votre fichier \u003ccode\u003e/etc/fstab\u003c/code\u003e de manière à en faire une sauvegarde -\ncela pourrait être utile plus tard !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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 /etc/fstab /root/fstab.origin ; chmod 0400 /root/fstab.origin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"modification-du-fichier-etcfstab\"\u003eModification du fichier \u003ccode\u003e/etc/fstab\u003c/code\u003e\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\"\u003eduid_info.b none swap sw\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eduid_info.a / ffs ro 1 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eduid_info.k /home ffs ro,nodev,noexec,nosuid 1 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eduid_info.d /tmp ffs rw,nodev,noexec,nosuid 1 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eduid_info.f /usr ffs ro,nodev 1 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eduid_info.g /usr/X11R6 ffs ro,nodev 1 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eduid_info.h /usr/local ffs ro,nodev,wxallowed 1 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eduid_info.j /usr/obj ffs ro,nodev,nosuid 1 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eduid_info.i /usr/src ffs ro,nodev,nosuid 1 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eduid_info.e /var ffs rw,nodev,noexec,nosuid 1 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eswap /dev mfs rw,-i\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e1024,-P=/dev,-s=32m 0 0\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\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e à ces deux points essentiels :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela partition \u003ccode\u003e/tmp\u003c/code\u003e, et \u003ccode\u003e/var\u003c/code\u003e ont besoin de rester en écriture ;\nnéanmoins, il n\u0026rsquo;est pas nécessaire d\u0026rsquo;avoir des droits en exécution,\nni suid, ni d\u0026rsquo;écriture de périphériques spéciaux.\u003c/li\u003e\n\u003cli\u003ela partition \u003ccode\u003e/home\u003c/code\u003e peut être en lecture seule ; néanmoins, soyez\nconscient que cela vous compliquera la tâche pour ajouter/créer/détruire\ntout fichier dans votre répertoire personnel, surtout dans le contexte\nd\u0026rsquo;une machine. \u003cbr\u003e\nDe même si vous souhaitez tester du code \u003cem\u003e(python, shell, …)\u003c/em\u003e\naprès avoir cloné des dépôts git, compiler des binaires pour les tester… \u003cbr\u003e\ndans ce cas-là, c\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003enoexec\u003c/code\u003e qui vous empêchera une telle\nactivité, somme toute légitime. \u003cbr\u003e\n\u003cem\u003eÀ vous de voir…\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\u003c/div\u003e\n\n\u003ch4 id=\"création-du-fichier-sysmount\"\u003eCréation du fichier \u003ccode\u003esysmount\u003c/code\u003e\u003c/h4\u003e\n\u003cp\u003eLe script \u003ca href=\"https://framagit.org/hucste/omv-it/blob/master/Administration/sysmount\" rel=\"external\"\u003e\u003ccode\u003esysmount\u003c/code\u003e\u003c/a\u003e\nnous facilitera la vie, pour autoriser l\u0026rsquo;écriture et verrouiller des\ndifférentes partitions le nécessitant :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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:#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: 2018/10/10\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:#06b6ef\"\u003earg\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;$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:#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#   FUNCTIONS\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:#776e71\"\u003e# mount FS in rw mode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003erw() {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprintf \u0026#34;%s \\n\u0026#34; \u0026#34;*** Mount FS in rw mode! ***\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emount -uw /\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emount -uw /usr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emount -uw /usr/X11R6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emount -uw /usr/local\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprintf \u0026#34;%s \\n\u0026#34; \u0026#34;--- DONE! ---\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:#776e71\"\u003e#mount FS in ro mode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ero() {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprintf \u0026#34;%s \\n\u0026#34; \u0026#34;*** Mount FS in ro mode! ***\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emount -ur /usr/local\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emount -ur /usr/X11R6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emount -ur /usr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emount -ur /\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprintf \u0026#34;%s \\n\u0026#34; \u0026#34;--- DONE! ---\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:#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:#06b6ef\"\u003eif [ \u0026#34;${arg}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;rw\u0026#34; ]; then rw; elif [ \u0026#34;${arg}\u0026#34; = \u0026#34;ro\u0026#34; ]; then ro; fi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;usage en est très simple : avant l\u0026rsquo;installation d\u0026rsquo;un binaire, ou la\nmodification d\u0026rsquo;un fichier de configuration, un coup de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e./sysmount rw\u003c/code\u003e pour autoriser l\u0026rsquo;écriture sur le système de fichier,\u003c/li\u003e\n\u003cli\u003epuis ensuite de \u003ccode\u003e./sysmount ro\u003c/code\u003e pour l\u0026rsquo;empêcher à nouveau`\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eet, voilà !\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\u003eSoyez attentif\u003c/strong\u003e au fait que ce script ne gère QUE les droits\nd\u0026rsquo;écriture sur la racine ainsi que les partitions \u003ccode\u003e/usr/\u003c/code\u003e\nprincipales…\u003c/p\u003e\n\u003cp\u003eIl vous faudra le modifier en conséquence pour gérer soit d\u0026rsquo;autres\npartitions, soit d\u0026rsquo;autres options !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003eLorsqu\u0026rsquo;il faudra mettre à niveau le système d\u0026rsquo;exploitation, veuillez\nlire cet autre article : \u003cstrong\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/upgrade-hardened-openbsd/\" title=\"Lien interne vers l\u0026#39;article : '[Mini-Tuto] Upgrade Hardened OpenBSD'\"\u003e[Mini-Tuto] Upgrade Hardened OpenBSD\u003c/a\u003e\n\n\u003c/strong\u003e\u003c/p\u003e\n\u003chr\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/securelevel\" title=\"Page du Manuel OpenBSD pour : securelevel\"\u003esecurelevel\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\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eUn petit \u0026ldquo;gros\u0026rdquo; merci\n@\u003ca href=\"http://www.vincentdelft.be/\" rel=\"external\"\u003eVincent\u003c/a\u003e pour ces tutoriels\nsur le durcissement du système de fichier OpenBSD :\n\u003ca href=\"http://www.vincentdelft.be/post/post_20160712\" rel=\"external\"\u003eici\u003c/a\u003e ou\n\u003ca href=\"http://www.vincentdelft.be/post/post_20180713\" rel=\"external\"\u003elà\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment durcir sa machine sous OpenBSD","tags":["OpenBSD","Harden"],"date_published":"2018-10-11T18:43:18+01:00","date_modified":"2020-05-21T15:00:40+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-09:/fr/trad/tumfatig.net/openbsd-raspberry-pi3#ed903e9831072f73d20dfeda3e4ea127855e1a6d04903a510fd00d7fa906cb7e","url":"https://it-log.fr.eu.org/fr/trad/tumfatig.net/openbsd-raspberry-pi3/","title":"Faire fonctionner OpenBSD sur le Raspberry Pi 3","author":{"name":"Stéphane HUC"},"content_text":"Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;Running OpenBSD on Raspberry Pi 3\u0026rdquo;, écrit par Joel Carnat.\nFaire fonctionner OpenBSD sur le Raspberry Pi 3 OS concerné : OpenBSD 6.3 et \u0026gt; Étape 1 : avoir dans les mains un Raspbian Étape 2 : exécuté OpenBSD sur le modèle B du Raspberry Pi 3. J\u0026rsquo;ai eu pas mal d\u0026rsquo;essais et d\u0026rsquo;échecs, mais il a démarré, a été installé et à la fin, il fonctionne correctement. Voici l\u0026rsquo;histoire complète. Le matériel Raspberry Pi 3 Pour installer OpenBSD 6.3 sur le Raspberry Pi 3 v1.2, j\u0026rsquo;ai utilisé une microSD de 128 Mo (pour héberger l\u0026rsquo;installateur), un adaptateur USB pour la microSD, une clé USB sans marque de 30 Go, un convertisseur USB-TTL et un câble RJ45.\nTout a été fait depuis un Macbook Pro utilisant MacOS 10.13.5. Les commandes de préparation ne devraient pas différer beaucoup si vous utilisez un des *BSD ou Linux.\nJ\u0026rsquo;ai démarré les deux versions d\u0026rsquo;OpenBSD 6.3, la stable et la current mais le support matériel était le même. Pas d\u0026rsquo;interface Wifi…\nProcédure Étape par Étape Récupérez votre fichier d\u0026rsquo;installation d\u0026rsquo;OpenBSD favori. J\u0026rsquo;ai utilisé miniroot63.fs.\nFormatez votre microSD et votre clé USB. Cela n\u0026rsquo;est absolument pas requis mais je préfère démarrer vraiment vide.\n# diskutil list # diskutil unmountDisk /dev/disk2 # dd if=/dev/zero of=/dev/disk2 count=4096 (…) # diskutil eject /dev/disk2 Disk /dev/disk2 ejected # diskutil unmountDisk /dev/disk3 # dd if=/dev/zero of=/dev/disk3 count=4096 (…) # diskutil eject /dev/disk3 Disk /dev/disk3 ejected Insérez la microSD au dos du MacBook, ignorez les messages d\u0026rsquo;initialisation de MacOS et copiez le fichier miniroot.fs sur la carte.\n# diskutil list (…) /dev/disk2 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: *126.0 MB disk2 # dd if=miniroot63.fs of=/dev/disk2 bs=1m 21+0 records in 21+0 records out 22020096 bytes transferred in 7.937130 secs (2774315 bytes/sec) # diskutil list (…) /dev/disk2 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *126.0 MB disk2 1: Windows_FAT_32 BOOT 4.2 MB disk2s1 2: OpenBSD 13.6 MB disk2s4 # diskutil eject /dev/disk2 Disk /dev/disk2 ejected Pour être capable de démarrer depuis la clé USB, le Raspberry a été \u0026ldquo;patché\u0026rdquo;. Cela a été fait en ajoutant un drapeau dans le OTP. Vous devrez insérer la microSD dans le Mac, et éditer le fichier BOOT/config.txt en ajoutant une simple ligne de code.\n|# echo \u0026ldquo;program_usb_boot_mode=1\u0026rdquo; \u0026raquo; /Volumes/BOOT/config.txt|\nInsérez la microSD dans le slot microSD du RPI3, la clé USB dans un des connecteurs USB du RPI3. Connectez le câble Ethernet au RPI3. Connectez le RPI3 et le MacBook en utilisant l\u0026rsquo;adaptateur USB TTL.\nDepuis mon terminal, j\u0026rsquo;ai utilisé les commandes suivantes pour accéder à la console :\n# cu -l /dev/cu.usbserial -s 115200 | tee cu.log\nBranchez le câble électrique microUSB au RPI3. J\u0026rsquo;ai utilisé un câble microUSB-USB et l\u0026rsquo;ai connecté au port USB3 de mon Synology. Cela a fonctionné. Bien que la console émette parfois des messages d\u0026rsquo;avertissements relatifs à la tension.\nVérifiez dans la console que tout démarre :\nU-Boot 2018.03 (Mar 20 2018 - 04:28:27 -0600) DRAM: 948 MiB RPI 3 Model B (0xa02082) U-Boot 2018.03 (Mar 20 2018 - 04:28:27 -0600) DRAM: 948 MiB RPI 3 Model B (0xa02082) MMC: mmc@7e202000: 0, sdhci@7e300000: 1 Loading Environment from FAT… *** Warning - bad CRC, using default environment Failed (-5) In: serial Out: vidconsole Err: vidconsole Net: No ethernet found. starting USB… USB0: Core Release: 2.80a scanning bus 0 for devices… 4 USB Device(s) found scanning usb for storage devices… 1 Storage Device(s) found Hit any key to stop autoboot: 0 U-Boot\u0026gt; usb storage Device 0: Vendor: USB Rev: 1100 Prod: Flash Disk Type: Removable Hard Disk Capacity: 30720.0 MB = 30.0 GB (62914560 x 512) U-Boot\u0026gt; boot switch to partitions #0, OK mmc0 is current device Scanning mmc 0:1… Found EFI removable media binary efi/boot/bootaa64.efi Scanning disk mmc@7e202000.blk… Card did not respond to voltage select! Scanning disk sdhci@7e300000.blk… Disk sdhci@7e300000.blk not ready Scanning disk usb_mass_storage.lun0… Found 4 disks 82780 bytes read in 12 ms (6.6 MiB/s) ## Starting EFI application at 01000000 … \u0026gt;\u0026gt; OpenBSD/arm64 BOOTAA64 0.11 boot\u0026gt; cannot open sd0a:/etc/random.seed: No such file or directory booting sd0a:/bsd: 2417208+377168+8373432- +732352 [179732+96+291264+160768]=0xf498 f0 type 0x0 pa 0x0 va 0x0 pages 0x1 attr 0x8 type 0x7 pa 0x1000 va 0x0 pages 0x1ff attr 0x8 type 0x2 pa 0x200000 va 0x200000 pages 0x4000 attr 0x8 type 0x7 pa 0x4200000 va 0x0 pages 0x3e00 attr 0x8 type 0x6 pa 0x8000000 va 0xe0250b000 pages 0x8 attr 0x8000000000000008 type 0x7 pa 0x8009000 va 0x0 pages 0x312c0 attr 0x8 type 0x2 pa 0x392c9000 va 0x392c9000 pages 0x4 attr 0x8 (…) type 0x2 pa 0x39f41000 va 0x39f41000 pages 0x146a attr 0x8 type 0x5 pa 0x3b3ab000 va 0xe358b6000 pages 0x1 attr 0x8000000000000008 type 0x2 pa 0x3b3ac000 va 0x39f41000 pages 0x54 attr 0x8 type 0xb pa 0x3f100000 va 0xe358b7000 pages 0x1 attr 0x8000000000000000 Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2018 OpenBSD. All rights reserved. https://www.OpenBSD.org OpenBSD 6.3 (RAMDISK) #212: Sat Mar 24 20:24:43 MDT 2018 deraadt@arm64.openbsd.org:/usr/src/sys/arch/arm64/compile/RAMDISK real mem = 959180800 (914MB) avail mem = 892710912 (851MB) mainbus0 at root: Raspberry Pi 3 Model B Rev 1.2 cpu0 at mainbus0 mpidr 0: ARM Cortex-A53 r0p4 efi0 at mainbus0: UEFI 2.7 efi0: Das U-Boot rev 0x0 simplefb0 at mainbus0: 656x416 wsdisplay0 at simplefb0 wsdisplay0: screen 0 added (std, vt100 emulation) simplebus0 at mainbus0: \u0026#34;soc\u0026#34; bcmintc0 at simplebus0 bcmdog0 at simplebus0 bcmrng0 at simplebus0 pluart0 at simplebus0 bcmaux0 at simplebus0 com0 at sim����: ns16550, no workingcom0: console dwctwo0 at simplebus0 simplebus1 at mainbus0: \u0026#34;clocks\u0026#34; agtimer0 at mainbus0: tick rate 19200 KHz usb0 at dwctwo0: USB revision 2.0 uhub0 at usb0 configuration 1 interface 0 \u0026#34;Broadcom DWC2 root hub\u0026#34; rev 2.00/1.00 addr 1 uhub1 at uhub0 port 1 configuration 1 interface 0 \u0026#34;Standard Microsystems product 0x9514\u0026#34; rev 2.00/2.00 addr 2 smsc0 at uhub1 port 1 configuration 1 interface 0 \u0026#34;Standard Microsystems SMSC9512/14\u0026#34; rev 2.00/2.00 addr 3 smsc0: address xx:xx:xx:xx:xx:xx ukphy0 at smsc0 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x0001f0, model 0x000c umass0 at uhub1 port 3 configuration 1 interface 0 \u0026#34;USB Flash Disk\u0026#34; rev 2.00/11.00 addr 4 umass0: using SCSI over Bulk-Only scsibus0 at umass0: 2 targets, initiator 0 sd0 at scsibus0 targ 1 lun 0: \u0026lt;USB, Flash Disk, 1100\u0026gt; SCSI2 0/direct removable serial.090c1000000000014806 sd0: 30720MB, 512 bytes/sector, 62914560 sectors bootfile: sd0a:/bsd boot device: sd0 root on rd0a swap on rd0b dump on rd0b WARNING: CHECK AND RESET THE DATE! erase ^?, werase ^W, kill ^U, intr ^C, status ^T Welcome to the OpenBSD/arm64 6.3 installation program. (I)nstall, (U)pgrade, (A)utoinstall or (S)hell? i Procédez à l\u0026rsquo;installation d\u0026rsquo;OpenBSD. Ici, rien de spécial. La carte réseau sera une smsc0 et peut utiliser DHCP. En utilisant - \u0026ldquo;Whole disk\u0026rdquo; - cela créera automatiquement et remplira une partition MSDOS pour activer le démarrage depuis la clé USB. Au moment d\u0026rsquo;écrire cela, il n\u0026rsquo;est pas possible d\u0026rsquo;installer OpenBSD sur une microSD ; il n\u0026rsquo;y a pas de pilote pour cela. Je ne suis pas sûr, mais il semble qu\u0026rsquo;eMMC n\u0026rsquo;est pas non plus supporté, pas encore. La seule manière d\u0026rsquo;installer OpenBSD est d\u0026rsquo;utiliser un disque USB compatible pour démarrer.\nChoisissez - \u0026ldquo;Halt\u0026rdquo; - à la fin de l\u0026rsquo;installation. Déconnectez l\u0026rsquo;alimentation USB. Enlevez la microSD d\u0026rsquo;installation.\nReconnectez l\u0026rsquo;alimention microUSB et regardez OpenBSD démarrer.\nU-Boot 2018.03 (Mar 20 2018 - 04:28:27 -0600) DRAM: 948 MiB RPI 3 Model B (0xa02082) MMC: mmc@7e202000: 0, sdhci@7e300000: 1 Loading Environment from FAT… WARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command()! WARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command()! Card did not respond to voltage select! ** Bad device mmc 0 ** Failed (-5) In: serial Out: vidconsole Err: vidconsole Net: No ethernet found. starting USB… USB0: Core Release: 2.80a scanning bus 0 for devices… 4 USB Device(s) found scanning usb for storage devices… 1 Storage Device(s) found Hit any key to stop autoboot: 0 WARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command()! WARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command()! WARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command()! Card did not respond to voltage select! Device 0: Vendor: USB Rev: 1100 Prod: Flash Disk Type: Removable Hard Disk Capacity: 30720.0 MB = 30.0 GB (62914560 x 512) … is now current device Scanning usb 0:1… Found EFI removable media binary efi/boot/bootaa64.efi WARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command()! WARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command()! WARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command()! Card did not respond to voltage select! Scanning disk mmc@7e202000.blk… Disk mmc@7e202000.blk not ready Card did not respond to voltage select! Scanning disk sdhci@7e300000.blk… Disk sdhci@7e300000.blk not ready Scanning disk usb_mass_storage.lun0… Found 3 disks 82780 bytes read in 88 ms (918 KiB/s) ## Starting EFI application at 01000000 … 3996244+595624+583064+805616 [281462+96+464664/ type 0x0 pa 0x0 va 0x0 pages 0x1 attr 0x8 type 0x7 pa 0x1000 va 0x0 pages 0x1ff attr 0x8 type 0x2 pa 0x200000 va 0x200000 pages 0x4000 attr 0x8 type 0x7 pa 0x4200000 va 0x0 pages 0x3e00 attr 0x8 type 0x6 pa 0x8000000 va 0x20987be000 pages 0x8 attr 0x8000000000000008 type 0x7 pa 0x8009000 va 0x0 pages 0x317f6 attr 0x8 type 0x2 pa 0x397ff000 va 0x397ff000 pages 0x4 attr 0x8 (…) type 0x5 pa 0x3b3ab000 va 0x20cbb69000 pages 0x1 attr 0x8000000000000008 type 0x2 pa 0x3b3ac000 va 0x39f41000 pages 0x54 attr 0x8 type 0xb pa 0x3f100000 va 0x20cbb6a000 pages 0x1 attr 0x8000000000000000 [ using 994392 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-2018 OpenBSD. All rights reserved. https://www.OpenBSD.org OpenBSD 6.3 (GENERIC.MP) #41: Sat Mar 24 20:06:13 MDT 2018 deraadt@arm64.openbsd.org:/usr/src/sys/arch/arm64/compile/GENERIC.MP real mem = 964644864 (919MB) avail mem = 905125888 (863MB) mainbus0 at root: Raspberry Pi 3 Model B Rev 1.2 cpu0 at mainbus0 mpidr 0: ARM Cortex-A53 r0p4 efi0 at mainbus0: UEFI 2.7 efi0: Das U-Boot rev 0x0 simplefb0 at mainbus0: 656x416 wsdisplay0 at simplefb0 mux 1 wsdisplay0: screen 0-5 added (std, vt100 emulation) simplebus0 at mainbus0: \u0026#34;soc\u0026#34; bcmintc0 at simplebus0 bcmdog0 at simplebus0 bcmrng0 at simplebus0 pluart0 at simplebus0 bcmtemp0 at simplebus0 bcmaux0 at simplebus0 com0 at sim����: ns16550, no workingcom0: console dwctwo0 at simplebus0 simplebus1 at mainbus0: \u0026#34;clocks\u0026#34; agtimer0 at mainbus0: tick rate 19200 KHz cpu1 at mainbus0 mpidr 1: ARM Cortex-A53 r0p4 cpu2 at mainbus0 mpidr 2: ARM Cortex-A53 r0p4 cpu3 at mainbus0 mpidr 3: ARM Cortex-A53 r0p4 usb0 at dwctwo0: USB revision 2.0 uhub0 at usb0 configuration 1 interface 0 \u0026#34;Broadcom DWC2 root hub\u0026#34; rev 2.00/1.00 addr 1 uhub1 at uhub0 port 1 configuration 1 interface 0 \u0026#34;Standard Microsystems product 0x9514\u0026#34; rev 2.00/2.00 addr 2 smsc0 at uhub1 port 1 configuration 1 interface 0 \u0026#34;Standard Microsystems SMSC9512/14\u0026#34; rev 2.00/2.00 addr 3 smsc0: address xx:xx:xx:xx:xx:xx ukphy0 at smsc0 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x0001f0, model 0x000c umass0 at uhub1 port 3 configuration 1 interface 0 \u0026#34;USB Flash Disk\u0026#34; rev 2.00/11.00 addr 4 umass0: using SCSI over Bulk-Only scsibus0 at umass0: 2 targets, initiator 0 sd0 at scsibus0 targ 1 lun 0: \u0026lt;USB, Flash Disk, 1100\u0026gt; SCSI2 0/direct removable serial.090c1000000000014806 sd0: 30720MB, 512 bytes/sector, 62914560 sectors vscsi0 at root scsibus1 at vscsi0: 256 targets softraid0 at root scsibus2 at softraid0: 256 targets bootfile: sd0a:/bsd boot device: sd0 root on sd0a (01654b77d1056385.a) swap on sd0b dump on sd0b WARNING: CHECK AND RESET THE DATE! Automatic boot in progress: starting file system checks. /dev/sd0a (01654b77d1056385.a): file system is clean; not checking setting tty flags pf enabled starting network smsc0: bound to 10.0.0.23 from 10.0.0.1 (xx:xx:xx:xx:xx:xx) reordering libraries: done. openssl: generating isakmpd/iked RSA keys… done. ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519 starting early daemons: syslogd pflogd 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 sndiod. running rc.firsttime Path to firmware: http://firmware.openbsd.org/firmware/6.3/ No devices found which need firmware files to be downloaded. Checking for available binary patches… done. Run syspatch(8) to install: 001_perl 002_libtls 003_arp 004_gif 005_httpd 006_ipseclen 007_libcrypto 008_ipsecout 009_libcrypto 011_perl starting local daemons: cron. Sun Mar 25 07:56:40 CEST 2018 OpenBSD/arm64 (bagheera.tumfatig.net) (console) login: root Password: OpenBSD 6.3 (GENERIC.MP) #41: Sat Mar 24 20:06:13 MDT 2018 Welcome to OpenBSD: The proactively secure Unix-like operating system. Et voilà ! Rien de bien difficile.\nRemerciements Avec l\u0026rsquo;aimable autorisation de Joel Carnat !\nCette page est la traduction de la page Running OpenBSD on Raspberry Pi 3 du site TUM\u0026rsquo;FATIG. - licence de type BSD.\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.tumfatig.net/20180706/running-openbsd-on-raspberry-pi-3/\" rel=\"external\"\u003eRunning OpenBSD on Raspberry Pi 3\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit par Joel Carnat.\u003c/p\u003e\n\u003chr\u003e\n\u003ch1 id=\"faire-fonctionner-openbsd-sur-le-raspberry-pi-3\"\u003eFaire fonctionner OpenBSD sur le Raspberry Pi 3\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eOS concerné : \u003cstrong\u003eOpenBSD 6.3 et \u0026gt;\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eÉtape 1 : avoir dans les mains un Raspbian\u003c/li\u003e\n\u003cli\u003eÉtape 2 : exécuté OpenBSD sur le modèle B du Raspberry Pi 3. J\u0026rsquo;ai eu\npas mal d\u0026rsquo;essais et d\u0026rsquo;échecs, mais il a démarré, a été installé et\nà la fin, il fonctionne correctement. Voici l\u0026rsquo;histoire complète.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"le-matériel\"\u003eLe matériel\u003c/h2\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/tumfatig.net/OpenBSD-RPI3.jpg\" title=\"Raspberry Pi 3 \"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/tumfatig.net/OpenBSD-RPI3_hu_9382848123deb05.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Raspberry Pi 3 \" height=\"250\" loading=\"lazy\" src=\"/images/tumfatig.net/OpenBSD-RPI3_hu_c9a1474a234e1930.jpg\" type=\"image/jpeg\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eRaspberry Pi 3 \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003ePour installer OpenBSD 6.3 sur le Raspberry Pi 3 v1.2, j\u0026rsquo;ai utilisé une\nmicroSD de 128 Mo (pour héberger l\u0026rsquo;installateur), un adaptateur USB pour\nla microSD, une clé USB sans marque de 30 Go, un convertisseur USB-TTL\net un câble RJ45.\u003c/p\u003e\n\u003cp\u003eTout a été fait depuis un Macbook Pro utilisant MacOS 10.13.5. Les\ncommandes de préparation ne devraient pas différer beaucoup si vous\nutilisez un des *BSD ou Linux.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai démarré les deux versions d\u0026rsquo;OpenBSD 6.3, la stable et la current\nmais le support matériel était le même. Pas d\u0026rsquo;interface Wifi…\u003c/p\u003e\n\u003ch2 id=\"procédure-étape-par-étape\"\u003eProcédure Étape par Étape\u003c/h2\u003e\n\u003cp\u003eRécupérez votre fichier d\u0026rsquo;installation d\u0026rsquo;OpenBSD favori. J\u0026rsquo;ai utilisé\nminiroot63.fs.\u003c/p\u003e\n\u003cp\u003eFormatez votre microSD et votre clé USB. Cela n\u0026rsquo;est absolument pas\nrequis mais je préfère démarrer vraiment vide.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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# diskutil list\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# diskutil unmountDisk /dev/disk2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# dd if=/dev/zero of=/dev/disk2 count=4096\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:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# diskutil eject /dev/disk2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDisk /dev/disk2 ejected\n\u003c/span\u003e\u003c/span\u003e\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# diskutil unmountDisk /dev/disk3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# dd if=/dev/zero of=/dev/disk3 count=4096\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:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# diskutil eject /dev/disk3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDisk /dev/disk3 ejected\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eInsérez la microSD au dos du MacBook, ignorez les messages\nd\u0026rsquo;initialisation de MacOS et copiez le fichier miniroot.fs sur la carte.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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# diskutil list\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:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/disk2 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eexternal, physical\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#: TYPE NAME SIZE IDENTIFIER\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e0: *126.0 MB disk2\n\u003c/span\u003e\u003c/span\u003e\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# dd if=miniroot63.fs of=/dev/disk2 bs=1m\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e21+0 records in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e21+0 records out\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e22020096\u003c/span\u003e bytes transferred in 7.937130 secs \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2774315\u003c/span\u003e bytes/sec\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# diskutil list\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:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/disk2 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eexternal, physical\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#: TYPE NAME SIZE IDENTIFIER\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e0: FDisk_partition_scheme *126.0 MB disk2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e1: Windows_FAT_32 BOOT 4.2 MB disk2s1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2: OpenBSD 13.6 MB disk2s4\n\u003c/span\u003e\u003c/span\u003e\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# diskutil eject /dev/disk2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDisk /dev/disk2 ejected\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour être capable de démarrer depuis la clé USB, le Raspberry a été\n\u0026ldquo;patché\u0026rdquo;. Cela a été fait en ajoutant un drapeau dans le OTP. Vous\ndevrez insérer la microSD dans le Mac, et éditer le fichier\n\u003ccode\u003eBOOT/config.txt\u003c/code\u003e  en ajoutant une simple ligne de code.\u003c/p\u003e\n\u003cp\u003e|# echo \u0026ldquo;program_usb_boot_mode=1\u0026rdquo; \u0026raquo; /Volumes/BOOT/config.txt|\u003c/p\u003e\n\u003cp\u003eInsérez la microSD dans le slot microSD du RPI3, la clé USB dans un des\nconnecteurs USB du RPI3. Connectez le câble Ethernet au RPI3. Connectez\nle RPI3 et le MacBook en utilisant l\u0026rsquo;adaptateur USB TTL.\u003c/p\u003e\n\u003cp\u003eDepuis mon terminal, j\u0026rsquo;ai utilisé les commandes suivantes pour accéder\nà la console :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# cu -l /dev/cu.usbserial -s 115200 | tee cu.log\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eBranchez le câble électrique microUSB au RPI3. J\u0026rsquo;ai utilisé un câble\nmicroUSB-USB et l\u0026rsquo;ai connecté au port USB3 de mon Synology. Cela a\nfonctionné. Bien que la console émette parfois des messages\nd\u0026rsquo;avertissements relatifs à la tension.\u003c/p\u003e\n\u003cp\u003eVérifiez dans la console que tout démarre :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eU-Boot 2018.03 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eMar \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2018\u003c/span\u003e - 04:28:27 -0600\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\u003eDRAM: \u003cspan style=\"color:#f99b15\"\u003e948\u003c/span\u003e MiB\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRPI \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e Model B \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0xa02082\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\u003eU-Boot 2018.03 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eMar \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2018\u003c/span\u003e - 04:28:27 -0600\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\u003eDRAM: \u003cspan style=\"color:#f99b15\"\u003e948\u003c/span\u003e MiB\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRPI \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e Model B \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0xa02082\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMMC: mmc@7e202000: 0, sdhci@7e300000: \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLoading Environment from FAT… *** Warning - bad CRC, using default environment\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFailed \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e-5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIn: serial\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOut: vidconsole\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eErr: vidconsole\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNet: No ethernet found.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estarting USB…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUSB0: Core Release: 2.80a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escanning bus \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e devices… \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e USB Device\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003es\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e found\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escanning usb \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e storage devices… \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e Storage Device\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003es\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e found\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eHit any key to stop autoboot: \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\u003eU-Boot\u0026gt; usb storage\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDevice 0: Vendor: USB Rev: \u003cspan style=\"color:#f99b15\"\u003e1100\u003c/span\u003e Prod: Flash Disk\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eType: Removable Hard Disk\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCapacity: 30720.0 \u003cspan style=\"color:#ef6155\"\u003eMB\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e 30.0 GB \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e62914560\u003c/span\u003e x 512\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\u003eU-Boot\u0026gt; boot\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eswitch to partitions \u003cspan style=\"color:#776e71\"\u003e#0, OK\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emmc0 is current device\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eScanning mmc 0:1…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFound EFI removable media binary efi/boot/bootaa64.efi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eScanning disk mmc@7e202000.blk…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCard did not respond to voltage \u003cspan style=\"color:#815ba4\"\u003eselect\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eScanning disk sdhci@7e300000.blk…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDisk sdhci@7e300000.blk not ready\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eScanning disk usb_mass_storage.lun0…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFound \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e disks\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e82780\u003c/span\u003e bytes read in \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e ms \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6.6 MiB/s\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## Starting EFI application at 01000000 …\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt;\u0026gt; OpenBSD/arm64 BOOTAA64 0.11\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\u003ecannot open sd0a:/etc/random.seed: No such file or directory\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebooting sd0a:/bsd: 2417208+377168+8373432-\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e+732352 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e179732+96+291264+160768\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e0xf498\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ef0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x0 pa 0x0 va 0x0 pages 0x1 attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x7 pa 0x1000 va 0x0 pages 0x1ff attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x2 pa 0x200000 va 0x200000 pages 0x4000 attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x7 pa 0x4200000 va 0x0 pages 0x3e00 attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x6 pa 0x8000000 va 0xe0250b000 pages 0x8 attr 0x8000000000000008\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x7 pa 0x8009000 va 0x0 pages 0x312c0 attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x2 pa 0x392c9000 va 0x392c9000 pages 0x4 attr 0x8\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\u003etype 0x2 pa 0x39f41000 va 0x39f41000 pages 0x146a attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x5 pa 0x3b3ab000 va 0xe358b6000 pages 0x1 attr 0x8000000000000008\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x2 pa 0x3b3ac000 va 0x39f41000 pages 0x54 attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0xb pa 0x3f100000 va 0xe358b7000 pages 0x1 attr 0x8000000000000000\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\u003eThe 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-2018 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.3 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRAMDISK\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e#212: Sat Mar 24 20:24:43 MDT 2018\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ederaadt@arm64.openbsd.org:/usr/src/sys/arch/arm64/compile/RAMDISK\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\"\u003e959180800\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e914MB\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\"\u003e892710912\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e851MB\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emainbus0 at root: Raspberry Pi \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e Model B Rev 1.2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0 at mainbus0 mpidr 0: ARM Cortex-A53 r0p4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eefi0 at mainbus0: UEFI 2.7\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eefi0: Das U-Boot rev 0x0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esimplefb0 at mainbus0: 656x416\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsdisplay0 at simplefb0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsdisplay0: screen \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e 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\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esimplebus0 at mainbus0: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;soc\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebcmintc0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebcmdog0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebcmrng0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epluart0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebcmaux0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom0 at sim����: ns16550, no workingcom0: console\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edwctwo0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esimplebus1 at mainbus0: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;clocks\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eagtimer0 at mainbus0: tick rate \u003cspan style=\"color:#f99b15\"\u003e19200\u003c/span\u003e KHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eusb0 at dwctwo0: USB revision 2.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;Broadcom DWC2 root hub\u0026#34;\u003c/span\u003e rev 2.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\u003euhub1 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\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Standard Microsystems product 0x9514\u0026#34;\u003c/span\u003e rev 2.00/2.00 addr \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmsc0 at uhub1 port \u003cspan style=\"color:#f99b15\"\u003e1\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;Standard Microsystems SMSC9512/14\u0026#34;\u003c/span\u003e rev 2.00/2.00 addr \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmsc0: address xx:xx:xx:xx:xx:xx\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eukphy0 at smsc0 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x0001f0, model 0x000c\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eumass0 at uhub1 port \u003cspan style=\"color:#f99b15\"\u003e3\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;USB Flash Disk\u0026#34;\u003c/span\u003e rev 2.00/11.00 addr \u003cspan style=\"color:#f99b15\"\u003e4\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\u003escsibus0 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\u003esd0 at scsibus0 targ \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e lun 0: \u0026lt;USB, Flash Disk, 1100\u0026gt; SCSI2 0/direct removable serial.090c1000000000014806\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd0: 30720MB, \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e bytes/sector, \u003cspan style=\"color:#f99b15\"\u003e62914560\u003c/span\u003e sectors\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebootfile: sd0a:/bsd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eboot device: sd0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eroot on rd0a swap on rd0b dump on rd0b\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWARNING: CHECK AND RESET THE DATE!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eerase ^?, werase ^W, kill ^U, intr ^C, status ^T\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWelcome to the OpenBSD/arm64 6.3 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? i\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eProcédez à l\u0026rsquo;installation d\u0026rsquo;OpenBSD. Ici, rien de spécial. La carte\nréseau sera une \u003ccode\u003esmsc0\u003c/code\u003e  et peut utiliser DHCP. En utilisant -\n\u0026ldquo;Whole disk\u0026rdquo; -  cela créera automatiquement et remplira une partition\nMSDOS pour activer le démarrage depuis la clé USB. Au moment d\u0026rsquo;écrire\ncela, il n\u0026rsquo;est pas possible d\u0026rsquo;installer OpenBSD sur une microSD ; il\nn\u0026rsquo;y a pas de pilote pour cela. Je ne suis pas sûr, mais il semble\nqu\u0026rsquo;eMMC n\u0026rsquo;est pas non plus supporté, pas encore. La seule manière\nd\u0026rsquo;installer OpenBSD est d\u0026rsquo;utiliser un disque USB compatible pour démarrer.\u003c/p\u003e\n\u003cp\u003eChoisissez - \u0026ldquo;Halt\u0026rdquo; -  à la fin de l\u0026rsquo;installation. Déconnectez\nl\u0026rsquo;alimentation USB. Enlevez la microSD d\u0026rsquo;installation.\u003c/p\u003e\n\u003cp\u003eReconnectez l\u0026rsquo;alimention microUSB et regardez OpenBSD 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\u003eU-Boot 2018.03 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eMar \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2018\u003c/span\u003e - 04:28:27 -0600\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\u003eDRAM:  \u003cspan style=\"color:#f99b15\"\u003e948\u003c/span\u003e MiB\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRPI \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e Model B \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0xa02082\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMMC:   mmc@7e202000: 0, sdhci@7e300000: \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLoading Environment from FAT… WARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCard did not respond to voltage \u003cspan style=\"color:#815ba4\"\u003eselect\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e** Bad device mmc \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e **\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFailed \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e-5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIn:    serial\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOut:   vidconsole\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eErr:   vidconsole\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNet:   No ethernet found.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estarting USB…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUSB0:   Core Release: 2.80a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escanning bus \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e devices… \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e USB Device\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003es\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e found\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       scanning usb \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e storage devices… \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e Storage Device\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003es\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e found\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eHit any key to stop autoboot:  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCard did not respond to voltage \u003cspan style=\"color:#815ba4\"\u003eselect\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDevice 0: Vendor: USB      Rev: \u003cspan style=\"color:#f99b15\"\u003e1100\u003c/span\u003e Prod: Flash Disk\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            Type: Removable Hard Disk\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            Capacity: 30720.0 \u003cspan style=\"color:#ef6155\"\u003eMB\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e 30.0 GB \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e62914560\u003c/span\u003e x 512\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e… is now current device\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eScanning usb 0:1…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFound EFI removable media binary efi/boot/bootaa64.efi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWARNING at /usr/obj/ports/u-boot-aarch64-2018.03-aarch64/u-boot-2018.03/drivers/mmc/bcm2835_sdhost.c:438/bcm2835_send_command\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCard did not respond to voltage \u003cspan style=\"color:#815ba4\"\u003eselect\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eScanning disk mmc@7e202000.blk…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDisk mmc@7e202000.blk not ready\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCard did not respond to voltage \u003cspan style=\"color:#815ba4\"\u003eselect\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eScanning disk sdhci@7e300000.blk…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDisk sdhci@7e300000.blk not ready\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eScanning disk usb_mass_storage.lun0…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFound \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e disks\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e82780\u003c/span\u003e bytes read in \u003cspan style=\"color:#f99b15\"\u003e88\u003c/span\u003e ms \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e918\u003c/span\u003e KiB/s\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## Starting EFI application at 01000000 …\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e3996244+595624+583064+805616 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e281462+96+464664/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x0 pa 0x0 va 0x0 pages 0x1 attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x7 pa 0x1000 va 0x0 pages 0x1ff attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x2 pa 0x200000 va 0x200000 pages 0x4000 attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x7 pa 0x4200000 va 0x0 pages 0x3e00 attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x6 pa 0x8000000 va 0x20987be000 pages 0x8 attr 0x8000000000000008\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x7 pa 0x8009000 va 0x0 pages 0x317f6 attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x2 pa 0x397ff000 va 0x397ff000 pages 0x4 attr 0x8\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\u003etype 0x5 pa 0x3b3ab000 va 0x20cbb69000 pages 0x1 attr 0x8000000000000008\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0x2 pa 0x3b3ac000 va 0x39f41000 pages 0x54 attr 0x8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype 0xb pa 0x3f100000 va 0x20cbb6a000 pages 0x1 attr 0x8000000000000000\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\"\u003e994392\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-2018 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.3 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGENERIC.MP\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e#41: Sat Mar 24 20:06:13 MDT 2018\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    deraadt@arm64.openbsd.org:/usr/src/sys/arch/arm64/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\"\u003e964644864\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e919MB\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\"\u003e905125888\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e863MB\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emainbus0 at root: Raspberry Pi \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e Model B Rev 1.2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0 at mainbus0 mpidr 0: ARM Cortex-A53 r0p4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eefi0 at mainbus0: UEFI 2.7\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eefi0: Das U-Boot rev 0x0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esimplefb0 at mainbus0: 656x416\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsdisplay0 at simplefb0 mux \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsdisplay0: screen 0-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\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esimplebus0 at mainbus0: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;soc\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebcmintc0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebcmdog0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebcmrng0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epluart0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebcmtemp0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebcmaux0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom0 at sim����: ns16550, no workingcom0: console\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edwctwo0 at simplebus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esimplebus1 at mainbus0: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;clocks\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eagtimer0 at mainbus0: tick rate \u003cspan style=\"color:#f99b15\"\u003e19200\u003c/span\u003e KHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu1 at mainbus0 mpidr 1: ARM Cortex-A53 r0p4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu2 at mainbus0 mpidr 2: ARM Cortex-A53 r0p4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu3 at mainbus0 mpidr 3: ARM Cortex-A53 r0p4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eusb0 at dwctwo0: USB revision 2.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;Broadcom DWC2 root hub\u0026#34;\u003c/span\u003e rev 2.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\u003euhub1 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\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Standard Microsystems product 0x9514\u0026#34;\u003c/span\u003e rev 2.00/2.00 addr \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmsc0 at uhub1 port \u003cspan style=\"color:#f99b15\"\u003e1\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;Standard Microsystems SMSC9512/14\u0026#34;\u003c/span\u003e rev 2.00/2.00 addr \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmsc0: address xx:xx:xx:xx:xx:xx\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eukphy0 at smsc0 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x0001f0, model 0x000c\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eumass0 at uhub1 port \u003cspan style=\"color:#f99b15\"\u003e3\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;USB Flash Disk\u0026#34;\u003c/span\u003e rev 2.00/11.00 addr \u003cspan style=\"color:#f99b15\"\u003e4\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\u003escsibus0 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\u003esd0 at scsibus0 targ \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e lun 0: \u0026lt;USB, Flash Disk, 1100\u0026gt; SCSI2 0/direct removable serial.090c1000000000014806\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd0: 30720MB, \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e bytes/sector, \u003cspan style=\"color:#f99b15\"\u003e62914560\u003c/span\u003e sectors\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\u003escsibus1 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\u003escsibus2 at softraid0: \u003cspan style=\"color:#f99b15\"\u003e256\u003c/span\u003e targets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebootfile: sd0a:/bsd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eboot device: sd0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eroot on sd0a \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e01654b77d1056385.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\u003eWARNING: CHECK AND RESET THE DATE!\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\u003e01654b77d1056385.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\u003esetting tty flags\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\u003estarting network\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmsc0: bound to 10.0.0.23 from 10.0.0.1 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003exx:xx:xx:xx:xx:xx\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\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\u003eopenssl: generating isakmpd/iked RSA keys… \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essh-keygen: generating new host keys: RSA DSA ECDSA ED25519\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estarting early daemons: syslogd pflogd 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 sndiod.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erunning rc.firsttime\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePath to firmware: http://firmware.openbsd.org/firmware/6.3/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNo devices found which need firmware files to be downloaded.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e available binary patches… \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRun syspatch\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e to install:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e001_perl\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e002_libtls\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e003_arp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e004_gif\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e005_httpd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e006_ipseclen\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e007_libcrypto\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e008_ipsecout\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e009_libcrypto\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e011_perl\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\u003eSun Mar \u003cspan style=\"color:#f99b15\"\u003e25\u003c/span\u003e 07:56:40 CEST \u003cspan style=\"color:#f99b15\"\u003e2018\u003c/span\u003e\n\u003c/span\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/arm64 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ebagheera.tumfatig.net\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003econsole\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\u003elogin: root\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\u003eOpenBSD 6.3 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGENERIC.MP\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e#41: Sat Mar 24 20:06:13 MDT 2018\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWelcome to OpenBSD: The proactively secure Unix-like operating system.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt voilà ! Rien de bien difficile.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eAvec l\u0026rsquo;aimable autorisation de Joel Carnat !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCette page est la traduction de la page \u003ca href=\"https://www.tumfatig.net/20180706/running-openbsd-on-raspberry-pi-3/\" rel=\"external\"\u003eRunning OpenBSD on Raspberry Pi 3\u003c/a\u003e\ndu site TUM\u0026rsquo;FATIG. - \u003ca href=\"https://www.tumfatig.net/disclaimer/\" rel=\"external\"\u003elicence de type BSD\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 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 'Running OpenBSD on Raspberry Pi 3' de l'auteur Joel Carnat","tags":["Traduction","OpenBSD","Raspberry","Pi3"],"date_published":"2018-10-09T11:37:46+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-08:/fr/sys/openbsd/minidlna#5182d8c3af97f3deab0284d93a77a48d8c8f5ffedfe975e25011255e86192d24","url":"https://it-log.fr.eu.org/fr/sys/openbsd/minidlna/","title":"MiniDLNA (OpenBSD)","author":{"name":"Stéphane HUC"},"content_text":"Description MiniDLNA est un simple logiciel de serveur multimédia, écrit en C, dont le but est d\u0026rsquo;être totalement compatible avec différents clients DLNA (Digital Living Network Alliance) et/ou UPnP-AV (Universal Plug and Play - Audio Video) , tels que des téléviseurs, tablettes et autres médiums…\nSite web : http://sourceforge.net/projects/minidlna/ Version installée : 1.2.1p1 OS : OpenBSD 6.3 InfoCette solution sous OpenBSD n\u0026rsquo;est pas satisfaisante ; malheureusement, il vaut mieux se tourner vers un autre OS qui la fait fonctionner sans soucis, voire un autre logiciel\nDLNA\n.\nInstallation Installez le paquet minidlna.\nUn utilisateur _minidlna sans droit système est créé !\nAttentionATTENTION à ne jamais exécuter le binaire minidlnad avec les droits root… celui-ci mettra ses droits sur le répertoire de la base de données de minidlna.\nRésultat, lors de l\u0026rsquo;exécution du service minidlna par l\u0026rsquo;outil rcctl, celui-ci échouerait - il faudra réattribuer les droits de l\u0026rsquo;utilisateur _minidlna sur le répertoire de la db, à coup de chown -R _minidlna /dir/db !\nConfiguration AttentionL\u0026rsquo;option inotify ne fonctionne pas sous OpenBSD ! Fichier de configuration La configuration du fichier /etc/minidlna.conf n\u0026rsquo;est pas complexe en soi - si vous ne spécifiez aucune option, ce sont les valeurs par défaut qui sont prises en charge.\nLe port de connexion au service, par défaut, est le 8200.\nVeillez néanmoins à configurer les répertoires à scanner media_dir, en faisant attention à ces options, avec une virgule séparant l\u0026rsquo;option et le répertoire cible :\nA pour le contenu audio P pour les images - (P pour pictures, en anglais) V pour les vidéos et, PV pour le contenu rassemblant et les images et les vidéos. Profitez-en pour lui donner à votre service un joli petit nom, avec l\u0026rsquo;option friendly_name\nActivez l\u0026rsquo;option tivo : enable_tivo=yes - Attention, cette option nécessite que le service de recherche Avahi soit fonctionnel !\nUne option intéressante est de limiter le nombre de connexion simultanée : max_connections\nDémarrer MiniDLNA Une fois le fichier configuré, il ne vous reste plus qu\u0026rsquo;à :\nActiver le service minidlna Paramétrer le drapeau -R Démarrer le service minidlna Règles PF La configuration des règles du pare-feu PF (Packet Filter) est un peu plus délicate. En effet, il est nécessaire de ne pas filtrer le flux mdns, et d\u0026rsquo;ouvrir les ports adéquates :\n(…) dlna_port = \u0026#34;8200\u0026#34; (…) block log pass out (…) # minidlna pass in quick on egress proto tcp from egress:network to egress port $dlna_port flags S/SA modulate state pass in quick on egress proto udp from egress:network to egress port $dlna_port allow-opts keep state # avahi multicast traffic # règle par défaut, présentée dans la documentation *pkg_readme* d\u0026#39;avahi… pass on egress inet proto udp from any to 224.0.0.251 port mdns allow-opts # règle IPv6 équivalente à la précédente pass on egress inet6 proto udp from any to ff02::fb port mdns allow-opts # règles SSDP nécessaire 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 (…) Documentations Manpages rcctl(8) ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eMiniDLNA\u003c/strong\u003e est un simple logiciel de serveur multimédia, écrit en C, dont le\nbut est d\u0026rsquo;être totalement compatible avec différents clients \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDLNA \u003cem\u003e(Digital Living Network Alliance)\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\net/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\n\n\u003cspan lang=\"en\"\u003eUPnP-AV \u003cem\u003e(Universal Plug and Play - Audio Video)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n, tels que des téléviseurs, tablettes et autres\nmédiums…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web : \u003ca href=\"http://sourceforge.net/projects/minidlna/\" rel=\"external\"\u003ehttp://sourceforge.net/projects/minidlna/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVersion installée : \u003cstrong\u003e1.2.1p1\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eOS : \u003cstrong\u003eOpenBSD 6.3\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\"\u003e\u003cp\u003eCette solution sous OpenBSD n\u0026rsquo;est pas satisfaisante ; malheureusement, il vaut\nmieux se tourner vers un autre OS qui la fait fonctionner sans soucis, voire un\nautre logiciel\u003c/p\u003e\n\u003cp\u003e\u003cabbr lang=\"en\" title=\"Digital Living Network Alliance\"\u003eDLNA\u003c/abbr\u003e\u003c/p\u003e\n\u003cp\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\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\u003eminidlna\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eUn utilisateur \u003ccode\u003e_minidlna\u003c/code\u003e sans droit système est créé !\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eATTENTION à ne jamais exécuter le binaire \u003ccode\u003eminidlnad\u003c/code\u003e avec les droits \u003ccode\u003eroot\u003c/code\u003e… \u003cbr\u003e\ncelui-ci mettra ses droits sur le répertoire de la base de données de minidlna.\u003c/p\u003e\n\u003cp\u003eRésultat, lors de l\u0026rsquo;exécution du service \u003cstrong\u003eminidlna\u003c/strong\u003e par l\u0026rsquo;outil \u003ccode\u003ercctl\u003c/code\u003e,\ncelui-ci échouerait - il faudra réattribuer les droits de l\u0026rsquo;utilisateur\n\u003ccode\u003e_minidlna\u003c/code\u003e sur le répertoire de la db, à coup de \u003ccode\u003echown -R _minidlna /dir/db\u003c/code\u003e !\u003c/p\u003e\n\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\"\u003eL\u0026rsquo;option \u003ccode\u003einotify\u003c/code\u003e ne fonctionne pas sous OpenBSD !\u003c/div\u003e\n\n\u003ch4 id=\"fichier-de-configuration\"\u003eFichier de configuration\u003c/h4\u003e\n\u003cp\u003eLa configuration du fichier \u003ccode\u003e/etc/minidlna.conf\u003c/code\u003e n\u0026rsquo;est pas complexe en\nsoi - si vous ne spécifiez aucune option, ce sont les valeurs par défaut\nqui sont prises en charge.\u003c/p\u003e\n\u003cp\u003eLe port de connexion au service, par défaut, est le \u003ccode\u003e8200\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eVeillez néanmoins à configurer les répertoires à scanner \u003ccode\u003emedia_dir\u003c/code\u003e,\nen faisant attention à ces options, avec une virgule séparant l\u0026rsquo;option\net le répertoire cible :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eA\u003c/code\u003e pour le contenu audio\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eP\u003c/code\u003e pour les images - \u003cem\u003e(P pour \u003cstrong\u003epictures\u003c/strong\u003e, en anglais)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eV\u003c/code\u003e pour les vidéos\u003c/li\u003e\n\u003cli\u003eet, \u003ccode\u003ePV\u003c/code\u003e pour le contenu rassemblant et les images et les vidéos.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eProfitez-en pour lui donner à votre service un joli petit nom, avec\nl\u0026rsquo;option \u003ccode\u003efriendly_name\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eActivez l\u0026rsquo;option tivo : \u003ccode\u003eenable_tivo=yes\u003c/code\u003e - \u003cspan class=\"red\"\u003eAttention, cette\noption nécessite que le service de recherche \u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/system/net/avahi\" rel=\"external\"\u003eAvahi\u003c/a\u003e soit fonctionnel !\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003eUne option intéressante est de limiter le nombre de connexion simultanée : \u003ccode\u003emax_connections\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"démarrer-minidlna\"\u003eDémarrer MiniDLNA\u003c/h2\u003e\n\u003cp\u003eUne fois le fichier configuré, il ne vous reste plus qu\u0026rsquo;à :\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\u003eminidlna\u003c/code\u003e\u003c/li\u003e\n\u003cli\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étrer\u003c/a\u003e\n le drapeau \u003ccode\u003e-R\u003c/code\u003e\u003c/li\u003e\n\u003cli\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émarrer le service\u003c/a\u003e\n \u003ccode\u003eminidlna\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"règles-pf\"\u003eRègles PF\u003c/h2\u003e\n\u003cp\u003eLa configuration des règles du pare-feu \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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 est un peu plus délicate.\nEn effet, il est nécessaire de ne pas filtrer le flux mdns, et d\u0026rsquo;ouvrir les ports\nadéquates :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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:#06b6ef\"\u003edlna_port\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;8200\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\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 log pass out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# minidlna\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 egress:network to egress port $dlna_port 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 $dlna_port 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# avahi multicast traffic\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# règle par défaut, présentée dans la documentation *pkg_readme* d\u0026#39;avahi…\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 on egress inet 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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# règle IPv6 équivalente à la précédente\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 on egress 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:#776e71\"\u003e# règles SSDP nécessaire\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 on egress inet proto udp from any to 239.255.255.250 port 1900 allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass on egress inet6 proto udp from any to { ff02::c, ff05::c, ff08::c } port 1900 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\"\u003e(…)\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\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\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\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Installer et configurer le serveur MiniDLNA sous OpenBSD : serveur multimédia DLNA et UPNP-AV","tags":["OpenBSD","MiniDLNA"],"date_published":"2018-10-08T14:11:45+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-07:/fr/sys/openbsd/deluge-torrent#5d141cdde16c8f91e006b208e4d5a1d42581a6619e3c52ba3e108598bbf6d042","url":"https://it-log.fr.eu.org/fr/sys/openbsd/deluge-torrent/","title":"OpenBSD : Service Deluge (torrent)","author":{"name":"Stéphane HUC"},"content_text":"Présentation Deluge est un client BitTorrent léger, logiciel libre et multiplate-forme.\nDéluge contient les fonctionnalités communes aux clients BitTorrent telles que chiffrement de protocole, , découverte entre homologues locaux (LSD), échange entre homologues ( PEX (Peer EXchange) ), UPnP (Universal Plug and Play) , NAT-PMP (NAT Port Mapping Protocol) , prise en charge du proxy, ressources Web, limites de vitesse globales et par torrent.\nDeluge a été conçu pour fonctionner à la fois comme une application autonome normale et en tant que client-serveur. Dans le modèle de client léger, un démon Deluge gère toute l\u0026rsquo;activité de BitTorrent et peut fonctionner sur des machines sans et avec interfaces utilisateur permettant de se connecter à distance depuis n\u0026rsquo;importe quelle autre plateforme.\nSite web : https://www.deluge-torrent.org Installation Depuis la version d\u0026rsquo;OpenBSD 6.3, deluge-torrent est intégré en tant que paquet - ce qui installe toutes les dépendances nécessaires.\nInstallez deluge.\nNéanmoins, il y a quelques étapes supplémentaires à franchir !\nConfiguration Étape 1 : création utilisateur dédié Créer un utilisateur dédié _deluge, sans droit particulier, sans shell nologin : :$ userinfo _deluge login _deluge passwd * uid 706 groups _deluge change NEVER class gecos deluge user dir /home/_deluge shell /sbin/nologin expire NEVER Étape 2 : création fichier rc Créer un fichier rc dédié au binaire deluged, tel que /etc/rc.d/deluged : #!/bin/sh # # $OpenBSD: deluge,v 1.3.15 2018/10/19 19:05:00 Stephane HUC $ daemon=\u0026#34;/usr/local/bin/deluged\u0026#34; #daemon_flags=\u0026#34;\u0026#34; daemon_user=\u0026#34;_deluge\u0026#34; . /etc/rc.d/rc.subr rc_reload=NO rc_cmd $1 Ensuite, donnez-lui les droits d\u0026rsquo;exécution nécessaire : :# chmod 0755 /etc/rc.d/deluged\nCe script permet à minima de démarrer le service : # rcctl start deluged\nAttentionAttention, pour une raison que je ne connais pas encore, je n\u0026rsquo;arrive pas à gérer l\u0026rsquo;arrêt du service ! Étape 3 : règles PF En admettant que vos règles bloquent tout ce qui doit être bloqué, et laissent passer les connexions entrantes et sortantes, relatives au flux déjà établis, quelques règles de cet acabit permettent de s\u0026rsquo;assurer d\u0026rsquo;un minima :\n(…) deluge_web_port = \u0026#34;8112\u0026#34; p2p_in_ports = \u0026#34;6881:6891\u0026#34; table \u0026lt;t_admins\u0026gt; const { addr_ip_votre_station } (…) block log pass out (…) pass in quick on egress proto tcp from \u0026lt;t_admins\u0026gt; to egress port $deluge_web_port flags S/SA modulate state pass in quick on egress proto udp from any to egress port $p2p_in_ports allow-opts pass out on egress inet proto tcp from egress $flag $st_mod user _deluge (…) La règle sortante semble nécessaire pour laisser sortir \u0026ldquo;tranquillement\u0026rdquo; tout le flux sortant TCP… cela permet d\u0026rsquo;interroger les différents trackers, mais aussi le flux de connexion vers les différents clients…\nl\u0026rsquo;option user _deluge est seulement pour \u0026ldquo;obliger\u0026rdquo; que ce flux lui appartiennent - tout autre flux TCP qui ne viendrait pas de lui serait bloqué ! (c\u0026rsquo;est un pis-aller…)\nPour finir Il ne vous reste plus qu\u0026rsquo;à exécuter le binaire deluge-web avec un autre utilisateur…\n","content_html":"\u003ch2 id=\"présentation\"\u003ePrésentation\u003c/h2\u003e\n\u003cp\u003eDeluge est un client BitTorrent léger, logiciel libre et multiplate-forme.\u003c/p\u003e\n\u003cp\u003eDéluge contient les fonctionnalités communes aux clients BitTorrent telles que\nchiffrement de 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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, découverte entre homologues locaux\n\u003cem\u003e(LSD)\u003c/em\u003e, échange entre homologues \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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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\"\u003ePEX \u003cem\u003e(Peer EXchange)\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)\u003c/em\u003e, \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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\"\u003eUPnP \u003cem\u003e(Universal Plug and Play)\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\u003cspan lang=\"en\"\u003eNAT-PMP \u003cem\u003e(NAT Port Mapping 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, prise en charge du proxy, ressources Web, limites de\nvitesse globales et\npar torrent.\u003c/p\u003e\n\u003cp\u003eDeluge a été conçu pour fonctionner à la fois comme une application\nautonome normale et en tant que client-serveur. Dans le modèle de client\nléger, un démon Deluge gère toute l\u0026rsquo;activité de BitTorrent et peut\nfonctionner sur des machines sans et avec interfaces utilisateur\npermettant de se connecter à distance depuis n\u0026rsquo;importe quelle autre\nplateforme.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web : \u003ca href=\"https://www.deluge-torrent.org\" rel=\"external\"\u003ehttps://www.deluge-torrent.org\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eDepuis la version d\u0026rsquo;OpenBSD 6.3, deluge-torrent est intégré en tant que\npaquet - ce qui installe toutes les dépendances nécessaires.\u003c/p\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\u003edeluge\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eNéanmoins, il y a quelques étapes supplémentaires à franchir !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"étape-1--création-utilisateur-dédié\"\u003eÉtape 1 : création utilisateur dédié\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCréer un utilisateur dédié \u003ccode\u003e_deluge\u003c/code\u003e, sans droit particulier,\nsans shell \u003ccode\u003enologin\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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ userinfo _deluge\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elogin   _deluge\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\u003euid     \u003cspan style=\"color:#f99b15\"\u003e706\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egroups  _deluge\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echange  NEVER\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eclass\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egecos   deluge user\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edir     /home/_deluge\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eshell   /sbin/nologin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexpire  NEVER\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"étape-2--création-fichier-rc\"\u003eÉtape 2 : création fichier rc\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCréer un fichier rc dédié au binaire \u003ccode\u003edeluged\u003c/code\u003e, tel que \u003ccode\u003e/etc/rc.d/deluged\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#!/bin/sh\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# $OpenBSD: deluge,v 1.3.15 2018/10/19 19:05:00 Stephane HUC $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003edaemon\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/usr/local/bin/deluged\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#daemon_flags=\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\"\u003edaemon_user\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;_deluge\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. /etc/rc.d/rc.subr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003erc_reload\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\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\"\u003erc_cmd $1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, donnez-lui les droits d\u0026rsquo;exécution nécessaire : \u003cbr\u003e\n\u003ccode\u003e:# chmod 0755 /etc/rc.d/deluged\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCe script permet à minima de démarrer le service : \u003ccode\u003e# rcctl start deluged\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, pour une raison que je ne connais pas encore, je n\u0026rsquo;arrive pas à\ngérer l\u0026rsquo;arrêt du service !\u003c/div\u003e\n\n\u003ch3 id=\"étape-3--règles-pf\"\u003eÉtape 3 : règles PF\u003c/h3\u003e\n\u003cp\u003eEn admettant que vos règles bloquent tout ce qui doit être bloqué, et\nlaissent passer les connexions entrantes et sortantes, relatives au flux\ndéjà établis, quelques règles de cet acabit permettent de s\u0026rsquo;assurer\nd\u0026rsquo;un 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:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edeluge_web_port\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;8112\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ep2p_in_ports\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;6881:6891\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_admins\u0026gt; const { addr_ip_votre_station }\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\"\u003eblock log\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out\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\"\u003epass in quick on egress proto tcp from \u0026lt;t_admins\u0026gt; to egress port $deluge_web_port 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 any to egress port $p2p_in_ports 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 out on egress inet proto tcp from egress $flag $st_mod user _deluge\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\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLa règle sortante semble nécessaire pour laisser sortir \u0026ldquo;tranquillement\u0026rdquo; tout\nle flux sortant TCP… cela permet d\u0026rsquo;interroger les différents trackers, mais\naussi le flux de connexion vers les différents clients…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003el\u0026rsquo;option \u003ccode\u003euser _deluge\u003c/code\u003e est seulement pour \u0026ldquo;obliger\u0026rdquo; que ce flux lui appartiennent -\ntout autre flux TCP qui ne viendrait pas de lui serait bloqué !\n\u003cem\u003e(c\u0026rsquo;est un pis-aller…)\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"pour-finir\"\u003ePour finir\u003c/h2\u003e\n\u003cp\u003eIl ne vous reste plus qu\u0026rsquo;à exécuter le binaire \u003ccode\u003edeluge-web\u003c/code\u003e avec un autre utilisateur…\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment faire fonctionner le client BitTorent nommé Deluge sous OpenBSD","tags":["OpenBSD","Deluge","Torrent","client"],"date_published":"2018-10-07T14:46:44+01:00","date_modified":"2020-05-21T14:30:40+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-10-03:/fr/sys/openbsd/mount-crypt-hd#d4cfaced14c4900853db7f0b78f8145a811100f1283c991668f4ef7b1e8ff662","url":"https://it-log.fr.eu.org/fr/sys/openbsd/mount-crypt-hd/","title":"OpenBSD : monter un disque dur chiffré automatiquement","author":{"name":"Stéphane HUC"},"content_text":"Description Non, je ne vais pas vous apprendre à créer un disque dur chiffré sous OpenBSD - la FAQ officielle (en anglais) vous l\u0026rsquo;apprendra mieux que moi-même !\nConvention et étapes de base Vous vous êtes assuré que le disque dur est connecté… électriquement, et soit en USB, en SATA, etc… Admettons que celui-ci soit reconnu par le système en tant que sd0.\nL\u0026rsquo;étape 0 - de base - est d\u0026rsquo;enregistrer la passphrase dans un fichier, et de lui donner les droits nécessaires au bon fonctionnement de bioctl : 0600.\nPar convention, nous appellerons ce fichier /root/crypt_passwd.\ndisk=\u0026#34;sd0\u0026#34; file_passwd=\u0026#34;/root/crypt_passwd\u0026#34; file_tmp=\u0026#34;/tmp/raid.info\u0026#34; Une méthode plus sûre est l\u0026rsquo;usage d\u0026rsquo;une clé USB dédié au déchiffrement. À savoir qu\u0026rsquo;il est possible d\u0026rsquo;utiliser une seule et même clé pour le chiffrement de plusieurs disques, une partition par chiffrement.\nduid La première étape est d\u0026rsquo;obtenir le duid - c\u0026rsquo;est l\u0026rsquo;identifiant du disk, fourni par disklabel - relatif à notre périphérique sd0.\nduid=\u0026quot;$(disklabel ${disk0} | awk -F':' '/duid/ { gsub(/[[:space:]]*/, \u0026quot;\u0026quot;, $2) ; printf \u0026quot;%s\u0026quot;,$2 }')\u0026quot;\nQue fait awk dans les détails ? Il recherche la ligne comportant la mention duid, et supprime tout espace, pour enfin afficher le résultat recherché, sans retour à la ligne !\nnuméro partition RAID Obtenons la lettre de partition relative à la partition RAID - en réalité, la partition chiffrée par bioctl.\n:# get partition\u0026#39;s letter s=\u0026#34;$(disklabel ${disk} | awk -F\u0026#39;:\u0026#39; \u0026#39;/RAID/ { gsub(/[[:space:]]*/, \u0026#34;\u0026#34;, $1); printf \u0026#34;%s\u0026#34;,$1 }\u0026#39; )\u0026#34; slide=\u0026#34;${duid}.$s\u0026#34; identifiant disque Attachons le périphérique chiffré à un périphérique softraid0 :\nbioctl -c C -l ${slide} -p ${file_passwd} softraid0 \u0026gt; ${file_tmp}\nLe fichier temporaire contiendra très certainement une mention, telle que la suivante : softraid0: CRYPTO volume attached as sd2 - néanmoins cela dépend du fait d\u0026rsquo;avoir d\u0026rsquo;autres périphériques connectés, soit sur les ports SATA, USB, etc…\nDe toute façon, quelque soit l\u0026rsquo;écriture restituée dans le fichier temporaire, nous récupérerons l\u0026rsquo;identifiant du périphérique attaché, de manière \u0026quot;dynamique\u0026quot;.\ndevice=\u0026quot;$(awk '/CRYPTO/ { printf \u0026quot;%s\u0026quot;,$6 }' ${file_tmp})\u0026quot;\nDans cet exemple, la valeur obtenue sera sd2.\nMaintenant, obtenons à nouveau la lettre de partition, mais cette fois-ci du périphérique attaché, pour construire les variables nécessaires :\ns=\u0026#34;$(disklabel ${device} | awk -F\u0026#39;:\u0026#39; \u0026#39;/\u0026#39;4.2BSD/ { gsub(/[[:space:]]*/, \u0026#34;\u0026#34;, $1); printf \u0026#34;%s\u0026#34;,$1 }\u0026#39; )\u0026#34; partition=\u0026#34;${disk}$s\u0026#34; slide=\u0026#34;${duid}.$s\u0026#34; mount mkdir -p /mnt/${device} mount -o noatime,nodev,noexec,nosuid,rw,softdep /dev/${partition} /mnt/${device} Voilà, normalement nous avons accès au périphérique chiffré attaché et monté !\nIl n\u0026rsquo;y a plus qu\u0026rsquo;à le remplir…\nFS check Si le montage ne se fait pas correctement, exécutons une vérification du système de fichier :\nfsck -y /dev/${partition}\nSi c\u0026rsquo;est OK, essayez de remonter la partition vers le répertoire choisi, avec la commande mount ci-dessus.\numount Le démontage et le détachement du périphérique se fait très simplement :\numount -f /mnt/${device} bioctl -d ${device}\nPense-bête pour supprimer le fichier temporaire qui n\u0026rsquo;est plus nécessaire :\nrm -fP \u0026quot;${file_tmp}\u0026quot;\nTL;DR Voici le script complet, dont je me sers, pour monter et démonter automatique un périphérique chiffré avec bioctl dès le démarrage du système OpenBSD.\nIl faut l\u0026rsquo;utiliser ainsi :\npour monter le périphérique : ./mount_crypt_hd mount - créez le fichier /etc/rc.local et appelez le script de la manière à le monter…\npour démonter le périphérique proprement : ./mount_crypt_hd umount - créez le fichier /etc/rc.shutdown et appelez le script de la manière à le démonter…\n#!/bin/sh #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: 2018/10/03 # ### error=0 # DO NOT TOUCH device=\u0026#34;\u0026#34; # DO NOT TOUCH dir_nas=\u0026#34;/mnt/nas\u0026#34; # mount point of crypted hd disk0=\u0026#34;sd0\u0026#34; # DO NOT TOUCH file_passwd=\u0026#34;/root/nas\u0026#34; # passwd file of crypted hd partition=\u0026#34;\u0026#34; # DO NOT TOUCH s=\u0026#34;\u0026#34; # letter of slide - DO NOT TOUCH slide=\u0026#34;\u0026#34; # DO NOT TOUCH ################################################################################ ### ## # FUNCTIONS ## ### ################################################################################ get_device() { device=\u0026#34;$(awk \u0026#39;/CRYPTO/ { printf \u0026#34;%s\u0026#34;,$6 }\u0026#39; ${file_tmp})\u0026#34; } get_duid() { # get duid info duid=\u0026#34;$(disklabel ${disk0} | awk -F\u0026#39;:\u0026#39; \u0026#39;/duid/ { gsub(/[[:space:]]*/, \u0026#34;\u0026#34;, $2) ; printf \u0026#34;%s\u0026#34;,$2 }\u0026#39;)\u0026#34; } get_slide() { disk=\u0026#34;$1\u0026#34; case \u0026#34;${disk}\u0026#34; in ${disk0}) pattern=\u0026#34;RAID\u0026#34; ;; ${device}) pattern=\u0026#34;4.2BSD\u0026#34; ;; esac # get partition\u0026#39;s letter s=\u0026#34;$(disklabel ${disk} | awk -F\u0026#39;:\u0026#39; \u0026#39;/\u0026#39;${pattern}\u0026#39;/ { gsub(/[[:space:]]*/, \u0026#34;\u0026#34;, $1); printf \u0026#34;%s\u0026#34;,$1 }\u0026#39; )\u0026#34; partition=\u0026#34;${disk}$s\u0026#34; slide=\u0026#34;${duid}.$s\u0026#34; unset disk pattern } _mount() { [ ! -d ${dir_nas} ] \u0026amp;\u0026amp; mkdir -p \u0026#34;${dir_nas}\u0026#34; logger \u0026#34;rc.local: mount ${partition} to ${dir_nas}!\u0026#34; mount -o noatime,nodev,noexec,nosuid,rw,softdep /dev/${partition} ${dir_nas} } mount_crypt_device() { get_duid get_slide ${disk0} file_tmp=\u0026#34;/tmp/${duid}.info\u0026#34; if [ -n ${duid} ]; then # attempt to open HD logger \u0026#34;rc.local: bioctl -c C -l ${slide} -p ${file_passwd} \u0026#34; if bioctl -c C -l ${slide} -p ${file_passwd} softraid0 \u0026gt; ${file_tmp}; then get_device echo \u0026#34;*** bioctl attaches from ${slide} to /dev/${device}: OK!\u0026#34; chmod 0400 ${file_tmp} else echo \u0026#34;*** bioctl C from ${slide}: KO!\u0026#34; fi if [ -r ${file_tmp} ]; then get_slide ${device} if [ -n ${device} ]; then # attempt to mount if _mount; then echo \u0026#34;*** Mount ${device} on ${dir_nas}: OK!\u0026#34; else error=1 echo \u0026#34;*** Mount ${device}: KO!\u0026#34; echo \u0026#34;*** Init a FS check on ${partition}!\u0026#34; logger \u0026#34;rc.local: Can\u0026#39;t mount ${device}; attempt FS check on ${partition}!\u0026#34; if fsck -y /dev/${partition}; then echo \u0026#34;*** Fsck seems: OK!\u0026#34; logger \u0026#34;rc.local: FS check on ${partition}: OK!\u0026#34; if _mount; then error=0; fi else echo \u0026#34;*** Fsck seems: KO!\u0026#34; echo \u0026#34;### Can not mount on ${device} crypted HD ${slide}! ###\u0026#34; logger \u0026#34;rc.local: FS check on ${device}: KO! Can\u0026#39;t mount-it!\u0026#34; fi fi if [ ${error} -eq 0 ]; then sync; fi fi fi } _shutdown() { get_duid file_tmp=\u0026#34;/tmp/${duid}.info\u0026#34; get_device logger \u0026#34;rc.shutdown: umount:${dir_nas}\u0026#34; umount -f \u0026#34;${dir_nas}\u0026#34; sleep 3 sync logger \u0026#34;rc.shutdown: bioctl -d ${device}\u0026#34; bioctl -d ${device} rm -fP \u0026#34;${file_tmp}\u0026#34; } ################################################################################ ### ## # EXECUTION ## ### ################################################################################ case \u0026#34;$1\u0026#34; in \u0026#34;mount\u0026#34;) mount_crypt_device ;; \u0026#34;umount\u0026#34;) _shutdown ;; esac Remerciement source - en anglais ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eNon, je ne vais pas vous apprendre à créer un disque dur chiffré sous\nOpenBSD - la \u003ca href=\"https://www.openbsd.org/faq/faq14.html#softraidFDE\" rel=\"external\"\u003eFAQ officielle\u003c/a\u003e \u003cem\u003e(en anglais)\u003c/em\u003e vous l\u0026rsquo;apprendra mieux que\nmoi-même !\u003c/p\u003e\n\u003ch3 id=\"convention-et-étapes-de-base\"\u003eConvention et étapes de base\u003c/h3\u003e\n\u003cp\u003eVous vous êtes assuré que le disque dur est connecté… électriquement, et soit en\nUSB, en SATA, etc… Admettons que celui-ci soit reconnu par le système en tant que\n\u003cem\u003esd0\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eL\u0026rsquo;étape 0\u003c/strong\u003e - de base - est d\u0026rsquo;\u003cstrong\u003eenregistrer la passphrase dans un fichier\u003c/strong\u003e,\net de lui donner les droits nécessaires au bon fonctionnement de \u003ccode\u003ebioctl\u003c/code\u003e : \u003ccode\u003e0600\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePar convention, nous appellerons ce fichier \u003ccode\u003e/root/crypt_passwd\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\"\u003edisk\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;sd0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003efile_passwd\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/root/crypt_passwd\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003efile_tmp\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/tmp/raid.info\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUne méthode plus sûre est l\u0026rsquo;usage d\u0026rsquo;une clé USB dédié au déchiffrement. \u003cbr\u003e\nÀ savoir qu\u0026rsquo;il est possible d\u0026rsquo;utiliser une seule et même clé pour le chiffrement\nde plusieurs disques, une partition par chiffrement.\u003c/p\u003e\n\u003ch3 id=\"duid\"\u003eduid\u003c/h3\u003e\n\u003cp\u003eLa première étape est d\u0026rsquo;obtenir le \u003ccode\u003eduid\u003c/code\u003e - \u003cem\u003ec\u0026rsquo;est l\u0026rsquo;identifiant du disk, fourni\npar disklabel\u003c/em\u003e - relatif à notre périphérique \u003ccode\u003esd0\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eduid=\u0026quot;$(disklabel ${disk0} | awk -F':' '/duid/ { gsub(/[[:space:]]*/, \u0026quot;\u0026quot;, $2) ; printf \u0026quot;%s\u0026quot;,$2 }')\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eQue fait \u003ccode\u003eawk\u003c/code\u003e dans les détails ? \u003cbr\u003e\nIl recherche la ligne comportant la mention \u003ccode\u003eduid\u003c/code\u003e, et supprime tout espace,\npour enfin afficher le résultat recherché, sans retour à la ligne !\u003c/p\u003e\n\u003ch3 id=\"numéro-partition-raid\"\u003enuméro partition RAID\u003c/h3\u003e\n\u003cp\u003eObtenons la lettre de partition relative à la partition RAID - \u003cstrong\u003een réalité, la\npartition chiffrée par \u003cem\u003ebioctl\u003c/em\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003e:# get partition\u0026#39;s letter\ns=\u0026#34;$(disklabel ${disk} | awk -F\u0026#39;:\u0026#39; \u0026#39;/RAID/ { gsub(/[[:space:]]*/, \u0026#34;\u0026#34;, $1); printf \u0026#34;%s\u0026#34;,$1 }\u0026#39; )\u0026#34;\nslide=\u0026#34;${duid}.$s\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"identifiant-disque\"\u003eidentifiant disque\u003c/h3\u003e\n\u003cp\u003eAttachons le périphérique chiffré à un périphérique softraid0 :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ebioctl -c C -l ${slide} -p ${file_passwd} softraid0 \u0026gt; ${file_tmp}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLe fichier temporaire contiendra très certainement une mention, telle que la\nsuivante : \u003cem\u003esoftraid0: CRYPTO volume attached as sd2\u003c/em\u003e - \u003cbr\u003e\nnéanmoins cela dépend du fait d\u0026rsquo;avoir d\u0026rsquo;autres périphériques connectés, soit sur\nles ports SATA, USB, etc…\u003c/p\u003e\n\u003cp\u003eDe toute façon, quelque soit l\u0026rsquo;écriture restituée dans le fichier temporaire,\nnous récupérerons l\u0026rsquo;identifiant du périphérique attaché, de manière \u0026quot;dynamique\u0026quot;.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003edevice=\u0026quot;$(awk '/CRYPTO/ { printf \u0026quot;%s\u0026quot;,$6 }' ${file_tmp})\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eDans cet exemple, la valeur obtenue sera \u003ccode\u003esd2\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eMaintenant, obtenons à nouveau la lettre de partition, mais cette fois-ci du\npériphérique attaché, pour construire les variables nécessaires :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003es=\u0026#34;$(disklabel ${device} | awk -F\u0026#39;:\u0026#39; \u0026#39;/\u0026#39;4.2BSD/ { gsub(/[[:space:]]*/, \u0026#34;\u0026#34;, $1); printf \u0026#34;%s\u0026#34;,$1 }\u0026#39; )\u0026#34;\n\npartition=\u0026#34;${disk}$s\u0026#34;\nslide=\u0026#34;${duid}.$s\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"mount\"\u003emount\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\u003emkdir -p /mnt/\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edevice\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emount -o noatime,nodev,noexec,nosuid,rw,softdep /dev/\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003epartition\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e /mnt/\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edevice\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\u003cp\u003eVoilà, normalement nous avons accès au périphérique chiffré attaché et monté !\u003c/p\u003e\n\u003cp\u003eIl n\u0026rsquo;y a plus qu\u0026rsquo;à le remplir…\u003c/p\u003e\n\u003ch4 id=\"fs-check\"\u003eFS check\u003c/h4\u003e\n\u003cp\u003eSi le montage ne se fait pas correctement, exécutons une vérification du\nsystème de fichier :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003efsck -y /dev/${partition}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi c\u0026rsquo;est OK, essayez de remonter la partition vers le répertoire choisi, avec\nla commande \u003ccode\u003emount\u003c/code\u003e ci-dessus.\u003c/p\u003e\n\u003ch3 id=\"umount\"\u003eumount\u003c/h3\u003e\n\u003cp\u003eLe démontage et le détachement du périphérique se fait très simplement :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eumount -f /mnt/${device}\u003c/code\u003e \u003ccode\u003ebioctl -d ${device}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePense-bête pour supprimer le fichier temporaire qui n\u0026rsquo;est plus\nnécessaire :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003erm -fP \u0026quot;${file_tmp}\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"tldr\"\u003eTL;DR\u003c/h3\u003e\n\u003cp\u003eVoici le script complet, dont je me sers, pour monter et démonter automatique\nun périphérique chiffré avec \u003cem\u003ebioctl\u003c/em\u003e dès le démarrage du système OpenBSD.\u003c/p\u003e\n\u003cp\u003eIl faut l\u0026rsquo;utiliser ainsi :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003epour monter le périphérique : \u003ccode\u003e./mount_crypt_hd mount\u003c/code\u003e - créez le fichier\n\u003ccode\u003e/etc/rc.local\u003c/code\u003e et appelez le script de la manière à le monter…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epour démonter le périphérique proprement : \u003ccode\u003e./mount_crypt_hd umount\u003c/code\u003e - créez\nle fichier \u003ccode\u003e/etc/rc.shutdown\u003c/code\u003e et appelez le script de la manière à le démonter…\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003e#!/bin/sh\n#set -x\n\n###\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:\n#\n# Date: 2018/10/03\n#\n###\n\nerror=0 # DO NOT TOUCH\ndevice=\u0026#34;\u0026#34;  # DO NOT TOUCH\ndir_nas=\u0026#34;/mnt/nas\u0026#34;  # mount point of crypted hd\ndisk0=\u0026#34;sd0\u0026#34; # DO NOT TOUCH\nfile_passwd=\u0026#34;/root/nas\u0026#34; # passwd file of crypted hd\npartition=\u0026#34;\u0026#34;    # DO NOT TOUCH\ns=\u0026#34;\u0026#34;    # letter of slide - DO NOT TOUCH\nslide=\u0026#34;\u0026#34;    # DO NOT TOUCH\n\n################################################################################\n###\n##\n#   FUNCTIONS\n##\n###\n################################################################################\nget_device() {\n    device=\u0026#34;$(awk \u0026#39;/CRYPTO/ { printf \u0026#34;%s\u0026#34;,$6 }\u0026#39; ${file_tmp})\u0026#34;\n}\n\nget_duid() {\n    # get duid info\n    duid=\u0026#34;$(disklabel ${disk0} | awk -F\u0026#39;:\u0026#39; \u0026#39;/duid/ { gsub(/[[:space:]]*/, \u0026#34;\u0026#34;, $2) ; printf \u0026#34;%s\u0026#34;,$2 }\u0026#39;)\u0026#34;\n}\n\nget_slide() {\n    disk=\u0026#34;$1\u0026#34;\n    case \u0026#34;${disk}\u0026#34; in\n        ${disk0}) pattern=\u0026#34;RAID\u0026#34; ;;\n        ${device}) pattern=\u0026#34;4.2BSD\u0026#34; ;;\n    esac\n\n    # get partition\u0026#39;s letter\n    s=\u0026#34;$(disklabel ${disk} | awk -F\u0026#39;:\u0026#39; \u0026#39;/\u0026#39;${pattern}\u0026#39;/ { gsub(/[[:space:]]*/, \u0026#34;\u0026#34;, $1); printf \u0026#34;%s\u0026#34;,$1 }\u0026#39; )\u0026#34;\n\n    partition=\u0026#34;${disk}$s\u0026#34;\n    slide=\u0026#34;${duid}.$s\u0026#34;\n\n    unset disk pattern\n}\n\n_mount() {\n    [ ! -d ${dir_nas} ] \u0026amp;\u0026amp; mkdir -p \u0026#34;${dir_nas}\u0026#34;\n    logger \u0026#34;rc.local: mount ${partition} to ${dir_nas}!\u0026#34;\n    mount -o noatime,nodev,noexec,nosuid,rw,softdep /dev/${partition} ${dir_nas}\n}\n\nmount_crypt_device() {\n    get_duid\n    get_slide ${disk0}\n\n    file_tmp=\u0026#34;/tmp/${duid}.info\u0026#34;\n\n    if [ -n ${duid} ]; then\n        # attempt to open HD\n        logger \u0026#34;rc.local: bioctl -c C -l ${slide} -p ${file_passwd} \u0026#34;\n        if bioctl -c C -l ${slide} -p ${file_passwd} softraid0 \u0026gt; ${file_tmp}; then\n            get_device\n            echo \u0026#34;*** bioctl attaches from ${slide} to /dev/${device}: OK!\u0026#34;\n            chmod 0400 ${file_tmp}\n\n        else\n            echo \u0026#34;*** bioctl C from ${slide}: KO!\u0026#34;\n\n        fi\n\n        if [ -r ${file_tmp} ]; then\n            get_slide ${device}\n\n            if [ -n ${device} ]; then\n                # attempt to mount\n                if _mount; then\n                    echo \u0026#34;*** Mount ${device} on ${dir_nas}: OK!\u0026#34;\n\n                else\n                    error=1\n                    echo \u0026#34;*** Mount ${device}: KO!\u0026#34;\n                    echo \u0026#34;*** Init a FS check on ${partition}!\u0026#34;\n                    logger \u0026#34;rc.local: Can\u0026#39;t mount ${device}; attempt FS check on ${partition}!\u0026#34;\n\n                    if fsck -y /dev/${partition}; then\n                        echo \u0026#34;*** Fsck seems: OK!\u0026#34;\n                        logger \u0026#34;rc.local: FS check on ${partition}: OK!\u0026#34;\n\n                        if _mount; then error=0; fi\n\n                    else\n                        echo \u0026#34;*** Fsck seems: KO!\u0026#34;\n                        echo \u0026#34;### Can not mount on ${device} crypted HD ${slide}! ###\u0026#34;\n                        logger \u0026#34;rc.local: FS check on ${device}: KO! Can\u0026#39;t mount-it!\u0026#34;\n\n                    fi\n\n                fi\n\n                if [ ${error} -eq 0 ]; then sync; fi\n\n            fi\n\n        fi\n\n}\n\n_shutdown() {\n    get_duid\n    file_tmp=\u0026#34;/tmp/${duid}.info\u0026#34;\n    get_device\n    logger \u0026#34;rc.shutdown: umount:${dir_nas}\u0026#34;\n    umount -f \u0026#34;${dir_nas}\u0026#34;\n    sleep 3\n    sync\n    logger \u0026#34;rc.shutdown: bioctl -d ${device}\u0026#34;\n    bioctl -d ${device}\n    rm -fP \u0026#34;${file_tmp}\u0026#34;\n}\n\n################################################################################\n###\n##\n#   EXECUTION\n##\n###\n################################################################################\n\ncase \u0026#34;$1\u0026#34; in\n    \u0026#34;mount\u0026#34;) mount_crypt_device ;;\n    \u0026#34;umount\u0026#34;) _shutdown ;;\nesac\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"remerciement\"\u003eRemerciement\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003e\u003ca href=\"http://www.vincentdelft.be/post/post_20160719\" rel=\"external\"\u003esource\u003c/a\u003e - en anglais\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment monter automatiquement un disque dur FFS chiffré sous OpenBSD ?","tags":["OpenBSD","mount"],"date_published":"2018-10-03T23:41:58+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-09-09:/fr/trad/tumfatig.net/telegraf-openbsd#0e635d6e616d3f7e03c64e4fc4ee211366eb94bfd1ab32e4b4b8051fb5e6d6ee","url":"https://it-log.fr.eu.org/fr/trad/tumfatig.net/telegraf-openbsd/","title":"Exécuter Telegraf sur OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;Running Telegraf on OpenBSD\u0026rdquo;, écrit par Joel Carnat.\nExécuter Telegraf sur OpenBSD OS concerné : 6.3 et \u0026gt; J\u0026rsquo;ai essayé d\u0026rsquo;exécuter Telegraf d\u0026rsquo;InfluxData sur la version 6.2 d\u0026rsquo;OpenBSD mais il n\u0026rsquo;était pas disponible dans les ports et n\u0026rsquo;ai pas été capable de le compiler depuis les sources. Mais cela a changé puisque j\u0026rsquo;ai pu faire fonctionner une instance dans OpenBSD 6.3. Voici comment le compiler et exécuter Telegraf sur OpenBSD.\nUtilisez OpenBSD 6.3, architecture amd64. Il peut peut-être fonctionner sur d\u0026rsquo;autres architectures et versions.\nInstallez les outils de développement requis :\n# pkg_add gmake git go (...) gmake-4.2.1: ok git-2.16.2: ok go-1.10: ok Configurez l\u0026rsquo;environnement de compilation :\n# export GOPATH=~/go # export PATH=$PATH:~/go/bin Démarrez la compilation de l\u0026rsquo;outil de gestion des dépendances du langage Go :\n# go get github.com/golang/dep # cd $GOPATH/src/github.com/golang/dep # go install ./... Ensuite, compilez Telegraf, lui-même :\n# go get github.com/influxdata/telegraf # cd $GOPATH/src/github.com/influxdata/telegraf # gmake dep ensure -vendor-only go build -ldflags \u0026#34; -X main.commit=c7e2945a -X main.branch=master\u0026#34; ./cmd/telegraf Cela compilera la branche master. On devrait être capable de compiler une branche stable en utilisant les bascules et les étiquettes de Git. Je n\u0026rsquo;ai pas pu compiler la version 1.7.4.\nQuand le binaire est prêt, installez-le :\n# gmake install go build -ldflags \u0026#34; -X main.commit=c7e2945a -X main.branch=master\u0026#34; ./cmd/telegraf mkdir -p /usr/local/bin/ cp telegraf /usr/local/bin/ J\u0026rsquo;utilise les fonctions de Classes et Utilisateurs d\u0026rsquo;OpenBSD, ainsi Telegraf ne sera pas exécuté avec les droits root :\n# vim /etc/login.conf (...) telegraf:\\ :tc=daemon: # cap_mkdb /etc/login.conf # groupadd -g xxxx _telegraf # useradd -u xxxx -g xxxx -c \u0026#34;Telegraf agent\u0026#34; -d /var/telegraf -s /sbin/nologin -L telegraf _telegraf Le fichier de configuration par défaut sera dans /etc :\n# mkdir /etc/telegraf # chown _telegraf:_telegraf /etc/telegraf # chmod 0750 /etc/telegraf # doas -u _telegraf telegraf config \u0026gt; /etc/telegraf/telegraf.conf Finalement, il faut créer un script rc.d pour faciliter la gestion :\n# cat \u0026gt; /etc/rc.d/telegraf #!/bin/ksh # # Start InfluxData Telegraf agent daemon=\u0026#34;/usr/local/bin/telegraf\u0026#34; daemon_flags=\u0026#34;--config /etc/telegraf/telegraf.conf\u0026#34; daemon_user=\u0026#34;_telegraf\u0026#34; . /etc/rc.d/rc.subr pexp=\u0026#39;.*telegraf\u0026#39; rc_reload=NO rc_pre() { /usr/bin/install -d -o _telegraf -g _telegraf -m 0750 /var/telegraf } rc_cmd $1 #EOF # chmod 0755 /etc/rc.d/telegraf # chown root:wheel /etc/rc.d/telegraf # rcctl enable telegraf # rcctl start telegraf Il y a un problème avec la fonction rc_check() lors de l\u0026rsquo;utilisation de start ou restart. Je n\u0026rsquo;ai pas pu trouver pourquoi. Selon `/etc/rc.d/rc.subr” : “(…) # XXX for unknown reason, rc_check can fail (…)”.\nJusque là, Telegraf exécute les filtres d\u0026rsquo;entrée d\u0026rsquo;Apache, MySQL, PHP-FPM et SNMP et le filtre de sortie d\u0026rsquo;InfluxDB. Et, il ne semble pas utiliser plus de ressources que Collectd.\nRemerciements Avec l\u0026rsquo;aimable autorisation de Joel Carnat !\nCette page est la traduction de la page Running Telegraf on OpenBSD du site TUM\u0026rsquo;FATIG. - licence de type BSD.\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.tumfatig.net/2018/running-telegraf-on-openbsd/\" rel=\"external\"\u003eRunning Telegraf on OpenBSD\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit par Joel Carnat.\u003c/p\u003e\n\u003chr\u003e\n\u003ch1 id=\"exécuter-telegraf-sur-openbsd\"\u003eExécuter Telegraf sur OpenBSD\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eOS concerné : \u003cstrong\u003e6.3 et \u0026gt;\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eJ\u0026rsquo;ai essayé d\u0026rsquo;exécuter Telegraf d\u0026rsquo;InfluxData sur la version 6.2\nd\u0026rsquo;OpenBSD mais il n\u0026rsquo;était pas disponible dans les ports et n\u0026rsquo;ai pas été\ncapable de le compiler depuis les sources. Mais cela a changé puisque\nj\u0026rsquo;ai pu faire fonctionner une instance dans OpenBSD 6.3. Voici comment\nle compiler et exécuter Telegraf sur OpenBSD.\u003c/p\u003e\n\u003cp\u003eUtilisez OpenBSD 6.3, architecture amd64. Il peut peut-être fonctionner\nsur d\u0026rsquo;autres architectures et versions.\u003c/p\u003e\n\u003cp\u003eInstallez les outils de développement requis :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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 gmake git go\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:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egmake-4.2.1: ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit-2.16.2: ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego-1.10: ok\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eConfigurez l\u0026rsquo;environnement de compilation :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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 GOPATH=~/go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# export PATH=$PATH:~/go/bin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDémarrez la compilation de l\u0026rsquo;outil de gestion des dépendances du langage\nGo :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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# go get github.com/golang/dep\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# cd $GOPATH/src/github.com/golang/dep\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# go install ./...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, compilez Telegraf, lui-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-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# go get github.com/influxdata/telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# cd $GOPATH/src/github.com/influxdata/telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# gmake\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edep ensure -vendor-only\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego build -ldflags \u003cspan style=\"color:#48b685\"\u003e\u0026#34; -X main.commit=c7e2945a -X main.branch=master\u0026#34;\u003c/span\u003e ./cmd/telegraf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCela compilera la branche master. On devrait être capable de compiler\nune branche stable en utilisant les bascules et les étiquettes de Git.\nJe n\u0026rsquo;ai pas pu compiler la version 1.7.4.\u003c/p\u003e\n\u003cp\u003eQuand le binaire est prêt, installez-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# gmake install\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego build -ldflags \u003cspan style=\"color:#48b685\"\u003e\u0026#34; -X main.commit=c7e2945a -X main.branch=master\u0026#34;\u003c/span\u003e ./cmd/telegraf\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\u003ecp telegraf /usr/local/bin/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eJ\u0026rsquo;utilise les fonctions de Classes et Utilisateurs d\u0026rsquo;OpenBSD, ainsi\nTelegraf ne sera pas exécuté avec les droits 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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# vim /etc/login.conf\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\"\u003etelegraf:\\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003e:tc\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003edaemon:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# cap_mkdb /etc/login.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# groupadd -g xxxx _telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# useradd -u xxxx -g xxxx -c \u0026#34;Telegraf agent\u0026#34; -d /var/telegraf -s /sbin/nologin -L telegraf _telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe fichier de configuration par défaut sera dans \u003ccode\u003e/etc\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# mkdir /etc/telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# chown _telegraf:_telegraf /etc/telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# chmod 0750 /etc/telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# doas -u _telegraf telegraf config \u0026gt; /etc/telegraf/telegraf.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFinalement, il faut créer un script \u003ccode\u003erc.d\u003c/code\u003e pour faciliter la gestion :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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 \u0026gt; /etc/rc.d/telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/ksh\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# Start InfluxData Telegraf agent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003edaemon\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/usr/local/bin/telegraf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edaemon_flags\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;--config /etc/telegraf/telegraf.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edaemon_user\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;_telegraf\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. /etc/rc.d/rc.subr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003epexp\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;.*telegraf\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003erc_reload\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\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\"\u003erc_pre() {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e/usr/bin/install -d -o _telegraf -g _telegraf -m 0750 /var/telegraf\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\"\u003erc_cmd $1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#EOF\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# chmod 0755 /etc/rc.d/telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# chown root:wheel /etc/rc.d/telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# rcctl enable telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start telegraf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl y a un problème avec la fonction rc_check() lors de l\u0026rsquo;utilisation de\n\u003ccode\u003estart\u003c/code\u003e ou \u003ccode\u003erestart\u003c/code\u003e. Je n\u0026rsquo;ai pas pu trouver pourquoi. Selon\n`/etc/rc.d/rc.subr” : “(…) # XXX for unknown reason, rc_check can fail (…)”.\u003c/p\u003e\n\u003cp\u003eJusque là, Telegraf exécute les filtres d\u0026rsquo;entrée d\u0026rsquo;Apache, MySQL,\nPHP-FPM et SNMP et le filtre de sortie d\u0026rsquo;InfluxDB. Et, il ne semble pas\nutiliser plus de ressources que Collectd.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eAvec l\u0026rsquo;aimable autorisation de Joel Carnat !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCette page est la traduction de la page \u003ca href=\"https://www.tumfatig.net/2018/running-telegraf-on-openbsd/\" rel=\"external\"\u003eRunning Telegraf on OpenBSD\u003c/a\u003e\ndu site TUM\u0026rsquo;FATIG. - \u003ca href=\"https://www.tumfatig.net/disclaimer/\" rel=\"external\"\u003elicence de type BSD\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 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 'Running Telegraf on OpenBSD' de l'auteur Joel Carnat","tags":["Traduction","OpenBSD","Telegraf"],"date_published":"2018-09-09T11:55:02+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-09-01:/fr/trad/jcs.org/openbsd-surface-go#04435675181197a48ba040f8a55dfacbe64208e4341e50a16f5724a9aeed4fa4","url":"https://it-log.fr.eu.org/fr/trad/jcs.org/openbsd-surface-go/","title":"OpenBSD sur la Surface Go de Microsoft","author":{"name":"Stéphane HUC"},"content_text":"Description Pour une raison quelconque, j\u0026rsquo;aime les petits ordinateurs portables et les contraintes qu\u0026rsquo;ils imposent (tant qu\u0026rsquo;ils sont encore utilisables). J\u0026rsquo;ai utilisé un Dell Mini 9 pendant des jours et j\u0026rsquo;utilisais jusqu\u0026rsquo;à récemment un MacBook Air 11\u0026quot; comme principale machine de développement, et ce pendant de nombreuses années. Récemment, Microsoft a annoncé une version plus petite et moins chère de ses tablettes Surface, appelées Surface Go, qui ont éveillé mon intérêt.\nPrésentation de la Surface Go de Microsoft Matériel La Surface Go est disponible dans deux configurations matérielles :\nune avec 4 Go de RAM et un disque eMMC de 64 Go, et une autre avec 8 Go de RAM avec un disque SSD NVMe de 128 Go. (J\u0026rsquo;ai pris cette dernière). Les deux sont livrées avec un processeur Intel Pentium Gold 4415Y qui n\u0026rsquo;est pas très rapide, mais reste certainement utilisable.\nLa tablette mesure 23,5 cm de long, ~ 17.5 cm de large, ~ 0.8 cm d\u0026rsquo;épaisseur. Elle a un écran tactile de 10\u0026quot; de diagonale (3:2), recouvert d\u0026rsquo;un Gorilla Glass et une résolution de 1800x1200. Le pourtour est assez large, spécialement pour un si petit écran, mais cela a du sens sur un périphérique qui est destiné à être tenu, pour éviter les appuis accidentels sur l\u0026rsquo;écran.\nLe clavier et le pavé tactile sont situés sur une dalle amovible distincte, appelée Surface Signature Type Cover, vendue séparément. J\u0026rsquo;ai opté pour la couverture \u0026ldquo;bleu de cobalt\u0026rdquo; qui contient un matériau en alcantara doux, semblable à un tissu. Le couvercle se fixe magnétiquement le long du bord inférieur de l\u0026rsquo;appareil et présente des claviers et des pavés tactiles reliés par USB. Lorsque le capot est replié contre l\u0026rsquo;écran, il envoie un signal de veille ACPI et est maintenu magnétiquement sur l\u0026rsquo;écran. En utilisation normale, le couvercle peut être placé à plat sur une surface ou légèrement relevé d’environ 3/4, près de l’écran pour une meilleure ergonomie. Lorsque vous utilisez l’appareil comme une tablette, vous pouvez faire pivoter le couvercle derrière ce qui arrête automatiquement l\u0026rsquo;envoi des événements clavier et pavé tactile jusqu\u0026rsquo;à ce qu\u0026rsquo;il soit à nouveau retourné.\nLe clavier a une bonne quantité de touches et une bonne disposition, avec Home / Fin / Page Up / Page Down accessible via Fn + Gauche / Droite / Haut / Bas, mais aussi les touches Home / Fin / Page Up / Page Down dédiées. Je trouve les touches F9 à F12 assez utiles puisque la disposition du clavier est un peu petite. Par défaut, les touches F1 à F12 n\u0026rsquo;envoient pas les codes de touches F1-F12, la touche Fn doit être utilisée, soit enfoncée temporairement , soit appuyée pour activer le verrouillage Fn. Les touches sont rétroéclairées avec trois niveaux de réglage, gérés par le clavier lui-même avec la touche F7.\nLe pavé tactile du Type Cover est un pavé tactile Windows Precision connecté via USB HID. Il a un clic décent, mais lorsque la couverture est inclinée au lieu d\u0026rsquo;être plate sur une surface, cela sonne un peu creux et bon marché.\n'Hello from OpenSBD' depuis la Surface Go de Microsoft L\u0026rsquo;écran tactile est alimenté par une puce Elantech connectée via HID-over-i2c, qui prend également en charge la saisie au stylet. Un stylet Surface Pen est disponible séparément auprès de Microsoft et est disponible dans les mêmes couleurs que les dalles amovibles \u0026ldquo;Type Covers\u0026rdquo;. Le stylet fonctionne sans aucun appairage, bien que le bouton supérieur fonctionne en Bluetooth, il faut donc l\u0026rsquo;appairer pour l\u0026rsquo;utiliser. Dans tous les cas, le stylet nécessite une pile AAAA pour fonctionner. Le stylet peut être fixé magnétiquement sur le côté gauche de l\u0026rsquo;écran lorsqu\u0026rsquo;il n\u0026rsquo;est pas utilisé.\nUne béquille peut basculer derrière l\u0026rsquo;écran pour utiliser la tablette dans un format de portable pouvant s\u0026rsquo;ajuster à n\u0026rsquo;importe quel angle jusqu\u0026rsquo;à environ 170 degrés. La béquille reste fermement en place partout où elle est positionnée, ce qui signifie également qu’elle nécessite un peu de force pour la sortir lors de la première mise en place de la Surface Go sur un bureau.\nEn haut de l\u0026rsquo;écran, vous trouverez un bouton d\u0026rsquo;alimentation et des boutons à bascule pour le volume du son. Sur le côté droit se trouvent la prise casque 3,5 mm, le port USB-C, le port d\u0026rsquo;alimentation et le logement pour carte microSD située derrière la béquille.\nLa charge peut être effectuée via le port USB-C ou le port de charge dédié, qui accueille une fixation magnétique similaire à l’adaptateur MagSafe de première génération d’Apple. Le câble de charge a une LED blanche qui brille quand il est connecté, ce qui est assez ennuyeux car il est près de la ligne médiane de l\u0026rsquo;écran plutôt que vers le bas du clavier. Contrairement au MagSafe d\u0026rsquo;Apple, le voyant n\u0026rsquo;indique pas si la batterie est chargée ou non. La prise du chargeur électrique peut être placée vers le haut ou le bas, mais dans les deux sens, je trouve que le câble d\u0026rsquo;alimentation qui en sort est soumis à une contrainte gênante en raison de la position verticale du port.\nLa connectivité sans fil est assurée par une puce Qualcomm Atheros QCA6174 802.11ac qui fournit également une connectivité Bluetooth.\nLa plupart des capteurs de l\u0026rsquo;appareil, tels que le gyroscope et le capteur de lumière ambiante, sont connectés derrière un périphérique PCI Intel Sensor Hub, ce qui permet de réaliser des économies d\u0026rsquo;énergie car le processeur hôte n\u0026rsquo;a pas à interroger les capteurs en permanence.\nFirmware Pour accéder au menu BIOS ou micrologiciel de la Surface Go, maintenez le bouton Volume Haut enfoncé, puis appuyez sur le bouton Marche / Arrêt et relâchez-le, puis relâchez la touche Volume Up lorsque le menu apparaît. Secure Boot ainsi que divers composants matériels peuvent être désactivés dans ce menu. L\u0026rsquo;ordre de démarrage peut également être ajusté. Un menu de démarrage temporaire peut être affiché de la même manière, mais en utilisant plutôt Volume Down.\nInstaller OpenBSD L\u0026rsquo;installation était très facile, le clavier \u0026ldquo;Type Cover\u0026rdquo; fonctionnant immédiatement, la plupart du matériel étant des composants PC standard.\nPour démarrer l\u0026rsquo;installateur d\u0026rsquo;OpenBSD, utilisez dd pour installer l\u0026rsquo;image install64.fs sur un disque USB ; entrez dans le BIOS comme indiqué ci-dessus et désactivez \u0026ldquo;Secure Boot\u0026rdquo;, puis définissez le périphérique USB comme priorité de démarrage.\nLorsque vous partitionnez le SSD de 128 Go, vous pouvez supprimer en toute sécurité la partition Windows Recovery qui occupe 1 Go, car elle ne peut pas réparer une partition Windows totalement supprimée et une image de récupération complète peut être téléchargée du site Web Microsoft et copiée sur un disque USB.\nAprès avoir installé OpenBSD mais avant de redémarrer, montez la partition EFI ( sd0i ) et supprimez le répertoire /EFI/Microsoft. Sans cela, la tablette peut essayer de démarrer le chargeur de récupération Windows. Le chargeur de démarrage EFI d\u0026rsquo;OpenBSD /EFI/Boot/BOOTX64.EFI sera chargé par défaut.\nUn inconvénient à noter : si vous appuyez sur le pavé tactile ou si vous appuyez sur les touches F1 à F6 lors de l\u0026rsquo;installation, le \u0026ldquo;Type Cover\u0026rdquo; détachera tous ses périphériques USB, puis les ré-activera. Cela est dû au fait que le ramdisk ne contient aucun pilote de pavé tactile ou autre périphérique prenant en charge les contrôles de consommation USB HID pour les touches F1-F6. Par conséquent, les canaux USB de ces périphériques ne sont pas fonctionnels. Il est probable que le \u0026ldquo;Type Cover\u0026rdquo; se redémarre dans cette situation en tant que sécurité intégrée pour le forcer à se rattacher, plutôt que de demander à l\u0026rsquo;utilisateur de détacher le capot et de le rattacher.\nCela ne se produira pas pour le pavé tactile une fois que le noyau normal sera démarré car il contient le pilote umt. Lisez mes remarques ci-dessous pour utiliser usbhidcontrol afin de répondre aux touches F1-F6 qui maintiendront le bon canal USB ouvert afin d\u0026rsquo;empêcher le détachement ou la réinstallation lors de l\u0026rsquo;utilisation de ces touches.\nJournal de support OpenBSD 23-08-2018 : J\u0026rsquo;ai reçu la Surface Go et j\u0026rsquo;ai démarré un disque USB OpenBSD après avoir désactivé Secure Boot. J\u0026rsquo;ai pu installer OpenBSD à la place de la partition Windows, en conservant la partition de récupération Windows. Après le redémarrage, la Surface a continué d\u0026rsquo;essayer de démarrer Windows Recovery, qui échouait encore et encore. J\u0026rsquo;ai démarré sur une installation USB Windows et j\u0026rsquo;ai pu utiliser EasyUEFI pour ajouter une nouvelle option de démarrage UEFI et démarrer explicitement le BOOTX64.EFI d\u0026rsquo;OpenBSD. OpenBSD démarre maintenant par défaut.\nJ\u0026rsquo;ai remarqué que l\u0026rsquo;écran avait un pixel mort dans le coin inférieur gauche, alors j\u0026rsquo;ai décidé de l\u0026rsquo;apporter au Microsoft Store proche pour un échange. Mais avant, je devais réinstaller Windows, ce qui a pris plusieurs heures, car la partition de récupération Windows ne peut actuellement rien récupérer si la partition Windows a été effacée. J\u0026rsquo;ai téléchargé une image de récupération de la Surface à partir du site Web de Microsoft et créer un disque USB pour réinstaller Windows. Finalement, je me suis rendu au Microsoft Store et ils m\u0026rsquo;ont rapidement donné une nouvelle en échange.\nLors de l\u0026rsquo;installation d\u0026rsquo;OpenBSD sur le nouveau périphérique, j\u0026rsquo;ai décidé d\u0026rsquo;effacer la partition de récupération de Windows car elle est de toute façon inutile et me permettrait d\u0026rsquo;économiser un gigaoctet d\u0026rsquo;espace supplémentaire. Avant de redémarrer, j\u0026rsquo;ai compris que les variables de démarrage UEFI pointaient d\u0026rsquo;abord vers les fichiers EFI de récupération de Windows dans \\EFI\\Microsoft. J\u0026rsquo;ai donc supprimé tout ce répertoire en laissant \\EFI\\Boot\\BOOTX64.EFI qui est le chargeur de démarrage d\u0026rsquo;OpenBSD. Cela a fonctionné comme prévu et OpenBSD démarre maintenant par défaut.\n24-08-2018 : Le pavé tactile du Type Cover se connecte à ums mais c\u0026rsquo;est un pavé tactile Windows Precision qui devrait donc fonctionner comme mon pilote imt , mais via USB. ums ne prend en charge qu\u0026rsquo;un seul doigt de saisie et le matériel a la fonction \u0026ldquo;tap-to-click\u0026rdquo; activée par défaut, il ne peut pas être désactivé. J\u0026rsquo;ai écrit un nouveau pilote umt pour le brancher sur USB à la place de hidmt, ensuite j\u0026rsquo;ai perdu beaucoup de temps pour déboguer les raisons pour lesquelles le périphérique ne fonctionnait pas correctement dans le mode PTP. Je l\u0026rsquo;ai traqué jusqu\u0026rsquo;à trouver une certaine confusion entre ihidev et hidmt qui devait être corrigés en premier, j\u0026rsquo;ai donc envoyé un diff à tech@.\n25-08-2018 : J\u0026rsquo;ai envoyé les modifications des pilotes ihidev et hidmt et un diff pour importer umt à tech@ pour analyse. Il a été rapidement importé .\n28-08-2018 : Ces deux derniers jours, j\u0026rsquo;ai passé du temps à chercher ce qui était nécessaire pour que l\u0026rsquo;écran tactile Elan fonctionne. Il s\u0026rsquo;attache à ihidev en tant que périphérique HID-over-i2c, mais il ne s\u0026rsquo;attache pas à imt. Finalement, j\u0026rsquo;ai découvert que ce n\u0026rsquo;est pas un périphérique compatible PTP, mais conforme à l\u0026rsquo;ancien multitouch de type Windows 8. J\u0026rsquo;ai commencé à ajouter un support pour ces périphériques de type Windows 8 à hidmt et déplacé du code dupliqué dans umt et imt dans hidmt.\nJ\u0026rsquo;ai aussi examiné les boutons de volume en haut de l\u0026rsquo;écran. Malheureusement, ils ne fonctionnent pas avec notre pilote acpisurface existant, alors j\u0026rsquo;ai démarré un disque USB Linux et ai tracé leur fonctionnement. Apparemment, c\u0026rsquo;est un périphérique \u0026ldquo;Intel 5-button Array\u0026rdquo; qui fonctionne via ACPI. J\u0026rsquo;ai écrit un nouveau pilote acpihid pour cela et les boutons de volume contrôlent maintenant le volume audio. Il y a certaines surcharges dans acpihid, dans la gestion du bouton d\u0026rsquo;alimentation et de la méthode d\u0026rsquo;interruption ACPI GPE standard, afin de recevoir la pression sur le bouton d\u0026rsquo;alimentation. J\u0026rsquo;ai donc dû prendre en compte que acpibtn capture acpihid s\u0026rsquo;il est attaché. Ce serait bien s\u0026rsquo;il y avait une variable sysctl comme machdep.lidaction qui spécifiait si le bouton d\u0026rsquo;alimentation était en mode arrêt, suspendu ou ne faisait rien.\n29-08-2018 : Je voulais faire fonctionner les fonctions F1 à F6 du clavier (luminosité, lecture / pause, sourdine, diminution / augmentation du volume) sur le Type Cover. Actuellement, chaque fois qu\u0026rsquo;ils sont pressés, le Type Cover redémarre, car le rétro-éclairage s\u0026rsquo;éteint et tous ses périphériques USB se détachent puis se reconnectent. En traçant comment cela fonctionne sous Linux, j\u0026rsquo;ai vu qu\u0026rsquo;il s\u0026rsquo;agissait essentiellement d\u0026rsquo;utiliser leur pilote générique hid-input, donc il ne devrait pas avoir besoin de le personnaliser. J\u0026rsquo;ai commencé à travailler sur un pilote générique d\u0026rsquo;entrée USB HID (contrairement à ukbd / hidkbd qui nécessite des utilisations spécifiques au clavier), mais j\u0026rsquo;ai eu des soucis sur usbhidaction que nous avons déjà en base et qui devrait bien fonctionner pour cette tâche.\nMalheureusement, usbhidaction requiert de connaître le chemin spécifique uhid du périphérique HID qui doit être contrôlé et le quitter dès que le périphérique disparaît. Pour la dalle Type Cover de la Surface, ce périphérique peut changer en fonction de ce qui a été branché au démarrage, et se détachera à chaque fois que la machine sera arrêtée alors usbhidaction s\u0026rsquo;arrêtera simplement.\nAprès avoir passé beaucoup de temps à modifier usbhidaction pour interroger le périphérique /dev/usbN afin d\u0026rsquo;attendre les ajouts et les suppressions de périphérique, j\u0026rsquo;ai réalisé que la page de manuel était obsolète et que tous ces événements étaient sortis du noyau il y a plusieurs années. J\u0026rsquo;ai enlevé cette ligne dans la page de manuel.\n30-08-2018 : Afin d\u0026rsquo;être capable d\u0026rsquo;utiliser usbhidaction pour qu\u0026rsquo;il trouve automatiquement un périphérique USB en fonction de son fournisseur et de son identifiant, et être capable d\u0026rsquo;attendre que le périphérique s\u0026rsquo;affiche automatiquement, je l\u0026rsquo;ai connecté à /dev/hotplug. Malheureusement, hotplug ne prend en charge qu\u0026rsquo;un seul lecteur simultané. J\u0026rsquo;ai donc implémenté le clonage de périphérique dans le pilote hotplug afin que plusieurs processus puissent lire à partir de /dev/hotplug et que chacun reçoive sa propre file d\u0026rsquo;événements. Je l\u0026rsquo;ai envoyé par courrier électronique à la liste des développeurs OpenBSD et j\u0026rsquo;ai reçu quelques premiers commentaires à ce sujet.\nJ\u0026rsquo;ai fait beaucoup de progrès sur les changements d’ usbhidaction, et je les ai envoyés dans mon arborescence.\nJ\u0026rsquo;ai également envoyé un changement en amont pour créer 8 périphériques /dev/uhidN, puisqu\u0026rsquo;il n\u0026rsquo;y en avait que 4 auparavant.\n31-08-2018 : J\u0026rsquo;ai décidé d\u0026rsquo;abandonner mon support multitouch Windows 8 pour le moment, car l\u0026rsquo;écran tactile devrait être utilisable avec le support de base par ims (agissant comme une souris à un bouton). Utiliser imt signifiait de réclamer tous les rapports HID (25 !) sur le périphérique, ce qui brisait la prise en charge de l\u0026rsquo;utilisation d\u0026rsquo;un stylet et mon stylet Surface est arrivé, je voulais l\u0026rsquo;utiliser. De cette façon, ims peut juste l\u0026rsquo;attacher au rapport de l\u0026rsquo;écran tactile et un autre ims peut l\u0026rsquo;attacher au rapport de saisie du stylet.\nEn faisant des ims correspondant aux rapports de l\u0026rsquo;écran tactile, je suis tombé sur ce qui ressemble à un bogue dans notre analyseur HID (ou, il n\u0026rsquo;est tout simplement pas pris en charge) où il correspondait à l\u0026rsquo;utilisation de pages qu\u0026rsquo;il ne devrait pas. Le résultat de ceci était que, quand hidms cherchait la page d\u0026rsquo;utilisation indiquant le minimum logique et le maximum X / Y de l\u0026rsquo;écran (afin de pouvoir mapper les coordonnées d\u0026rsquo;entrée de l\u0026rsquo;écran tactile sur l\u0026rsquo;affichage de l\u0026rsquo;écran), il y avait des utilisations pour d\u0026rsquo;autres choses sans rapport, cela faisait penser au pilote que l’écran était beaucoup plus grand qu’il ne l’était. Lorsque je touchais l\u0026rsquo;écran et que je le parcourais complètement, cela ne faisait déplacer le curseur que d\u0026rsquo;un quart environ.\nJ\u0026rsquo;ai envoyé un diff à tech@ pour contourner cet ims et attacher des ims aux écrans tactiles.\n01-09-2018 : Les diff d\u0026rsquo;hidms et d\u0026rsquo;ims ont été acceptés. OpenBSD 6.4 prendra en charge l’écran tactile, le stylet, le clavier et le pavé tactile multitouch.\nJe suis toujours en attente de retours sur mon changement de hotplug, ce qui me permettra ensuite de développer plus profondément mes modifications sur usbhidaction.\nJ\u0026rsquo;ai aussi besoin de commencer à travailler sur un pilote pour le périphérique PCI Intel Sensor Hub qui me permettrait ensuite de prendre en charge le capteur de lumière ambiante et le gyroscope pour la détection de la rotation. Cependant, en regardant le pilote Linux, il semble qu\u0026rsquo;il y ait une tonne de code et bien sûr, il n’y a pas de documentation ouverte pour que je puisse trouver.\nRésumé du support actuel d\u0026rsquo;OpenBSD Le statut est relatif à OpenBSD-current en date du 03-09- 2018.\nComposant Fonctionnel Remarques Adaptateur électrique AC Oui Pris en charge via acpiac et le statut est disponible via apm et hw.sensors , qui supporte également la charge via USB-C. Détecteur de lumière ambiante Non Connecté derrière un périphérique PCI Intel Sensor Hub qui nécessite un nouveau pilote. Audio Oui Audio HDA ​​avec un codec Realtek 298 pris en charge par azalia. État de la batterie Oui Pris en charge via acpibat et le status est disponible via apm et hw.sensors. Bluetooth Non Le périphérique Atheros apparaît comme un périphérique ugen , mais OpenBSD ne prend pas en charge le Bluetooth. Peut être désactivé dans le BIOS. Les caméras Non Il existe apparemment des caméras avant, arrière et infrarouge, dont aucune n\u0026rsquo;est prise en charge (ni souhaité). Peut être désactivées dans le BIOS. Le Gyroscope Non Connecté derrière le périphérique PCI Intel Sensor Hub qui requiert un nouveau pilote qui pourrait alimenter le [[https://man.openbsd.org/man9/sensor_attach.9 Hibernation Oui Fonctionne bien avec zzz Slot MicroSD Oui Un Realtek RTS522A, supporté par rtsx. Le SSD Oui Le périphérique Toshiba NVMe accessible via nvme. Le stylet Oui Fonctionne sur l\u0026rsquo;écran tactile via ims. Le bouton situé en haut du stylet nécessite la prise en charge du Bluetooth qui n\u0026rsquo;est pas pris en charge. Du fait que dwiic nécessite toujours l\u0026rsquo;interrogation de ces chipsets, dessiner avec le stylet n\u0026rsquo;est pas aussi fluide qu\u0026rsquo;avec des interruptions correctes. Mise en veille / Réveil Oui Fonctionne bien à partir de zzz et en fermant le Type Cover contre l\u0026rsquo;écran. Il ne se réveille pas automatiquement lorsque vous retirez le Type Cover, il faut appuyer sur le bouton d\u0026rsquo;alimentation pour le réveiller. L\u0026rsquo;Écran tactile Oui HID-over-I2C, supporté par ims. Le clavier Type Cover Oui USB, supporté par ukbd. 3 niveaux de contrôle du rétroéclairage sont réglables par le clavier lui-même avec F7. Les actions des touches F1 à F6 apparaissent dans le rapport 3 et peuvent être répondues avec usbhidaction -u 045e:096f -r 3. Le pavé tactile Type Cover Oui USB, pris en charge par mon nouveau pilote umt pour le multitouch à 5 doigts, le défilement à deux doigts, l\u0026rsquo;hystérésis et être capable de désactiver le tap-to-click qui est activé par défaut en mode souris normal. USB Oui Le port USB-C fonctionne bien pour les données et la charge. La Vidéo Oui inteldrm a pris en charge Kaby Lake en ajoutant la vidéo accélérée, le DPMS, le contrôle gamma, le contrôle de rétroéclairage intégré et la reprise S3 appropriée. Les boutons de volume Oui Intel à 5 ​​boutons, pris en charge par mon nouveau pilote acpihid non encore importé en amont. Wifi Non Puce sans fil Qualcomm Atheros QCA6174 802.11ac, non prise en charge. FreeBSD a un port en cours de travail d’ath10k partir de Linux (sous licence ISC) qui peut être porté. J\u0026rsquo;utilise actuellement un petit adaptateur sans fil USB-A qui est rendu moins volumineux par un adaptateur USB-A vers USB-C. Remerciements Avec l\u0026rsquo;aimable autorisation de Joshua Stein !\nCette page est la traduction de la page [OpenBSD on Microsoft Surface Go]]]1 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\u003ePour une raison quelconque, j\u0026rsquo;aime les petits ordinateurs portables et\nles contraintes qu\u0026rsquo;ils imposent (tant qu\u0026rsquo;ils sont encore utilisables).\nJ\u0026rsquo;ai utilisé un \u003ca href=\"https://jcs.org/notaweblog/2009/04/23/on_the_dell_mini_9\" rel=\"external\"\u003eDell Mini 9\u003c/a\u003e\npendant des jours et j\u0026rsquo;utilisais jusqu\u0026rsquo;à récemment un MacBook Air 11\u0026quot;\ncomme principale machine de développement, et ce  pendant de nombreuses\nannées.\nRécemment, Microsoft a annoncé une version plus petite et moins chère de\nses tablettes Surface, appelées \u003ca href=\"https://www.microsoft.com/en-us/p/surface-go/8v9dp4lnknsz\" rel=\"external\"\u003eSurface Go\u003c/a\u003e,\nqui ont éveillé mon intérêt.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/jcs.org/2018-08-31-surface_go-680x224.jpg\" title=\"Présentation de la Surface Go de Microsoft\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/jcs.org/2018-08-31-surface_go-680x224_hu_a7c3ab666ce18875.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Présentation de la Surface Go de Microsoft\" height=\"82\" loading=\"lazy\" src=\"/images/jcs.org/2018-08-31-surface_go-680x224_hu_3e6e9ed07e9121e3.jpg\" type=\"image/jpeg\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003ePrésentation de la Surface Go de Microsoft\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"matériel\"\u003eMatériel\u003c/h2\u003e\n\u003cp\u003eLa Surface Go est disponible dans deux configurations matérielles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eune avec 4 Go de RAM et un disque eMMC de 64 Go,\u003c/li\u003e\n\u003cli\u003eet une autre avec 8 Go de RAM avec un disque SSD NVMe de 128 Go.\n(J\u0026rsquo;ai pris cette dernière).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes deux sont livrées avec un processeur Intel Pentium Gold 4415Y qui\nn\u0026rsquo;est pas très rapide, mais reste certainement utilisable.\u003c/p\u003e\n\u003cp\u003eLa tablette mesure 23,5 cm de long, ~ 17.5 cm de large, ~ 0.8 cm\nd\u0026rsquo;épaisseur. Elle a un écran tactile de 10\u0026quot; de diagonale (3:2),\nrecouvert d\u0026rsquo;un Gorilla Glass et une résolution de 1800x1200.\nLe pourtour est assez large, spécialement pour un si petit écran, mais\ncela a du sens sur un périphérique qui est destiné à être tenu, pour\néviter les appuis accidentels sur l\u0026rsquo;écran.\u003c/p\u003e\n\u003cp\u003eLe clavier et le pavé tactile sont situés sur une dalle amovible distincte,\nappelée Surface Signature Type Cover, vendue séparément.  J\u0026rsquo;ai opté pour\nla couverture \u0026ldquo;bleu de cobalt\u0026rdquo; qui contient un matériau en alcantara doux,\nsemblable à un tissu.\nLe couvercle se fixe magnétiquement le long du bord inférieur de\nl\u0026rsquo;appareil et présente des claviers et des pavés tactiles reliés par USB.\nLorsque le capot est replié contre l\u0026rsquo;écran, il envoie un signal de veille\nACPI et est maintenu magnétiquement sur l\u0026rsquo;écran. En utilisation normale,\nle couvercle peut être placé à plat sur une surface ou légèrement relevé\nd’environ 3/4, près de l’écran pour une meilleure ergonomie. Lorsque vous\nutilisez l’appareil comme une tablette, vous pouvez faire pivoter le\ncouvercle derrière ce qui arrête automatiquement l\u0026rsquo;envoi des événements\nclavier et pavé tactile jusqu\u0026rsquo;à ce qu\u0026rsquo;il soit à nouveau retourné.\u003c/p\u003e\n\u003cp\u003eLe clavier a une bonne quantité de touches et une bonne disposition,\navec \u003ckbd\u003eHome\u003c/kbd\u003e / \u003ckbd\u003eFin\u003c/kbd\u003e / \u003ckbd\u003ePage Up\u003c/kbd\u003e / \u003ckbd\u003ePage Down\u003c/kbd\u003e\naccessible via \u003ckbd\u003eFn\u003c/kbd\u003e + \u003ckbd\u003eGauche\u003c/kbd\u003e / \u003ckbd\u003eDroite\u003c/kbd\u003e / \u003ckbd\u003eHaut\u003c/kbd\u003e / \u003ckbd\u003eBas\u003c/kbd\u003e,\nmais aussi les touches \u003ckbd\u003eHome\u003c/kbd\u003e / \u003ckbd\u003eFin\u003c/kbd\u003e / \u003ckbd\u003ePage Up\u003c/kbd\u003e / \u003ckbd\u003ePage Down\u003c/kbd\u003e\ndédiées. Je trouve les touches \u003ckbd\u003eF9\u003c/kbd\u003e à \u003ckbd\u003eF12\u003c/kbd\u003e assez\nutiles puisque la disposition du clavier est un peu petite. Par défaut,\nles touches \u003ckbd\u003eF1\u003c/kbd\u003e à \u003ckbd\u003eF12\u003c/kbd\u003e n\u0026rsquo;envoient pas les codes de\ntouches F1-F12, la touche \u003ckbd\u003eFn\u003c/kbd\u003e doit être utilisée, soit\nenfoncée temporairement , soit appuyée pour activer le verrouillage Fn.\nLes touches sont rétroéclairées avec trois niveaux de réglage, gérés par\nle clavier lui-même avec la touche \u003ckbd\u003eF7\u003c/kbd\u003e.\u003c/p\u003e\n\u003cp\u003eLe pavé tactile du Type Cover est un pavé tactile Windows Precision\nconnecté via USB HID. Il a un clic décent, mais lorsque la couverture\nest inclinée au lieu d\u0026rsquo;être plate sur une surface, cela sonne un peu\ncreux et bon marché.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/jcs.org/2018-08-31-surface_go_pen-335x251.jpg\" title=\"\u0026#39;Hello from OpenSBD\u0026#39; depuis la Surface Go de Microsoft\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/jcs.org/2018-08-31-surface_go_pen-335x251_hu_fa765734e9f11ffc.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"\u0026#39;Hello from OpenSBD\u0026#39; depuis la Surface Go de Microsoft\" height=\"187\" loading=\"lazy\" src=\"/images/jcs.org/2018-08-31-surface_go_pen-335x251_hu_43ba6240982c9cad.jpg\" type=\"image/jpeg\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003e'Hello from OpenSBD' depuis la Surface Go de Microsoft\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eL\u0026rsquo;écran tactile est alimenté par une puce Elantech connectée via\nHID-over-i2c, qui prend également en charge la saisie au stylet.\nUn stylet Surface Pen est disponible séparément auprès de Microsoft et\nest disponible dans les mêmes couleurs que les dalles amovibles \u0026ldquo;Type Covers\u0026rdquo;.\nLe stylet fonctionne sans aucun appairage, bien que le bouton supérieur\nfonctionne en Bluetooth, il faut donc l\u0026rsquo;appairer pour l\u0026rsquo;utiliser.\nDans tous les cas, le stylet nécessite une pile AAAA pour fonctionner.\nLe stylet peut être fixé magnétiquement sur le côté gauche de l\u0026rsquo;écran\nlorsqu\u0026rsquo;il n\u0026rsquo;est pas utilisé.\u003c/p\u003e\n\u003cp\u003eUne béquille peut basculer derrière l\u0026rsquo;écran pour utiliser la tablette\ndans un format de portable pouvant s\u0026rsquo;ajuster à n\u0026rsquo;importe quel angle\njusqu\u0026rsquo;à environ 170 degrés. La béquille reste fermement en place partout\noù elle est positionnée, ce qui signifie également qu’elle nécessite un\npeu de force pour la sortir lors de la première mise en place de la\nSurface Go sur un bureau.\u003c/p\u003e\n\u003cp\u003eEn haut de l\u0026rsquo;écran, vous trouverez un bouton d\u0026rsquo;alimentation et des\nboutons à bascule pour le volume du son.  Sur le côté droit se trouvent\nla prise casque 3,5 mm, le port USB-C, le port d\u0026rsquo;alimentation et le\nlogement pour carte microSD située derrière la béquille.\u003c/p\u003e\n\u003cp\u003eLa charge peut être effectuée via le port USB-C ou le port de charge\ndédié, qui accueille une fixation magnétique similaire à l’adaptateur\nMagSafe de première génération d’Apple. Le câble de charge a une LED\nblanche qui brille quand il est connecté, ce qui est assez ennuyeux car\nil est près de la ligne médiane de l\u0026rsquo;écran plutôt que vers le bas du\nclavier. Contrairement au MagSafe d\u0026rsquo;Apple, le voyant n\u0026rsquo;indique pas si la\nbatterie est chargée ou non. La prise du chargeur électrique peut être\nplacée vers le haut ou le bas, mais dans les deux sens, je trouve que le\ncâble d\u0026rsquo;alimentation qui en sort est soumis à une contrainte gênante en\nraison de la position verticale du port.\u003c/p\u003e\n\u003cp\u003eLa connectivité sans fil est assurée par une puce Qualcomm Atheros\nQCA6174 802.11ac qui fournit également une connectivité Bluetooth.\u003c/p\u003e\n\u003cp\u003eLa plupart des capteurs de l\u0026rsquo;appareil, tels que le gyroscope et le\ncapteur de lumière ambiante, sont connectés derrière un périphérique PCI\nIntel Sensor Hub, ce qui permet de réaliser des économies d\u0026rsquo;énergie car\nle processeur hôte n\u0026rsquo;a pas à interroger les capteurs en permanence.\u003c/p\u003e\n\u003ch2 id=\"firmware\"\u003eFirmware\u003c/h2\u003e\n\u003cp\u003ePour accéder au menu BIOS ou micrologiciel de la Surface Go, maintenez\nle bouton Volume Haut enfoncé, puis appuyez sur le bouton Marche / Arrêt\net relâchez-le, puis relâchez la touche Volume Up lorsque le menu apparaît.\nSecure Boot ainsi que divers composants matériels peuvent être désactivés\ndans ce menu. L\u0026rsquo;ordre de démarrage peut également être ajusté. Un menu\nde démarrage temporaire peut être affiché de la même manière, mais en\nutilisant plutôt Volume Down.\u003c/p\u003e\n\u003ch2 id=\"installer-openbsd\"\u003eInstaller OpenBSD\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;installation était très facile, le clavier \u0026ldquo;Type Cover\u0026rdquo; fonctionnant\nimmédiatement, la plupart du matériel étant des composants PC standard.\u003c/p\u003e\n\u003cp\u003ePour démarrer l\u0026rsquo;installateur d\u0026rsquo;OpenBSD, utilisez \u003ccode\u003edd\u003c/code\u003e pour installer\nl\u0026rsquo;image \u003ccode\u003einstall64.fs\u003c/code\u003e sur un disque USB ; entrez dans le BIOS comme\nindiqué ci-dessus et désactivez \u0026ldquo;Secure Boot\u0026rdquo;, puis définissez le\npériphérique USB comme priorité de démarrage.\u003c/p\u003e\n\u003cp\u003eLorsque vous partitionnez le SSD de 128 Go, vous pouvez supprimer en\ntoute sécurité la partition Windows Recovery qui occupe 1 Go, car elle\nne peut pas réparer une partition Windows totalement supprimée et une\nimage de récupération complète peut être téléchargée du site Web\nMicrosoft et copiée sur un disque USB.\u003c/p\u003e\n\u003cp\u003eAprès avoir installé OpenBSD mais avant de redémarrer, montez la\npartition EFI ( \u003ccode\u003esd0i\u003c/code\u003e ) et supprimez le répertoire \u003ccode\u003e/EFI/Microsoft\u003c/code\u003e.\nSans cela, la tablette peut essayer de démarrer le chargeur de\nrécupération Windows. Le chargeur de démarrage EFI d\u0026rsquo;OpenBSD\n\u003ccode\u003e/EFI/Boot/BOOTX64.EFI\u003c/code\u003e sera chargé par défaut.\u003c/p\u003e\n\u003cp\u003eUn inconvénient à noter : si vous appuyez sur le pavé tactile ou si vous\nappuyez sur les touches \u003ckbd\u003eF1\u003c/kbd\u003e à \u003ckbd\u003eF6\u003c/kbd\u003e lors de\nl\u0026rsquo;installation, le \u0026ldquo;Type Cover\u0026rdquo; détachera tous ses périphériques USB,\npuis les ré-activera.  Cela est dû au fait que le ramdisk ne contient\naucun pilote de pavé tactile ou autre périphérique prenant en charge les\ncontrôles de consommation USB HID pour les touches F1-F6. Par conséquent,\nles canaux USB de ces périphériques ne sont pas fonctionnels. Il est\nprobable que le \u0026ldquo;Type Cover\u0026rdquo; se redémarre dans cette situation en tant\nque sécurité intégrée pour le forcer à se rattacher, plutôt que de\ndemander à l\u0026rsquo;utilisateur de détacher le capot et de le rattacher.\u003c/p\u003e\n\u003cp\u003eCela ne se produira pas pour le pavé tactile une fois que le noyau\nnormal sera démarré car il contient le pilote \u003ccode\u003eumt\u003c/code\u003e. Lisez mes remarques\nci-dessous pour utiliser \u003ccode\u003eusbhidcontrol\u003c/code\u003e afin de répondre aux touches\nF1-F6 qui maintiendront le bon canal USB ouvert afin d\u0026rsquo;empêcher le\ndétachement ou la réinstallation lors de l\u0026rsquo;utilisation de ces touches.\u003c/p\u003e\n\u003ch2 id=\"journal-de-support-openbsd\"\u003eJournal de support OpenBSD\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e23-08-2018\u003c/strong\u003e : J\u0026rsquo;ai reçu la Surface Go et j\u0026rsquo;ai démarré un disque USB\nOpenBSD après avoir désactivé Secure Boot. J\u0026rsquo;ai pu installer OpenBSD à\nla place de la partition Windows, en conservant la partition de\nrécupération Windows. Après le redémarrage, la Surface a continué\nd\u0026rsquo;essayer de démarrer Windows Recovery, qui échouait encore et encore.\nJ\u0026rsquo;ai démarré sur une installation USB Windows et j\u0026rsquo;ai pu utiliser\n\u003ca href=\"https://www.easyuefi.com/\" rel=\"external\"\u003eEasyUEFI\u003c/a\u003e pour ajouter une nouvelle option\nde démarrage UEFI et démarrer explicitement le \u003ccode\u003eBOOTX64.EFI\u003c/code\u003e d\u0026rsquo;OpenBSD.\nOpenBSD démarre maintenant par défaut.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai remarqué que l\u0026rsquo;écran avait un pixel mort dans le coin inférieur\ngauche, alors j\u0026rsquo;ai décidé de l\u0026rsquo;apporter au Microsoft Store proche pour\nun échange. Mais avant, je devais réinstaller Windows, ce qui a pris\nplusieurs heures, car la partition de récupération Windows ne peut\nactuellement rien récupérer si la partition Windows a été effacée. J\u0026rsquo;ai\ntéléchargé une image de récupération de la Surface à partir du site Web\nde Microsoft et créer un disque USB pour réinstaller Windows. Finalement,\nje me suis rendu au Microsoft Store et ils m\u0026rsquo;ont rapidement donné une\nnouvelle en échange.\u003c/p\u003e\n\u003cp\u003eLors de l\u0026rsquo;installation d\u0026rsquo;OpenBSD sur le nouveau périphérique, j\u0026rsquo;ai\ndécidé d\u0026rsquo;effacer la partition de récupération de Windows car elle est de\ntoute façon inutile et me permettrait d\u0026rsquo;économiser un gigaoctet d\u0026rsquo;espace\nsupplémentaire. Avant de redémarrer, j\u0026rsquo;ai compris que les variables de\ndémarrage UEFI pointaient d\u0026rsquo;abord vers les fichiers EFI de récupération\nde Windows dans \u003ccode\u003e\\EFI\\Microsoft\u003c/code\u003e. J\u0026rsquo;ai donc supprimé tout ce répertoire\nen laissant \u003ccode\u003e\\EFI\\Boot\\BOOTX64.EFI\u003c/code\u003e qui est le chargeur de démarrage\nd\u0026rsquo;OpenBSD. Cela a fonctionné comme prévu et OpenBSD démarre maintenant\npar défaut.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e24-08-2018\u003c/strong\u003e : Le pavé tactile du Type Cover se connecte à \u003ccode\u003eums\u003c/code\u003e mais\nc\u0026rsquo;est un pavé tactile Windows Precision qui devrait donc fonctionner\ncomme mon pilote \u003ccode\u003eimt\u003c/code\u003e , mais via USB. \u003ccode\u003eums\u003c/code\u003e ne prend en charge qu\u0026rsquo;un\nseul doigt de saisie et le matériel a la fonction \u0026ldquo;tap-to-click\u0026rdquo; activée\npar défaut, il ne peut pas être désactivé. J\u0026rsquo;ai écrit un nouveau pilote\n\u003ca href=\"https://github.com/jcs/openbsd-src/commit/552927b7d737c9c58071e75c7eb396ef59b79594\" rel=\"external\"\u003e\u003ccode\u003eumt\u003c/code\u003e\u003c/a\u003e\npour le brancher sur USB à la place de \u003ccode\u003ehidmt\u003c/code\u003e, ensuite j\u0026rsquo;ai perdu\nbeaucoup de temps pour déboguer les raisons pour lesquelles le\npériphérique ne fonctionnait pas correctement dans le mode PTP. Je l\u0026rsquo;ai\ntraqué jusqu\u0026rsquo;à trouver une certaine confusion entre \u003ccode\u003eihidev\u003c/code\u003e et \u003ccode\u003ehidmt\u003c/code\u003e\nqui devait être corrigés en premier, j\u0026rsquo;ai donc envoyé un diff à \u003ccode\u003etech@\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e25-08-2018\u003c/strong\u003e : J\u0026rsquo;ai \u003ca href=\"https://github.com/openbsd/src/commit/253b28d04b9c6635c4d2e127060005b0bf7c3471\" rel=\"external\"\u003eenvoyé\u003c/a\u003e\nles modifications des pilotes \u003ccode\u003eihidev\u003c/code\u003e et \u003ccode\u003ehidmt\u003c/code\u003e et un\n\u003ca href=\"https://marc.info/?l=openbsd-tech\u0026amp;m=153522257408102\u0026amp;w=2\" rel=\"external\"\u003ediff pour importer \u003ccode\u003eumt\u003c/code\u003e\u003c/a\u003e\nà \u003ccode\u003etech@\u003c/code\u003e pour analyse. Il a été rapidement\n\u003ca href=\"https://github.com/openbsd/src/commit/737d705b8780db06a36e2cfc49360998fb7264ee\" rel=\"external\"\u003eimporté\u003c/a\u003e .\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e28-08-2018\u003c/strong\u003e : Ces deux derniers jours, j\u0026rsquo;ai passé du temps à chercher\nce qui était nécessaire pour que l\u0026rsquo;écran tactile Elan fonctionne. Il\ns\u0026rsquo;attache à \u003ccode\u003eihidev\u003c/code\u003e en tant que périphérique HID-over-i2c, mais il ne\ns\u0026rsquo;attache pas à \u003ccode\u003eimt\u003c/code\u003e. Finalement, j\u0026rsquo;ai découvert que ce n\u0026rsquo;est pas un\npériphérique compatible PTP, mais conforme à l\u0026rsquo;ancien multitouch de type\nWindows 8. J\u0026rsquo;ai \u003ca href=\"https://github.com/jcs/openbsd-src/commit/a6499db211d988462561564cd3284b11501e42ac\" rel=\"external\"\u003ecommencé à ajouter\u003c/a\u003e\nun support pour ces périphériques de type Windows 8 à \u003ccode\u003ehidmt\u003c/code\u003e et déplacé\ndu code dupliqué dans \u003ccode\u003eumt\u003c/code\u003e et \u003ccode\u003eimt\u003c/code\u003e dans \u003ccode\u003ehidmt\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai aussi examiné les boutons de volume en haut de l\u0026rsquo;écran.\nMalheureusement, ils ne fonctionnent pas avec notre pilote\n\u003ca href=\"https://man.openbsd.org/acpisurface.4\" rel=\"external\"\u003e\u003ccode\u003eacpisurface\u003c/code\u003e\u003c/a\u003e existant, alors\nj\u0026rsquo;ai démarré un disque USB Linux et ai tracé leur fonctionnement.\nApparemment, c\u0026rsquo;est un périphérique \u0026ldquo;Intel 5-button Array\u0026rdquo; qui fonctionne\nvia ACPI. J\u0026rsquo;ai écrit un nouveau pilote\n\u003ca href=\"https://github.com/jcs/openbsd-src/commit/0befab1a6ae8708140d418d5affeb0a76d84ce4b\" rel=\"external\"\u003e\u003ccode\u003eacpihid\u003c/code\u003e\u003c/a\u003e\npour cela et les boutons de volume contrôlent maintenant le volume audio.\nIl y a certaines surcharges dans \u003ccode\u003eacpihid\u003c/code\u003e, dans la gestion du bouton\nd\u0026rsquo;alimentation et de la méthode d\u0026rsquo;interruption ACPI GPE standard, afin\nde recevoir la pression sur le bouton d\u0026rsquo;alimentation. J\u0026rsquo;ai donc dû prendre\nen compte  que \u003ccode\u003eacpibtn\u003c/code\u003e capture \u003ccode\u003eacpihid\u003c/code\u003e s\u0026rsquo;il est attaché. Ce serait\nbien s\u0026rsquo;il y avait une variable \u003ccode\u003esysctl\u003c/code\u003e comme \u003ccode\u003emachdep.lidaction\u003c/code\u003e qui\nspécifiait si le bouton d\u0026rsquo;alimentation était en mode arrêt, suspendu ou\nne faisait rien.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e29-08-2018\u003c/strong\u003e : Je voulais faire fonctionner les fonctions \u003ckbd\u003eF1\u003c/kbd\u003e\nà \u003ckbd\u003eF6\u003c/kbd\u003e du clavier (luminosité, lecture / pause, sourdine,\ndiminution / augmentation du volume) sur le Type Cover. Actuellement,\nchaque fois qu\u0026rsquo;ils sont pressés, le Type Cover redémarre, car le\nrétro-éclairage s\u0026rsquo;éteint et tous ses périphériques USB se détachent puis\nse reconnectent. En traçant comment cela fonctionne sous Linux, j\u0026rsquo;ai vu\nqu\u0026rsquo;il s\u0026rsquo;agissait essentiellement d\u0026rsquo;utiliser leur pilote générique\n\u003ccode\u003ehid-input\u003c/code\u003e, donc il ne devrait pas avoir besoin de le personnaliser.\nJ\u0026rsquo;ai commencé à travailler sur un pilote générique d\u0026rsquo;entrée USB HID\n(contrairement à \u003ccode\u003eukbd\u003c/code\u003e / \u003ccode\u003ehidkbd\u003c/code\u003e qui nécessite des utilisations\nspécifiques au clavier), mais j\u0026rsquo;ai eu des soucis sur\n\u003ca href=\"https://man.openbsd.org/usbhidaction\" rel=\"external\"\u003e\u003ccode\u003eusbhidaction\u003c/code\u003e\u003c/a\u003e que nous avons\ndéjà en base et qui devrait bien fonctionner pour cette tâche.\u003c/p\u003e\n\u003cp\u003eMalheureusement, \u003ccode\u003eusbhidaction\u003c/code\u003e requiert de connaître le chemin\nspécifique uhid du périphérique HID qui doit être contrôlé et le quitter\ndès que le périphérique disparaît. Pour la dalle Type Cover de la Surface,\nce périphérique peut changer en fonction de ce qui a été branché au\ndémarrage, et se détachera à chaque fois que la machine sera arrêtée\nalors \u003ccode\u003eusbhidaction\u003c/code\u003e s\u0026rsquo;arrêtera simplement.\u003c/p\u003e\n\u003cp\u003eAprès avoir passé beaucoup de temps à modifier \u003ccode\u003eusbhidaction\u003c/code\u003e pour\ninterroger le périphérique \u003ccode\u003e/dev/usbN\u003c/code\u003e afin d\u0026rsquo;attendre les ajouts et les\nsuppressions de périphérique, j\u0026rsquo;ai réalisé que la page de manuel était\nobsolète et que tous ces événements étaient sortis du noyau il y a\nplusieurs années. J\u0026rsquo;ai\n\u003ca href=\"https://github.com/openbsd/src/commit/a544fd91425c575826734076091eb434c3582ef6\" rel=\"external\"\u003eenlevé\u003c/a\u003e\ncette ligne dans la page de manuel.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e30-08-2018\u003c/strong\u003e : Afin d\u0026rsquo;être capable d\u0026rsquo;utiliser \u003ccode\u003eusbhidaction\u003c/code\u003e pour\nqu\u0026rsquo;il trouve automatiquement un périphérique USB en fonction de son\nfournisseur et de son identifiant, et être capable d\u0026rsquo;attendre que le\npériphérique s\u0026rsquo;affiche automatiquement, je l\u0026rsquo;ai connecté à\n\u003ca href=\"https://man.openbsd.org/hotplug\" rel=\"external\"\u003e\u003ccode\u003e/dev/hotplug\u003c/code\u003e\u003c/a\u003e. Malheureusement,\nhotplug ne prend en charge qu\u0026rsquo;un seul lecteur simultané. J\u0026rsquo;ai donc\n\u003ca href=\"https://github.com/jcs/openbsd-src/commit/1d49b6870e7d96ebdb72bc79b676479f47cfaaee\" rel=\"external\"\u003eimplémenté le clonage de périphérique\u003c/a\u003e\ndans le pilote \u003ccode\u003ehotplug\u003c/code\u003e afin que plusieurs processus puissent lire à\npartir de \u003ccode\u003e/dev/hotplug\u003c/code\u003e et que chacun reçoive sa propre file d\u0026rsquo;événements.\nJe l\u0026rsquo;ai envoyé par courrier électronique à la liste des développeurs\nOpenBSD et j\u0026rsquo;ai reçu quelques premiers commentaires à ce sujet.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai fait beaucoup de progrès sur les changements d’ \u003ccode\u003eusbhidaction\u003c/code\u003e, et\nje \u003ca href=\"https://github.com/jcs/openbsd-src/commit/bdd58222f11ff91a0576bd7506306b740307d38d\" rel=\"external\"\u003eles ai envoyés\u003c/a\u003e\ndans mon arborescence.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai également \u003ca href=\"https://github.com/openbsd/src/commit/a79e753a0f4aa24616d8aacea73b5502a256f5f5\" rel=\"external\"\u003eenvoyé\u003c/a\u003e\nun changement en amont pour créer 8 périphériques \u003ccode\u003e/dev/uhidN\u003c/code\u003e,\npuisqu\u0026rsquo;il n\u0026rsquo;y en avait que 4 auparavant.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e31-08-2018\u003c/strong\u003e : J\u0026rsquo;ai décidé d\u0026rsquo;abandonner mon support multitouch Windows\n8 pour le moment, car l\u0026rsquo;écran tactile devrait être utilisable avec le\nsupport de base par \u003ccode\u003eims\u003c/code\u003e (agissant comme une souris à un bouton).\nUtiliser \u003ccode\u003eimt\u003c/code\u003e signifiait de réclamer tous les rapports HID (25 !) sur\nle périphérique, ce qui brisait la prise en charge de l\u0026rsquo;utilisation d\u0026rsquo;un\nstylet et mon stylet Surface est arrivé, je voulais l\u0026rsquo;utiliser. De cette\nfaçon, \u003ccode\u003eims\u003c/code\u003e peut juste l\u0026rsquo;attacher au rapport de l\u0026rsquo;écran tactile et un\nautre \u003ccode\u003eims\u003c/code\u003e peut l\u0026rsquo;attacher au rapport de saisie du stylet.\u003c/p\u003e\n\u003cp\u003eEn faisant des \u003ccode\u003eims\u003c/code\u003e correspondant aux rapports de l\u0026rsquo;écran tactile, je\nsuis tombé sur ce qui ressemble à un bogue dans notre analyseur HID (ou,\nil n\u0026rsquo;est tout simplement pas pris en charge) où il correspondait à\nl\u0026rsquo;utilisation de pages qu\u0026rsquo;il ne devrait pas. Le résultat de ceci était\nque, quand \u003ccode\u003ehidms\u003c/code\u003e cherchait la page d\u0026rsquo;utilisation indiquant le minimum\nlogique et le maximum X / Y de l\u0026rsquo;écran (afin de pouvoir mapper les\ncoordonnées d\u0026rsquo;entrée de l\u0026rsquo;écran tactile sur l\u0026rsquo;affichage de l\u0026rsquo;écran), il\ny avait des utilisations pour d\u0026rsquo;autres choses sans rapport, cela faisait\npenser au pilote que l’écran était beaucoup plus grand qu’il ne l’était.\nLorsque je touchais l\u0026rsquo;écran et que je le parcourais complètement, cela\nne faisait déplacer le curseur que d\u0026rsquo;un quart environ.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai \u003ca href=\"https://marc.info/?l=openbsd-tech\u0026amp;m=153575195129139\u0026amp;w=2\" rel=\"external\"\u003eenvoyé un diff\u003c/a\u003e\nà \u003ccode\u003etech@\u003c/code\u003e pour contourner cet ims et attacher des \u003ccode\u003eims\u003c/code\u003e aux écrans tactiles.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e01-09-2018\u003c/strong\u003e : Les diff d\u0026rsquo;\u003ca href=\"https://github.com/openbsd/src/commit/cecb02cd4eb9c092e59ac7b37bad207101e1a50f\" rel=\"external\"\u003e\u003ccode\u003ehidms\u003c/code\u003e\u003c/a\u003e\net d\u0026rsquo;\u003ca href=\"https://github.com/openbsd/src/commit/f320308cc2368ecbbecc04b9caf0f74523c62ab0\" rel=\"external\"\u003e\u003ccode\u003eims\u003c/code\u003e\u003c/a\u003e\nont été acceptés. OpenBSD 6.4 prendra en charge l’écran tactile, le\nstylet, le clavier et le pavé tactile multitouch.\u003c/p\u003e\n\u003cp\u003eJe suis toujours en attente de retours sur mon changement de \u003ccode\u003ehotplug\u003c/code\u003e,\nce qui me permettra ensuite de développer plus profondément mes\nmodifications sur \u003ccode\u003eusbhidaction\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai aussi besoin de commencer à travailler sur un pilote pour le\npériphérique PCI Intel Sensor Hub qui me permettrait ensuite de prendre\nen charge le capteur de lumière ambiante et le gyroscope pour la\ndétection de la rotation. Cependant, en regardant le pilote Linux, il\nsemble qu\u0026rsquo;il y ait une tonne de code et bien sûr, il n’y a pas de\ndocumentation ouverte pour que je puisse trouver.\u003c/p\u003e\n\u003ch2 id=\"résumé-du-support-actuel-dopenbsd\"\u003eRésumé du support actuel d\u0026rsquo;OpenBSD\u003c/h2\u003e\n\u003cp\u003eLe statut est relatif à OpenBSD-current en date du 03-09- 2018.\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eComposant\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eFonctionnel\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eRemarques\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAdaptateur électrique AC\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePris en charge via \u003ca href=\"https://man.openbsd.org/acpiac.4\" rel=\"external\"\u003e\u003ccode\u003eacpiac\u003c/code\u003e\u003c/a\u003e et le statut est disponible via \u003ccode\u003eapm\u003c/code\u003e et \u003ccode\u003ehw.sensors\u003c/code\u003e , qui supporte également la charge via USB-C.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eDétecteur de lumière ambiante\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eNon\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eConnecté derrière un périphérique PCI Intel Sensor Hub qui nécessite un nouveau pilote.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eAudio\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eAudio HDA ​​avec un codec Realtek 298 pris en charge par \u003ca href=\"https://man.openbsd.org/azalia.4\" rel=\"external\"\u003e\u003ccode\u003eazalia\u003c/code\u003e\u003c/a\u003e.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eÉtat de la batterie\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePris en charge via \u003ca href=\"https://man.openbsd.org/acpibat.4\" rel=\"external\"\u003e\u003ccode\u003eacpibat\u003c/code\u003e\u003c/a\u003e et le status est disponible via \u003ccode\u003eapm\u003c/code\u003e et \u003ccode\u003ehw.sensors\u003c/code\u003e.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eBluetooth\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eNon\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eLe périphérique Atheros apparaît comme un périphérique \u003ca href=\"https://man.openbsd.org/ugen.4\" rel=\"external\"\u003e\u003ccode\u003eugen\u003c/code\u003e\u003c/a\u003e , mais OpenBSD ne prend pas en charge le Bluetooth. Peut être désactivé dans le BIOS.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLes caméras\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eNon\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eIl existe apparemment des caméras avant, arrière et infrarouge, dont aucune n\u0026rsquo;est prise en charge (ni souhaité). Peut être désactivées dans le BIOS.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLe Gyroscope\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eNon\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eConnecté derrière le périphérique PCI Intel Sensor Hub qui requiert un nouveau pilote qui pourrait alimenter le [[https://man.openbsd.org/man9/sensor_attach.9\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eHibernation\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eFonctionne bien avec \u003ccode\u003ezzz\u003c/code\u003e\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eSlot MicroSD\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eUn Realtek RTS522A, supporté par \u003ca href=\"https://man.openbsd.org/rtsx.4\" rel=\"external\"\u003e\u003ccode\u003ertsx\u003c/code\u003e\u003c/a\u003e.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLe SSD\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eLe périphérique Toshiba NVMe accessible via \u003ca href=\"https://man.openbsd.org/nvme.4\" rel=\"external\"\u003e\u003ccode\u003envme\u003c/code\u003e\u003c/a\u003e.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLe stylet\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eFonctionne sur l\u0026rsquo;écran tactile via \u003ca href=\"https://man.openbsd.org/ims.4\" rel=\"external\"\u003e\u003ccode\u003eims\u003c/code\u003e\u003c/a\u003e. Le bouton situé en haut du stylet nécessite la prise en charge du Bluetooth qui n\u0026rsquo;est pas pris en charge. Du fait que dwiic nécessite toujours l\u0026rsquo;interrogation de ces chipsets, dessiner avec le stylet n\u0026rsquo;est pas aussi fluide qu\u0026rsquo;avec des interruptions correctes.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMise en veille / Réveil\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eFonctionne bien à partir de \u003ccode\u003ezzz\u003c/code\u003e et en fermant le Type Cover contre l\u0026rsquo;écran. Il ne se réveille pas automatiquement lorsque vous retirez le Type Cover, il faut appuyer sur le bouton d\u0026rsquo;alimentation pour le réveiller.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eL\u0026rsquo;Écran tactile\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eHID-over-I2C, supporté par \u003ca href=\"https://man.openbsd.org/ims.4\" rel=\"external\"\u003e\u003ccode\u003eims\u003c/code\u003e\u003c/a\u003e.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLe clavier Type Cover\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eUSB, supporté par \u003ca href=\"https://man.openbsd.org/ukbd.4\" rel=\"external\"\u003e\u003ccode\u003eukbd\u003c/code\u003e\u003c/a\u003e. 3 niveaux de contrôle du rétroéclairage sont réglables par le clavier lui-même avec \u003ckbd\u003eF7\u003c/kbd\u003e. Les actions des touches \u003ckbd\u003eF1\u003c/kbd\u003e à \u003ckbd\u003eF6\u003c/kbd\u003e apparaissent dans le rapport 3 et peuvent être répondues avec \u003ccode\u003eusbhidaction -u 045e:096f -r 3\u003c/code\u003e.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLe pavé tactile Type Cover\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eUSB, pris en charge par mon nouveau pilote \u003ca href=\"https://man.openbsd.org/umt.4\" rel=\"external\"\u003e\u003ccode\u003eumt\u003c/code\u003e\u003c/a\u003e pour le multitouch à 5 doigts, le défilement à deux doigts, l\u0026rsquo;hystérésis et être capable de désactiver le tap-to-click qui est activé par défaut en mode souris normal.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eUSB\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eLe port USB-C fonctionne bien pour les données et la charge.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLa Vidéo\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e\u003ca href=\"https://man.openbsd.org/inteldrm.4\" rel=\"external\"\u003e\u003ccode\u003einteldrm\u003c/code\u003e\u003c/a\u003e a pris en charge Kaby Lake en ajoutant la vidéo accélérée, le DPMS, le contrôle gamma, le contrôle de rétroéclairage intégré et la reprise S3 appropriée.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eLes boutons de volume\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOui\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eIntel à 5 ​​boutons, pris en charge par mon nouveau pilote \u003ca href=\"https://github.com/jcs/openbsd-src/commit/0befab1a6ae8708140d418d5affeb0a76d84ce4b\" rel=\"external\"\u003e\u003ccode\u003eacpihid\u003c/code\u003e\u003c/a\u003e non encore importé en amont.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWifi\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eNon\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003ePuce sans fil Qualcomm Atheros QCA6174 802.11ac, non prise en charge. FreeBSD a un \u003ca href=\"https://github.com/erikarn/athp\" rel=\"external\"\u003eport en cours de  travail d’\u003ccode\u003eath10k\u003c/code\u003e\u003c/a\u003e partir de Linux (sous licence ISC) qui peut être porté. J\u0026rsquo;utilise actuellement un petit adaptateur sans fil USB-A qui est rendu moins volumineux par un adaptateur USB-A vers USB-C.\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eAvec l\u0026rsquo;aimable autorisation de Joshua Stein !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCette page est la traduction de la page\n\u003cstrong\u003e[OpenBSD on Microsoft Surface Go]]]\u003ca href=\"https://jcs.org/2018/08/31/surface_go\" rel=\"external\"\u003e1\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 'OpenBSD on the Microsoft Surface Go' de l'auteur Joshua Stein","tags":["Traduction","OpenBSD","Surface"],"date_published":"2018-09-01T16:25:22+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-06-19:/fr/trad/fausses-croyances-dev-temps-2#28d0734082a69d32d90208cc23ca985310f37397104642b11a2b5497c423da48","url":"https://it-log.fr.eu.org/fr/trad/fausses-croyances-dev-temps-2/","title":"D'autres fausses croyances des développeurs à-propos du temps","author":{"name":"Stéphane HUC"},"content_text":"Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;More Falsehoods programmers believe about time\u0026rdquo;, écrit par l\u0026rsquo;auteur Noah Sussman, sous Licence CC-By.\nD\u0026rsquo;autres fausses croyances des développeurs à-propos du temps (…)\nToutes ces hypothèses sont fausses :\nLes décalages entre deux fuseaux horaires resteront constants. OK, hormis les bizarreries historiques, les décalages entre deux fuseaux horaires ne changeront pas dans le futur. Les changements dans les décalages entre deux fuseaux horaires se produiront avec un préavis suffisant. L\u0026rsquo;heure d\u0026rsquo;été a lieu au même moment chaque année. L\u0026rsquo;heure d\u0026rsquo;été a lieu au même moment dans chaque fuseau horaire L\u0026rsquo;heure d\u0026rsquo;été s\u0026rsquo;ajuste toujours d\u0026rsquo;une heure Les mois ont soit 28, 29, 30, ou 31 jours. Le jour du mois avance toujours de manière contiguë de N vers N+1 ou 1, sans discontinuer. Un seul calendrier système est utilisé à la fois. Il y a une année bissextile chaque année divisible par 4. Les années non bissextiles ne contiendront jamais de jour bissextile. Il sera toujours facile de calculer la durée d\u0026rsquo;un nombre d\u0026rsquo;heures et de minutes à partir d\u0026rsquo;un point particulier du temps. Le même mois a le même nombre de jours, partout ! Le temps Unix est complètement ignorant de tout excepté des secondes. Le temps Unix est le nombre de secondes depuis le 1er Janvier 1970. Le jour précédent Samedi est toujours Vendredi. Les fuseaux horaires contiguës ne sont pas distant de plus d\u0026rsquo;une heure (ainsi nous n\u0026rsquo;avons pas besoin de tester ce qui arrive à l\u0026rsquo;avionique lors d\u0026rsquo;un survol de la Ligne de Date Internationale) Deux fuseaux horaires qui différent seront différents d\u0026rsquo;un nombre entier de demi-heures. OK, de quart d\u0026rsquo;heures. OK, de secondes, mais ce sera une différence constante si nous ignorons l\u0026rsquo;heure d\u0026rsquo;été. Si vous créez deux objets de date l\u0026rsquo;un à côté de l\u0026rsquo;autre, ils représenteront le même temps (un fantastique générateur d\u0026rsquo;Heisenbug). Vous pouvez vous attendre à ce que l\u0026rsquo;horloge atteigne exactement HH:MM:SS en échantillonnant une fois par seconde. Si un processus s\u0026rsquo;exécute pendant n secondes et puis se termine, il se sera passé approximativement n seconds par l\u0026rsquo;horloge système à la fin de l\u0026rsquo;exécution. Les semaines commencent un Lundi. Les jours commencent le matin. Les jours fériés contiennent un nombre entier de jours. Les fins de semaine consistent en Samedi et Dimanche. Il est possible d\u0026rsquo;établir un ordre complet d\u0026rsquo;horodatage qui est utile en-dehors de votre système. Le décalage de l\u0026rsquo;heure locale (depuis UTC) ne changera pas durant les heures de bureau. Thread.sleep(1000) dort durant 1000 millisecondes Thread.sleep(1000) dort durant un temps ≥ 1000 millisecondes. Il y a 60 secondes dans chaque minute Les horodatages avancent toujours de manière monotone. GMT et UTC sont les mêmes fuseaux horaires. La Grande-Bretagne utilise GMT. Le temps va toujours de l\u0026rsquo;avant. La différence entre le temps actuel et une semaine par rapport à l\u0026rsquo;heure actuelle est toujours de 7 * 86400 secondes. La différence entre deux horodatages est une mesure précise du temps écoulée entre les deux. 24:12:34 est une heure invalide. Chaque nombre entier est une année théorique possible. Si vous affichez une date, l\u0026rsquo;heure affichée a la même seconde que l\u0026rsquo;heure stockée. Ou la même année. Mais au moins la différence numérique entre l\u0026rsquo;année affichée et celle enregistrée sera au minimum de 2. Si vous avez une date dans le format correct YYYY-MM-DD, l\u0026rsquo;année est constituée de quatre caractères. Si vous fusionnez deux dates, en prenant le mois de la première et le jour ou l\u0026rsquo;année de la seconde, vous aurez une date valide. Mais cela fonctionnera, si les deux années sont des années bissextiles. Si vous prenez un algorithme publié par le W3C pour le calcul de durées de dates, cela fonctionnera dans tous les cas. La bibliothèque standard supporte les années négatives et les années au-delà de 10000. Les fuseaux horaires différent toujours d\u0026rsquo;une heure pleine. Si vous convertissez un horodatage avec une précision de la milliseconde vers une date et une heure avec la précision de la seconde, vous pouvez ignorez les millisecondes. Mais vous pouvez ignorez les millisecondes, s\u0026rsquo;il y en a moins que 0.5 Les années à deux chiffres doivent être situées entre 1900 et 2099 Si vous analysez une date et une heure, vous pouvez lire les nombres caractère par caractère, sans avoir besoin de revenir en arrière. Mais si vous imprimez une date et une heure, vous pouvez écrire les nombres caractère par caractère, sans avoir besoin de revenir en arrière. Vous n\u0026rsquo;aurez jamais besoin d\u0026rsquo;analyser un format tel que \u0026mdash;12Z ou P12Y34M56DT78H90M12.345S Il y a seulement 24 fuseaux horaires. Les fuseaux horaires sont toujours a des heures complètes depuis UTC. L\u0026rsquo;heure d\u0026rsquo;été (DST) commence et termine à la même date partout. L\u0026rsquo;heure d\u0026rsquo;été est toujours avancée d\u0026rsquo;une heure. Lire l\u0026rsquo;horloge d\u0026rsquo;un client et la comparer avec UTC est une bonne manière de déterminer leur fuseau horaire. La pile logicielle essaiera ou n\u0026rsquo;essaiera pas automatiquement d\u0026rsquo;ajuster le fuseau horaire ou l\u0026rsquo;heure d\u0026rsquo;été. Mon logiciel est seulement utilisé en interne ou localement, aussi je n\u0026rsquo;ai pas besoin de me soucier des fuseaux horaires. Ma pile logicielle la gérera sans que j\u0026rsquo;ai quoique ce soit de spécial à faire. Je peux facilement maintenir par moi-même une liste de fuseau horaire. Toutes les mesures de temps d\u0026rsquo;une horloge donnée se feront dans le même cadre de référence. Les années ont 365 ou 366 jours. Chaque date calendaire est suivie de la suivante dans l\u0026rsquo;ordre, sans saut. Une date ou une heure donnée sans ambiguïté identifie un moment unique. Les années bissextiles arrivent tous les 4 ans. Vous pouvez déterminer le fuseau horaire depuis l\u0026rsquo;état ou la province. Vous pouvez déterminer le fuseau horaire depuis la cité ou la ville. Le temps passe à la même vitesse du haut d\u0026rsquo;une montagne et en bas d\u0026rsquo;une vallée. Une heure est aussi longue que la suivante dans tous les systèmes de temps. Vous pouvez calculer quand les secondes intercalaires seront ajoutées. La précision d\u0026rsquo;un type de donnée retournée par une fonction getCurrentTime() est la même que la précision de la fonction. Deux appels subséquents à la fonction getCurrentTime() retourneront des résultats distincts. Le second de deux appels subséquents à la fonction getCurrentTime() aura un résultat plus grand. Le logiciel ne fonctionnera jamais sur un vaisseau spatial en orbite d\u0026rsquo;un trou noir. Sérieusement ? Des trous noirs ?\nHé, si Bruce Sterling dit que mon logiciel a besoin d\u0026rsquo;être résilient contre les distorsions du temps causé par les trous noirs, je vais être attentif à ce propos.\nLe reste n\u0026rsquo;est volontairement pas traduit du fait de remerciements de l\u0026rsquo;auteur envers plusieurs personnes…\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\n\u0026ldquo;\u003cstrong\u003e\u003ca href=\"http://infiniteundo.com/post/25509354022/more-falsehoods-programmers-believe-about-time\" rel=\"external\"\u003eMore Falsehoods programmers believe about time\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit par l\u0026rsquo;auteur Noah Sussman, sous Licence CC-By.\u003c/p\u003e\n\u003chr\u003e\n\u003ch1 id=\"dautres-fausses-croyances-des-développeurs-à-propos-du-temps\"\u003eD\u0026rsquo;autres fausses croyances des développeurs à-propos du temps\u003c/h1\u003e\n\u003cp\u003e(…)\u003c/p\u003e\n\u003cp\u003eToutes ces hypothèses sont fausses :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eLes décalages entre deux fuseaux horaires resteront constants.\u003c/li\u003e\n\u003cli\u003eOK, hormis les bizarreries historiques, les décalages entre deux\nfuseaux horaires ne changeront pas dans le futur.\u003c/li\u003e\n\u003cli\u003eLes changements dans les décalages entre deux fuseaux horaires se\nproduiront avec un préavis suffisant.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;heure d\u0026rsquo;été a lieu au même moment chaque année.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;heure d\u0026rsquo;été a lieu au même moment dans chaque fuseau horaire\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;heure d\u0026rsquo;été s\u0026rsquo;ajuste toujours d\u0026rsquo;une heure\u003c/li\u003e\n\u003cli\u003eLes mois ont soit 28, 29, 30, ou 31 jours.\u003c/li\u003e\n\u003cli\u003eLe jour du mois avance toujours de manière contiguë de N vers N+1 ou\n1, sans discontinuer.\u003c/li\u003e\n\u003cli\u003eUn seul calendrier système est utilisé à la fois.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://support.microsoft.com/en-us/help/214326/excel-incorrectly-assumes-that-the-year-1900-is-a-leap-year\" rel=\"external\"\u003eIl y a une année bissextile chaque année divisible par 4\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eLes années non bissextiles ne contiendront jamais de jour bissextile.\u003c/li\u003e\n\u003cli\u003eIl sera toujours facile de calculer la durée d\u0026rsquo;un nombre d\u0026rsquo;heures et\nde minutes à partir d\u0026rsquo;un point particulier du temps.\u003c/li\u003e\n\u003cli\u003eLe même mois a le même nombre de jours, partout !\u003c/li\u003e\n\u003cli\u003eLe temps Unix est complètement ignorant de tout excepté des secondes.\u003c/li\u003e\n\u003cli\u003eLe temps Unix est le nombre de secondes depuis le 1er Janvier 1970.\u003c/li\u003e\n\u003cli\u003eLe jour précédent Samedi est toujours Vendredi.\u003c/li\u003e\n\u003cli\u003eLes fuseaux horaires contiguës ne sont pas distant de plus d\u0026rsquo;une\nheure (ainsi nous n\u0026rsquo;avons pas besoin de tester ce qui arrive à\nl\u0026rsquo;avionique lors d\u0026rsquo;un survol de la Ligne de Date Internationale)\u003c/li\u003e\n\u003cli\u003eDeux fuseaux horaires qui différent seront différents d\u0026rsquo;un nombre\nentier de demi-heures.\u003c/li\u003e\n\u003cli\u003eOK, de quart d\u0026rsquo;heures.\u003c/li\u003e\n\u003cli\u003eOK, de secondes, mais ce sera une différence constante si nous\nignorons l\u0026rsquo;heure d\u0026rsquo;été.\u003c/li\u003e\n\u003cli\u003eSi vous créez deux objets de date l\u0026rsquo;un à côté de l\u0026rsquo;autre, ils\nreprésenteront le même temps (un fantastique générateur d\u0026rsquo;Heisenbug).\u003c/li\u003e\n\u003cli\u003eVous pouvez vous attendre à ce que l\u0026rsquo;horloge atteigne exactement\nHH:MM:SS en échantillonnant une fois par seconde.\u003c/li\u003e\n\u003cli\u003eSi un processus s\u0026rsquo;exécute pendant n secondes et puis se termine, il\nse sera passé approximativement n seconds par l\u0026rsquo;horloge système à la\nfin de l\u0026rsquo;exécution.\u003c/li\u003e\n\u003cli\u003eLes semaines commencent un Lundi.\u003c/li\u003e\n\u003cli\u003eLes jours commencent le matin.\u003c/li\u003e\n\u003cli\u003eLes jours fériés contiennent un nombre entier de jours.\u003c/li\u003e\n\u003cli\u003eLes fins de semaine consistent en Samedi et Dimanche.\u003c/li\u003e\n\u003cli\u003eIl est possible d\u0026rsquo;établir un ordre complet d\u0026rsquo;horodatage qui est\nutile en-dehors de votre système.\u003c/li\u003e\n\u003cli\u003eLe décalage de l\u0026rsquo;heure locale (depuis UTC) ne changera pas durant\nles heures de bureau.\u003c/li\u003e\n\u003cli\u003eThread.sleep(1000) dort durant 1000 millisecondes\u003c/li\u003e\n\u003cli\u003eThread.sleep(1000) dort durant un temps ≥ 1000 millisecondes.\u003c/li\u003e\n\u003cli\u003eIl y a 60 secondes dans chaque minute\u003c/li\u003e\n\u003cli\u003eLes horodatages \u003ca href=\"https://www.metafilter.com/117073/Falsehoods-Programmers-Believe#4405410\" rel=\"external\"\u003eavancent toujours de manière monotone\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eGMT et UTC sont les mêmes fuseaux horaires.\u003c/li\u003e\n\u003cli\u003eLa Grande-Bretagne utilise GMT.\u003c/li\u003e\n\u003cli\u003eLe temps va toujours de l\u0026rsquo;avant.\u003c/li\u003e\n\u003cli\u003eLa différence entre le temps actuel et une semaine par rapport à\nl\u0026rsquo;heure actuelle est toujours de 7 * 86400 secondes.\u003c/li\u003e\n\u003cli\u003eLa différence entre deux horodatages est une mesure précise du temps\nécoulée entre les deux.\u003c/li\u003e\n\u003cli\u003e24:12:34 est une heure invalide.\u003c/li\u003e\n\u003cli\u003eChaque nombre entier est une année théorique possible.\u003c/li\u003e\n\u003cli\u003eSi vous affichez une date, l\u0026rsquo;heure affichée a la même seconde que\nl\u0026rsquo;heure stockée.\u003c/li\u003e\n\u003cli\u003eOu la même année.\u003c/li\u003e\n\u003cli\u003eMais au moins la différence numérique entre l\u0026rsquo;année affichée et\ncelle enregistrée sera au minimum de 2.\u003c/li\u003e\n\u003cli\u003eSi vous avez une date dans le format correct YYYY-MM-DD, l\u0026rsquo;année est\nconstituée de quatre caractères.\u003c/li\u003e\n\u003cli\u003eSi vous fusionnez deux dates, en prenant le mois de la première et\nle jour ou l\u0026rsquo;année de la seconde, vous aurez une date valide.\u003c/li\u003e\n\u003cli\u003eMais cela fonctionnera, si les deux années sont des années bissextiles.\u003c/li\u003e\n\u003cli\u003eSi vous prenez un algorithme publié par le W3C pour le calcul de\ndurées de dates, cela fonctionnera dans tous les cas.\u003c/li\u003e\n\u003cli\u003eLa bibliothèque standard supporte les années négatives et les années\nau-delà de 10000.\u003c/li\u003e\n\u003cli\u003eLes fuseaux horaires différent toujours d\u0026rsquo;une heure pleine.\u003c/li\u003e\n\u003cli\u003eSi vous convertissez un horodatage avec une précision de la\nmilliseconde vers une date et une heure avec la précision de la\nseconde, vous pouvez ignorez les millisecondes.\u003c/li\u003e\n\u003cli\u003eMais vous pouvez ignorez les millisecondes, s\u0026rsquo;il y en a moins que 0.5\u003c/li\u003e\n\u003cli\u003eLes années à deux chiffres doivent être situées entre 1900 et 2099\u003c/li\u003e\n\u003cli\u003eSi vous analysez une date et une heure, vous pouvez lire les nombres\ncaractère par caractère, sans avoir besoin de revenir en arrière.\u003c/li\u003e\n\u003cli\u003eMais si vous imprimez une date et une heure, vous pouvez écrire les\nnombres caractère par caractère, sans avoir besoin de revenir en\narrière.\u003c/li\u003e\n\u003cli\u003eVous n\u0026rsquo;aurez jamais besoin d\u0026rsquo;analyser un format tel que \u003cstrong\u003e\u0026mdash;12Z\u003c/strong\u003e\nou \u003cstrong\u003eP12Y34M56DT78H90M12.345S\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eIl y a seulement 24 fuseaux horaires.\u003c/li\u003e\n\u003cli\u003eLes fuseaux horaires sont toujours a des heures complètes depuis UTC.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;heure d\u0026rsquo;été (DST) commence et termine à la même date partout.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;heure d\u0026rsquo;été est toujours avancée d\u0026rsquo;une heure.\u003c/li\u003e\n\u003cli\u003eLire l\u0026rsquo;horloge d\u0026rsquo;un client et la comparer avec UTC est une bonne\nmanière de déterminer leur fuseau horaire.\u003c/li\u003e\n\u003cli\u003eLa pile logicielle essaiera ou n\u0026rsquo;essaiera pas automatiquement\nd\u0026rsquo;ajuster le fuseau horaire ou l\u0026rsquo;heure d\u0026rsquo;été.\u003c/li\u003e\n\u003cli\u003eMon logiciel est seulement utilisé en interne ou localement, aussi\nje n\u0026rsquo;ai pas besoin de me soucier des fuseaux horaires.\u003c/li\u003e\n\u003cli\u003eMa pile logicielle la gérera sans que j\u0026rsquo;ai quoique ce soit de\nspécial à faire.\u003c/li\u003e\n\u003cli\u003eJe peux facilement maintenir par moi-même une liste de fuseau horaire.\u003c/li\u003e\n\u003cli\u003eToutes les mesures de temps d\u0026rsquo;une horloge donnée se feront dans le\nmême \u003ca href=\"https://www.reddit.com/r/programming/comments/v8s0y/falsehoods_programmers_believe_about_time/c52kqpa/\" rel=\"external\"\u003ecadre de référence\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eLes années ont 365 ou 366 jours.\u003c/li\u003e\n\u003cli\u003eChaque date calendaire est suivie de la suivante dans l\u0026rsquo;ordre, sans\nsaut.\u003c/li\u003e\n\u003cli\u003eUne date ou une heure donnée sans ambiguïté identifie un moment unique.\u003c/li\u003e\n\u003cli\u003eLes années bissextiles arrivent tous les 4 ans.\u003c/li\u003e\n\u003cli\u003eVous pouvez déterminer le fuseau horaire depuis l\u0026rsquo;état ou la province.\u003c/li\u003e\n\u003cli\u003eVous pouvez déterminer le fuseau horaire depuis la cité ou la ville.\u003c/li\u003e\n\u003cli\u003eLe temps passe à la même vitesse du haut d\u0026rsquo;une montagne et en bas\nd\u0026rsquo;une vallée.\u003c/li\u003e\n\u003cli\u003eUne heure est aussi longue que la suivante dans tous les systèmes de\ntemps.\u003c/li\u003e\n\u003cli\u003eVous pouvez calculer quand les secondes intercalaires seront ajoutées.\u003c/li\u003e\n\u003cli\u003eLa précision d\u0026rsquo;un type de donnée retournée par une fonction\ngetCurrentTime() est la même que la précision de la fonction.\u003c/li\u003e\n\u003cli\u003eDeux appels subséquents à la fonction getCurrentTime() retourneront\ndes résultats distincts.\u003c/li\u003e\n\u003cli\u003eLe second de deux appels subséquents à la fonction getCurrentTime()\naura un résultat plus grand.\u003c/li\u003e\n\u003cli\u003eLe logiciel ne fonctionnera jamais sur un vaisseau spatial en orbite\nd\u0026rsquo;un trou noir.\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eSérieusement ? Des trous noirs ?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eHé, si\n\u003ca href=\"https://www.wired.com/2012/06/falsehoods-programmers-believe-about-time/\" rel=\"external\"\u003eBruce Sterling dit que mon logiciel a besoin d\u0026rsquo;être résilient contre les distorsions du temps causé par les trous noirs\u003c/a\u003e,\nje vais être attentif à ce propos.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eLe reste n\u0026rsquo;est volontairement pas traduit du fait de remerciements de\nl\u0026rsquo;auteur envers plusieurs personnes…\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 'More Falsehoods programmers believe about time' de l'auteur Noah Sussman, sous Licence CC-By","tags":["Traduction","Dev","Temps"],"date_published":"2018-06-19T13:26:06+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-06-19:/fr/trad/fausses-croyances-dev-temps#a690622426ac736c315430d28928fec3daab5f19b0e36b91629e39e390f6d865","url":"https://it-log.fr.eu.org/fr/trad/fausses-croyances-dev-temps/","title":"Fausses croyances des développeurs à-propos du temps","author":{"name":"Stéphane HUC"},"content_text":"Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;Falsehoods programmers believe about time\u0026rdquo;, écrit par l\u0026rsquo;auteur Noah Sussman, sous Licence CC-By.\nFausses croyances des développeurs à-propos du temps (…)\nToutes ces hypothèses sont fausses :\nIl y a toujours 24 heures dans une journée. Les mois ont soit 30 ou 31 jours. Les années ont 365 jours. Février a toujours 28 jours. Une période de 24 heures commencera toujours ou terminera durant le même jour, (ou la semaine, ou le mois). Une semaine commence toujours et termine dans le même mois. Une semaine (ou un mois) commence toujours et termine dans la même année. La machine sur laquelle le programme fonctionne sera toujours dans le fuseau horaire GMT. OK, ce n\u0026rsquo;est pas vrai. Mais au moins le fuseau horaire dans lequel le programme fonctionne ne changera jamais. Bien, assurément il n\u0026rsquo;y aura jamais de changement de fuseau horaire dans lequel un programme s\u0026rsquo;exécute en production. L\u0026rsquo;horloge système sera toujours paramétrée à une heure locale correcte. L\u0026rsquo;horloge système sera toujours paramétrée à une heure qui n\u0026rsquo;est pas très différente de l\u0026rsquo;heure locale correcte. Si l\u0026rsquo;horloge système est incorrecte, il y aura toujours le même nombre constant de secondes. L\u0026rsquo;horloge du serveur et celle du client seront toujours paramétrées sur la même heure. L\u0026rsquo;horloge du serveur et celle du client seront toujours paramétrées à peu près à la même heure. OK, mais l\u0026rsquo;heure du serveur et celle du client ne seront jamais différentes au-delà de la maîtrise des décennies. Si l\u0026rsquo;horloge du serveur et celle du client ne sont pas synchronisées, elles seront toujours au moins désynchronisées d\u0026rsquo;un nombre constant de secondes. L\u0026rsquo;horloge du serveur et celle du client utiliseront le même fuseau horaire. L\u0026rsquo;horloge système ne sera jamais paramétrée sur une heure d\u0026rsquo;un passé distant ou d\u0026rsquo;un lointain future. Le temps n\u0026rsquo;a pas de commencement et pas de fin. Une minute d\u0026rsquo;une horloge système a exactement la même durée qu\u0026rsquo;une minute sur une autre horloge. OK, mais la durée d\u0026rsquo;une minute d\u0026rsquo;une horloge système sera la plus proche de la durée d\u0026rsquo;une minute sur la plupart des autres horloges. D\u0026rsquo;accord, mais la durée d\u0026rsquo;une minute d\u0026rsquo;une horloge système ne sera jamais plus grande que celle d\u0026rsquo;une heure. Tu n\u0026rsquo;es pas sérieux. La plus petite unité du temps est la seconde. OK, une mili-seconde Il ne sera jamais nécessaire de régler l\u0026rsquo;heure du système sur une autre valeur que celle de l\u0026rsquo;heure locale correcte. OK, les tests peuvent nécessiter le paramétrage de l\u0026rsquo;heure du système sur une autre valeur que celle de l\u0026rsquo;heure locale mais il ne sera jamais nécessaire de faire cela en production. L\u0026rsquo;horodatage sera toujours spécifié dans un format communément compris, tel que 1339972628 ou 133997262837. L\u0026rsquo;horodatage sera toujours spécifié dans un même format. L\u0026rsquo;horodatage aura toujours le même niveau de précision. Un horodatage d\u0026rsquo;une précision suffisante peut être considéré unique en toute sécurité. Un horodatage représente l\u0026rsquo;heure à laquelle un événement s\u0026rsquo;est produit. Les dates humainement compréhensibles peuvent être spécifiées dans un format universellement compris tel que 05/07/11. La réflexion à-propos du fait que la minute puisse être plus longue qu\u0026rsquo;une heure est une blague, n\u0026rsquo;est-ce pas ?\nNon.\nC\u0026rsquo;est un fascinant bogue dans de vieilles version de KVM sur CentOS. Spécifiquement, une machine virtuelle KVM ne savait pas qu\u0026rsquo;elle ne fonctionnait pas sur du matériel physique. Cela signifiait que le système hôte mettait la VM dans un état de veille, l\u0026rsquo;horloge système virtualisée conservait le temps qu\u0026rsquo;elle avait au moment de sa suspension.\nP. ex. si la VM était suspendue à 13:00 et qu\u0026rsquo;elle était remise à un état d\u0026rsquo;activité deux heures plus tard (à 15:00), l\u0026rsquo;horloge système sur la VM reflétait toujours l\u0026rsquo;heure locale à 13:00. Le résultat était que chaque fois qu\u0026rsquo;une machine virtuelle KVM devenait inactive, l\u0026rsquo;OS hôte la mettait dans un état suspendu et l\u0026rsquo;horloge système de la machine virtuelle commençait à s\u0026rsquo;éloigner de la réalité, parfois d\u0026rsquo;une large marge en fonction de la durée pendant laquelle la machine virtuelle était restée inactive.\nIl y avait une tâche cron qui pouvait être installée pour garder l\u0026rsquo;horloge système virtualisée en ligne avec l\u0026rsquo;horloge matérielle de l\u0026rsquo;OS hôte. Mais il était facile d\u0026rsquo;oublier de le faire sur de nouvelles VMs et l\u0026rsquo;échec à le faire a conduit à beaucoup d\u0026rsquo;hilarité. Le bogue a été corrigé dans les versions plus récentes.\nLe reste n\u0026rsquo;est volontairement pas traduit du fait de remerciements de l\u0026rsquo;auteur envers plusieurs personnes…\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\n\u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://infiniteundo.com/post/25326999628/falsehoods-programmers-believe-about-time\" rel=\"external\"\u003eFalsehoods programmers believe about time\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit par l\u0026rsquo;auteur Noah Sussman, sous Licence CC-By.\u003c/p\u003e\n\u003chr\u003e\n\u003ch1 id=\"fausses-croyances-des-développeurs-à-propos-du-temps\"\u003eFausses croyances des développeurs à-propos du temps\u003c/h1\u003e\n\u003cp\u003e(…)\u003c/p\u003e\n\u003cp\u003eToutes ces hypothèses sont fausses :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eIl y a toujours 24 heures dans une journée.\u003c/li\u003e\n\u003cli\u003eLes mois ont soit 30 ou 31 jours.\u003c/li\u003e\n\u003cli\u003eLes années ont 365 jours.\u003c/li\u003e\n\u003cli\u003eFévrier a toujours 28 jours.\u003c/li\u003e\n\u003cli\u003eUne période de 24 heures commencera toujours ou terminera durant le\nmême jour, (ou la semaine, ou le mois).\u003c/li\u003e\n\u003cli\u003eUne semaine commence toujours et termine dans le même mois.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.reddit.com/r/programming/comments/v8s0y/falsehoods_programmers_believe_about_time/c52k8m9/\" rel=\"external\"\u003eUne semaine (ou un mois) commence toujours et termine dans la même année\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eLa machine sur laquelle le programme fonctionne sera toujours dans le\nfuseau horaire GMT.\u003c/li\u003e\n\u003cli\u003eOK, ce n\u0026rsquo;est pas vrai. Mais au moins le fuseau horaire dans lequel le\nprogramme fonctionne ne changera jamais.\u003c/li\u003e\n\u003cli\u003eBien, assurément il n\u0026rsquo;y aura jamais de changement de fuseau horaire\ndans lequel un programme s\u0026rsquo;exécute \u003cem\u003een production\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;horloge système sera toujours paramétrée à une heure locale correcte.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;horloge système sera toujours paramétrée à une heure qui n\u0026rsquo;est pas\ntrès différente de l\u0026rsquo;heure locale correcte.\u003c/li\u003e\n\u003cli\u003eSi l\u0026rsquo;horloge système est incorrecte, il y aura toujours le même nombre\nconstant de secondes.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;horloge du serveur et celle du client seront toujours paramétrées\nsur la même heure.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;horloge du serveur et celle du client seront toujours paramétrées à\npeu près à la même heure.\u003c/li\u003e\n\u003cli\u003eOK, mais l\u0026rsquo;heure du serveur et celle du client ne seront jamais\ndifférentes au-delà de la maîtrise \u003cem\u003edes décennies\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eSi l\u0026rsquo;horloge du serveur et celle du client ne sont pas synchronisées,\nelles seront toujours au moins désynchronisées d\u0026rsquo;un nombre constant\nde secondes.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;horloge du serveur et celle du client utiliseront le même fuseau\nhoraire.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;horloge système ne sera jamais paramétrée sur une heure d\u0026rsquo;un passé\ndistant ou d\u0026rsquo;un lointain future.\u003c/li\u003e\n\u003cli\u003eLe temps n\u0026rsquo;a pas de commencement et \u003ca href=\"https://en.wikipedia.org/wiki/Year_2038_problem\" rel=\"external\"\u003epas de fin\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eUne minute d\u0026rsquo;une horloge système a exactement la même durée qu\u0026rsquo;une\nminute sur \u003ca href=\"https://en.wikipedia.org/wiki/Atomic_clock\" rel=\"external\"\u003eune autre horloge\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eOK, mais la durée d\u0026rsquo;une minute d\u0026rsquo;une horloge système sera la plus\nproche de la durée d\u0026rsquo;une minute sur la plupart des autres horloges.\u003c/li\u003e\n\u003cli\u003eD\u0026rsquo;accord, mais la durée d\u0026rsquo;une minute d\u0026rsquo;une horloge système ne sera\njamais plus grande  que celle d\u0026rsquo;une heure.\u003c/li\u003e\n\u003cli\u003eTu n\u0026rsquo;es pas sérieux.\u003c/li\u003e\n\u003cli\u003eLa plus petite unité du temps est la seconde.\u003c/li\u003e\n\u003cli\u003eOK, une mili-seconde\u003c/li\u003e\n\u003cli\u003eIl ne sera jamais nécessaire de régler l\u0026rsquo;heure du système sur une\nautre valeur que celle de l\u0026rsquo;heure locale correcte.\u003c/li\u003e\n\u003cli\u003eOK, \u003cem\u003eles tests\u003c/em\u003e peuvent nécessiter le paramétrage de l\u0026rsquo;heure du\nsystème sur une autre valeur que celle de l\u0026rsquo;heure locale mais il ne\nsera jamais nécessaire de faire cela \u003cem\u003een production\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;horodatage sera toujours spécifié dans un format communément compris,\ntel que 1339972628 ou 133997262837.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;horodatage sera toujours spécifié dans un même format.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;horodatage aura toujours le même niveau de précision.\u003c/li\u003e\n\u003cli\u003eUn horodatage d\u0026rsquo;une précision suffisante peut être considéré unique en\ntoute sécurité.\u003c/li\u003e\n\u003cli\u003eUn horodatage représente l\u0026rsquo;heure à laquelle un événement s\u0026rsquo;est produit.\u003c/li\u003e\n\u003cli\u003eLes dates humainement compréhensibles peuvent être spécifiées dans un\nformat universellement compris tel que 05/07/11.\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eLa réflexion à-propos du fait que la minute puisse être plus longue\nqu\u0026rsquo;une heure est une blague, n\u0026rsquo;est-ce pas ?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eNon.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est un fascinant bogue dans de vieilles version de\n\u003ca href=\"https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine\" rel=\"external\"\u003eKVM\u003c/a\u003e sur\nCentOS. Spécifiquement, une machine virtuelle KVM ne savait pas qu\u0026rsquo;elle\nne fonctionnait pas sur du matériel physique. Cela signifiait que le\nsystème hôte mettait la VM dans un état de veille, l\u0026rsquo;horloge système\nvirtualisée conservait le temps qu\u0026rsquo;elle avait \u003cem\u003eau moment de sa suspension\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eP. ex. si la VM était suspendue à 13:00 et qu\u0026rsquo;elle était remise à un\nétat d\u0026rsquo;activité deux heures plus tard (à 15:00), l\u0026rsquo;horloge système sur\nla VM reflétait toujours l\u0026rsquo;heure locale à 13:00. Le résultat était que\nchaque fois qu\u0026rsquo;une machine virtuelle KVM devenait inactive, l\u0026rsquo;OS hôte la\nmettait dans un état suspendu et l\u0026rsquo;horloge système de la machine\nvirtuelle commençait à s\u0026rsquo;éloigner de la réalité, parfois d\u0026rsquo;une large\nmarge en fonction de la durée pendant laquelle la machine virtuelle\nétait restée inactive.\u003c/p\u003e\n\u003cp\u003eIl y avait une tâche cron qui pouvait être installée pour garder\nl\u0026rsquo;horloge système virtualisée en ligne avec l\u0026rsquo;horloge matérielle de l\u0026rsquo;OS\nhôte. Mais il était facile d\u0026rsquo;oublier de le faire sur de nouvelles VMs et\nl\u0026rsquo;échec à le faire a conduit à beaucoup d\u0026rsquo;hilarité. Le bogue a été\ncorrigé dans les versions plus récentes.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eLe reste n\u0026rsquo;est volontairement pas traduit du fait de remerciements de\nl\u0026rsquo;auteur envers plusieurs personnes…\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 'Falsehoods programmers believe about time' de l'auteur Noah Sussman, sous Licence CC-By","tags":["Traduction","Dev","Temps"],"date_published":"2018-06-19T13:11:11+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-06-09:/fr/trad/tumfatig.net/openbsd-collectd-influxdb-grafana#958c220a7c1f4f904ad28e7dd0dd60184e3b06ae1c45a37f7333f9845c3141d8","url":"https://it-log.fr.eu.org/fr/trad/tumfatig.net/openbsd-collectd-influxdb-grafana/","title":"Monitorer OpenBSD en utilisant CollectD, InfluxDB et Grafana","author":{"name":"Stéphane HUC"},"content_text":"Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;Monitoring OpenBSD using CollectD, InfluxDB and Grafana\u0026rdquo;, écrit par Joel Carnat.\nMonitorer OpenBSD en utilisant CollectD, InfluxDB et Grafana OS concerné : 6.2-current et \u0026gt; Logiciels packagés : CollectD, InfluxDB, Grafana Regardons comment monitorer OpenBSD en utilisant le collecteur CollectD et le tableau de bord de rendu Grafana. OpenBSD 6.2-current fournit les packages InfluxDB et Grafana. Une superbe pile pour obtenir de jolis graphiques.\nHébergement des données Les métriques du système sont stockés dans InfluxDB ; parce qu\u0026rsquo;il peut être utilisé comme ressource pour Grafana. L\u0026rsquo;installation et la configuration sont simples. L\u0026rsquo;essentiel est d\u0026rsquo;activer le protocole de collecte collectd.\n# pkg_add influxdb # vi /etc/influxdb/influxdb.conf (...) [[collectd]] enabled = true bind-address = \u0026#34;:25826\u0026#34; database = \u0026#34;collectd\u0026#34; retention-policy = \u0026#34;\u0026#34; typesdb = \u0026#34;/usr/local/share/collectd\u0026#34; # rcctl enable influxdb # rcctl start influxdb Notez que ce service fonctionne seulement sur UDP. Il semble ne pas y avoir d\u0026rsquo;options disponibles pour TCP ni TLS.\n# netstat -na | grep 25826 udp 0 0 *.25826 *.* Collecter les données Utilisons CollectD en tant que collecteur des métriques. Surtout parce qu\u0026rsquo;il connaît OpenBSD et qu\u0026rsquo;il est capable d\u0026rsquo;envoyer ses données à distance. Dans ce cas, à InfluxDB. Activez tous les plugins requis.\nN\u0026rsquo;oubliez pas celui relatif au réseau afin que les données soient envoyées à InfluxDB.\n# pkg_add collectd # vi /etc/collectd.conf (...) \u0026lt;Plugin network\u0026gt; \u0026lt;Server \u0026#34;127.0.0.1\u0026#34; \u0026#34;25826\u0026#34;\u0026gt; \u0026lt;/Server\u0026gt; ReportStats true \u0026lt;/Plugin\u0026gt; # rcctl enable collectd # rcctl start collectd Restituer les données Ce qui est nouveau dans la version current d\u0026rsquo;OpenBSD 6.2 : Grafana est disponible en tant que package. Cela permettra de faire de jolis graphiques en utilisant OpenBSD.\n# pkg_add grafana # vi /etc/grafana/config.ini # rcctl enable grafana # rcctl start grafana Ouvrez votre navigateur web à l\u0026rsquo;adresse http://localhost:3000/ et connectez vous en utilisant les informations d\u0026rsquo;identification par défaut (admin:admin). Ceux-ci peuvent être modifiés de cette manière et depuis l\u0026rsquo;interface graphique.\nDans Grafana, ajoutez la source InfluxDB en tant que base de données.\nDes exemples de tableaux de bord sont disponibles sur le site Web de Grafana, tels que le #554, #[555 et #755. Ils seront presque prêts à l\u0026rsquo;emploi et peuvent servir de base pour créer les vôtres. Ils semblent être centrés sur Linux mais voici à quoi ils ressemblent, une fois légèrement modifiés pour OpenBSD, disponible sur Grafana.\n\u0026ldquo;That’s All Folks!\u0026rdquo;\nRemerciements Avec l\u0026rsquo;aimable autorisation de Joel Carnat !\nCette page est la traduction de la page Monitoring OpenBSD using CollectD, InfluxDB and Grafana du site TUM\u0026rsquo;FATIG. - licence de type BSD.\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\n\u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://www.tumfatig.net/2018/monitoring-openbsd-using-collectd-influxdb-and-grafana/\" rel=\"external\"\u003eMonitoring OpenBSD using CollectD, InfluxDB and Grafana\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit par Joel Carnat.\u003c/p\u003e\n\u003chr\u003e\n\u003ch1 id=\"monitorer-openbsd-en-utilisant-collectd-influxdb-et-grafana\"\u003eMonitorer OpenBSD en utilisant CollectD, InfluxDB et Grafana\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eOS concerné : \u003cstrong\u003e6.2-current et \u0026gt;\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eLogiciels packagés : CollectD, InfluxDB, Grafana\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eRegardons comment monitorer OpenBSD en utilisant le collecteur CollectD\net le tableau de bord de rendu Grafana. OpenBSD 6.2-current fournit les\npackages InfluxDB et Grafana. Une superbe pile pour obtenir de jolis\ngraphiques.\u003c/p\u003e\n\u003ch2 id=\"hébergement-des-données\"\u003eHébergement des données\u003c/h2\u003e\n\u003cp\u003eLes métriques du système sont stockés dans InfluxDB ; parce qu\u0026rsquo;il peut\nêtre utilisé comme ressource pour Grafana. L\u0026rsquo;installation et la\nconfiguration sont simples. L\u0026rsquo;essentiel est d\u0026rsquo;activer le protocole de\ncollecte collectd.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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 influxdb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# vi /etc/influxdb/influxdb.conf\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:#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\u003ecollectd\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\"\u003eenabled\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  bind-address \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;:25826\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#ef6155\"\u003edatabase\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;collectd\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  retention-policy \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\"\u003etypesdb\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/usr/local/share/collectd\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# rcctl enable influxdb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start influxdb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNotez que ce service fonctionne seulement sur UDP. Il semble ne pas y\navoir d\u0026rsquo;options disponibles pour TCP ni 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\u003cspan style=\"color:#776e71\"\u003e# netstat -na | grep 25826\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eudp \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e *.25826 *.*\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"collecter-les-données\"\u003eCollecter les données\u003c/h2\u003e\n\u003cp\u003eUtilisons CollectD en tant que collecteur des métriques. Surtout parce\nqu\u0026rsquo;il connaît OpenBSD et qu\u0026rsquo;il est capable d\u0026rsquo;envoyer ses données à\ndistance. Dans ce cas, à InfluxDB. Activez tous les plugins requis.\u003c/p\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas celui relatif au réseau afin que les données soient\nenvoyées à InfluxDB.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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 collectd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# vi /etc/collectd.conf\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:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;Plugin network\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;Server \u003cspan style=\"color:#48b685\"\u003e\u0026#34;127.0.0.1\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;25826\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;/Server\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ReportStats true\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/Plugin\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# rcctl enable collectd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start collectd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"restituer-les-données\"\u003eRestituer les données\u003c/h2\u003e\n\u003cp\u003eCe qui est nouveau dans la version current d\u0026rsquo;OpenBSD 6.2 : Grafana est\ndisponible en tant que package. Cela permettra de faire de jolis\ngraphiques en utilisant 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-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# pkg_add grafana\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# vi /etc/grafana/config.ini\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# rcctl enable grafana\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start grafana\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOuvrez votre navigateur web à l\u0026rsquo;adresse \u003ccode\u003ehttp://localhost:3000/\u003c/code\u003e et\nconnectez vous en utilisant les informations d\u0026rsquo;identification par défaut\n(\u003ccode\u003eadmin:admin\u003c/code\u003e). Ceux-ci peuvent être modifiés de cette\n\u003ca href=\"http://docs.grafana.org/installation/configuration/#security\" rel=\"external\"\u003emanière\u003c/a\u003e\net depuis l\u0026rsquo;interface graphique.\u003c/p\u003e\n\u003cp\u003eDans Grafana, ajoutez la source InfluxDB en tant que base de données.\u003c/p\u003e\n\u003cp\u003eDes exemples de tableaux de bord sont disponibles sur le site Web de\nGrafana, tels que le #\u003ca href=\"https://grafana.com/dashboards/554\" rel=\"external\"\u003e554\u003c/a\u003e,\n#[\u003ca href=\"https://grafana.com/dashboards/555\" rel=\"external\"\u003e555\u003c/a\u003e et\n#\u003ca href=\"https://grafana.com/dashboards/755\" rel=\"external\"\u003e755\u003c/a\u003e. Ils seront presque prêts à\nl\u0026rsquo;emploi et peuvent servir de base pour créer les vôtres. Ils semblent\nêtre centrés sur Linux mais voici à quoi ils ressemblent, une fois\nlégèrement modifiés pour OpenBSD,\n\u003ca href=\"https://grafana.com/dashboards/4775\" rel=\"external\"\u003edisponible sur Grafana\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;That’s All Folks!\u0026rdquo;\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eAvec l\u0026rsquo;aimable autorisation de Joel Carnat !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCette page est la traduction de la page \u003ca href=\"https://www.tumfatig.net/2018/monitoring-openbsd-using-collectd-influxdb-and-grafana/\" rel=\"external\"\u003eMonitoring OpenBSD using CollectD, InfluxDB and Grafana\u003c/a\u003e\ndu site TUM\u0026rsquo;FATIG. - \u003ca href=\"https://www.tumfatig.net/disclaimer/\" rel=\"external\"\u003elicence de type BSD\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 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 'Monitoring OpenBSD using CollectD, InfluxDB and Grafana' de l'auteur Joel Carnat","tags":["Traduction","OpenBSD","Collectd","InfluxDB","Grafana"],"date_published":"2018-06-09T12:04:30+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-03-23:/fr/post/openbsd-dnssec-plus-dns-over-tls#e477c5a36f4e34963d1a976def81e0566570d15faabc7d5ffa79da6505785963","url":"https://it-log.fr.eu.org/fr/post/openbsd-dnssec-plus-dns-over-tls/","title":"OpenBSD : Utiliser DNSSEC, + DNS / TLS (EXPÉRIMENTAL)","author":{"name":"Stéphane HUC"},"content_text":"Description OpenBSD : 6.2 Coupler des requêtes DNSSEC en utilisant \u0026ldquo;DNS-over-TLS\u0026rdquo; sous OpenBSD est non seulement possible, mais envisageable, et fonctionnel… plus ou moins nativement !\nPour les requêtes DNSSEC, nous avons nativement sous OpenBSD – un outil fort puissant et utile, à savoir : \u0026lsquo;\u0026lsquo;unbound\u0026rsquo;\u0026rsquo;.\nUnbound est capable de discuter sur la pile DualStack IPv4, IPv6 ; il nous permet aussi de créer/d’avoir en local un resolveur cache qui nous fait des requêtes auprès des DNS publiques, si besoin…\nIl y a quelques mois, j’écrivais cet article sur comment Utiliser Unbound avec DNSSEC sur OpenBSD. Vous l’avez lu ? Très bien, sinon faites-le…\nIl faudra impérativement vous familiariser et mettre en place votre fichier de configuration, avec toutes les autres options utiles – ce n’est pas compliqué du tout. Assurez-vous impérativement de vérifier que vos requêtes soient correctes… Quant à la question des requêtes DNS sur TLS, hier, nous avons vu l’usage de Stubby : Client DNS/TLS sous OpenBSD (EXPÉRIMENTAL) , lui aussi capable de discuter sur la DualStack (IPv4, IPv6) – c’est là qu’est la partie \u0026ldquo;EXPÉRIMENTAL\u0026rdquo;, car non natif, ni en tant que package, ni dans les ports : du moins, pour l’instant… mais c’est vraiment fonctionnel !\nCréons un resolveur cache local DNSSEC avec DNS/TLS Alors comment faire pour utiliser sur notre machine ces deux logiciels de manière à avoir un resolveur cache local communiquant sur DNSSEC et avoir des requêtes DNS sur TLS, dans le même laps de temps ?\nIl semble que nous soyons obligés de coupler :\nunbound, bien que capable de comprendre DNSSEC, et d’utiliser un flux SSL, semble ne pas être – encore ? - capable d’authentifier les flux, de ré-utiliser les connexions TCP et TLS, d’être configuré pour le mode Strict ou Opportun lié à l’usage de DNS/TLS , voire d’envoyer les options relatives à cet usage confidentiel. c’est justement là qu’intervient un logiciel comme stubby en complément d’unbound. Lui est capable de faire ce que n’est pas capable unbound, mais n’est pas fait pour être un resolveur cache, même s’il est capable d’utiliser DNSSEC, lui aussi. Configuration resolv.conf La première chose à s’assurer est d’avoir paramétré correctement votre fichier /etc/resolv.conf pour n’interroger qu’en local !\nnameserver 127.0.0.1 nameserver ::1 unbound.conf Ensuite, il faut modifier légèrement votre fichier /var/unbound/etc/unbound.conf, pour veiller à ajouter quelques paramètres ; il y a :\nl’usage de l’option do-not-query-localhost et le fait de transmettre les requêtes non connues à notre ami stubby # $OpenBSD: unbound.conf,v 1.7 2016/03/30 01:41:25 sthen Exp $ server: (...) do-not-query-localhost: no (...) forward-zone: name: \u0026#34;.\u0026#34; # use for ALL queries forward-addr: ::1@853 forward-addr: 127.0.0.1@853 Toute requête DNS qui n\u0026rsquo;est pas en cache dans la mémoire d\u0026rsquo;unbound sera transmise à stubby qui fera le nécessaire… unbound prendra absolument le relais pour toute requête DNS identique.\nInfoIl est possible d\u0026rsquo;utiliser tout autre port, tel que \u0026lsquo;\u0026lsquo;8053\u0026rsquo;\u0026rsquo; comme montré en exemple sur la documentation de stubby. Quelque soit votre choix, veillez à mettre le même port dans la configuration de stubby ! stubby.yml Il nous faut modifier le fichier de configuration de stubby /usr/local/etc/stubby/stubby.yml, en rapport avec le port spécifié sur les adresses que le service de stubby va devoir écouter :\n(...) listen_addresses: - 127.0.0.1@853 - 0::1@853 (...) Si dans le fichier de configuration d\u0026rsquo;unbound, vous utilisez un autre numéro que celui-ci, veillez impérativement renseigner le même !\nInfoPour information, il est envisageable de demander à stubby d\u0026rsquo;exécuter ses requêtes sur le protocole DNSSEC ; pour cela, il faut décommenter l\u0026rsquo;option dnssec_return_status: GETDNS_EXTENSION_TRUE !\nCela augmente assurément le temps de charge des requêtes. Laissez donc à unbound le soin de les faire !\nDans la partie # Additional server du fichier de configuration de stubby, vous avez la possibilité de décommenter un ou plusieurs serveurs à interroger, autant sur IPv4 qu\u0026rsquo;IPv6, dont le fameux Quad9 @9999\u0026hellip;.\nRedémarrer les services Si (re)démarrer LE service relatif à unbound n\u0026rsquo;est pas bien difficile, à coup de : # rcctl restart unbound, (re)démarrer celui de stubby n\u0026rsquo;est pas possible car rien n\u0026rsquo;existe par défaut pour que cela puisse être.\nAstuceAvant de chercher à redémarrer les services, pensez d\u0026rsquo;abord à vérifier vos fichiers de configuration - pour rappel :\npour unbound : $ unbound-checkconf pour stubby : $ stubby -i Création du fichier rc pour stubby Pour que stubby puisse interagir en tant que service sur votre système OpenBSD, il faut lui créer un fichier rc, à positionner dans /etc/rc.d/stubby avec pour contenu ceci, ni + ni - :\n#!/bin/sh # # $OpenBSD: stubby,v 0.2.2 2018/03/22 12:00:00 Stephane HUC $ daemon=\u0026#34;/usr/local/bin/stubby\u0026#34; daemon_flags=\u0026#34;\u0026#34; . /etc/rc.d/rc.subr #rc_reload=NO rc_cmd $1 Attribuez-lui des droits suivants : # chmod 555 /etc/rc.d/stubby\nVoilà, maintenant vous allez pouvoir jouer du contrôleur rc :\n# rcctl enable stubby # rcctl set stubby flags \u0026#34;-g\u0026#34; # rcctl start stubby Tests Très basiquement avec l\u0026rsquo;outil dig, tel que :\n$ dig @::1 A www.gandi.net ; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.4.2-P2 \u0026lt;\u0026lt;\u0026gt;\u0026gt; @::1 www.gandi.net ; (1 server found) ;; global options: printcmd ;; Got answer: ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NOERROR, id: 12892 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.gandi.net. IN A ;; ANSWER SECTION: www.gandi.net. 46710 IN CNAME prod.gandi.map.fastly.net. prod.gandi.map.fastly.net. 3600 IN A 151.101.37.103 ;; Query time: 644 msec ;; SERVER: ::1#53(::1) ;; WHEN: Fri Mar 23 01:17:20 2018 ;; MSG SIZE rcvd: 83 On la réitère pour se rendre compte de la différence en terme de temps d\u0026rsquo;accès :\n$ dig @::1 www.gandi.net ; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.4.2-P2 \u0026lt;\u0026lt;\u0026gt;\u0026gt; @::1 www.gandi.net ; (1 server found) ;; global options: printcmd ;; Got answer: ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NOERROR, id: 2032 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.gandi.net. IN A ;; ANSWER SECTION: www.gandi.net. 46706 IN CNAME prod.gandi.map.fastly.net. prod.gandi.map.fastly.net. 3596 IN A 151.101.37.103 ;; Query time: 1 msec ;; SERVER: ::1#53(::1) ;; WHEN: Fri Mar 23 01:17:24 2018 ;; MSG SIZE rcvd: 83 644 millisecondes la première interrogation ; 1 milliseconde, la seconde… unbound fait son travail de cache assurément !\nDocumentations La documentation de stubby, sa FAQ et sa partie de configuration avec un resolveur cache local La documentation d\u0026rsquo;unbound Stephane Bortzmeyer explique certaines choses à ce propos [ici et là… par exemple ! ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD : 6.2\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCoupler des requêtes DNSSEC en utilisant \u0026ldquo;DNS-over-TLS\u0026rdquo; sous OpenBSD est\nnon seulement possible, mais envisageable, et fonctionnel…\nplus ou moins nativement !\u003c/p\u003e\n\u003cp\u003ePour \u003cstrong\u003eles requêtes DNSSEC\u003c/strong\u003e, nous avons \u003cstrong\u003enativement sous OpenBSD\u003c/strong\u003e –\nun outil fort puissant et utile, à savoir : \u003cstrong\u003e\u0026lsquo;\u0026lsquo;unbound\u0026rsquo;\u0026rsquo;\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eUnbound est capable de discuter sur la pile DualStack IPv4, IPv6 ; il nous\npermet aussi de créer/d’avoir en local un resolveur cache qui nous fait\ndes requêtes auprès des DNS publiques, si besoin…\u003c/p\u003e\n\u003cp\u003eIl y a quelques mois, j’écrivais cet article sur comment \u003ca class=\"inside\" href=\"/fr/sys/openbsd/unbound/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : utiliser Unbound'\"\u003eUtiliser Unbound avec DNSSEC\u003c/a\u003e\n sur\nOpenBSD. Vous l’avez lu ? Très bien, sinon faites-le…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIl faudra impérativement vous familiariser et mettre en place votre\nfichier de configuration, avec toutes les autres options utiles –\n\u003cem\u003ece n’est pas compliqué du tout\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eAssurez-vous impérativement de vérifier que vos requêtes soient correctes…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuant à la question des \u003cstrong\u003erequêtes DNS sur TLS\u003c/strong\u003e, hier, nous avons vu\nl’\u003cstrong\u003eusage de \u003ca class=\"inside\" href=\"/fr/sys/openbsd/stubby/\" title=\"Lien interne vers l\u0026#39;article : 'Stubby : Client DNS/TLS sous OpenBSD (EXPÉRIMENTAL) '\"\u003eStubby : Client DNS/TLS sous OpenBSD (EXPÉRIMENTAL) \u003c/a\u003e\u003c/strong\u003e, lui aussi capable de\ndiscuter sur la DualStack (IPv4, IPv6) – \u003cem\u003ec’est là qu’est la partie \u0026ldquo;EXPÉRIMENTAL\u0026rdquo;,\ncar non natif, ni en tant que package, ni dans les ports : du moins, pour l’instant\u003c/em\u003e…\nmais \u003cstrong\u003ec’est vraiment fonctionnel !\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"créons-un-resolveur-cache-local-dnssec-avec-dnstls\"\u003eCréons un resolveur cache local DNSSEC avec DNS/TLS\u003c/h2\u003e\n\u003cp\u003eAlors comment faire pour utiliser sur notre machine ces deux logiciels de\nmanière à avoir un resolveur cache local communiquant sur DNSSEC et avoir\ndes requêtes DNS sur TLS, dans le même laps de temps ?\u003c/p\u003e\n\u003cp\u003eIl semble que nous soyons obligés de coupler :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eunbound, bien que capable de comprendre DNSSEC, et d’utiliser un flux\nSSL, semble ne pas être – \u003cem\u003eencore ?\u003c/em\u003e - capable d’authentifier les flux,\nde ré-utiliser les connexions TCP et TLS, d’être configuré pour le mode\nStrict ou Opportun lié à l’usage de DNS/TLS , voire d’envoyer les options\nrelatives à cet usage confidentiel.\u003c/li\u003e\n\u003cli\u003ec’est justement là qu’intervient un logiciel comme stubby en complément\nd’unbound. Lui est capable de faire ce que n’est pas capable unbound,\nmais n’est pas fait pour être un resolveur cache, même s’il est capable\nd’utiliser DNSSEC, lui aussi.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"resolvconf\"\u003eresolv.conf\u003c/h3\u003e\n\u003cp\u003eLa première chose à s’assurer est d’avoir paramétré correctement votre fichier\n\u003ccode\u003e/etc/resolv.conf\u003c/code\u003e pour n’interroger qu’en local !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003enameserver 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\"\u003enameserver ::1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"unboundconf\"\u003eunbound.conf\u003c/h3\u003e\n\u003cp\u003eEnsuite, il faut modifier légèrement votre fichier \u003ccode\u003e/var/unbound/etc/unbound.conf\u003c/code\u003e,\npour veiller à ajouter quelques paramètres ; il y a  :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el’usage de l’option \u003ccode\u003edo-not-query-localhost\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet le fait de transmettre les requêtes non connues à notre ami \u003cstrong\u003estubby\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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# $OpenBSD: unbound.conf,v 1.7 2016/03/30 01:41:25 sthen 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:#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\"\u003edo-not-query-localhost:  no\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\"\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;                               # use for ALL queries\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: ::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: 127.0.0.1@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eToute requête DNS qui n\u0026rsquo;est pas en cache dans la mémoire d\u0026rsquo;unbound sera\ntransmise à stubby qui fera le nécessaire…\nunbound prendra absolument le relais pour toute requête DNS identique.\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 d\u0026rsquo;utiliser tout autre port, tel que \u0026lsquo;\u0026lsquo;8053\u0026rsquo;\u0026rsquo; comme montré\nen exemple sur la documentation de stubby. Quelque soit votre choix,\nveillez à mettre le même port dans la configuration de stubby !\u003c/div\u003e\n\n\u003ch3 id=\"stubbyyml\"\u003estubby.yml\u003c/h3\u003e\n\u003cp\u003eIl nous faut modifier le fichier de configuration de stubby \u003ccode\u003e/usr/local/etc/stubby/stubby.yml\u003c/code\u003e,\nen rapport avec le port spécifié sur les adresses que le service de\nstubby va devoir écouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003elisten_addresses:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003e- 127.0.0.1@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003e-  0::1@853\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\u003eSi dans le fichier de configuration d\u0026rsquo;unbound, vous utilisez un autre numéro\nque celui-ci, veillez impérativement renseigner le même !\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003ePour information, il est envisageable de demander à stubby d\u0026rsquo;exécuter\nses requêtes sur le protocole DNSSEC ; pour cela, il faut décommenter\nl\u0026rsquo;option \u003ccode\u003ednssec_return_status: GETDNS_EXTENSION_TRUE\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003eCela augmente assurément le temps de charge des requêtes. Laissez donc à\nunbound le soin de les faire !\u003c/p\u003e\n\u003cp\u003eDans la partie \u003ccode\u003e# Additional server\u003c/code\u003e du fichier de configuration de stubby,\nvous avez la possibilité de décommenter un ou plusieurs serveurs à interroger,\nautant sur IPv4 qu\u0026rsquo;IPv6, dont le fameux Quad9 @9999\u0026hellip;.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"redémarrer-les-services\"\u003eRedémarrer les services\u003c/h2\u003e\n\u003cp\u003eSi (re)démarrer LE service relatif à unbound n\u0026rsquo;est pas bien difficile, à\ncoup de : \u003ccode\u003e# rcctl restart unbound\u003c/code\u003e, (re)démarrer celui de stubby n\u0026rsquo;est\npas possible car rien n\u0026rsquo;existe par défaut pour que cela puisse être.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eAvant de chercher à redémarrer les services, pensez d\u0026rsquo;abord à vérifier\nvos fichiers de configuration - pour rappel :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour unbound : \u003ccode\u003e$ unbound-checkconf\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epour stubby : \u003ccode\u003e$ stubby -i\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\u003c/div\u003e\n\n\u003ch3 id=\"création-du-fichier-rc-pour-stubby\"\u003eCréation du fichier rc pour stubby\u003c/h3\u003e\n\u003cp\u003ePour que stubby puisse interagir en tant que service sur votre système\nOpenBSD, il faut lui créer un fichier \u003cstrong\u003erc\u003c/strong\u003e, à positionner dans \u003ccode\u003e/etc/rc.d/stubby\u003c/code\u003e\navec pour contenu ceci, ni + ni - :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# $OpenBSD: stubby,v 0.2.2 2018/03/22 12:00:00 Stephane HUC $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003edaemon\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/usr/local/bin/stubby\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edaemon_flags\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:#06b6ef\"\u003e. /etc/rc.d/rc.subr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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#rc_reload=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\"\u003erc_cmd $1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAttribuez-lui des droits suivants : \u003ccode\u003e# chmod 555 /etc/rc.d/stubby\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVoilà, maintenant vous allez pouvoir jouer du contrôleur rc :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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 stubby\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl set stubby flags \u0026#34;-g\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 start stubby\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"tests\"\u003eTests\u003c/h2\u003e\n\u003cp\u003eTrès basiquement avec l\u0026rsquo;outil \u003ccode\u003edig\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$ dig @::1 A www.gandi.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\u003e; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.4.2-P2 \u0026lt;\u0026lt;\u0026gt;\u0026gt; @::1 www.gandi.net\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:#f99b15\"\u003e1\u003c/span\u003e server found\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; global options:  printcmd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; Got answer:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; -\u0026gt;\u0026gt;HEADER\u003cspan style=\"color:#48b685\"\u003e\u0026lt;\u0026lt;- opco\u003c/span\u003ede: QUERY, status: NOERROR, id: \u003cspan style=\"color:#f99b15\"\u003e12892\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: \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;; QUESTION SECTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;www.gandi.net.                 IN      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;; ANSWER SECTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww.gandi.net.          \u003cspan style=\"color:#f99b15\"\u003e46710\u003c/span\u003e   IN      CNAME   prod.gandi.map.fastly.net.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprod.gandi.map.fastly.net. \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e IN      A       151.101.37.103\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; Query time: \u003cspan style=\"color:#f99b15\"\u003e644\u003c/span\u003e msec\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; SERVER: ::1#53\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e::1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; WHEN: Fri Mar \u003cspan style=\"color:#f99b15\"\u003e23\u003c/span\u003e 01:17:20 \u003cspan style=\"color:#f99b15\"\u003e2018\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; MSG SIZE  rcvd: \u003cspan style=\"color:#f99b15\"\u003e83\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn la réitère pour se rendre compte de la différence en terme de temps d\u0026rsquo;accès :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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$ dig @::1 www.gandi.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\u003e; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.4.2-P2 \u0026lt;\u0026lt;\u0026gt;\u0026gt; @::1 www.gandi.net\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:#f99b15\"\u003e1\u003c/span\u003e server found\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; global options:  printcmd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; Got answer:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; -\u0026gt;\u0026gt;HEADER\u003cspan style=\"color:#48b685\"\u003e\u0026lt;\u0026lt;- opco\u003c/span\u003ede: QUERY, status: NOERROR, id: \u003cspan style=\"color:#f99b15\"\u003e2032\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: \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;; QUESTION SECTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;www.gandi.net.                 IN      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;; ANSWER SECTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww.gandi.net.          \u003cspan style=\"color:#f99b15\"\u003e46706\u003c/span\u003e   IN      CNAME   prod.gandi.map.fastly.net.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprod.gandi.map.fastly.net. \u003cspan style=\"color:#f99b15\"\u003e3596\u003c/span\u003e IN      A       151.101.37.103\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; Query time: \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e msec\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; SERVER: ::1#53\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e::1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; WHEN: Fri Mar \u003cspan style=\"color:#f99b15\"\u003e23\u003c/span\u003e 01:17:24 \u003cspan style=\"color:#f99b15\"\u003e2018\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; MSG SIZE  rcvd: \u003cspan style=\"color:#f99b15\"\u003e83\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e644\u003c/strong\u003e millisecondes la première interrogation ; \u003cstrong\u003e1\u003c/strong\u003e milliseconde, la seconde…\nunbound fait son travail de cache assurément !\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLa \u003ca href=\"https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Project+Homepage\" rel=\"external\"\u003edocumentation\u003c/a\u003e de stubby,\nsa \u003ca href=\"https://dnsprivacy.org/wiki/display/DP/About+Stubby\" rel=\"external\"\u003eFAQ\u003c/a\u003e et sa\npartie de \u003ca href=\"https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Clients\" rel=\"external\"\u003econfiguration avec un resolveur cache local\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLa \u003ca href=\"https://unbound.net/documentation/unbound.conf.html\" rel=\"external\"\u003edocumentation\u003c/a\u003e d\u0026rsquo;unbound\u003c/li\u003e\n\u003cli\u003eStephane Bortzmeyer explique certaines choses à ce propos [\u003ca href=\"http://www.bortzmeyer.org/quad9.html\" rel=\"external\"\u003eici\u003c/a\u003e\net \u003ca href=\"http://www.bortzmeyer.org/7858.html\" rel=\"external\"\u003elà\u003c/a\u003e… par exemple !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","tags":["OpenBSD","DNS","DNSSEC","DoT","unbound","stubby"],"date_published":"2018-03-23T19:30:19+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-03-22:/fr/sys/openbsd/stubby#4c7d1d2be3da8a4febc78b7553300debca800112ce16bbd6d60ba32ebc52da3b","url":"https://it-log.fr.eu.org/fr/sys/openbsd/stubby/","title":"Stubby : Client DNS/TLS sous OpenBSD (EXPÉRIMENTAL) ","author":{"name":"Stéphane HUC"},"content_text":"Description Stubby est une application qui agit en tant que client DNS, sur protocole sécurisé (en utilisant DoT (DNS-over-TCP) ). Ce logiciel chiffre les requêtes DNS envoyées d\u0026rsquo;une machine cliente vers un résolveur DNS, ou un serveur DNS faisant autorité afin d\u0026rsquo;augmenter la confidentialité des communications de l\u0026rsquo;utilisateur, par le chiffrement des requêtes DNS. De même, il peut faire des requêtes DNS selon le protocole DNSSEC.\nAttentionAttention : il ne fait pas office de résolveur cache DNS, ni de serveur faisant autorité ; ce n\u0026rsquo;est qu\u0026rsquo;un client DNS !\nDe plus, il n\u0026rsquo;existe ni package, ni port de Stubby sous OpenBSD stable… et encore moins de port officiel du projet stubbly vers OpenBSD, d\u0026rsquo;où le titre \u0026ldquo;EXPÉRIMENTAL\u0026rdquo;. Nous allons devoir récupérer les sources, les compiler, installer, configurer, etc…\nInstallation L\u0026rsquo;installation du client stubby se fait/fera sous OpenBSD stable.\nla 6.3 à ce jour… Pré-requis OpenSSL : installé par défaut Libyaml : à installer… autoconf, automake : à installer pour les phases de configuration, compilation avant installation :# pkg_add autoconf automake libyaml quirks-2.414 signed on 2018-03-28T14:24:37Z Ambiguous: choose package for autoconf a 0: \u0026lt;None\u0026gt; 1: autoconf-2.13p4 2: autoconf-2.52p6 3: autoconf-2.54p5 4: autoconf-2.56p4 5: autoconf-2.57p4 6: autoconf-2.58p5 7: autoconf-2.59p5 8: autoconf-2.60p5 9: autoconf-2.61p5 10: autoconf-2.62p2 11: autoconf-2.63p1 12: autoconf-2.64p1 13: autoconf-2.65p1 14: autoconf-2.67p1 15: autoconf-2.68p1 16: autoconf-2.69p2 Your choice: 16 Ambiguous: choose package for automake a 0: \u0026lt;None\u0026gt; 1: automake-1.10.3p8 2: automake-1.11.6p2 3: automake-1.12.6p1 4: automake-1.13.4p1 5: automake-1.14.1p0 6: automake-1.15.1 7: automake-1.4.6p5 8: automake-1.8.5p9 9: automake-1.9.6p12 Your choice: 6 Puis on va suivre les recommandations officielles d\u0026rsquo;installation depuis les sources\npour Linux - en les adaptant à notre cher OS qu\u0026rsquo;est OpenBSD. Chacune des étapes est à exécuter l\u0026rsquo;une après l\u0026rsquo;autre. Téléchargement :$ git clone https://github.com/getdnsapi/getdns.git :$ cd getdns :$ git checkout develop La deuxième commande git nous permet d\u0026rsquo;obtenir les sources les plus récentes…\nConfiguration :$ git submodule update --init :$ libtoolize -ci :$ export AUTOCONF_VERSION=2.69 :$ export AUTOMAKE_VERSION=1.15 :$ autoreconf -fi :$ mkdir build \u0026amp;\u0026amp; cd build :$ ../configure --prefix=/usr/local --without-libidn --enable-stub-only --with-stubby Compilation :$ make :# make install Bien-sûr, à la place de la dernière commande, si vous avez configuré doas , vous pouvez ainsi l\u0026rsquo;exécuter : :$ doas make install\nresolv.conf Il est nécessaire de modifier votre fichier /etc/resolv.conf afin de communiquer directement avec stubby :\nnameserver 127.0.0.1 nameserver ::1 stubby.yml Le fichier de configuration de stubby se trouve être dans /usr/local/etc/stubby/stubby.yml. Si vous en créez un au format yaml dans votre répertoire personnel, tel que ~/.stubby.yml, il sera lu en premier.\nExécution Pour exécuter stubby, il suffit de :\n:# stubby [12:57:39.896254] STUBBY: Read config from file /usr/local/etc/stubby/stubby.yml [12:57:39.898479] STUBBY: DNSSEC Validation is OFF [12:57:39.898585] STUBBY: Transport list is: [12:57:39.898617] STUBBY: - TLS [12:57:39.898681] STUBBY: Privacy Usage Profile is Strict (Authentication required) [12:57:39.898713] STUBBY: (NOTE a Strict Profile only applies when TLS is the ONLY transport!!) [12:57:39.898749] STUBBY: Starting DAEMON.... Quelques informations intéressantes :\nle drapeau -C permet de spécifier un autre fichier de configuration, à la place de l\u0026rsquo;original. le drapeau -g permet de fonctionner en arrière plan… le drapeau -i permet de vérifier la configuration ! le drapeau -l a pour objectif de journaliser les connexions. Pour l\u0026rsquo;instant, la sortie se fait sur la sortie standard stdout ! Test L\u0026rsquo;usage très simple de dig nous permettra de nous assurer du bon fonctionnement :\n⇒ Version IPv4\n:$ dig @127.0.0.1 www.gandi.net ; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.4.2-P2 \u0026lt;\u0026lt;\u0026gt;\u0026gt; @127.0.0.1 www.gandi.net ; (1 server found) ;; global options: printcmd ;; Got answer: ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NOERROR, id: 40041 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.gandi.net. IN A ;; ANSWER SECTION: www.gandi.net. 21583 IN CNAME prod.gandi.map.fastly.net. prod.gandi.map.fastly.net. 3600 IN A 151.101.37.103 ;; AUTHORITY SECTION: fastly.net. 3600 IN NS ns1.fastly.net. fastly.net. 3600 IN NS ns2.fastly.net. fastly.net. 3600 IN NS ns3.fastly.net. fastly.net. 3600 IN NS ns4.fastly.net. ;; Query time: 1888 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Mar 22 14:15:51 2018 ;; MSG SIZE rcvd: 155 ⇒ Version IPv6 :\n:$ dig @::1 www.gandi.net ; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.4.2-P2 \u0026lt;\u0026lt;\u0026gt;\u0026gt; @::1 www.gandi.net ; (1 server found) ;; global options: printcmd ;; Got answer: ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NOERROR, id: 24688 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: 4 ;; QUESTION SECTION: ;www.gandi.net. IN A ;; ANSWER SECTION: www.gandi.net. 84574 IN CNAME prod.gandi.map.fastly.net. prod.gandi.map.fastly.net. 3600 IN A 151.101.85.103 ;; AUTHORITY SECTION: fastly.net. 168207 IN NS ns4.fastly.net. fastly.net. 168207 IN NS ns2.fastly.net. fastly.net. 168207 IN NS ns1.fastly.net. fastly.net. 168207 IN NS ns3.fastly.net. ;; ADDITIONAL SECTION: ns1.fastly.net. 3600 IN A 23.235.32.32 ns2.fastly.net. 3600 IN A 104.156.80.32 ns3.fastly.net. 3600 IN A 23.235.36.32 ns4.fastly.net. 3600 IN A 104.156.84.32 ;; Query time: 1614 msec ;; SERVER: ::1#53(::1) ;; WHEN: Thu Mar 22 14:16:40 2018 ;; MSG SIZE rcvd: 219 ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/getdnsapi/stubby\" rel=\"external\"\u003eStubby\u003c/a\u003e est une application qui agit en\ntant que client DNS, sur protocole sécurisé (en utilisant \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). \u003cbr\u003e\nCe logiciel chiffre les requêtes DNS envoyées d\u0026rsquo;une machine cliente vers\nun résolveur DNS, ou un serveur DNS faisant autorité afin d\u0026rsquo;augmenter la\nconfidentialité des communications de l\u0026rsquo;utilisateur, par le chiffrement\ndes requêtes DNS. \u003cbr\u003e\nDe même, il peut faire des requêtes DNS selon le protocole DNSSEC.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eAttention : il ne fait pas office de résolveur cache DNS, ni de serveur\nfaisant autorité ; ce n\u0026rsquo;est qu\u0026rsquo;un client DNS !\u003c/p\u003e\n\u003cp\u003eDe plus, il n\u0026rsquo;existe ni package, ni port de\nStubby sous OpenBSD stable… et encore moins de port officiel du\nprojet stubbly vers OpenBSD, d\u0026rsquo;où le titre \u0026ldquo;EXPÉRIMENTAL\u0026rdquo;. Nous allons\ndevoir récupérer les sources, les compiler, installer, configurer,\netc…\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;installation du client \u003cstrong\u003estubby\u003c/strong\u003e se fait/fera sous OpenBSD stable.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela 6.3 à ce jour…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"pré-requis\"\u003ePré-requis\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eOpenSSL\u003c/code\u003e : installé par défaut\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLibyaml\u003c/code\u003e : à installer…\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eautoconf\u003c/code\u003e, \u003ccode\u003eautomake\u003c/code\u003e : à installer pour les phases de configuration, \ncompilation avant installation\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:# pkg_add autoconf automake libyaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003equirks-2.414 signed on 2018-03-28T14:24:37Z\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAmbiguous: choose package \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e autoconf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea       0: \u0026lt;None\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        1: autoconf-2.13p4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        2: autoconf-2.52p6\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        3: autoconf-2.54p5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        4: autoconf-2.56p4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        5: autoconf-2.57p4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        6: autoconf-2.58p5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        7: autoconf-2.59p5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        8: autoconf-2.60p5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        9: autoconf-2.61p5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        10: autoconf-2.62p2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        11: autoconf-2.63p1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        12: autoconf-2.64p1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        13: autoconf-2.65p1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        14: autoconf-2.67p1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        15: autoconf-2.68p1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        16: autoconf-2.69p2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eYour choice: \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAmbiguous: choose package \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e automake\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea       0: \u0026lt;None\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        1: automake-1.10.3p8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        2: automake-1.11.6p2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        3: automake-1.12.6p1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        4: automake-1.13.4p1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        5: automake-1.14.1p0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        6: automake-1.15.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        7: automake-1.4.6p5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        8: automake-1.8.5p9\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        9: automake-1.9.6p12\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eYour choice: \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis on va suivre les recommandations officielles\nd\u0026rsquo;\u003ca href=\"https://dnsprivacy.org/wiki/pages/viewpage.action?pageId=3145786\" rel=\"external\"\u003einstallation depuis les sources\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003epour Linux\u003c/em\u003e - en les adaptant à notre cher OS qu\u0026rsquo;est OpenBSD.\nChacune des étapes est à exécuter l\u0026rsquo;une après l\u0026rsquo;autre.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"téléchargement\"\u003eTéléchargement\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 https://github.com/getdnsapi/getdns.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ cd getdns\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ git checkout develop\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa deuxième commande \u003cem\u003egit\u003c/em\u003e nous permet d\u0026rsquo;obtenir les sources les plus\nrécentes…\u003c/p\u003e\n\u003ch3 id=\"configuration\"\u003eConfiguration\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 submodule update --init\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ libtoolize -ci\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ export \u003cspan style=\"color:#ef6155\"\u003eAUTOCONF_VERSION\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e2.69\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ export \u003cspan style=\"color:#ef6155\"\u003eAUTOMAKE_VERSION\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1.15\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ autoreconf -fi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ mkdir build \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e cd build\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ../configure --prefix\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/usr/local --without-libidn --enable-stub-only --with-stubby\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"compilation\"\u003eCompilation\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:$ make\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien-sûr, à la place de la dernière commande, si vous avez configuré\n\u003cem\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/doas\" title=\"Page du Manuel OpenBSD pour : doas\"\u003edoas\u003c/a\u003e\n\u003c/em\u003e, vous pouvez ainsi l\u0026rsquo;exécuter : \u003cbr\u003e\n\u003ccode\u003e:$ doas make install\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"resolvconf\"\u003eresolv.conf\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire de modifier votre fichier \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e afin de\ncommuniquer directement avec stubby :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003enameserver 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\"\u003enameserver ::1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"stubbyyml\"\u003estubby.yml\u003c/h3\u003e\n\u003cp\u003eLe fichier de configuration de stubby se trouve être dans\n\u003ccode\u003e/usr/local/etc/stubby/stubby.yml\u003c/code\u003e. Si vous en créez un au format yaml\ndans votre répertoire personnel, tel que \u003ccode\u003e~/.stubby.yml\u003c/code\u003e, il sera lu en\npremier.\u003c/p\u003e\n\u003ch2 id=\"exécution\"\u003eExécution\u003c/h2\u003e\n\u003cp\u003ePour exécuter stubby, il suffit de :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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:# stubby\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e12:57:39.896254\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e STUBBY: Read config from file /usr/local/etc/stubby/stubby.yml\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e12:57:39.898479\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e STUBBY: DNSSEC Validation is OFF\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e12:57:39.898585\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e STUBBY: Transport list is:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e12:57:39.898617\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e STUBBY:   - TLS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e12:57:39.898681\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e STUBBY: Privacy Usage Profile is Strict \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eAuthentication required\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\u003e12:57:39.898713\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e STUBBY: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eNOTE a Strict Profile only applies when TLS is the ONLY transport!!\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\u003e12:57:39.898749\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e STUBBY: Starting DAEMON....\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eQuelques informations intéressantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele drapeau \u003ccode\u003e-C\u003c/code\u003e permet de spécifier un autre fichier de configuration, \nà la place de l\u0026rsquo;original.\u003c/li\u003e\n\u003cli\u003ele drapeau \u003ccode\u003e-g\u003c/code\u003e permet de fonctionner en arrière plan…\u003c/li\u003e\n\u003cli\u003ele drapeau \u003ccode\u003e-i\u003c/code\u003e permet de vérifier la configuration !\u003c/li\u003e\n\u003cli\u003ele drapeau \u003ccode\u003e-l\u003c/code\u003e a pour objectif de journaliser les connexions. \nPour l\u0026rsquo;instant, la sortie se fait sur la sortie standard \u003ccode\u003estdout\u003c/code\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"test\"\u003eTest\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;usage très simple de \u003ccode\u003edig\u003c/code\u003e nous permettra de nous assurer du bon\nfonctionnement :\u003c/p\u003e\n\u003cp\u003e⇒ Version IPv4\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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:$ dig @127.0.0.1 www.gandi.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\u003e; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.4.2-P2 \u0026lt;\u0026lt;\u0026gt;\u0026gt; @127.0.0.1 www.gandi.net\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:#f99b15\"\u003e1\u003c/span\u003e server found\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; global options:  printcmd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; Got answer:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; -\u0026gt;\u0026gt;HEADER\u003cspan style=\"color:#48b685\"\u003e\u0026lt;\u0026lt;- opco\u003c/span\u003ede: QUERY, status: NOERROR, id: \u003cspan style=\"color:#f99b15\"\u003e40041\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: \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;; QUESTION SECTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;www.gandi.net.                 IN      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;; ANSWER SECTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww.gandi.net.          \u003cspan style=\"color:#f99b15\"\u003e21583\u003c/span\u003e   IN      CNAME   prod.gandi.map.fastly.net.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprod.gandi.map.fastly.net. \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e IN      A       151.101.37.103\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; AUTHORITY SECTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efastly.net.             \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e    IN      NS      ns1.fastly.net.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efastly.net.             \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e    IN      NS      ns2.fastly.net.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efastly.net.             \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e    IN      NS      ns3.fastly.net.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efastly.net.             \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e    IN      NS      ns4.fastly.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\u003e;; Query time: \u003cspan style=\"color:#f99b15\"\u003e1888\u003c/span\u003e msec\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; SERVER: 127.0.0.1#53\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e127.0.0.1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; WHEN: Thu Mar \u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e 14:15:51 \u003cspan style=\"color:#f99b15\"\u003e2018\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; MSG SIZE  rcvd: \u003cspan style=\"color:#f99b15\"\u003e155\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Version IPv6 :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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:$ dig @::1 www.gandi.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\u003e; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.4.2-P2 \u0026lt;\u0026lt;\u0026gt;\u0026gt; @::1 www.gandi.net\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:#f99b15\"\u003e1\u003c/span\u003e server found\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; global options:  printcmd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; Got answer:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; -\u0026gt;\u0026gt;HEADER\u003cspan style=\"color:#48b685\"\u003e\u0026lt;\u0026lt;- opco\u003c/span\u003ede: QUERY, status: NOERROR, id: \u003cspan style=\"color:#f99b15\"\u003e24688\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; QUESTION SECTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;www.gandi.net.                 IN      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;; ANSWER SECTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww.gandi.net.          \u003cspan style=\"color:#f99b15\"\u003e84574\u003c/span\u003e   IN      CNAME   prod.gandi.map.fastly.net.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprod.gandi.map.fastly.net. \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e IN      A       151.101.85.103\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; AUTHORITY SECTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efastly.net.             \u003cspan style=\"color:#f99b15\"\u003e168207\u003c/span\u003e  IN      NS      ns4.fastly.net.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efastly.net.             \u003cspan style=\"color:#f99b15\"\u003e168207\u003c/span\u003e  IN      NS      ns2.fastly.net.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efastly.net.             \u003cspan style=\"color:#f99b15\"\u003e168207\u003c/span\u003e  IN      NS      ns1.fastly.net.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efastly.net.             \u003cspan style=\"color:#f99b15\"\u003e168207\u003c/span\u003e  IN      NS      ns3.fastly.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\u003e;; ADDITIONAL SECTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ens1.fastly.net.         \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e    IN      A       23.235.32.32\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ens2.fastly.net.         \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e    IN      A       104.156.80.32\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ens3.fastly.net.         \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e    IN      A       23.235.36.32\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ens4.fastly.net.         \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e    IN      A       104.156.84.32\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; Query time: \u003cspan style=\"color:#f99b15\"\u003e1614\u003c/span\u003e msec\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; SERVER: ::1#53\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e::1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; WHEN: Thu Mar \u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e 14:16:40 \u003cspan style=\"color:#f99b15\"\u003e2018\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; MSG SIZE  rcvd: \u003cspan style=\"color:#f99b15\"\u003e219\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n","summary":"Expérimentation d'installation de stubby, un client DoT pour DNS, et DNSSEC, sur OpenBSD (6.3).","tags":["OpenBSD","stubby","experimental","DNS","DoT","DNSSEC"],"date_published":"2018-03-22T14:21:09+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-03-19:/fr/post/generer-enregistrement-tlsa#91e0f71f077c32288d56386b941b07f7187fb11a038aaecaaffae3670ac5cfdb","url":"https://it-log.fr.eu.org/fr/post/generer-enregistrement-tlsa/","title":"DNS: Générer un enregistrement TLSA","author":{"name":"Stéphane HUC"},"content_text":"Description Du fait de gérer moi-même la zone DNS pour mon propre ndd, dans le but \u0026ldquo;d\u0026rsquo;implémenter\u0026rdquo; DNSSEC.\nJe commence maintenant à m\u0026rsquo;intéresser aux enregistrements DANE. Pour l\u0026rsquo;instant, je ne génère qu\u0026rsquo;un enregistrement pour le port 443/tcp - service web. Mais il est possible d\u0026rsquo;en générer pour d\u0026rsquo;autres services, tel que 25/tcp qui correspond à smtp, d\u0026rsquo;autres protocoles que tcp, etc…\nCréer un enregistrement TLSA n\u0026rsquo;est pas compliqué !\nPour le propos, un enregistrement TLSA est ainsi construit :\n_numeroDePort._protocol.domain. IN TLSA usage selecteur correspondance certificatAssocie\nVeuillez consulter la documentation de l\u0026rsquo;Afnic, ci-dessous, pour bien comprendre le propos.\nGénération TLSA en shell Pour générer un enregistrement TLSA en shell, c\u0026rsquo;est assez simple en somme :\nopenssl x509 -noout -pubkey -in /etc/ssl/acme/nomDeDomaine.cert.pem | openssl rsa -pubin -outform der 2\u0026gt;/dev/null | sha512 | tr \u0026quot;a-z\u0026quot; \u0026quot;A-Z\u0026quot;\nDans un premier temps :\non choisit l\u0026rsquo;algo, soit sha256, soit sha512 on choisit de n\u0026rsquo;utiliser tout le certificat ou juste la clé publique de celui-ci algo=\u0026#34;sha512\u0026#34; domain=\u0026#34;stephane-huc.net\u0026#34; cert=\u0026#34;/etc/ssl/acme/${domain}.cert.pem\u0026#34; # chemin vers le fichier cert SSL généré par LetsEncrypt, avec le client natif OpenBSD - acme secure ! tls_port=443 tls_proto=\u0026#34;tcp\u0026#34; tlsa_usage=3 # Usage Field; possible: 0 =\u0026gt; 3 tlsa_selector=0 # Selector Field; 0: use cert; 1: use public key tlsa_method=0 # Matching Type Field case \u0026#34;${algo}\u0026#34; in \u0026#34;sha256\u0026#34;) tlsa_method=1 ;; \u0026#34;sha512\u0026#34;) tlsa_method=2 ;; esac #tlsa_cert_associated=\u0026#34;$(openssl x509 -in \u0026#34;${cert}\u0026#34; -outform der | openssl $algo | cut -d \u0026#39; \u0026#39; -f2)\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 | ${algo} | tr \u0026#34;a-z\u0026#34; \u0026#34;A-Z\u0026#34; )\u0026#34; tlsa_record=\u0026#34;_${tls_port}._${tls_proto}.${domain}. IN TLSA ${tlsa_usage} ${tlsa_selector} ${tlsa_method} ${tlsa_cert_associated}\u0026#34; # ajout de l\u0026#39;enregistrement vers votre zone dns ; dans ce cas, l\u0026#39;enregistrement de cette dernière est dû au fait de l\u0026#39;outil ldnscript de @\u0026#34;22decembre\u0026#34; ! echo \u0026#34;${tlsa_record}\u0026#34; \u0026gt;\u0026gt; /etc/ns/${domain} Version multi-domaines Voici le même code shell, pour gérer plusieurs domaines, pour exemple :\n#!/bin/sh algo=sha256 #cert=\u0026#34;/etc/ssl/acme/${domain}.cert.pem\u0026#34; domains=\u0026#34;yeuxdelibad.net 3hg.fr ouaf.xyz\u0026#34; tls_proto=\u0026#34;tcp\u0026#34; tls_ports=\u0026#34;443\u0026#34; tlsa_usage=3 # Usage Field; possible: 0 =\u0026gt; 3 tlsa_selector=1 # Selector Field; 0: use cert; 1: use public key tlsa_method=0 # Matching Type Field case \u0026#34;${algo}\u0026#34; in \u0026#34;sha256\u0026#34;) tlsa_method=1 ;; \u0026#34;sha512\u0026#34;) tlsa_method=2 ;; esac for domain in ${domains}; do cert=\u0026#34;etc/ssl/acme/${domain}.cert.pem\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 | ${algo} | tr \u0026#34;a-z\u0026#34; \u0026#34;A-Z\u0026#34; )\u0026#34; for port in ${tls_ports}; do tlsa_record=\u0026#34;_${port}._${tls_proto}.${domain}. IN TLSA ${tlsa_usage} ${tlsa_selector} ${tlsa_method} ${tlsa_cert_associated}\u0026#34; echo \u0026#34;${tlsa_record}\u0026#34; \u0026gt;\u0026gt; \u0026#34;/etc/ns/${domain}\u0026#34; done echo \u0026#34;You should update your ${domain} zone in 48h\u0026#34; | mail -s \u0026#34;${domain} TLSA update\u0026#34; root sleep 1 # reload zone and nsd ; à décommenter, si vous utiliser nsd ;) #/var/ldns/ldnscript signing \u0026#34;${domain}\u0026#34; done Merci Xavier ;)\nGénérer TLSA en PHP Générer un enregistrement TLSA en PHP n\u0026rsquo;est guère plus compliqué, à partir du moment où on a les bonnes infos !\nOn veille à récupérer le certificat au format PEM, à l\u0026rsquo;injecter dans un formulaire HTML et à traiter les informations reçues par celui-ci. Je ne décris pas le code HTML.\n\u0026lt;?php function extractPublicKey($cert) { $certificate = openssl_x509_read($cert); $pub_key = openssl_get_publickey($certificate); $pub_key = openssl_pkey_get_details($pub_key); if (!isset($pub_key[\u0026#39;key\u0026#39;])) { // @codeCoverageIgnoreStart throw new \\InvalidArgumentException(\u0026#39;Provided certificate is invalid.\u0026#39;); // @codeCoverageIgnoreEnd } return $pub_key[\u0026#39;key\u0026#39;]; } function pem2der($pem) { return base64_decode(str_replace([\u0026#34;\\n\u0026#34;, \u0026#34;\\r\u0026#34;], \u0026#39;\u0026#39;, $pem)); } function stripDatas($pem) { $datas = [ \u0026#39;-----BEGIN PUBLIC KEY-----\u0026#39;, \u0026#39;-----END PUBLIC KEY-----\u0026#39;, \u0026#39;-----BEGIN CERTIFICATE-----\u0026#39;, \u0026#39;-----END CERTIFICATE-----\u0026#39; ]; $data = str_replace($datas, \u0026#39;\u0026#39;, $pem); return trim($data); } # $datas = certificat au format PEM $pkey = extractPublicKey($datas); $pem = pem2der(stripDatas($pkey)); switch($tlsa_match) { case 0: $data = $pem; break; case 1: $data = hash(\u0026#39;sha256\u0026#39;, $pem, true); break; case 2: $data = hash(\u0026#39;sha512\u0026#39;, $pem, true); break; } $tlsa_cert_associated = bin2hex($data); # les variables $port, $protocol, $domain ainsi que les $tlsa_* sont des variables créées dans le contexte du formulaire HTML, et nommées très simplement selon leur contexte. $tlsa_gen = \u0026#34;_\u0026#34;.$port.\u0026#34;._\u0026#34;.$protocol.\u0026#34;.\u0026#34;.$domain.\u0026#34;. IN TLSA \u0026#34;.$tlsa_usage.\u0026#34; \u0026#34;.$tlsa_selector.\u0026#34; \u0026#34;.$tlsa_match.\u0026#34; \u0026#34;.$tlsa_cert_associated; # pour finir, un echo là où vous le désirez dans votre code HTML de restitution... echo $tlsa_gen ?\u0026gt; Les fonctions dans le code ne sont pas de moi - je partage ni + ni -\nVérification de l\u0026rsquo;enregistrement TLSA Il existe des modules à Firefox :\nDNSSEC DNSSEC/DANE Validator On peut le faire par l\u0026rsquo;usage de générateur TLSA en ligne - puis comparer les infos restituées avec celles que vous avez générées - malheureusement rien d\u0026rsquo;automati(que|sé) :\ncelui de Simon Huque celui de SSL-Tools et forcément le mien - le seul en français !? Documentation L\u0026rsquo;afnic a écrit des articles intéressants à-propos de :\nDNSSEC DANE Stéphane Bortzmeyer aussi parle de la RFC 6698 et explique beaucoup de choses intéressantes !\nUn autre article expliquant de manière claire, simple DANE-TLSA.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eDu fait de gérer moi-même la zone DNS pour mon propre ndd, dans le but\n\u0026ldquo;d\u0026rsquo;implémenter\u0026rdquo; DNSSEC.\u003c/p\u003e\n\u003cp\u003eJe commence maintenant à m\u0026rsquo;intéresser aux enregistrements DANE. Pour\nl\u0026rsquo;instant, je ne génère qu\u0026rsquo;un enregistrement pour le port 443/tcp - service web.\nMais il est possible d\u0026rsquo;en générer pour d\u0026rsquo;autres services, tel que 25/tcp\nqui correspond à smtp, d\u0026rsquo;autres protocoles que tcp, etc…\u003c/p\u003e\n\u003cp\u003eCréer un enregistrement TLSA n\u0026rsquo;est pas compliqué !\u003c/p\u003e\n\u003cp\u003ePour le propos, un enregistrement TLSA est ainsi construit :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e_numeroDePort._protocol.domain. IN TLSA usage selecteur correspondance certificatAssocie\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eVeuillez consulter la \u003ca href=\"/fr/post/generer-enregistrement-tlsa/#documentation\"\u003edocumentation\u003c/a\u003e de l\u0026rsquo;Afnic, ci-dessous,\npour bien comprendre le propos.\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"génération-tlsa-en-shell\"\u003eGénération TLSA en shell\u003c/h2\u003e\n\u003cp\u003ePour générer un enregistrement TLSA en shell, c\u0026rsquo;est assez simple en somme :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eopenssl x509 -noout -pubkey -in /etc/ssl/acme/nomDeDomaine.cert.pem | openssl rsa -pubin -outform der 2\u0026gt;/dev/null | sha512 | tr \u0026quot;a-z\u0026quot; \u0026quot;A-Z\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eDans un premier temps :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eon choisit l\u0026rsquo;algo, soit sha256, soit sha512\u003c/li\u003e\n\u003cli\u003eon choisit de n\u0026rsquo;utiliser tout le certificat ou juste la clé publique de celui-ci\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\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\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\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;stephane-huc.net\u0026#34;\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;/etc/ssl/acme/\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    \u003cspan style=\"color:#776e71\"\u003e# chemin vers le fichier cert SSL généré par LetsEncrypt, avec le client natif OpenBSD - acme secure !\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003etls_port\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e443\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003etls_proto\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;tcp\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_usage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e    \u003cspan style=\"color:#776e71\"\u003e# Usage Field; possible: 0 =\u0026gt; 3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\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 \u003cspan style=\"color:#776e71\"\u003e# Selector Field; 0: use cert; 1: use public key\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\"\u003e0\u003c/span\u003e   \u003cspan style=\"color:#776e71\"\u003e# Matching Type Field\u003c/span\u003e\n\u003c/span\u003e\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\"\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:#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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#tlsa_cert_associated=\u0026#34;$(openssl x509 -in \u0026#34;${cert}\u0026#34; -outform der | openssl $algo | cut -d \u0026#39; \u0026#39; -f2)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\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:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e | tr \u003cspan style=\"color:#48b685\"\u003e\u0026#34;a-z\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;A-Z\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\"\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# ajout de l\u0026#39;enregistrement vers votre zone dns ; dans ce cas, l\u0026#39;enregistrement de cette dernière est dû au fait de l\u0026#39;outil ldnscript de @\u0026#34;22decembre\u0026#34; !\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho \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; /etc/ns/\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\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=\"version-multi-domaines\"\u003eVersion multi-domaines\u003c/h3\u003e\n\u003cp\u003eVoici le même code shell, pour gérer plusieurs domaines, pour 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\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\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003esha256\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#cert=\u0026#34;/etc/ssl/acme/${domain}.cert.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edomains\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;yeuxdelibad.net 3hg.fr ouaf.xyz\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\"\u003etls_proto\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;tcp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003etls_ports\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;443\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_usage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e    \u003cspan style=\"color:#776e71\"\u003e# Usage Field; possible: 0 =\u0026gt; 3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\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 \u003cspan style=\"color:#776e71\"\u003e# Selector Field; 0: use cert; 1: use public key\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\"\u003e0\u003c/span\u003e   \u003cspan style=\"color:#776e71\"\u003e# Matching Type Field\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\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:#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:#815ba4\"\u003efor\u003c/span\u003e domain in \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:#815ba4\"\u003edo\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;etc/ssl/acme/\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    \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:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e | tr \u003cspan style=\"color:#48b685\"\u003e\u0026#34;a-z\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;A-Z\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\"\u003efor\u003c/span\u003e port in \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_ports\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\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:#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\"\u003eport\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        echo \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;/etc/ns/\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    echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;You should update your \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 zone in 48h\u0026#34;\u003c/span\u003e | mail -s \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 TLSA update\u0026#34;\u003c/span\u003e root\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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:#776e71\"\u003e# reload zone and nsd ; à décommenter, si vous utiliser nsd ;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#/var/ldns/ldnscript signing \u0026#34;${domain}\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eMerci \u003ca href=\"https://si3t.ch\" rel=\"external\"\u003eXavier\u003c/a\u003e ;)\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"générer-tlsa-en-php\"\u003eGénérer TLSA en PHP\u003c/h2\u003e\n\u003cp\u003eGénérer un enregistrement TLSA en PHP n\u0026rsquo;est guère plus compliqué, à\npartir du moment où on a les bonnes infos !\u003c/p\u003e\n\u003cp\u003eOn veille à récupérer le certificat au format PEM, à l\u0026rsquo;injecter dans un\nformulaire HTML et à traiter les informations reçues par celui-ci.\n\u003cem\u003eJe ne décris pas le code HTML\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-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eextractPublicKey\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$cert\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e$certificate\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eopenssl_x509_read\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$cert\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e$pub_key\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eopenssl_get_publickey\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$certificate\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e$pub_key\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eopenssl_pkey_get_details\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$pub_key\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:#06b6ef\"\u003eisset\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$pub_key\u003c/span\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;key\u0026#39;\u003c/span\u003e])) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#776e71\"\u003e// @codeCoverageIgnoreStart\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#815ba4\"\u003ethrow\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e\\InvalidArgumentException\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Provided certificate is invalid.\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#776e71\"\u003e// @codeCoverageIgnoreEnd\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:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$pub_key\u003c/span\u003e[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;key\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\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003epem2der\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$pem\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\"\u003ebase64_decode\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003estr_replace\u003c/span\u003e([\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\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\\r\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e], \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$pem\u003c/span\u003e));\n\u003c/span\u003e\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\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003estripDatas\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$pem\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e$datas\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#39;-----BEGIN PUBLIC KEY-----\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;-----END PUBLIC KEY-----\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;-----BEGIN CERTIFICATE-----\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;-----END CERTIFICATE-----\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:#ef6155\"\u003e$data\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003estr_replace\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$datas\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$pem\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\"\u003etrim\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$data\u003c/span\u003e);\n\u003c/span\u003e\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# $datas = certificat au format PEM\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$pkey\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eextractPublicKey\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$datas\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$pem\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003epem2der\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003estripDatas\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$pkey\u003c/span\u003e));\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eswitch\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$tlsa_match\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:#f99b15\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$data\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$pem\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ebreak\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:#f99b15\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$data\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehash\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;sha256\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$pem\u003c/span\u003e, \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e); \u003cspan style=\"color:#815ba4\"\u003ebreak\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:#f99b15\"\u003e2\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$data\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehash\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;sha512\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e$pem\u003c/span\u003e, \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e); \u003cspan style=\"color:#815ba4\"\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:#ef6155\"\u003e$tlsa_cert_associated\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ebin2hex\u003c/span\u003e(\u003cspan style=\"color:#ef6155\"\u003e$data\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\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# les variables $port, $protocol, $domain ainsi que les $tlsa_* sont des variables créées dans le contexte du formulaire HTML, et nommées très simplement selon leur contexte.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e$tlsa_gen\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:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$port\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:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$protocol\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:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$domain\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;. IN TLSA \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$tlsa_usage\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:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$tlsa_selector\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:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$tlsa_match\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:#5bc4bf\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$tlsa_cert_associated\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\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# pour finir, un echo là où vous le désirez dans votre code HTML de restitution...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$tlsa_gen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eLes fonctions dans le code ne sont pas de moi - je partage ni + ni -\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"vérification-de-lenregistrement-tlsa\"\u003eVérification de l\u0026rsquo;enregistrement TLSA\u003c/h2\u003e\n\u003cp\u003eIl existe des modules à Firefox :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://addons.mozilla.org/fr/firefox/addon/dnssec/?src=api\" rel=\"external\"\u003eDNSSEC\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://addons.mozilla.org/fr/firefox/addon/dnssec-dane-validator/\" rel=\"external\"\u003eDNSSEC/DANE Validator\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOn peut le faire par l\u0026rsquo;usage de générateur TLSA en ligne - puis comparer les infos restituées avec celles que vous avez générées - \u003cem\u003emalheureusement rien d\u0026rsquo;automati(que|sé)\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecelui de \u003ca href=\"https://www.huque.com/bin/gen_tlsa\" rel=\"external\"\u003eSimon Huque\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ecelui de \u003ca href=\"https://ssl-tools.net/tlsa-generator\" rel=\"external\"\u003eSSL-Tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eet forcément \u003ca href=\"https://huc.fr.eu.org/tools/dane-tlsa.php\" rel=\"external\"\u003ele mien\u003c/a\u003e - \u003cem\u003ele seul en français !?\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;afnic a écrit des articles intéressants à-propos de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.afnic.fr/medias/documents/afnic-dossier-dnssec-2010-09.pdf\" rel=\"external\"\u003eDNSSEC\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.afnic.fr/fr/ressources/publications/dossiers-thematiques/securiser-les-communications-sur-internet-de-bout-en-bout-avec-le-protocole-dane.html\" rel=\"external\"\u003eDANE\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eStéphane Bortzmeyer aussi parle de la \u003ca href=\"http://www.bortzmeyer.org/6698.html\" rel=\"external\"\u003eRFC 6698\u003c/a\u003e et explique beaucoup de choses intéressantes !\u003c/p\u003e\n\u003cp\u003eUn autre \u003ca href=\"https://www.abyssproject.net/2016/09/creer-utiliser-enregistrements-tlsa-dane/\" rel=\"external\"\u003earticle\u003c/a\u003e expliquant de manière claire, simple DANE-TLSA.\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment générer un enregistrement TLSA en langage shell, et PHP","tags":["DNS","DANE","TLSA"],"date_published":"2018-03-19T16:03:53+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2018-03-04:/fr/sec/gpg/gpg-erreurs#cab3d995f84f7f1210e5d1be12d99e3bf83e24ab0bf2bbeba1b515f75e10f04f","url":"https://it-log.fr.eu.org/fr/sec/gpg/gpg-erreurs/","title":"GPG : les messages d'erreurs","author":{"name":"Stéphane HUC"},"content_text":"Description Cet article répertorie les différentes erreurs plus ou moins classiques, et essaie d\u0026rsquo;apporter une réponse !\nMessages Attention : les droits du répertoire personnel « ~/.gnupg » ne sont pas sûrs Faites à minima un chmod 0600 dessus : $ chmod 0600 ~/.gnupg\nerror: cannot run gpg: No such file or directory error: cannot run gpg: No such file or directory error: impossible de lancer gpg.`\nLe système ne trouve pas l\u0026rsquo;outil GPG. Vérifiez votre installation …\ngpg: échec de la signature : Inappropriate ioctl for device gpg: échec de la signature : Inappropriate ioctl for device gpg: signing failed: Inappropriate ioctl for device Vérifiez que les paquets pinentry, et/ou ses variantes pour gtk sous Linux, *BSD soient installés : pinentry-gtk2, pinentry-gtk3 Sinon, faites-le !\ngpg: failed to start the dirmngr gpg: failed to start the dirmngr \u0026#39;/usr/bin/dirmngr\u0026#39;: Aucun fichier ou dossier de ce type gpg: connecting dirmngr at \u0026#39;/tmp/apt-key-gpghome.fPXOnUY2mr/S.dirmngr\u0026#39; failed: Aucun fichier ou dossier de ce type gpg: keyserver receive failed: Pas de dirmngr Vérifiez que le paquet dirmgnr soit installé ; sinon, faites-le !\ngpg: des parties de la clef secrète ne sont pas disponibles La clé que vous cherchez à utiliser ou avec laquelle vous cherchez à signer est en mode \u0026ldquo;protégé\u0026rdquo;.\nLe seul moyen que j\u0026rsquo;ai trouvé est de supprimer la clé en question :\n:$ gpg --delete-secret-and-public-key gpg (GnuPG) 1.4.21; Copyright (C) 2015 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. sec 4096R/*** 2016-03-28 Nom Prenom \u0026lt;email@domain.tld\u0026gt; Faut-il supprimer cette clef du porte-clefs ? (o/N) o C\u0026#39;est une clef secrète — faut-il vraiment la supprimer ? (o/N) o pub 4096R/*** 2016-03-28 Nom Prenom \u0026lt;email@domain.tld\u0026gt; Faut-il supprimer cette clef du porte-clefs ? (o/N) o Puis de réimporter le fichier de signature de clé privée que vous avez créé suite à la création de ladite clé :\n:$ gpg --import ~/email@domain.tld.private_key.asc gpg: clef *** : clef secrète importée gpg: clef *** : clef publique « Nom Prenom \u0026lt;email@domain.tld\u0026gt; » importée gpg: Quantité totale traitée : 1 gpg: importées : 1 (RSA: 1) gpg: clefs secrètes lues : 1 gpg: clefs secrètes importées : 1 gpg-agent :: erreurs gpg: gpg-agent n\u0026rsquo;est pas disponible dans cette session Avez-vous veillé à exporter la variable GPG_TTY ?\nAjoutez dans votre fichier .bashrc, ou .kshrc :\nexport GPG_TTY=\u0026quot;$(tty)\u0026quot;\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eCet article répertorie les différentes erreurs plus ou moins classiques,\net essaie d\u0026rsquo;apporter une réponse !\u003c/p\u003e\n\u003ch2 id=\"messages\"\u003eMessages\u003c/h2\u003e\n\u003ch3 id=\"attention-les-droits-du-répertoire-personnel-gnupg-ne-sont-pas-sûrs\"\u003eAttention : les droits du répertoire personnel « ~/.gnupg » ne sont pas sûrs\u003c/h3\u003e\n\u003cp\u003eFaites à minima un \u003cem\u003echmod 0600\u003c/em\u003e dessus : \u003cbr\u003e\n\u003ccode\u003e$ chmod 0600 ~/.gnupg\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"error-cannot-run-gpg-no-such-file-or-directory\"\u003eerror: cannot run gpg: No such file or directory\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eerror: cannot run gpg: No such file or directory \u003c/code\u003eerror: impossible de lancer gpg.`\u003c/p\u003e\n\u003cp\u003eLe système ne trouve pas l\u0026rsquo;outil \u003cstrong\u003eGPG\u003c/strong\u003e.\n\u003cspan class=\"red\"\u003eVérifiez votre installation\u003c/span\u003e\n…\u003c/p\u003e\n\u003ch3 id=\"gpg-échec-de-la-signature--inappropriate-ioctl-for-device\"\u003egpg: échec de la signature : Inappropriate ioctl for device\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-gpg\" data-lang=\"gpg\"\u003egpg: échec de la signature : Inappropriate ioctl for device\ngpg: signing failed: Inappropriate ioctl for device\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cspan class=\"red\"\u003eVérifiez\u003c/span\u003e\n que les paquets \u003ccode\u003epinentry\u003c/code\u003e, et/ou ses\nvariantes pour \u003cstrong\u003egtk\u003c/strong\u003e sous Linux, *BSD soient installés : \u003ccode\u003epinentry-gtk2\u003c/code\u003e,\n\u003ccode\u003epinentry-gtk3\u003c/code\u003e \u003cbr\u003e\nSinon, faites-le !\u003c/p\u003e\n\u003ch3 id=\"gpg-failed-to-start-the-dirmngr\"\u003egpg: failed to start the dirmngr\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-gpg\" data-lang=\"gpg\"\u003egpg: failed to start the dirmngr \u0026#39;/usr/bin/dirmngr\u0026#39;: Aucun fichier ou dossier de ce type\ngpg: connecting dirmngr at \u0026#39;/tmp/apt-key-gpghome.fPXOnUY2mr/S.dirmngr\u0026#39; failed: Aucun fichier ou dossier de ce type\ngpg: keyserver receive failed: Pas de dirmngr\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cspan class=\"red\"\u003eVérifiez\u003c/span\u003e\n  que le paquet \u003cstrong\u003edirmgnr\u003c/strong\u003e soit installé ;\nsinon, faites-le !\u003c/p\u003e\n\u003ch3 id=\"gpg-des-parties-de-la-clef-secrète-ne-sont-pas-disponibles\"\u003egpg: des parties de la clef secrète ne sont pas disponibles\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eLa clé que vous cherchez à utiliser ou avec laquelle vous cherchez à signer\nest en mode \u0026ldquo;protégé\u0026rdquo;.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLe seul moyen que j\u0026rsquo;ai trouvé est de supprimer la clé\nen question :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ gpg --delete-secret-and-public-key\ngpg (GnuPG) 1.4.21; Copyright (C) 2015 Free Software Foundation, Inc.\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\n\nsec  4096R/*** 2016-03-28 Nom Prenom \u0026lt;email@domain.tld\u0026gt;\n\nFaut-il supprimer cette clef du porte-clefs ? (o/N) o\nC\u0026#39;est une clef secrète — faut-il vraiment la supprimer ? (o/N) o\n\npub  4096R/*** 2016-03-28 Nom Prenom \u0026lt;email@domain.tld\u0026gt;\n\nFaut-il supprimer cette clef du porte-clefs ? (o/N) o\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuis de réimporter le fichier de signature de clé privée que vous avez\ncréé suite à la création de ladite clé :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ gpg --import ~/email@domain.tld.private_key.asc\ngpg: clef *** : clef secrète importée\ngpg: clef *** : clef publique « Nom Prenom \u0026lt;email@domain.tld\u0026gt; » importée\ngpg:       Quantité totale traitée : 1\ngpg:                     importées : 1  (RSA: 1)\ngpg:           clefs secrètes lues : 1\ngpg:      clefs secrètes importées : 1\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"gpg-agent--erreurs\"\u003egpg-agent :: erreurs\u003c/h2\u003e\n\u003ch3 id=\"gpg-gpg-agent-nest-pas-disponible-dans-cette-session\"\u003egpg: gpg-agent n\u0026rsquo;est pas disponible dans cette session\u003c/h3\u003e\n\u003cp\u003eAvez-vous veillé à \u003ca href=\"https://www.gnupg.org/documentation/manuals/gnupg/Invoking-GPG_002dAGENT.html\" rel=\"external\"\u003eexporter la variable GPG_TTY\u003c/a\u003e ?\u003c/p\u003e\n\u003cp\u003eAjoutez dans votre fichier \u003ccode\u003e.bashrc\u003c/code\u003e, ou \u003ccode\u003e.kshrc\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eexport GPG_TTY=\u0026quot;$(tty)\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Du traitement des messages d'erreurs de GPG, et du client gpg-agent","tags":["GPG","Erreur"],"date_published":"2018-03-04T18:55:50+01:00","date_modified":"2019-03-17T18:29:50+01:00"},{"id":"tag:doc.huc.fr.eu.org,2018-02-15:/fr/sys/debian/urbackup-client-gui#9be75bd36f2246cfd5220c730162243246544aa0db64aa4c517eee59560f658d","url":"https://it-log.fr.eu.org/fr/sys/debian/urbackup-client-gui/","title":"Urbackup: Client graphique pour Debian/Ubuntu","author":{"name":"Stéphane HUC"},"content_text":"Description Ceci est un tutoriel pour utiliser l\u0026rsquo;interface graphique du logiciel client d\u0026rsquo;Urbackup - logiciel de sauvegarde sur serveur -\nLa première erreur à ne pas commettre est de bien télécharger le bon client :\nne pas télécharger Binary Linux client (command line only; with auto-update; x86/AMD64/ARMv6+/ARM64) mais bel et bien selon la page \u0026ldquo;Install client on Debian or Ubuntu from sources\u0026rdquo; - ceci est en fait une traduction principalement, avec quelques corrections et aperçus ! Nécessite :\nque le logiciel urbackup-serveur soit installé sur le serveur qui recevra les sauvegardes du client, qu\u0026rsquo;il soit activé et fonctionnel - ce tuto ne traite pas de l\u0026rsquo;installation de celui-ci sur le serveur. le binaire gksu doit être installé sur la station à sauvegarder… Installation Installation des dépendances nécessaires : :# apt install build-essential \u0026#34;g++\u0026#34; libwxgtk3.0-dev \u0026#34;libcrypto++-dev\u0026#34; libz-dev On télécharge puis on décompresse l\u0026rsquo;archive relative au binaire : :$ wget https://hndl.urbackup.org/Client/2.1.17/urbackup-client-2.1.17.tar.gz :$ tar xzf urbackup-client-2.1.17.tar.gz On compile et installe le binaire : :$ cd urbackup-client-2.1.17 :$ ./configure :$ make -j4 :# make install Ceci étant fait, on vérifie que le service d\u0026rsquo;arrière plan fonctionne bien : :$ urbackupclientbackend -v info 2018-02-15 18:22:00: Started UrBackupClient Backend… 2018-02-15 18:22:01: Looking for old Sessions… 0 sessions Systemd Création du service de démarrage pour systemd, par l\u0026rsquo;ajout au système d\u0026rsquo;un nouveau fichier nommé /etc/systemd/system/urbackup.service : Description=Urbackup Backend ConditionPathExists=/usr/local/sbin/urbackupclientbackend [Service] Type=forking ExecStart=/usr/local/sbin/urbackupclientbackend -d PIDFile = /var/run/urbackup_srv.pid TimeoutSec=0 [Install] WantedBy=multi-user.target Lui attribuer les droits d\u0026rsquo;exécution nécessaires : :# chmod a+x /etc/systemd/system/urbackup.service` Redémarrer systemd, de démarrer le nouveau service et de l\u0026rsquo;activer pour le démarrage automatique : :# systemctl --system daemon-reload :# systemctl start urbackup.service :# systemctl enable urbackup.service Puis, vérifier que le nouveau service fonctionne bien : # systemctl status urbackup.service ● urbackup.service - Urbackup Backend Loaded: loaded (/etc/systemd/system/urbackup.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2018-02-15 17:33:37 CET; 4min 5s ago Process: 13362 ExecStart=/usr/local/sbin/urbackupclientbackend -d (code=exited, status=0/SUCCESS) Main PID: 13364 (urbackupclientb) Tasks: 11 (limit: 4915) CGroup: /system.slice/urbackup.service └─13364 /usr/local/sbin/urbackupclientbackend -d Feb 15 17:33:37 ptb-mlm systemd[1]: Starting Urbackup Backend… Feb 15 17:33:37 ptb-mlm systemd[1]: Started Urbackup Backend. Utilisation Le binaire du client graphique se nomme urbackupclientgui et nécessite des droits administrateurs pour le paramétrage de celui-ci :\nVérifiez que le binaire \u0026ldquo;gksu\u0026rdquo; soit installé, si ce n\u0026rsquo;est pas le cas, faites-le ! Puis ajoutez votre identifiant utilisateur au groupe sudo : # adduser USERID sudo Déconnectez-vous, et reconnectez-vous à votre session. Puis, dans votre session, une fois connecté, ajoutez le démarrage du client Gui, dans les paramètres de \u0026ldquo;Session et démarrage\u0026rdquo; - qui dépendent de votre bureau graphique ; le chemin du binaire est : /usr/local/bin/urbackupclientgui AstuceL\u0026rsquo;équivalent de ces menus est gérable au-travers de l\u0026rsquo;interface web du serveur (http://ip_serveur:55414) ; choisissez le menu \u0026ldquo;Réglages\u0026rdquo;, puis le client à gérer dans la liste déroulante \u0026ldquo;Clients\u0026rdquo;. Menu \u0026ldquo;Do * Backups\u0026rdquo; Le menu \u0026ldquo;Do full file backup\u0026rdquo; est l\u0026rsquo;option qui vous permet de faire une sauvegarde de tous les fichiers et répertoires choisis… Le menu \u0026ldquo;Do incremental file backup\u0026rdquo; est l\u0026rsquo;option qui vous permet de faire une sauvegarde dite incrémentale ; celle qui sauvegarde juste les différences… Menu \u0026ldquo;Settings\u0026rdquo; Onglet \u0026ldquo;File Backup\u0026rdquo; : Les champs d\u0026rsquo;intervalle sont là pour définir le nombre de jours pour les sauvegardes, principalement. Les champs \u0026ldquo;Exclude from backup\u0026rdquo;, et \u0026ldquo;Include in backup\u0026rdquo; sont ceux qui vous permettent d\u0026rsquo;inclure ou d\u0026rsquo;exclure des fichiers spécifiques - à séparer par le symbole \u0026lsquo;;\u0026rsquo;. Onglet \u0026ldquo;Client\u0026rdquo; : Le champ \u0026ldquo;Client\u0026rdquo; est celui qui vous permettra de nommer la station à sauvegarder - par défaut, il prend la valeur du hostname. Onglet \u0026ldquo;Internet\u0026rdquo; : Cet onglet n\u0026rsquo;est intéressant que pour ceux qui veulent sauvegarder au-travers d\u0026rsquo;un Internet… il serait assurément intéressant d\u0026rsquo;envisager ce flux-là au-travers d\u0026rsquo;un tunnel SSH ! Menu \u0026ldquo;Add/Remove backup paths\u0026rdquo; Ce menu est celui qui vous permettra d\u0026rsquo;ajouter ou supprimer les répertoires que vous voulez sauvegarder !\nEnjoy-ID! Enjoy-IT!\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eCeci est un tutoriel pour utiliser l\u0026rsquo;interface graphique du logiciel client\nd\u0026rsquo;Urbackup - logiciel de sauvegarde sur serveur -\u003c/p\u003e\n\u003cp\u003eLa première erreur à ne pas commettre est de bien télécharger le bon client :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan class=\"red\"\u003ene pas télécharger\u003c/span\u003e\n \u003cdel\u003e\u003ca href=\"https://www.urbackup.org/download.html#linux_all_binary\" rel=\"external\"\u003eBinary Linux client (command line only; with auto-update; x86/AMD64/ARMv6+/ARM64)\u003c/a\u003e\u003c/del\u003e\u003c/li\u003e\n\u003cli\u003emais bel et bien selon la page \u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://www.urbackup.org/client_debian_ubuntu_install.html\" rel=\"external\"\u003eInstall client on Debian or Ubuntu from sources\u003c/a\u003e\u003c/strong\u003e\u0026rdquo; -\nceci est en fait une traduction principalement, avec quelques corrections et aperçus !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNécessite :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eque le logiciel urbackup-serveur soit installé sur le serveur qui recevra\nles sauvegardes du client, qu\u0026rsquo;il soit activé et fonctionnel -\n\u003cem\u003ece tuto ne traite pas de l\u0026rsquo;installation de celui-ci sur le serveur\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003ele binaire \u003ccode\u003egksu\u003c/code\u003e doit être installé sur la station à sauvegarder…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eInstallation des dépendances nécessaires :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# apt install build-essential \u0026#34;g++\u0026#34; libwxgtk3.0-dev \u0026#34;libcrypto++-dev\u0026#34; libz-dev\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003eOn télécharge puis on décompresse l\u0026rsquo;archive relative au binaire :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ wget https://hndl.urbackup.org/Client/2.1.17/urbackup-client-2.1.17.tar.gz\n:$ tar xzf urbackup-client-2.1.17.tar.gz\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003eOn compile et installe le binaire :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ cd urbackup-client-2.1.17\n:$ ./configure\n:$ make -j4\n:# make install\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003eCeci étant fait, on vérifie que le service d\u0026rsquo;arrière plan fonctionne bien :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ urbackupclientbackend -v info\n2018-02-15 18:22:00: Started UrBackupClient Backend…\n2018-02-15 18:22:01: Looking for old Sessions… 0 sessions\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"systemd\"\u003eSystemd\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCréation du service de démarrage pour \u003cstrong\u003esystemd\u003c/strong\u003e, par l\u0026rsquo;ajout au système\nd\u0026rsquo;un nouveau fichier nommé \u003ccode\u003e/etc/systemd/system/urbackup.service\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\"\u003eDescription\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eUrbackup Backend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eConditionPathExists\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/usr/local/sbin/urbackupclientbackend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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[Service]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eType\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eforking\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eExecStart\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/usr/local/sbin/urbackupclientbackend -d\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePIDFile\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/var/run/urbackup_srv.pid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eTimeoutSec\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\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[Install]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eWantedBy\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003emulti-user.target\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eLui attribuer les droits d\u0026rsquo;exécution nécessaires :\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:# chmod a+x /etc/systemd/system/urbackup.service\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eRedémarrer systemd, de démarrer le nouveau service et de l\u0026rsquo;activer pour\nle démarrage automatique :\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:# systemctl --system daemon-reload\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# systemctl start urbackup.service\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# systemctl enable urbackup.service\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003ePuis, vérifier que le nouveau service fonctionne bien :\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# systemctl status urbackup.service\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e● urbackup.service - Urbackup Backend\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Loaded: loaded \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e/etc/systemd/system/urbackup.service; enabled; vendor preset: enabled\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Active: active \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003erunning\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e since Thu 2018-02-15 17:33:37 CET; 4min 5s ago\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Process: \u003cspan style=\"color:#f99b15\"\u003e13362\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eExecStart\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/usr/local/sbin/urbackupclientbackend -d \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ecode\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eexited, \u003cspan style=\"color:#ef6155\"\u003estatus\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0/SUCCESS\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e Main PID: \u003cspan style=\"color:#f99b15\"\u003e13364\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eurbackupclientb\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Tasks: \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elimit: 4915\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   CGroup: /system.slice/urbackup.service\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e           └─13364 /usr/local/sbin/urbackupclientbackend -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\u003eFeb \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e 17:33:37 ptb-mlm systemd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Starting Urbackup Backend…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFeb \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e 17:33:37 ptb-mlm systemd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Started Urbackup Backend.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eLe binaire du client graphique se nomme \u003ccode\u003eurbackupclientgui\u003c/code\u003e et nécessite\ndes droits administrateurs pour le paramétrage de celui-ci :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVérifiez que le binaire \u0026ldquo;gksu\u0026rdquo; soit installé, si ce n\u0026rsquo;est pas le cas, faites-le !\u003c/li\u003e\n\u003cli\u003ePuis ajoutez votre identifiant utilisateur au groupe sudo : \u003cbr\u003e\n\u003ccode\u003e# adduser USERID sudo\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eDéconnectez-vous, et reconnectez-vous à votre session.\u003c/li\u003e\n\u003cli\u003ePuis, dans votre session, une fois connecté, ajoutez le démarrage du\nclient Gui, dans les paramètres de \u0026ldquo;Session et démarrage\u0026rdquo; -\n\u003cem\u003equi dépendent de votre bureau graphique\u003c/em\u003e ; \u003cbr\u003e\nle chemin du binaire est : \u003ccode\u003e/usr/local/bin/urbackupclientgui\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\"\u003eL\u0026rsquo;équivalent de ces menus est gérable au-travers de l\u0026rsquo;interface web du serveur\n(http://ip_serveur:55414) ; choisissez le menu \u0026ldquo;Réglages\u0026rdquo;, puis le client\nà gérer dans la liste déroulante \u0026ldquo;Clients\u0026rdquo;.\u003c/div\u003e\n\n\u003ch3 id=\"menu-do--backups\"\u003eMenu \u0026ldquo;Do * Backups\u0026rdquo;\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLe menu \u0026ldquo;Do full file backup\u0026rdquo; est l\u0026rsquo;option qui vous permet de faire une\n\u003cstrong\u003esauvegarde de tous\u003c/strong\u003e les fichiers et répertoires choisis…\u003c/li\u003e\n\u003cli\u003eLe menu \u0026ldquo;Do incremental file backup\u0026rdquo; est l\u0026rsquo;option qui vous permet de\nfaire une sauvegarde dite incrémentale ; celle qui sauvegarde juste\nles différences…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"menu-settings\"\u003eMenu \u0026ldquo;Settings\u0026rdquo;\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eOnglet \u0026ldquo;File Backup\u0026rdquo; :\n\u003cul\u003e\n\u003cli\u003eLes champs d\u0026rsquo;intervalle sont là pour définir le nombre de jours pour\nles sauvegardes, principalement.\u003c/li\u003e\n\u003cli\u003eLes champs \u0026ldquo;Exclude from backup\u0026rdquo;, et \u0026ldquo;Include in backup\u0026rdquo; sont ceux\nqui vous permettent d\u0026rsquo;inclure ou d\u0026rsquo;exclure des fichiers spécifiques -\nà séparer par le symbole \u0026lsquo;;\u0026rsquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eOnglet \u0026ldquo;Client\u0026rdquo; :\n\u003cul\u003e\n\u003cli\u003eLe champ \u0026ldquo;Client\u0026rdquo; est celui qui vous permettra de nommer la station\nà sauvegarder - par défaut, il prend la valeur du \u003cstrong\u003ehostname\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eOnglet \u0026ldquo;Internet\u0026rdquo; :\n\u003cul\u003e\n\u003cli\u003eCet onglet n\u0026rsquo;est intéressant que pour ceux qui veulent sauvegarder\nau-travers d\u0026rsquo;un Internet… \u003cbr\u003e\n\u003cem\u003eil serait assurément intéressant d\u0026rsquo;envisager ce flux-là au-travers d\u0026rsquo;un tunnel SSH !\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"menu-addremove-backup-paths\"\u003eMenu \u0026ldquo;Add/Remove backup paths\u0026rdquo;\u003c/h3\u003e\n\u003cp\u003eCe menu est celui qui vous permettra d\u0026rsquo;ajouter ou supprimer les répertoires\nque vous voulez sauvegarder !\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\u003chr\u003e\n","summary":"Comment installer le client graphique - GUI - d'Urbackup, logiciel de sauvegarde, sous Debian, ou Ubuntu","tags":["Debian","Urbackup","backup","GUI"],"date_published":"2018-02-15T18:21:22+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-20:/fr/sys/openbsd/adb#31c989ff65a906eb3f8fb5c323688b5dae000899108e41b999d08e4edf086a99","url":"https://it-log.fr.eu.org/fr/sys/openbsd/adb/","title":"adb sous OpenBSD (outil de communication avec Android)","author":{"name":"Stéphane HUC"},"content_text":"Description L\u0026rsquo;usage de l\u0026rsquo;outil adb pour communiquer avec vos périphériques sous Android (tel que smartphone, tablette, etc…) est possible !\nIl existe une liste des périphériques connus pour fonctionner - vous y trouverez les identifiants vendeurs nécessaires.\nInstallation Installez le paquet adb.\nVersion testée : adb-5.1.1.4 OS : OpenBSD 6.x Configuration Veillez à ce que votre périphérique android soit en mode debug developper, puis activez l\u0026rsquo;option debug USB !\nUtilisation InfoToutes les commandes liées à l\u0026rsquo;usage d\u0026rsquo;adb s\u0026rsquo;utilisent en mode console ! adb devices Pour être sûr que votre périphérique soit reconnu, utilisez la commande adb devices :\n:$ adb devices List of devices attached 0123456789ABCDEF device À l\u0026rsquo;aide ! Pour obtenir l\u0026rsquo;aide des différentes commandes liées à l\u0026rsquo;outil adb, tapez juste adb dans votre terminal/console.\nCopier les fichiers Copier vers le périphérique :$ adb push -p /repertoire_local_machine/fichier /repertoire_peripherique_android\nCopier depuis le périphérique :$ adb pull -a -p /repertoire_peripherique_android/fichier /repertoire_local_machine\nL\u0026rsquo;option -a copie les informations telles que le temps, et le mode du fichier.\nInfoSi le répertoire local de la machine n\u0026rsquo;est pas spécifié, le fichier depuis android sera copié dans le répertoire d\u0026rsquo;où est exécutée la commande adb. Sauvegarde La commande principale est : :$ adb backup -f nom_fichier_sauvegarde.ab\nInfoSi l\u0026rsquo;option -f n\u0026rsquo;est pas spécifiée, le fichier backup.ab sera créé dans le répertoire courant où est exécutée la commande de sauvegarde… Sauvegarder tout :$ adb backup -f nom_fichier_sauvegarde.ab -all Cette commande implique la sauvegarde de toutes les applications installées, dont les applications systèmes.\nInfoCette option intègre l\u0026rsquo;option -system - pas besoin de la spécifier ! Sauvegarde juste les applications :$ adb backup -f nom_fichier_sauvegarde.ab -apk -obb\nCette commande sauvegarde les fichiers apk des applications installées.\nInfo L\u0026rsquo;option par défaut est -noapk qui signifie que les fichiers apk ne seront pas sauvegardés ! L\u0026rsquo;option -obb implique la sauvegarde des fichiers relatifs aux applications installées, tels que fichiers de sauvegarde, de config, etc… par défaut, c\u0026rsquo;est l\u0026rsquo;option -noobb qui est active ! :$ adb backup -f nom_fichier_sauvegarde.ab package1 package2 package_n Celle-ci sauvegarde juste les applications dont les noms sont concernés !\nSauvegarde SD Carte AttentionIl est bien sûr nécessaire d\u0026rsquo;avoir une SD Carte dans votre appareil… :$ adb backup -f nom_fichier_sauvegarde.ab -shared Sauvegarde le contenu de la SD Carte, ainsi que de tout répertoire de stockage partagé.\nInfoPar défaut, c\u0026rsquo;est l\u0026rsquo;option -noshared qui est active et implique la non sauvegarde ! Sauvegarde Système :$ adb backup -f nom_fichier_sauvegarde.ab -system InfoPar défaut, c\u0026rsquo;est l\u0026rsquo;option -system qui est activée, ce qui a pour effet d\u0026rsquo;inclure les applications systèmes ! Sauvegarde Pertinente Le moyen pertinent de sauvegarder tout correctement, sans s\u0026rsquo;occuper du contenu de la SD Carte, est :\n:$ adb backup -f nom_fichier_sauvegarde.ab -apk -obb -all\nSauvegarde des partitions L\u0026rsquo;outil adb peut servir à sauvegarder indirectement les partitions de votre périphérique…\nPour cela, il faut télécharger l\u0026rsquo;outil rkdump !\nPuis l\u0026rsquo;installer ainsi :\n:$ adb push rkdump /data/ :$ adb shell chmod 0755 /data/rkdump Pour l\u0026rsquo;utiliser l\u0026rsquo;outil rkdump, veuillez lire son tutoriel…\nRestauration :$ adb restore nom_fichier_sauvegarde.ab AttentionAttention : Tout ce qui concerne le contenu du fichier de sauvegarde sera restauré ! Erreurs \u0026lsquo;adb devices\u0026rsquo; : rien n\u0026rsquo;est affiché Il peut être intéressant d\u0026rsquo;effectuer la manipulation suivante :\nCréer le fichier ~/.android/adb_usb.ini, et écrivez dedans 0x suivi de votre idVendor Quoiqu\u0026rsquo;il en soit, redémarrer le serveur adb : $ adb kill-server\nPuis relancez la commande adb devices.\n\u0026lsquo;adb devices\u0026rsquo; : offline Lorsque je tape adb devices, le périphérique est reconnu mais affiché offline.\n:$ adb devices List of devices attached 0123456789ABCDEF offline Il vous faudra alors :\ndésactivez l\u0026rsquo;option Débogage USB… déconnectez/reconnectez votre tablette à l\u0026rsquo;ordinateur, en débranchant/rebranchant le câble USB. activez à nouveau l\u0026rsquo;option Débogage USB À ce moment-là, essayez à nouveau la commande adb devices ; vous devriez voir apparaître votre périphérique… correctement !\n\u0026lsquo;adb devices\u0026rsquo; : ???????????? no permissions Lorsque je tape adb devices, le périphérique n\u0026rsquo;est pas reconnu et il est affiché ???????????? no permissions.\nIl vous faut tuer le serveur, le redémarrer avec des droits administrateur ensuite le périphérique apparaîtra !\n:$ adb kill-server :$ adb start-server daemon not running. starting it now on port 5037 daemon started successfully :$ adb devices List of devices attached 0123456789ABCDEF device ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;usage de l\u0026rsquo;outil \u003ccode\u003eadb\u003c/code\u003e pour communiquer avec vos périphériques sous Android\n\u003cem\u003e(tel que smartphone, tablette, etc…)\u003c/em\u003e est possible !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eIl existe une \u003ca href=\"http:*cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/dev/usb/usbdevs\" rel=\"external\"\u003eliste des périphériques\u003c/a\u003e connus\npour fonctionner - \u003cstrong\u003evous y trouverez les identifiants vendeurs nécessaires\u003c/strong\u003e.\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\u003eadb\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVersion testée : \u003cstrong\u003eadb-5.1.1.4\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eOS : \u003cstrong\u003eOpenBSD 6.x\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eVeillez à ce que votre périphérique android soit en mode \u003ccode\u003edebug developper\u003c/code\u003e,\npuis activez l\u0026rsquo;option \u003ccode\u003edebug USB\u003c/code\u003e !\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eToutes les commandes liées à l\u0026rsquo;usage d\u0026rsquo;adb s\u0026rsquo;utilisent en mode console !\u003c/div\u003e\n\n\u003ch3 id=\"adb-devices\"\u003eadb devices\u003c/h3\u003e\n\u003cp\u003ePour être sûr que votre périphérique soit reconnu, utilisez la commande\n\u003ccode\u003eadb devices\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:$ adb devices\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eList of devices attached\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e0123456789ABCDEF device\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"à-laide-\"\u003eÀ l\u0026rsquo;aide !\u003c/h3\u003e\n\u003cp\u003ePour obtenir l\u0026rsquo;aide des différentes commandes liées à l\u0026rsquo;outil adb, tapez juste\n\u003ccode\u003eadb\u003c/code\u003e dans votre terminal/console.\u003c/p\u003e\n\u003ch3 id=\"copier-les-fichiers\"\u003eCopier les fichiers\u003c/h3\u003e\n\u003ch3 id=\"copier-vers-le-périphérique\"\u003eCopier vers le périphérique\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e:$ adb push -p /repertoire_local_machine/fichier /repertoire_peripherique_android\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"copier-depuis-le-périphérique\"\u003eCopier depuis le périphérique\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e:$ adb pull -a -p /repertoire_peripherique_android/fichier /repertoire_local_machine\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;option \u003ccode\u003e-a\u003c/code\u003e copie les informations telles que le temps, et le mode du fichier.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eSi le répertoire local de la machine n\u0026rsquo;est pas spécifié, le fichier depuis\nandroid sera copié dans le répertoire d\u0026rsquo;où est exécutée la commande \u003ccode\u003eadb\u003c/code\u003e.\u003c/div\u003e\n\n\u003ch3 id=\"sauvegarde\"\u003eSauvegarde\u003c/h3\u003e\n\u003cp\u003eLa commande principale est : \u003ccode\u003e:$ adb backup -f nom_fichier_sauvegarde.ab\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\"\u003eSi l\u0026rsquo;option \u003ccode\u003e-f\u003c/code\u003e n\u0026rsquo;est pas spécifiée, le fichier \u003ccode\u003ebackup.ab\u003c/code\u003e sera créé dans le\nrépertoire courant où est exécutée la commande de sauvegarde…\u003c/div\u003e\n\n\u003ch3 id=\"sauvegarder_tout\"\u003eSauvegarder tout\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e:$ adb backup -f nom_fichier_sauvegarde.ab -all \u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCette commande implique la sauvegarde de toutes les applications installées,\ndont les applications systèmes.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCette option intègre l\u0026rsquo;option \u003ccode\u003e-system\u003c/code\u003e - \u003cem\u003epas besoin de la spécifier\u003c/em\u003e !\u003c/div\u003e\n\n\u003ch3 id=\"sauvegarde_juste_les_applications\"\u003eSauvegarde juste les applications\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e:$ adb backup -f nom_fichier_sauvegarde.ab -apk -obb\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCette commande sauvegarde les fichiers apk des applications installées.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cul\u003e\n\u003cli\u003eL\u0026rsquo;option par défaut est \u003ccode\u003e-noapk\u003c/code\u003e qui signifie que les fichiers apk ne seront \npas sauvegardés !\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;option \u003ccode\u003e-obb\u003c/code\u003e implique la sauvegarde des fichiers relatifs aux applications \ninstallées, tels que fichiers de sauvegarde, de config, etc… \u003c/li\u003e\n\u003cli\u003epar défaut, c\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003e-noobb\u003c/code\u003e qui est active !\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003e\u003ccode\u003e:$ adb backup -f nom_fichier_sauvegarde.ab package1 package2 package_n \u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCelle-ci sauvegarde juste les applications dont les noms sont concernés !\u003c/p\u003e\n\u003ch3 id=\"sauvegarde_sd_carte\"\u003eSauvegarde SD Carte\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cstrong\u003eIl est bien sûr nécessaire d\u0026rsquo;avoir une SD Carte dans votre appareil\u003c/strong\u003e…\u003c/div\u003e\n\n\u003cp\u003e\u003ccode\u003e:$ adb backup -f nom_fichier_sauvegarde.ab -shared \u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSauvegarde le contenu de la SD Carte, ainsi que de tout répertoire de stockage\npartagé.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePar défaut, c\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003e-noshared\u003c/code\u003e qui est active et implique la non\nsauvegarde !\u003c/div\u003e\n\n\u003ch3 id=\"sauvegarde_système\"\u003eSauvegarde Système\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e:$ adb backup -f nom_fichier_sauvegarde.ab -system \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\"\u003ePar défaut, c\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003e-system\u003c/code\u003e qui est activée, ce qui a pour effet\nd\u0026rsquo;inclure les applications systèmes !\u003c/div\u003e\n\n\u003ch3 id=\"sauvegarde_pertinente\"\u003eSauvegarde Pertinente\u003c/h3\u003e\n\u003cp\u003eLe moyen pertinent de sauvegarder tout correctement, sans s\u0026rsquo;occuper du contenu\nde la SD Carte, est :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ adb backup -f nom_fichier_sauvegarde.ab -apk -obb -all\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"sauvegarde_des_partitions\"\u003eSauvegarde des partitions\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;outil \u003ccode\u003eadb\u003c/code\u003e peut servir à sauvegarder indirectement les partitions de votre\npériphérique…\u003c/p\u003e\n\u003cp\u003ePour cela, il faut télécharger l\u0026rsquo;outil \u003ca href=\"http://files.androtab.info/rk2818/devel/rkdump_android.zip\" rel=\"external\"\u003erkdump\u003c/a\u003e !\u003c/p\u003e\n\u003cp\u003ePuis l\u0026rsquo;installer 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:$ adb push rkdump /data/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ adb shell chmod \u003cspan style=\"color:#f99b15\"\u003e0755\u003c/span\u003e /data/rkdump\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour l\u0026rsquo;utiliser l\u0026rsquo;outil rkdump, veuillez lire son \u003ca href=\"http://androtab.info/rockchip/devel/rkutils/\" rel=\"external\"\u003etutoriel\u003c/a\u003e…\u003c/p\u003e\n\u003ch3 id=\"restauration\"\u003eRestauration\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e:$ adb restore nom_fichier_sauvegarde.ab \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 : Tout ce qui concerne le contenu du fichier de sauvegarde sera\nrestauré !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"erreurs\"\u003eErreurs\u003c/h2\u003e\n\u003ch3 id=\"adb_devices_rien_nest_affiché\"\u003e\u0026lsquo;adb devices\u0026rsquo; : rien n\u0026rsquo;est affiché\u003c/h3\u003e\n\u003cp\u003eIl peut être intéressant d\u0026rsquo;effectuer la manipulation suivante :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCréer le fichier \u003ccode\u003e~/.android/adb_usb.ini\u003c/code\u003e, et écrivez dedans \u003ccode\u003e0x\u003c/code\u003e suivi de \nvotre idVendor\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuoiqu\u0026rsquo;il en soit, \u003cstrong\u003eredémarrer le serveur adb\u003c/strong\u003e : \u003ccode\u003e$ adb kill-server\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis relancez la commande \u003ccode\u003eadb devices\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"adb_devices_offline\"\u003e\u0026lsquo;adb devices\u0026rsquo; : offline\u003c/h3\u003e\n\u003cp\u003eLorsque je tape \u003ccode\u003eadb devices\u003c/code\u003e, le périphérique est reconnu mais affiché \u003ccode\u003eoffline\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:$ adb devices\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eList of devices attached\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e0123456789ABCDEF offline\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl vous faudra alors :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edésactivez l\u0026rsquo;option \u003ccode\u003eDébogage USB\u003c/code\u003e…\u003c/li\u003e\n\u003cli\u003edéconnectez/reconnectez votre tablette à l\u0026rsquo;ordinateur, en \ndébranchant/rebranchant le câble USB.\u003c/li\u003e\n\u003cli\u003eactivez à nouveau l\u0026rsquo;option \u003ccode\u003eDébogage USB\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eÀ ce moment-là, essayez à nouveau la commande \u003ccode\u003eadb devices\u003c/code\u003e ; vous devriez voir\napparaître votre périphérique… correctement !\u003c/p\u003e\n\u003ch3 id=\"adb_devices_no_permissions\"\u003e\u0026lsquo;adb devices\u0026rsquo; : ???????????? no permissions\u003c/h3\u003e\n\u003cp\u003eLorsque je tape \u003ccode\u003eadb devices\u003c/code\u003e, le périphérique n\u0026rsquo;est pas reconnu et il est\naffiché \u003ccode\u003e???????????? no permissions\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eIl vous faut tuer le serveur, le redémarrer avec des droits administrateur\nensuite le périphérique apparaîtra !\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:$ adb kill-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ adb start-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   daemon not running. starting it now on port \u003cspan style=\"color:#f99b15\"\u003e5037\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   daemon started successfully\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ adb devices\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eList of devices attached\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e0123456789ABCDEF device\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n","summary":"Comment installer et utiliser l'outil adb - outil pour communiquer avec des périphériques Android - sous OpenBSD","tags":["OpenBSD","adb"],"date_published":"2017-08-20T21:36:28+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-20:/fr/sys/openbsd/redshift#77eff31aaea6cd6eca7d0788c76282a208534d4114e96ae349753901672b087e","url":"https://it-log.fr.eu.org/fr/sys/openbsd/redshift/","title":"OpenBSD : Utiliser Redshift pour ajuster automatiquement la température de couleurs","author":{"name":"Stéphane HUC"},"content_text":"Description Redshift est un utilitaire système qui paramètre la température des couleurs de votre écran selon l\u0026rsquo;heure du jour, et de votre position géographique. Le but de cet outil est de vous aider à moins fatiguer vos yeux, la nuit, et à réduire les risques liés au syndrome de retard de phase de sommeil, lors de votre vision informatique en soirée.\nLa température de couleur est paramétrée en fonction de la position du soleil. La température de couleur est réglée différemment selon le jour ou la nuit.\nDurant le crépuscule, et au petit matin, la température de couleur varie doucement de la nuit vers la température de jour en permettant à vos yeux de s\u0026rsquo;adapter lentement sur une période d\u0026rsquo;une heure environ.\nLa nuit, la couleur de température devrait être paramétrée pour correspondre avec celles de vos lampes. C\u0026rsquo;est typiquement une basse température autour de 3000-4000K (par défaut est 3700K) .\nDurant la journée, la température de couleur doit correspondre avec celle de la lumière du jour, de fait entre 5500-6500K (par défaut est de 5500K). La lumière a une température plus haute par temps nuageux.\nLa température neutre est de 6500K. Utiliser cette valeur ne change pas la température de votre écran. Régler sur une valeur plus importante définira une lumière tirant vers le bleu ; définir une valeur plus bas se traduira par une lumière plus rouge.\nVoici les valeurs par défaut de température : Jour: 5500K, Nuit: 3700K\nInstallation Installez le paquet redshift .\nSynopsis redshift [-l LAT:LON | -l PROVIDER:OPTIONS] [-t DAY:NIGHT] [OPTIONS\u0026hellip;]\nConfiguration Placez votre fichier de configuration personnelle dans ~/.config/redshift.conf. C\u0026rsquo;est un simple fichier au standard INI.\nVoici sa configuration de base :\n[redshift] temp-day=5500 temp-night=3700 gamma=0.8 adjustment-method=randr location-provider=manual [manual] lat=44.1333 lon=0.35 Définir les températures Température jour L\u0026rsquo;option temp-day doit être un entier allant de 6500 à 5500.\nTempérature nuit L\u0026rsquo;option temp-night doit être un entier allant de 4000 à 3000.\nManuellement Vous pouvez définir manuellement une température en utilisant redshift, tel que : :$ redshift -O TEMP où TEMP est un entier, à moduler selon la température de période jour ou nuit désirée. (cf ci-dessous pour les températures de jour et de nuit).\nLes températures de jour et de nuit peuvent aussi être gérées manuellement, par l\u0026rsquo;usage de redshift, tel que : :$ redshift -t JOUR/NUIT où JOUR correspond à la température de jour, et NUIT respectivement à celle de nuit.\nDéfinir le gamma Permet d\u0026rsquo;ajuster le mode gamma, soit de manière globale pour les deux périodes de jour et de nuit, soit spécifique à l\u0026rsquo;une ou l\u0026rsquo;autre. Ce sont des valeurs de type RGB qui sont utilisées, tel que R:G:B.\nGamma global Ajuste le mode gamma pour les deux périodes : gamma = R:G:B\nGamma jour Ajuste le mode gamma juste pour la période jour : gamma-day = R:G:B\nGamma nuit Ajuste le mode gamma juste pour la période nuit : gamma-night = R:G:B\nManuellement Le mode gamma global peut aussi être géré manuellement, en utilisant redshift, tel que : :$ redshift -g R:G:B où R:G:B sont bel et bien les valeurs de couleurs en mode RGB.\nDéfinir la méthode d\u0026rsquo;ajustement C\u0026rsquo;est le méthode utilisée pour régler la température des couleurs. La plus commune semble être randr.\nAjustez l\u0026rsquo;option adjustment-method = nom.\nPour connaître le nom des différentes méthodes possibles, utilisez l\u0026rsquo;outil redshift, tel que :\n:$ redshift -m list Méthodes d\u0026#39;ajustement disponibles : drm randr vidmode dummy Spécifiez les options séparées par des deux-points en tant que « -m MÉTHODE:OPTIONS ». Essayez « -m MÉTHODE:help » pour obtenir de l\u0026#39;aide. Définir la latitude/longitude Il y a deux moyens de définir vos coordonnées latitude et longitude, toutes deux gérées par l\u0026rsquo;option location-provider.\nPour connaître les différents fournisseurs de location supportés par redshift, utilisez-le tel que :\n:$ redshift -l list Fournisseurs de localisation disponibles : geoclue2 manual Spécifiez les options séparées par des deux-points en tant que « -l FOURNISSEUR:OPTIONS ». Essayez « -l FOURNISSEUR:help » pour obtenir de l\u0026#39;aide. Automatiquement Le fournisseur geoclue est un mode de mise-à-jour automatique de vos coordonnées.\nVous pouvez utiliser le fournisseur geoclue, tel que, par exemple : :$ redshift -l geoclue2 -t 5500:3700 -b 1.0:0.8\nDans votre fichier de configuration, changez la valeur de location-provider par geoclue2.\nManuellement Pour connaître la latitude, longitude de votre ville, faites une recherche par le biais d\u0026rsquo;un moteur de recherche, en tapant latitude longitude ville pays…\nDans votre fichier de configuration, changez la valeur de location-provider par manual. C\u0026rsquo;est le mode par défaut.\nPuis dans la section [manual], définissez les valeurs lat et lon par les valeurs respectives de latitude et de longitude.\nDéfinir la transition Il est possible d\u0026rsquo;activer un effet de transition lors de la bascule entre les deux périodes de jour et de nuit. C\u0026rsquo;est l\u0026rsquo;option transition qui le gère et doit être un entier de type binaire, strictement, soit 0, soit 1.\nDéfinir la luminosité Il est possible de gérer la luminosité de l\u0026rsquo;écran, soit pour la période jour, soit pour la période nuit. Ce sont des valeurs strictement décimales à utiliser qui vont de 0.1 à 1.0.\nLuminosité jour Ajuste la luminosité de l\u0026rsquo;écran pour la journée : brightness-day = value\nLuminosité nuit Ajuste la luminosité de l\u0026rsquo;écran pour la nuit : brightness-night = value\nDéfinir le point d\u0026rsquo;élévation solaire Le point d\u0026rsquo;élévation solaire définit le point de transition entre les deux périodes de jour et de nuit.\nLe point d\u0026rsquo;élévation solaire se définit soit pour le jour, soit pour la nuit. C\u0026rsquo;est une valeur décimale à utiliser.\nÉlévation jour Ajuste le point d\u0026rsquo;élévation solaire pour le jour : elevation-high = decimal\nÉlévation nuit Ajuste le point d\u0026rsquo;élévation solaire pour la nuit : elevation-low = decimal\nManpage Pour les différentes options de configuration, veuillez lire la page de manuel de redshift(1), accessible seulement sur votre système : man redshift\nVoici une copie écran minimaliste de la version disponible dans OpenBSD 6.1 :\nOPTIONS -h Display this help message -v Verbose output -V Show program version -b DAY:NIGHT Screen brightness to apply (between 0.1 and 1.0) -c FILE Load settings from specified configuration file -g R:G:B Additional gamma correction to apply -l LAT:LON Your current location, in degrees, given as floating point numbers, towards north and east, with negative numbers representing south and west, respectively. -l PROVIDER[:OPTIONS] Select provider for automatic location updates (Use `-l list\u0026#39; to see available providers) -m METHOD[:OPTIONS] Method to use to set color temperature (Use `-m list\u0026#39; to see available methods) -o One shot mode (do not continuously adjust color temperature) -O TEMP One shot manual mode (set color temperature) -p Print mode (only print parameters and exit) -x Reset mode (remove adjustment from screen) -r Disable temperature transitions -t DAY:NIGHT Color temperature to set at daytime/night The neutral temperature is 6500K. Using this value will not change the color temperature of the display. Setting the color temperature to a value higher than this results in more blue light, and setting a lower value will result in more red light. Default temperature values: Daytime: 5500K, night: 3700K Utilisation En mode console Il est possible de l\u0026rsquo;exécuter directement en mode console, tel que :\n:$ redshift -l 44.1333:0.35 -t 5700:3600 -g 0.8 -m randr -v \u0026amp;\nExécution en mode graphique Allez dans le menu \u0026ldquo;Applications\u0026rdquo; \u0026gt; \u0026ldquo;Accessoires\u0026rdquo;.\nLancement automatique Éxecutez le binaire redshit-gtk :\n:$ /usr/local/bin/redshift-gtk\nL\u0026rsquo;icône s\u0026rsquo;affichera dans le systray. Faites un clic droit et choisissez de cocher \u0026ldquo;Lancement automatique\u0026rdquo;.\nSinon, modifiez les paramètres systèmes, tel que \u0026ldquo;Session et démarrage\u0026rdquo; pour XFCE, puis l\u0026rsquo;onglet \u0026ldquo;Démarrage automatique d\u0026rsquo;application\u0026rdquo;, pour ajouter une application.\nDans le champ nommé \u0026ldquo;commande\u0026rdquo;, écrivez redshift-gtk ou le chemin absolu vers le binaire /usr/local/bin/redshift-gtk.\nQuand vous serez dans votre session graphique, vous aurez le logiciel qui fonctionnera en tâche de fond, et l\u0026rsquo;icône \u0026ldquo;redshift\u0026rdquo; dans le systray.\nBogues connus Redshift n\u0026rsquo;affecte pas la température de couleur si votre pilote graphique est configuré pour utiliser matériellement votre curseur.\nQuelques pilotes logiciels graphiques ont l\u0026rsquo;option pour désactiver matériellement le curseur dans le fichier xorg.conf.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eRedshift\u003c/strong\u003e est un utilitaire système qui paramètre la température des\ncouleurs de votre écran selon l\u0026rsquo;heure du jour, et de votre position géographique.\nLe but de cet outil est de vous aider à moins fatiguer vos yeux, la nuit,\net à réduire les risques liés au syndrome de retard de phase de sommeil,\nlors de votre vision informatique en soirée.\u003c/p\u003e\n\u003cp\u003eLa température de couleur est paramétrée en fonction de la position du soleil.\nLa température de couleur est réglée différemment selon le jour ou la nuit.\u003c/p\u003e\n\u003cp\u003eDurant le crépuscule, et au petit matin, la température de couleur varie\ndoucement de la nuit vers la température de jour en permettant à vos yeux\nde s\u0026rsquo;adapter lentement sur une période d\u0026rsquo;une heure environ.\u003c/p\u003e\n\u003cp\u003eLa nuit, la couleur de température devrait être paramétrée pour correspondre\navec celles de vos lampes. C\u0026rsquo;est typiquement une basse température autour de\n3000-4000K (par défaut est 3700K) .\u003c/p\u003e\n\u003cp\u003eDurant la journée, la température de couleur doit correspondre avec celle\nde la lumière du jour, de fait entre 5500-6500K (par défaut est de 5500K).\nLa lumière a une température plus haute par temps nuageux.\u003c/p\u003e\n\u003cp\u003eLa température neutre est de 6500K. Utiliser cette valeur ne change pas\nla température de votre écran. Régler sur une valeur plus importante définira\nune lumière tirant vers le bleu ; définir une valeur plus bas se traduira\npar une lumière plus rouge.\u003c/p\u003e\n\u003cp\u003eVoici les valeurs par défaut de température : \u003cstrong\u003eJour: 5500K, Nuit: 3700K\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 le paquet \u003cstrong\u003eredshift\u003c/strong\u003e .\u003c/p\u003e\n\u003ch2 id=\"synopsis\"\u003eSynopsis\u003c/h2\u003e\n\u003cp\u003eredshift [-l LAT:LON | -l PROVIDER:OPTIONS] [-t DAY:NIGHT] [OPTIONS\u0026hellip;]\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePlacez votre fichier de configuration personnelle dans \u003ccode\u003e~/.config/redshift.conf\u003c/code\u003e.\nC\u0026rsquo;est un simple fichier au standard INI.\u003c/p\u003e\n\u003cp\u003eVoici sa configuration de base :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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[redshift]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etemp-day\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e5500\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etemp-night\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e3700\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003egamma\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e0.8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eadjustment-method\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003erandr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocation-provider\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003emanual\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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[manual]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elat\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e44.1333\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elon\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e0.35\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"définir-les-températures\"\u003eDéfinir les températures\u003c/h3\u003e\n\u003ch4 id=\"température-jour\"\u003eTempérature jour\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;option \u003ccode\u003etemp-day\u003c/code\u003e doit être un entier allant de 6500 à 5500.\u003c/p\u003e\n\u003ch4 id=\"température-nuit\"\u003eTempérature nuit\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;option \u003ccode\u003etemp-night\u003c/code\u003e doit être un entier allant de 4000 à 3000.\u003c/p\u003e\n\u003ch4 id=\"manuellement\"\u003eManuellement\u003c/h4\u003e\n\u003cp\u003eVous pouvez définir manuellement une température en utilisant \u003ccode\u003eredshift\u003c/code\u003e,\ntel que : \u003cbr\u003e\n\u003ccode\u003e:$ redshift -O TEMP\u003c/code\u003e \u003cbr\u003e\noù \u003ccode\u003eTEMP\u003c/code\u003e est un entier, à moduler selon la température de période jour\nou nuit désirée. \u003cem\u003e(cf ci-dessous pour les températures de jour et de nuit)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eLes températures de jour et de nuit peuvent aussi être gérées manuellement,\npar l\u0026rsquo;usage de \u003ccode\u003eredshift\u003c/code\u003e, tel que : \u003cbr\u003e\n\u003ccode\u003e:$ redshift -t JOUR/NUIT\u003c/code\u003e \u003cbr\u003e\noù \u003ccode\u003eJOUR\u003c/code\u003e correspond à la température de jour, et \u003ccode\u003eNUIT\u003c/code\u003e respectivement\nà celle de nuit.\u003c/p\u003e\n\u003ch3 id=\"définir-le-gamma\"\u003eDéfinir le gamma\u003c/h3\u003e\n\u003cp\u003ePermet d\u0026rsquo;ajuster le mode gamma, soit de manière globale pour les deux périodes\nde jour et de nuit, soit spécifique à l\u0026rsquo;une ou l\u0026rsquo;autre. Ce sont des valeurs\nde type RGB qui sont utilisées, tel que \u003ccode\u003eR:G:B\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"gamma-global\"\u003eGamma global\u003c/h4\u003e\n\u003cp\u003eAjuste le mode gamma pour les deux périodes : \u003ccode\u003egamma = R:G:B\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"gamma-jour\"\u003eGamma jour\u003c/h4\u003e\n\u003cp\u003eAjuste le mode gamma juste pour la période jour : \u003ccode\u003egamma-day = R:G:B\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"gamma-nuit\"\u003eGamma nuit\u003c/h4\u003e\n\u003cp\u003eAjuste le mode gamma juste pour la période nuit : \u003ccode\u003egamma-night = R:G:B\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"manuellement-1\"\u003eManuellement\u003c/h4\u003e\n\u003cp\u003eLe mode gamma global peut aussi être géré manuellement, en utilisant \u003ccode\u003eredshift\u003c/code\u003e,\ntel que :  \u003cbr\u003e\n\u003ccode\u003e:$ redshift -g R:G:B\u003c/code\u003e \u003cbr\u003e\noù \u003ccode\u003eR:G:B\u003c/code\u003e sont bel et bien les valeurs de couleurs en mode RGB.\u003c/p\u003e\n\u003ch3 id=\"définir-la-méthode-dajustement\"\u003eDéfinir la méthode d\u0026rsquo;ajustement\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est le méthode utilisée pour régler la température des couleurs.\nLa plus commune semble être \u003ccode\u003erandr\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAjustez l\u0026rsquo;option \u003ccode\u003eadjustment-method = nom\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePour connaître le nom des différentes méthodes possibles, utilisez l\u0026rsquo;outil\n\u003ccode\u003eredshift\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:$ redshift -m list\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMéthodes d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ajustement disponibles :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  drm\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  randr\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  vidmode\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  dummy\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\"\u003eSpécifiez les options séparées par des deux-points en tant que « -m MÉTHODE:OPTIONS ».\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eEssayez « -m MÉTHODE:help » pour obtenir de l\u0026#39;\u003c/span\u003eaide.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"définir-la-latitudelongitude\"\u003eDéfinir la latitude/longitude\u003c/h3\u003e\n\u003cp\u003eIl y a deux moyens de définir vos coordonnées latitude et longitude,\ntoutes deux gérées par l\u0026rsquo;option \u003ccode\u003elocation-provider\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePour connaître les différents fournisseurs de location supportés par\n\u003ccode\u003eredshift\u003c/code\u003e, utilisez-le 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:$ redshift -l list\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFournisseurs de localisation disponibles :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  geoclue2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  manual\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSpécifiez les options séparées par des deux-points en tant que « -l FOURNISSEUR:OPTIONS ».\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEssayez « -l FOURNISSEUR:help » pour obtenir de l\u003cspan style=\"color:#ef6155\"\u003e\u0026#39;\u003c/span\u003eaide.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"automatiquement\"\u003eAutomatiquement\u003c/h4\u003e\n\u003cp\u003eLe fournisseur \u003cstrong\u003egeoclue\u003c/strong\u003e est un mode de mise-à-jour automatique de vos coordonnées.\u003c/p\u003e\n\u003cp\u003eVous pouvez utiliser le fournisseur geoclue, tel que, par exemple : \u003cbr\u003e\n\u003ccode\u003e:$ redshift -l geoclue2 -t 5500:3700 -b 1.0:0.8\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eDans votre fichier de configuration, changez la valeur de \u003ccode\u003elocation-provider\u003c/code\u003e\npar \u003ccode\u003egeoclue2\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"manuellement-2\"\u003eManuellement\u003c/h4\u003e\n\u003cp\u003ePour connaître la latitude, longitude de votre ville, faites une recherche\npar le biais d\u0026rsquo;un moteur de recherche, en tapant \u003ccode\u003elatitude longitude ville pays\u003c/code\u003e…\u003c/p\u003e\n\u003cp\u003eDans votre fichier de configuration, changez la valeur de \u003ccode\u003elocation-provider\u003c/code\u003e\npar \u003ccode\u003emanual\u003c/code\u003e. \u003cem\u003eC\u0026rsquo;est le mode par défaut\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003ePuis dans la section \u003ccode\u003e[manual]\u003c/code\u003e, définissez les valeurs \u003ccode\u003elat\u003c/code\u003e et \u003ccode\u003elon\u003c/code\u003e\npar les valeurs respectives de latitude et de longitude.\u003c/p\u003e\n\u003ch3 id=\"définir-la-transition\"\u003eDéfinir la transition\u003c/h3\u003e\n\u003cp\u003eIl est possible d\u0026rsquo;activer un effet de transition lors de la bascule entre\nles deux périodes de jour et de nuit. C\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003etransition\u003c/code\u003e qui\nle gère et doit être un entier de type binaire, strictement, soit \u003ccode\u003e0\u003c/code\u003e, soit \u003ccode\u003e1\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"définir-la-luminosité\"\u003eDéfinir la luminosité\u003c/h3\u003e\n\u003cp\u003eIl est possible de gérer la luminosité de l\u0026rsquo;écran, soit pour la période jour,\nsoit pour la période nuit. Ce sont des valeurs strictement décimales à\nutiliser qui vont de \u003ccode\u003e0.1\u003c/code\u003e à \u003ccode\u003e1.0\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"luminosité-jour\"\u003eLuminosité jour\u003c/h4\u003e\n\u003cp\u003eAjuste la luminosité de l\u0026rsquo;écran pour la journée :  \u003ccode\u003ebrightness-day = value\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"luminosité-nuit\"\u003eLuminosité nuit\u003c/h4\u003e\n\u003cp\u003eAjuste la luminosité de l\u0026rsquo;écran pour la nuit : \u003ccode\u003ebrightness-night = value\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"définir-le-point-délévation-solaire\"\u003eDéfinir le point d\u0026rsquo;élévation solaire\u003c/h3\u003e\n\u003cp\u003eLe point d\u0026rsquo;élévation solaire définit le point de transition entre les deux\npériodes de jour et de nuit.\u003c/p\u003e\n\u003cp\u003eLe point d\u0026rsquo;élévation solaire se définit soit pour le jour, soit pour la nuit.\nC\u0026rsquo;est une valeur décimale à utiliser.\u003c/p\u003e\n\u003ch4 id=\"élévation-jour\"\u003eÉlévation jour\u003c/h4\u003e\n\u003cp\u003eAjuste le point d\u0026rsquo;élévation solaire pour le jour : \u003ccode\u003eelevation-high = decimal\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"élévation-nuit\"\u003eÉlévation nuit\u003c/h4\u003e\n\u003cp\u003eAjuste le point d\u0026rsquo;élévation solaire pour la nuit : \u003ccode\u003eelevation-low = decimal\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"manpage\"\u003eManpage\u003c/h2\u003e\n\u003cp\u003ePour les différentes options de configuration, veuillez lire la page de\nmanuel de \u003ccode\u003eredshift(1)\u003c/code\u003e, accessible seulement sur votre système : \u003cbr\u003e\n\u003ccode\u003eman redshift\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVoici une copie écran minimaliste de la version disponible dans OpenBSD 6.1 :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOPTIONS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       -h     Display this help message\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       -v     Verbose output\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       -V     Show program 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       -b DAY:NIGHT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              Screen brightness to apply \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ebetween 0.1 and 1.0\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       -c FILE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              Load settings from specified configuration file\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       -g R:G:B\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              Additional gamma correction to apply\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       -l LAT:LON\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              Your current location, in degrees, given as floating point\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              numbers, towards north and east, with negative numbers\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              representing south and west, respectively.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       -l PROVIDER\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e:OPTIONS\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              Select provider \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e automatic location updates \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eUse \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e-l list\u003cspan style=\"color:#48b685\"\u003e\u0026#39; to\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              see available providers)\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       -m METHOD[:OPTIONS]\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              Method to use to set color temperature (Use `-m list\u0026#39;\u003c/span\u003e to see\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              available methods\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       -o     One shot mode \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e not continuously adjust color temperature\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       -O TEMP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              One shot manual mode \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eset color temperature\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       -p     Print mode \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eonly print parameters and exit\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       -x     Reset mode \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eremove adjustment from screen\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       -r     Disable temperature 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       -t DAY:NIGHT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              Color temperature to set at daytime/night\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       The neutral temperature is 6500K. Using this value will not change the\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       color temperature of the display. Setting the color temperature to a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       value higher than this results in more blue light, and setting a lower\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       value will result in more red light.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       Default temperature values:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              Daytime: 5500K, night: 3700K\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=\"en-mode-console\"\u003eEn mode console\u003c/h3\u003e\n\u003cp\u003eIl est possible de l\u0026rsquo;exécuter directement en mode console, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ redshift -l 44.1333:0.35 -t 5700:3600 -g 0.8 -m randr -v \u0026amp;\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"exécution-en-mode-graphique\"\u003eExécution en mode graphique\u003c/h3\u003e\n\u003cp\u003eAllez dans le menu \u0026ldquo;Applications\u0026rdquo; \u0026gt; \u0026ldquo;Accessoires\u0026rdquo;.\u003c/p\u003e\n\u003ch3 id=\"lancement-automatique\"\u003eLancement automatique\u003c/h3\u003e\n\u003cp\u003eÉxecutez le binaire \u003ccode\u003eredshit-gtk\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ /usr/local/bin/redshift-gtk\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;icône s\u0026rsquo;affichera dans le systray. Faites un clic droit et choisissez\nde cocher \u0026ldquo;Lancement automatique\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eSinon, modifiez les paramètres systèmes, tel que \u0026ldquo;Session et démarrage\u0026rdquo;\npour XFCE, puis l\u0026rsquo;onglet \u0026ldquo;Démarrage automatique d\u0026rsquo;application\u0026rdquo;, pour ajouter\nune application.\u003c/p\u003e\n\u003cp\u003eDans le champ nommé \u0026ldquo;commande\u0026rdquo;, écrivez \u003ccode\u003eredshift-gtk\u003c/code\u003e ou le chemin absolu\nvers le binaire \u003ccode\u003e/usr/local/bin/redshift-gtk\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eQuand vous serez dans votre session graphique, vous aurez le logiciel qui\nfonctionnera en tâche de fond, et l\u0026rsquo;icône \u0026ldquo;redshift\u0026rdquo; dans le systray.\u003c/p\u003e\n\u003ch2 id=\"bogues-connus\"\u003eBogues connus\u003c/h2\u003e\n\u003cp\u003eRedshift n\u0026rsquo;affecte pas la température de couleur si votre pilote graphique\nest configuré pour utiliser matériellement votre curseur.\u003c/p\u003e\n\u003cp\u003eQuelques pilotes logiciels graphiques ont l\u0026rsquo;option pour désactiver matériellement\nle curseur dans le fichier xorg.conf.\u003c/p\u003e\n\u003chr\u003e\n","summary":"Utiliser le logiciel Redshift sous OpenBSD - filtre lumineux selon horaire de journée ; ajustement automatique de la température de couleurs de l'écran ; rien que pour soulager vos yeux…","tags":["OpenBSD","redshift","température","couleur"],"date_published":"2017-08-20T21:50:17+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-17:/fr/sec/ssh/rfc4716#23a520364eb1c823941cd99df0be87b4c5f775b29215f314bf11a5fbc1a8955d","url":"https://it-log.fr.eu.org/fr/sec/ssh/rfc4716/","title":"SSH : au format RFC 4716","author":{"name":"Stéphane HUC"},"content_text":"Description SSH a son propre format de génération de ses clés. Or, dans certains contextes, tel que le projet OMV, il est nécessaire de fournir votre clé publique au format RFC 4716 !\nLa norme RFC 4716 est une simple présentation de la clé privée ou publique dans un format texte, dit ASCII, ni plus, ni moins ;-)\nGénération Comme pour créer sa clé , on utilise l\u0026rsquo;outil ssh-keygen, de telle manière :\n⇒ Pour une clé ed25519 : $ ssh-keygen -e -f ~/.ssh/id_ed25519 \u0026gt; id_ed25519_rfc4716.pub\n⇒ Idem pour une clé RSA : $ ssh-keygen -e -f /home/zou/.ssh/id_rsa \u0026gt; id_rsa_rfc4716.pub\nIl ne vous reste plus qu\u0026rsquo;à copier-coller le contenu du fichier dans l\u0026rsquo;interface ou sur le serveur où ce format vous est demandé.\nBien-sûr il est possible de la générer directement dans votre terminal ; pour cela, n\u0026rsquo;utilisez pas la redirection de sortie :\nssh-keygen -e -f ~/.ssh/id_ed25519\nDocumentation RFC 4716 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eSSH a son propre format de génération de ses clés. Or, dans certains\ncontextes, tel que le projet \u003ca href=\"http://openmediavault.org\" rel=\"external\"\u003eOMV\u003c/a\u003e,\nil est nécessaire de fournir votre clé publique au format RFC 4716 !\u003c/p\u003e\n\u003cp\u003eLa norme \u003ca href=\"https://www.rfc-editor.org/info/rfc4716\" title=\"RFC Editor : Information à-propos de la RFC 4716\"\u003eRFC 4716\u003c/a\u003e\n est une simple présentation de la clé privée ou\npublique dans un format texte, dit ASCII, ni plus, ni moins ;-)\u003c/p\u003e\n\u003ch2 id=\"génération\"\u003eGénération\u003c/h2\u003e\n\u003cp\u003eComme pour \n\u003ca class=\"inside\" href=\"/fr/sec/ssh/configuration-securisee/\" title=\"Lien interne vers l\u0026#39;article : 'SSH : Configuration Sécurisée'\"\u003ecréer sa clé\u003c/a\u003e\n,\non utilise l\u0026rsquo;outil \u003ccode\u003essh-keygen\u003c/code\u003e, de telle manière :\u003c/p\u003e\n\u003cp\u003e⇒ Pour une clé ed25519 : \u003cbr\u003e\n\u003ccode\u003e$ ssh-keygen -e -f ~/.ssh/id_ed25519 \u0026gt; id_ed25519_rfc4716.pub\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Idem pour une clé RSA : \u003cbr\u003e\n\u003ccode\u003e$ ssh-keygen -e -f /home/zou/.ssh/id_rsa \u0026gt; id_rsa_rfc4716.pub\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl ne vous reste plus qu\u0026rsquo;à copier-coller le contenu du fichier dans\nl\u0026rsquo;interface ou sur le serveur où ce format vous est demandé.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eBien-sûr il est possible de la générer directement dans votre terminal ;\npour cela, n\u0026rsquo;utilisez pas la redirection de sortie :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003essh-keygen -e -f ~/.ssh/id_ed25519\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\n\u003ch3 id=\"rfc-4716\"\u003eRFC 4716\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/rfc4716\" title=\"RFC 4716 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc4716\" title=\"RFC 4716 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc4716.txt\" title=\"RFC 4716 : 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/rfc4716.html\" title=\"RFC 4716 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc4716.txt.pdf\" title=\"RFC 4716 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc4716.txt\" title=\"RFC 4716 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003chr\u003e\n","summary":"Comment transformer votre clé SSH au format spécifié par la RFC 4716","tags":["SSH","RFC","RFC4716"],"date_published":"2017-08-17T17:37:53+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-16:/fr/web/http/x-content-type-options#b0be83e1e4c363b503b8a17b44e7c71c3aa3568a32ef451b4bd70d5dcc9b06e4","url":"https://it-log.fr.eu.org/fr/web/http/x-content-type-options/","title":"X-Content-Type-Options (header)","author":{"name":"Stéphane HUC"},"content_text":"Définition X-Content-Type-Options est une technique de base qui demande aux clients web de ne pas (télé)charger des ressources, tels que des scripts ou des feuilles de styles à moins que le serveur n\u0026rsquo;indique correctement le type MIME . Sans cette entête, les clients web pourraient télécharger n\u0026rsquo;importe quoi, et ainsi être victimes d\u0026rsquo;attaques.\nX-Content-Type-Options est une entête HTTP , dont la mise-en-place est extrêmement aisé, mais le bénéfice est faible !\nIl n\u0026rsquo;existe qu\u0026rsquo;une seule option possible : nosniff\nElle fait partie des entêtes de base à générer pour protéger son site web, au même titre que l\u0026rsquo;usage de HSTS, et des autres entêtes X-*-Options, telles que X-Content-Type, X-XSS-Protections…\nExemples X-Content-Type-Options: nosniff\nnginx add_header X-Content-Type-Options \u0026#34;nosniff\u0026#34; always; relayd Et, oui, malheureusement, httpd ne peut pas gérer les entêtes, ce sera son binôme relayd(8) que l\u0026rsquo;on utilisera !\nmatch response header set \u0026#34;X-Content-Type-Options\u0026#34; value \u0026#34;nosniff\u0026#34; Documentations Cross-site_scripting WP ","content_html":"\u003ch2 id=\"définition\"\u003eDéfinition\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eX-Content-Type-Options\u003c/strong\u003e est une technique de base qui demande aux clients web de ne pas (télé)charger des ressources, tels que des scripts ou des feuilles de styles à moins que le serveur n\u0026rsquo;indique correctement le type \u003cabbr title=\"Multipurpose Internet Mail Extensions\"\u003eMIME\u003c/abbr\u003e\n. \u003cbr\u003e\nSans cette entête, les clients web pourraient télécharger n\u0026rsquo;importe quoi, et ainsi être victimes d\u0026rsquo;attaques.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eX-Content-Type-Options\u003c/strong\u003e est une entête \u003cabbr title=\"HyperText Transfert Protocol\"\u003eHTTP\u003c/abbr\u003e\n, dont la mise-en-place est extrêmement aisé, mais le bénéfice est faible !\u003c/p\u003e\n\u003cp\u003eIl n\u0026rsquo;existe qu\u0026rsquo;une seule option possible : \u003ccode\u003enosniff\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eElle fait partie des entêtes de base à générer pour protéger son site web, au même titre que l\u0026rsquo;usage de \u003ca href=\"/fr/web/ssl/hsts/\"\u003eHSTS\u003c/a\u003e, et\ndes autres entêtes X-*-Options, telles que \u003ca href=\"/fr/web/http/x-content-type-options/\"\u003eX-Content-Type\u003c/a\u003e, \u003ca href=\"/fr/web/http/x-xss-protections/\"\u003eX-XSS-Protections\u003c/a\u003e…\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eX-Content-Type-Options: nosniff\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"nginx\"\u003enginx\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-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\"\u003eX-Content-Type-Options\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;nosniff\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ealways\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"relayd\"\u003erelayd\u003c/h3\u003e\n\u003cp\u003eEt, oui, malheureusement, \u003ca class=\"tag\" href=\"/fr/tags/httpd\"\u003ehttpd\u003c/a\u003e\n ne peut pas gérer les entêtes, ce sera son binôme \n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.8\" title=\"Page du Manuel OpenBSD pour : relayd\"\u003erelayd(8)\u003c/a\u003e\n que l\u0026rsquo;on utilisera !\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ematch response header set \u0026#34;X-Content-Type-Options\u0026#34; value \u0026#34;nosniff\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Cross-site_scripting\" title=\"Article Wikipédia : Cross-site_scripting\"\u003e\n    Cross-site_scripting\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Explications sur l'entête HTTP nommée X-Content-Type-Options","tags":["HTTP","header","X Options"],"date_published":"2017-08-16T16:13:25+01:00","date_modified":"2018-10-12T02:48:25+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-16:/fr/web/http/x-frame-options#59c6fb5593e8df1f1f85207e3b4cbf03855b8ce08f5e63ef79b09d1c7165d432","url":"https://it-log.fr.eu.org/fr/web/http/x-frame-options/","title":"X-Frame-Options (header)","author":{"name":"Stéphane HUC"},"content_text":"Définition X-Frame-Options est une entête HTTP qui permet de contrôler comment les sites internet externes peuvent \u0026ldquo;encapsuler\u0026rdquo; le vôtre.\nL\u0026rsquo;usage de cette entête est recommandé, d\u0026rsquo;autant qu\u0026rsquo;elle est simple à gérer et son bénéfice de sécurité est important.\nCette entête remplace l\u0026rsquo;historique entête Frame-Options, et est elle-même remplacée par la directive frame-ancestors de l\u0026rsquo;entête CSP !\nElle fait partie des entêtes de base à générer pour protéger son site web, au même titre que l\u0026rsquo;usage de HSTS, et des autres entêtes X-*-Options, telles que X-Content-Type, X-XSS-Protections,…\nOptions 3 options sont permises :\nDENY : interdit aux autres de mettre votre site dans une iframe. C\u0026rsquo;est l\u0026rsquo;option recommandée ! SAMEORIGIN : permet d\u0026rsquo;être mis dans une frame, à-partir de votre propre site. ALLOW-FROM uri : Cette option est dépréciée - il est clairement recommandée de ne plus l\u0026rsquo;utiliser au profit de la directive frame-ancestors gérée par l\u0026rsquo;entête CSP. Exemples X-Frame-Options: DENY\nnginx add_header X-Frame-Options \u0026#34;DENY\u0026#34; always; relayd Et, oui, malheureusement, httpd ne peut pas gérer les entêtes, ce sera son binôme relayd(8) que l\u0026rsquo;on utilisera !\nmatch response header set \u0026#34;X-Frame-Options\u0026#34; value \u0026#34;DENY\u0026#34; Documentations Différentes techniques de protections : https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet Support actuel : http://caniuse.com/#search=X-Frame-Options ","content_html":"\u003ch2 id=\"définition\"\u003eDéfinition\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eX-Frame-Options\u003c/strong\u003e est une entête HTTP qui permet de contrôler comment les sites internet externes peuvent \u0026ldquo;encapsuler\u0026rdquo; le vôtre.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;usage de cette entête est recommandé, d\u0026rsquo;autant qu\u0026rsquo;elle est simple à gérer et son bénéfice de sécurité est important.\u003c/p\u003e\n\u003cp\u003eCette entête remplace l\u0026rsquo;historique entête \u003ccode\u003eFrame-Options\u003c/code\u003e, et est elle-même remplacée par la directive \u003ccode\u003eframe-ancestors\u003c/code\u003e de l\u0026rsquo;entête \u003ca href=\"/fr/web/http/csp/\"\u003eCSP\u003c/a\u003e !\u003c/p\u003e\n\u003cp\u003eElle fait partie des entêtes de base à générer pour protéger son site web, au même titre que l\u0026rsquo;usage de \u003ca href=\"/fr/web/ssl/hsts/\"\u003eHSTS\u003c/a\u003e, et  des autres entêtes X-*-Options, telles que \u003ca href=\"/fr/web/http/x-content-type-options/\"\u003eX-Content-Type\u003c/a\u003e, \u003ca href=\"/fr/web/http/x-xss-protections/\"\u003eX-XSS-Protections\u003c/a\u003e,…\u003c/p\u003e\n\u003ch3 id=\"options\"\u003eOptions\u003c/h3\u003e\n\u003cp\u003e3 options sont permises :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eDENY\u003c/code\u003e : interdit aux autres de mettre votre site dans une iframe. C\u0026rsquo;est l\u0026rsquo;\u003cspan class=\"red\"\u003eoption recommandée\u003c/span\u003e\n !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSAMEORIGIN\u003c/code\u003e : permet d\u0026rsquo;être mis dans une frame, à-partir de votre propre site.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eALLOW-FROM uri\u003c/code\u003e : Cette option est \u003cspan class=\"red\"\u003edépréciée\u003c/span\u003e\n - il est clairement recommandée de ne plus l\u0026rsquo;utiliser au profit de la directive \u003ccode\u003eframe-ancestors\u003c/code\u003e gérée par l\u0026rsquo;entête \u003ca href=\"/fr/web/http/csp/\"\u003eCSP\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eX-Frame-Options: DENY\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"nginx\"\u003enginx\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-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\"\u003eX-Frame-Options\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;DENY\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ealways\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"relayd\"\u003erelayd\u003c/h3\u003e\n\u003cp\u003eEt, oui, malheureusement, \u003ca class=\"tag\" href=\"/fr/tags/httpd\"\u003ehttpd\u003c/a\u003e\n ne peut pas gérer les entêtes, ce sera son binôme \n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.8\" title=\"Page du Manuel OpenBSD pour : relayd\"\u003erelayd(8)\u003c/a\u003e\n que l\u0026rsquo;on utilisera !\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ematch response header set \u0026#34;X-Frame-Options\u0026#34; value \u0026#34;DENY\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDifférentes techniques de protections : \u003ca href=\"https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet\" rel=\"external\"\u003ehttps://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport actuel : \u003ca href=\"http://caniuse.com/#search=X-Frame-Options\" rel=\"external\"\u003ehttp://caniuse.com/#search=X-Frame-Options\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Explications sur l'entête HTTP nommée X-Frame-Options","tags":["HTTP","header","X Options"],"date_published":"2017-08-16T13:39:25+01:00","date_modified":"2018-10-12T02:49:25+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-16:/fr/web/http/x-xss-protection#7d1d1cec9f6bd0155a8c07ff4b9949176df915332a7fa29e13e1e04a4ebde757","url":"https://it-log.fr.eu.org/fr/web/http/x-xss-protection/","title":"X-XSS-Protection (header)","author":{"name":"Stéphane HUC"},"content_text":"Définition X-XSS-Protection est une technique de protection dont le but est de stopper le (télé)chargement de pages lorsque certaines attaques sont détectées.\nC\u0026rsquo;est une entête HTTP dont le bénéfice est minimale, et aisée à mettre en place… et dont l\u0026rsquo;impact n\u0026rsquo;est pas négligeable.\nIl n\u0026rsquo;existe qu\u0026rsquo;une seule option : 1; mode=block\nElle fait partie des entêtes de base à générer pour protéger son site web, au même titre que l\u0026rsquo;usage de HSTS , et des autres entêtes X-*-Options, telles que X-Content-Type-Options , X-Frame-Options …\nExemples X-XSS-Protection: 1; mode=block\nnginx add_header X-Xss-Protection \u0026#34;1; mode=block\u0026#34; always; relayd Et, oui, malheureusement, httpd ne peut pas gérer les entêtes, ce sera son binôme relayd(8) que l\u0026rsquo;on utilisera !\nmatch response header set \u0026#34;X-Xss-Protection\u0026#34; value \u0026#34;1; mode=block\u0026#34; Documentations Cross-site_scripting WP ","content_html":"\u003ch2 id=\"définition\"\u003eDéfinition\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eX-XSS-Protection\u003c/strong\u003e est une technique de protection dont le but\nest de stopper le (télé)chargement de pages lorsque certaines\nattaques sont détectées.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est une entête HTTP dont le bénéfice est minimale, et aisée à mettre\nen place… et dont l\u0026rsquo;impact n\u0026rsquo;est pas négligeable.\u003c/p\u003e\n\u003cp\u003eIl n\u0026rsquo;existe qu\u0026rsquo;une seule option : \u003ccode\u003e1; mode=block\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eElle fait partie des entêtes de base à générer pour protéger son site\nweb, au même titre que l\u0026rsquo;usage de \n\u003ca class=\"inside\" href=\"/fr/web/ssl/hsts/\" title=\"Lien interne vers l\u0026#39;article : 'HSTS : HTTP Strict Transport Security (header)'\"\u003eHSTS\u003c/a\u003e\n, et\ndes autres entêtes X-*-Options, telles que\n\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\u003c/a\u003e\n,\n\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\u003c/a\u003e\n…\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eX-XSS-Protection: 1; mode=block\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"nginx\"\u003enginx\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-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\"\u003eX-Xss-Protection\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;1\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003emode=block\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ealways\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"relayd\"\u003erelayd\u003c/h3\u003e\n\u003cp\u003eEt, oui, malheureusement, \u003ca class=\"tag\" href=\"/fr/tags/httpd\"\u003ehttpd\u003c/a\u003e\n ne peut pas gérer les entêtes, ce sera\nson binôme \n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.8\" title=\"Page du Manuel OpenBSD pour : relayd\"\u003erelayd(8)\u003c/a\u003e\n que l\u0026rsquo;on utilisera !\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ematch response header set \u0026#34;X-Xss-Protection\u0026#34; value \u0026#34;1; mode=block\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Cross-site_scripting\" title=\"Article Wikipédia : Cross-site_scripting\"\u003e\n    Cross-site_scripting\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Explications sur l'entête HTTP nommée X-XSS-Protection","tags":["HTTP","header","X Options"],"date_published":"2017-08-16T13:39:25+01:00","date_modified":"2018-10-12T02:50:25+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-16:/fr/web/http/sri#06b205abe51688181e9324ac0732b1a4b1a8acec83083c4c32c777e01c7ec4ed","url":"https://it-log.fr.eu.org/fr/web/http/sri/","title":"SRI : Subresource Integrity","author":{"name":"Stéphane HUC"},"content_text":"Définition SRI est une norme du W3C pour protéger des attaques par modification des ressources proposées par votre site internet, ou de celles que vous ajoutez, fournies par d\u0026rsquo;autres. Dans l\u0026rsquo;immédiat, elle ne s\u0026rsquo;utilise que pour les scripts JS et les feuilles de styles. Si la somme de contrôle relative à la ressource attendue ne correspond pas à celle déclarée, alors la ressource n\u0026rsquo;est pas (télé)chargée par le client web.\nLe bénéfice de cette technique est réelle, mais elle peut être un peu complexe à mettre en place.\nIl est possible de l\u0026rsquo;utiliser conjointement avec la directive require-sri-for de l\u0026rsquo;entête CSP.\nOptions integrity : la somme de contrôle, encodée en base64, précédée de la fonction de hash utilisée. Seuls les algorithmes sha256, sha384 - recommandation minimale - , et sha512 sont supportés. Il est possible de spécifier plusieurs niveaux de hash, dans ce cas, ce sera le hash le plus fort qui sera consulté en priorité ; s\u0026rsquo;il n\u0026rsquo;est pas supporté, ce sera celui qui le précéde.\ncrossorigin : informe le client web que la ressource partagée l\u0026rsquo;est de manière anonyme, sans aucun cookie. Une seule option : anonymous.\nExemples \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\u0026#34; integrity=\u0026#34;sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt; (…) \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js\u0026#34; integrity=\u0026#34;sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt; \u0026lt;/script\u0026gt; Bien-sûr, il est possible de faire de même - c\u0026rsquo;est fortement encouragé - avec vos propres ressources…\nCode Ci-dessous, retrouvez le code de génération shell :\ncat \u0026#34;${file}\u0026#34; | openssl dgst -\u0026#34;${algo}\u0026#34; -binary | openssl enc -base64 -A Documentations Générateur de hash pour SRI : https://www.srihash.org/ Support actuel : http://caniuse.com/#search=sri ","content_html":"\u003ch2 id=\"définition\"\u003eDéfinition\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSRI\u003c/strong\u003e est une norme du \u003cabbr title=\"World Wide Web Consortium\"\u003eW3C\u003c/abbr\u003e\n pour protéger des attaques par modification des ressources proposées par votre site internet, ou de celles que vous ajoutez, fournies par d\u0026rsquo;autres. \u003cbr\u003e\nDans l\u0026rsquo;immédiat, elle ne s\u0026rsquo;utilise que pour les scripts \u003cabbr title=\"JavaScript\"\u003eJS\u003c/abbr\u003e\n et les feuilles de styles. Si la somme de contrôle relative à la ressource attendue ne correspond pas à celle déclarée, alors la ressource n\u0026rsquo;est pas (télé)chargée par le client web.\u003c/p\u003e\n\u003cp\u003eLe bénéfice de cette technique est réelle, mais elle peut être un peu complexe à mettre en place.\u003c/p\u003e\n\u003cp\u003eIl est possible de l\u0026rsquo;utiliser conjointement avec la directive \u003ccode\u003erequire-sri-for\u003c/code\u003e de l\u0026rsquo;entête \u003ca href=\"/fr/web/http/csp/\"\u003eCSP\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"options\"\u003eOptions\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eintegrity\u003c/code\u003e : la somme de contrôle, encodée en base64, précédée de la fonction de hash utilisée. Seuls les algorithmes \u003ccode\u003esha256\u003c/code\u003e, \u003ccode\u003esha384\u003c/code\u003e - \u003cstrong\u003erecommandation minimale\u003c/strong\u003e - , et \u003ccode\u003esha512\u003c/code\u003e sont supportés. Il est possible de spécifier plusieurs niveaux de hash, dans ce cas, ce sera le hash le plus fort qui sera consulté en priorité ; s\u0026rsquo;il n\u0026rsquo;est pas supporté, ce sera celui qui le précéde.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecrossorigin\u003c/code\u003e : informe le client web que la ressource partagée l\u0026rsquo;est de manière anonyme, sans aucun cookie. Une seule option : \u003ccode\u003eanonymous\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\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-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;stylesheet\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://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eintegrity\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ecrossorigin\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;anonymous\u0026#34;\u003c/span\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003escript\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;text/javascript\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;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eintegrity\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ecrossorigin\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;anonymous\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\"\u003escript\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien-sûr, il est possible de faire de même - c\u0026rsquo;est fortement encouragé - avec vos propres ressources…\u003c/p\u003e\n\u003ch2 id=\"code\"\u003eCode\u003c/h2\u003e\n\u003cp\u003eCi-dessous, retrouvez le code de génération shell :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecat \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 | 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 -binary | openssl enc -base64 -A\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\u003eGénérateur de hash pour SRI : \u003ca href=\"https://www.srihash.org/\" rel=\"external\"\u003ehttps://www.srihash.org/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport actuel : \u003ca href=\"http://caniuse.com/#search=sri\" rel=\"external\"\u003ehttp://caniuse.com/#search=sri\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Explication sur l'entête HTTP nommée SRI : Subresource Integrity","tags":["HTTP","header","SRI"],"date_published":"2017-08-16T13:36:25+01:00","date_modified":"2018-10-12T02:47:25+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-16:/fr/web/http/referrer#2d7d8b81bd293149cb6736294a119ac2073bfe777f604684760c1fad15acd1be","url":"https://it-log.fr.eu.org/fr/web/http/referrer/","title":"HTTP : Referrer (header)","author":{"name":"Stéphane HUC"},"content_text":"Définition L\u0026rsquo;entête HTTP Referrer est une politique de protection d\u0026rsquo;un site internet, récente, en cours de travail… Cette politique permet aux sites web un contrôle fin sur l\u0026rsquo;origine d\u0026rsquo;où vient le client web.\nCela vous permet de limiter l\u0026rsquo;exposition de votre site web, en limitant voire interdisant les informations que peuvent contenir cette entête.\nCette entête complète la directive \u0026lsquo;referrer\u0026rsquo; de l\u0026rsquo;entête CSP\nOptions 4 options sont utiles :\nno-referrer : ne jamais envoyer l\u0026rsquo;entête ; elle aura une valeur à vide. same-origin : envoie l\u0026rsquo;entête mais seulement si le client se connecte sur le même site strict-origin : envoie l\u0026rsquo;entête, en ne contenant que votre URL, tel que : https://mon.domaine.net strict-origin-when-cross-origin : envoie l\u0026rsquo;entête complète\u0026hellip; votre URL vers un site extérieur. Exemples Referrer-Policy: same-origin\nnginx add_header Referrer-Policy same-origin; relayd Et, oui, malheureusement, httpd ne peut pas gérer les entêtes, ce sera son binôme relayd(8) que l\u0026rsquo;on utilisera !\nmatch response header set \u0026#34;Referrer-Policy\u0026#34; value \u0026#34;same-origin\u0026#34; Documentations https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Referrer-Policy Support actuel : http://caniuse.com/#search=Referrer ","content_html":"\u003ch2 id=\"définition\"\u003eDéfinition\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;entête \u003cabbr title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n \u003cstrong\u003eReferrer\u003c/strong\u003e est une politique de protection d\u0026rsquo;un site internet, récente, en cours de travail… \u003cbr\u003e\nCette politique permet aux sites web un contrôle fin sur l\u0026rsquo;origine d\u0026rsquo;où vient le client web.\u003cbr\u003e\nCela vous permet de limiter l\u0026rsquo;exposition de votre site web, en limitant voire interdisant les informations que peuvent contenir cette entête.\u003c/p\u003e\n\u003cp\u003eCette entête complète la directive \u0026lsquo;referrer\u0026rsquo; de l\u0026rsquo;entête \u003ca href=\"/fr/web/http/csp/\"\u003eCSP\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"options\"\u003eOptions\u003c/h2\u003e\n\u003cp\u003e4 options sont utiles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eno-referrer\u003c/code\u003e : ne jamais envoyer l\u0026rsquo;entête ; elle aura une valeur à vide. \u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esame-origin\u003c/code\u003e : envoie l\u0026rsquo;entête mais seulement si le client se connecte sur le même site\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estrict-origin\u003c/code\u003e : envoie l\u0026rsquo;entête, en ne contenant que votre URL, tel que : https://mon.domaine.net\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estrict-origin-when-cross-origin\u003c/code\u003e :  envoie l\u0026rsquo;entête complète\u0026hellip; votre URL vers un site extérieur.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eReferrer-Policy: same-origin\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"nginx\"\u003enginx\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-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\"\u003eReferrer-Policy\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003esame-origin\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"relayd\"\u003erelayd\u003c/h3\u003e\n\u003cp\u003eEt, oui, malheureusement, \u003ca class=\"tag\" href=\"/fr/tags/httpd\"\u003ehttpd\u003c/a\u003e\n ne peut pas gérer les entêtes, ce sera son binôme \n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.8\" title=\"Page du Manuel OpenBSD pour : relayd\"\u003erelayd(8)\u003c/a\u003e\n que l\u0026rsquo;on utilisera !\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ematch response header set \u0026#34;Referrer-Policy\u0026#34;         value \u0026#34;same-origin\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Referrer-Policy\" rel=\"external\"\u003ehttps://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Referrer-Policy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport actuel : \u003ca href=\"http://caniuse.com/#search=Referrer\" rel=\"external\"\u003ehttp://caniuse.com/#search=Referrer\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Explications sur l'entête HTTP nommée Referrer","tags":["HTTP","header","Referrer"],"date_published":"2017-08-16T13:35:25+01:00","date_modified":"2020-05-17T04:51:25+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-16:/fr/web/http/csp#5ca63b53fb3eccce1663df8e5665fb21f4ca606d7d8fb29485eeb50af37cf9d7","url":"https://it-log.fr.eu.org/fr/web/http/csp/","title":"CSP : Content Security Policy (header)","author":{"name":"Stéphane HUC"},"content_text":"Définition CSP est une politique de sécurité relative au contenu que votre site \u0026ldquo;distribue\u0026rdquo; vers l\u0026rsquo;utilisateur final, quelque soit son client web. Cette entête HTTP permet de contrôler très finement l\u0026rsquo;accès aux ressources de votre site et des ressources partagées par d\u0026rsquo;autres à-partir de votre site.\nCette politique de sécurité impose que le développement des codes CSS } et JS soit propre, c\u0026rsquo;est-à-dire \u0026ldquo;embarqué\u0026rdquo; par les balises HTML adéquates pour charger du code source correspondant, et non pas embarqués dans le code source HTML. On parle de code inline ; c\u0026rsquo;est cela qu\u0026rsquo;il faut éviter…\nLe bénéfice de sécurité est vraiment important, mais regorge de difficultés conséquentes, car il est vraiment nécessaire de comprendre les impacts des différentes directives qui vont plus ou moins empêcher l\u0026rsquo;accès aux ressources !\nIl faut aussi assimiler qu\u0026rsquo;avec une seule entête HTTP, il est possible d\u0026rsquo;avoir un éventail d\u0026rsquo;interactions qui ne sont pas anodines.\nIl y a actuellement deux normes :\nCSP 1 est normalement supportée par l\u0026rsquo;ensemble des navigateurs connus, sauf Opera Mini CSP 2 est généralement bien supportée par l\u0026rsquo;ensemble des navigateurs, seul Firefox a un support partiel, et IE et Opera Mini n\u0026rsquo;ont pas de support du tout ! Si vous avez un problème d\u0026rsquo;affichage, mettez-à-jour votre client web - sauf pour les deux derniers suscités… une troisième version est en cours de travail auprès du W3C. Officiellement, aucun support pour aucun navigateur web ! AttentionATTENTION : Si le client web utilisé ne comprend pas une des directives CSP, il feint de l\u0026rsquo;ignorer, ni plus ni moins… Pour lui, elle n\u0026rsquo;existe pas ! Modes Il y a deux modes possibles, et il est vraiment conseillé de commencer avec le premier, histoire de réaliser les tenants et aboutissants :\nContent-Security-Policy-Report-Only : ce mode est à considérer comme un mode de test, qui n\u0026rsquo;a pas d\u0026rsquo;impact sur votre site web, mais permet de tester les différentes directives Content-Security-Policy : est le mode d\u0026rsquo;application des directives Directives Il a vraiment beaucoup de directives, d\u0026rsquo;autant que selon la version de la politique CSP, certaines sont déclarées obsolètes…\nLa première directive à mettre-en-place est la directive par défaut :\ndefault-src : est la directive qui définit par défaut le comportement de l\u0026rsquo;entête CSP. - norme CSP 1 - Attention, seules certaines directives sont assujetties à cette directive par défaut : child-src, connect-src, font-src, img-src, manifest-src, media-src, object-src, script-src, style-src et worker-src ! Voici les autres directives qui peuvent être mises-en-place :\nbase-uri : définit l\u0026rsquo;URI que le client web utilisera comme base de la page web affichée - norme CSP2 - block-all-mixed-content : empêche que le client web (télé)charge du contenu sur le protocole HTTP alors que la page est consultée en mode HTTPS child-src : définit les sources valides relatives aux contenus autorisés - norme CSP2 - connect-src : définit quelles sources sont valides pour les connexions de type XMLHttpRequest, WebSocket, et assimilées. - norme CSP 1 - disown-opener; : assure qu\u0026rsquo;une ressource ne puisse être ouverte lors de sa consultation - norme CSP3 - font-src : directive ayant un impact sur les polices à afficher. - norme CSP 1 - form-action : définit l\u0026rsquo;interaction avec l\u0026rsquo;élément HTML form. - norme CSP2 - frame-ancestor : directive pour les ressources partagées par les frames embarquées - norme CSP2 - c\u0026rsquo;est l\u0026rsquo;équivalent de l\u0026rsquo;entête X-Frame-Options… frame-src : directive pour les ressources partagées par les frames embarquées. - norme CSP 1 - dépréciée en CSP2 - réintroduite dans CSP 3 img-src : directive ayant un impact sur les images à charger. - norme CSP 1 - manifest-src : définit quel manifeste peut être appliquée à la ressource. - norme CSP3 - media-src : directive pour les ressources audio, et vidéo. - norme CSP 1 - navigate-to : directive pour contrôler les ressources autorisées à la navigation - norme CSP3 - object-src : directive pour les ressources qui chargent des plugins, des applets et autres éléments embed. - norme CSP 1 - plugin-types : directive qui définit le type des ressources qui peuvent être chargées. - norme CSP2 - referrer : directive équivalent à l\u0026rsquo;entête Referrer - cette directive a ses propres mots-clés ! reflected-xss : directive pour filtrer les attaques de type XSS - équivalent de l\u0026rsquo;entête X-XSS-Protection - cette directive a ses propres mots-clés ! report-to : spécifie un jeton qui définit un groupe de rapports à envoyer. - norme CSP3 - report-uri: : directive qui définit l\u0026rsquo;URL où reporter les violations de sécurité. - norme CSP 1 - dépréciée en CSP3 , au profit de report-to - require-sri-for : directive qui oblige l\u0026rsquo;attribut SRI pour les scripts et autres styles. - cette directive a ses propres mots-clés ! sandbox : directive qui utilise une sandbox HTML pour protéger l\u0026rsquo;exécution des ressources. - cette directive a ses propres mots-clés ! - norme CSP 1 - script-nonce : directive qui autorise l\u0026rsquo;exécution d\u0026rsquo;un script seulement s\u0026rsquo;il y a correspondance avec l\u0026rsquo;attribut nonce. cf : les explications liées au mot-clé nonce ci-dessous… script-src : directive qui régit les scripts exécutables, tels que JS. - norme CSP 1 - style-src : directive qui régit les feuilles de styles. - norme CSP 1 - upgrade-insecure-requests : oblige toute requête faite en HTTP à basculer en HTTPS si une page est chargée en HTTPS. worker-src : définit quelles URL peuvent être chargées en tant que Worker, Sharedworker ou ServiceWorker. Il est très possible, du fait de l\u0026rsquo;évolution de la norme de cette entête que j\u0026rsquo;ai oublié la présentation de certaines directives… veuillez vérifier auprès du W3C.\nInfoJe ne détaillerai pas plus les différentes directives… pour cela, veuillez lire les documentations sur lesquelles j\u0026rsquo;attire votre attention dans la section ad hoc, et les référentiels W3C. Notes Du fait que la directive default-src n\u0026rsquo;a pas d\u0026rsquo;impact sur certaines directives, telles que frame-ancestor, form-action, si ces dernières ne sont pas spécifiées, alors l\u0026rsquo;émission de données correspondantes sera envoyée… La directive block-all-mixed-content est évaluée après la directive upgrade-insecure-requests La directive child-src remplace la directive frame-src Si la directive child-src n\u0026rsquo;est pas définie, elle est influencée par default-src- c\u0026rsquo;est le cas de toutes les directives assujetties à cette dernière Il est préférable de l\u0026rsquo;utiliser pour les scripts \u0026ldquo;dépendants\u0026rdquo; plutôt que l\u0026rsquo;usage de la directive script-src. Si les directives frame-src, work-src ne sont pas spécifiées, la politique child-src s\u0026rsquo;applique. La directive plugins-type n\u0026rsquo;accepte pas le caractère wildcard * ; il faut définir un type MIME : e.g : application/pdf ! Recommandations La première des recommandations est : Il n\u0026rsquo;y a rien de pire de ne rien faire que de spécifier plusieurs fois la même directive… seule la première directive est prise-en-compte ! La deuxième est de démarrer avec la déclaration suivante : default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; ; et de voir comment cela réagit ! ;-) Concernant la directive object-src, préférez l\u0026rsquo;usage du mot-clé none, sauf à avoir l\u0026rsquo;absolu nécessité d\u0026rsquo;exécuter des scripts Flash, ou Silverlight. Concernant les directives block-all-mixed-content et upgrade-insecure-requests, il est recommandé d\u0026rsquo;activer ou l\u0026rsquo;une, ou l\u0026rsquo;autre, mais pas les deux ! Attention à l\u0026rsquo;usage de la déclaration suivante : script-src 'self' qui peut ne pas être sûre en présence de JSONP. Idéalement, utiliser la directive report-uri qui postera du contenu JSON pour relever les violations de sécurité, par vos propres moyens, ou au-travers d\u0026rsquo;un service fourni par un tiers. Mots-clés Aux directives, il est possible d\u0026rsquo;appliquer un ou plusieurs mots-clés :\n* : autorise toutes les ressources. Ce wilcard peut s\u0026rsquo;appliquer aussi dans l\u0026rsquo;écriture des schemes, des URL et des ports autorisés, tel que : *://*.domaine.xyz:// : cet exemple signifie l\u0026rsquo;autorisation de toutes les ressources des différents sous-domaines, quelque soit le protocole utilisé, et sur n\u0026rsquo;importe quel port de connexion. 'none' : refuse toutes les ressources - C\u0026rsquo;est la politique à préférer, en terme de sécurité absolue, sur la directive par défaut ! 'self' : autorise les ressources du domaine en cours ; ne gèrent pas les ressources de sous-domaines, s\u0026rsquo;ils existent… il faut les autoriser explicitement par l\u0026rsquo;ajout de l\u0026rsquo;URL correspondante ! - C\u0026rsquo;est la politique minimale à appliquer sur la directive par défaut. 'strict-dynamic' : autorisera les scripts à charger leurs dépendances sans avoir à les autoriser spécifiquement - norme CSP3 - 'unsafe-inline' : permet l\u0026rsquo;usage du code inline CSS ou JS. 'unsafe-eval' : permet l\u0026rsquo;évaluation de tout… 'unsafe-hashed-attributes' : autorisera les gestionnaires d\u0026rsquo;événements selon leur hash. - norme CSP3 - Mots-clés relatifs à la gestion des données - dans chaque cas, il est strictement nécessaire de spécifier une URI :\nblob: : autorise l\u0026rsquo;usage de binaires data: : autorise l\u0026rsquo;usage des données relatives à certaines directives utilisées, telles que les directives script-src, styles-src,… cela peut être des images encodées en base64 filesystem: : autorise l\u0026rsquo;usage de ressources depuis le système de fichiers. https: : oblige les ressources à être chargées absolument par le biais du protocole HTTPS. mediastream: : autorise le chargement de streaming de médias audio, vidéo,… wss: : autorise le chargement des websockets ! Mots-clés relatifs à la directive referrer :\norigin : le client web envoie toujours l\u0026rsquo;origine de l\u0026rsquo;entête vers le même site origin-when-cross-origin : le client web enverra l\u0026rsquo;origine de l\u0026rsquo;entête uniquement vers le même site même lorsque les origines sont croisées. no-referrer : n\u0026rsquo;envoie pas l\u0026rsquo;entête no-referrer-when-downgrade : n\u0026rsquo;envoie pas l\u0026rsquo;entête quand le client navigue depuis HTTPS vers HTTP same-origin : envoie l\u0026rsquo;entête si seulement vers le même site unsafe-url : envoie toujours l\u0026rsquo;entête vers tous. Mots-clés relatifs à la directive reflected-xss :\nallow : désactive toute protection contre les attaques XSS. block : bloque le chargement des ressources si une attaque XSS est détectée filter : filtre la charge XSS avant son exécution Mots-clés relatifs à la directive require-sri-for :\nscript : oblige l\u0026rsquo;attribut integrity pour les scripts style : oblige l\u0026rsquo;attribut integrity pour les styles script, style : oblige l\u0026rsquo;attribut integrity pour les scripts et les styles Mots-clés relatifs à la directive sandbox :\nsandbox : active la protection avec toutes les restrictions en place. Aucune des autres valeurs ne doit être spécifiée afin que toutes les restrictions soient respectées ! allow-forms : permet une page à soumettre un formulaire allow-pointer-lock : évalue la gestion du pointeur de souris. allow-modals : permet les interactions avec le client web. allow-popups : autorise l\u0026rsquo;ouverture de popups allow-same-origin : permet à une page d\u0026rsquo;accéder à du contenu depuis le même site allow-scripts : permet à une page d\u0026rsquo;exécuter ses scripts allow-top-navigation : permet à une page de ??? Il existe deux mots-clés très spécifiques :\nhash : il permet d\u0026rsquo;autoriser un script, ou un style en particulier selon le hash définit… le hachage est calculé selon un des trois algorithmes SHA-2 (sha256, sha384 - politique minimale recommandée, sha512), encodé en base64. e.g. : style-src 'sha256-HashDigestHere=' nonce : acronyme de Number used Once - Numéro utilisé une seule fois - ; il permet d\u0026rsquo;autoriser un script inline selon la valeur dynamique aléatoire autorisé. Il est très possible, du fait de l\u0026rsquo;évolution de la norme de cette entête que j\u0026rsquo;ai oublié la présentation de certains mots-clés… veuillez vérifier auprès du W3C.\nRecommandations Il est recommandé d\u0026rsquo;appliquer le mot-clé https: sur la directive par défaut, tel que : default-src: https:. Cela désactive le code inline et oblige toute connexion en mode HTTPS seulement. Il est clairement recommandé d\u0026rsquo;éviter l\u0026rsquo;usage du mot-clé unsafe-inline ! Malheureusement, parfois certains scripts \u0026ldquo;embarqués\u0026rdquo; ou styles extérieurs nécessitent des données et autres codes qu\u0026rsquo;il est difficile de gérer finement ; c\u0026rsquo;est la solution du \u0026ldquo;moins pire\u0026rdquo; Il est assurément recommandé de ne pas utiliser le mot-clé unsafe-eval ! Attention à l\u0026rsquo;usage du mot-clé data: : par ce biais, il peut remonter des contenus \u0026ldquo;dérivés\u0026rdquo; inhérents aux directives object-src, script-src,… L\u0026rsquo;attribut nonce doit être unique, re-généré à chaque fois, et bien entendu doit être non trivial et non devinable !` Risques Les risques possibles sont liés à :\nDes erreurs de configuration, dues à des incompréhensions - d\u0026rsquo;où l\u0026rsquo;intérêt de tester avant l\u0026rsquo;application ;) l\u0026rsquo;application de politique trop permissive, tel que l\u0026rsquo;usage des mots-clés unsafe-*… Utiliser le mot-clé unsafe-inline est l\u0026rsquo;équivalent de ne pas avoir de politique de sécurité ; quant à utiliser le mot-clé unsafe-eval est assurément l\u0026rsquo;équivalent d\u0026rsquo;un trou béant dans votre site web où vous permettez à tout le monde de faire n\u0026rsquo;importe quoi… \u0026lt;= vous, voilà, prévenus !!! oui, j\u0026rsquo;exagère peut-être un peu… mais le risque est réel, et sérieux. Examples Content-Security-Policy: default-src https:\nIl est possible de la définir par le biais de l\u0026rsquo;élément HTML meta, tel que :\n\u0026lt;meta http-equiv=\u0026#34;Content-Security-Policy\u0026#34; content=\u0026#34;script-src \u0026#39;self\u0026#39;\u0026#34;\u0026gt; nginx add_header Content-Security-Policy \u0026#34;default-src \u0026#39;self\u0026#39;;\u0026#34; always; relayd Et, oui, malheureusement, httpd ne peut pas gérer les entêtes, ce sera son binôme relayd(8) que l\u0026rsquo;on utilisera !\nmatch response header set \u0026#34;Content-Security-Policy\u0026#34; value \u0026#34;default-src \u0026#39;self\u0026#39; data: \u0026#39;unsafe-inline\u0026#39;; base-uri \\*://domain.tld ; form-action \u0026#39;self\u0026#39;; frame-ancestors \u0026#39;none\u0026#39;; referrer no-referrer; reflected-xss block; sandbox allow-same-origin ; script-src \u0026#39;self\u0026#39; cdnjs.cloudflare.com netdna.bootstrapcdn.com ;\u0026#34; Documentations https://scotthelme.co.uk/csp-cheat-sheet/ https://content-security-policy.com/ https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP https://www.owasp.org/index.php/Content_Security_Policy https://openweb.eu.org/articles/content-security-policy Autres sites intéressants https://report-uri.io Support actuel : http://caniuse.com/#search=csp ","content_html":"\u003ch2 id=\"définition\"\u003eDéfinition\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eCSP\u003c/strong\u003e est une politique de sécurité relative au contenu que votre site \u0026ldquo;distribue\u0026rdquo; vers l\u0026rsquo;utilisateur final, quelque soit son client web. Cette entête \u003cabbr title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n permet de contrôler très finement l\u0026rsquo;accès aux ressources de votre site et des ressources partagées par d\u0026rsquo;autres à-partir de votre site.\u003c/p\u003e\n\u003cp\u003eCette politique de sécurité impose que le développement des codes \u003cabbr title=\"Cascade Stylesheet\"\u003eCSS\u003c/abbr\u003e\n} et \u003cabbr title=\"JavaScript\"\u003eJS\u003c/abbr\u003e\n soit propre, c\u0026rsquo;est-à-dire \u0026ldquo;embarqué\u0026rdquo; par les balises \u003cabbr title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n adéquates pour charger du code source correspondant, et non pas embarqués dans le code source HTML. On parle de \u003cspan lang=\"en\"\u003ecode inline\u003c/span\u003e ; c\u0026rsquo;est cela qu\u0026rsquo;il faut éviter…\u003c/p\u003e\n\u003cp\u003eLe bénéfice de sécurité est vraiment important, mais regorge de difficultés conséquentes, car il est vraiment nécessaire de comprendre les impacts des différentes directives qui vont plus ou moins empêcher l\u0026rsquo;accès aux ressources !\u003c/p\u003e\n\u003cp\u003eIl faut aussi assimiler qu\u0026rsquo;avec une seule entête HTTP, il est possible d\u0026rsquo;avoir un éventail d\u0026rsquo;interactions qui ne sont pas anodines.\u003c/p\u003e\n\u003cp\u003eIl y a actuellement deux normes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.w3.org/TR/CSP1/\" rel=\"external\"\u003eCSP\u003c/a\u003e \u003cspan class=\"dark-green\"\u003e1\u003c/span\u003e\n est normalement supportée par l\u0026rsquo;ensemble des navigateurs connus, sauf Opera Mini\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.w3.org/TR/CSP2/\" rel=\"external\"\u003eCSP\u003c/a\u003e \u003cspan class=\"green\"\u003e2\u003c/span\u003e\n est généralement bien supportée par l\u0026rsquo;ensemble des navigateurs, seul Firefox a un support partiel, et IE et Opera Mini n\u0026rsquo;ont pas de support du tout ! \u003cbr\u003e\n\u003cspan class=\"red\"\u003eSi vous avez un problème d\u0026rsquo;affichage, mettez-à-jour\u003c/span\u003e votre client web - \u003cem\u003esauf pour les deux derniers suscités\u003c/em\u003e…\u003c/li\u003e\n\u003cli\u003eune \u003ca href=\"https://www.w3.org/TR/CSP3/\" rel=\"external\"\u003etroisième version\u003c/a\u003e est en cours de travail auprès du W3C. \u003cspan class=\"red\"\u003eOfficiellement, aucun support pour aucun navigateur web\u003c/span\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\u003cstrong\u003eATTENTION\u003c/strong\u003e : Si le client web utilisé ne comprend pas une des directives CSP, il feint de l\u0026rsquo;ignorer, ni plus ni moins… \u003cbr\u003e\nPour lui, elle n\u0026rsquo;existe pas !\u003c/div\u003e\n\n\u003ch2 id=\"modes\"\u003eModes\u003c/h2\u003e\n\u003cp\u003eIl y a deux modes possibles, et il est vraiment conseillé de commencer avec le premier, histoire de réaliser les tenants et aboutissants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eContent-Security-Policy-Report-Only\u003c/code\u003e : ce mode est à considérer comme un mode de test, qui n\u0026rsquo;a pas d\u0026rsquo;impact sur votre site web, mais permet de tester les différentes directives\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eContent-Security-Policy\u003c/code\u003e : est le mode d\u0026rsquo;application des directives\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"directives\"\u003eDirectives\u003c/h2\u003e\n\u003cp\u003eIl a vraiment beaucoup de directives, d\u0026rsquo;autant que selon la version de la politique CSP, certaines sont déclarées obsolètes…\u003c/p\u003e\n\u003cp\u003eLa première directive à mettre-en-place est la directive par défaut :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edefault-src\u003c/code\u003e : est la directive qui définit par défaut le comportement de l\u0026rsquo;entête CSP. - norme \u003cspan class=\"dark-green\"\u003eCSP 1\u003c/span\u003e\n - \u003cbr\u003e\nAttention, \u003cspan class=\"IMP\"\u003eseules certaines directives sont assujetties\u003c/span\u003e à cette directive par défaut : \u003ccode\u003echild-src\u003c/code\u003e, \u003ccode\u003econnect-src\u003c/code\u003e, \u003ccode\u003efont-src\u003c/code\u003e, \u003ccode\u003eimg-src\u003c/code\u003e, \u003ccode\u003emanifest-src\u003c/code\u003e, \u003ccode\u003emedia-src\u003c/code\u003e, \u003ccode\u003eobject-src\u003c/code\u003e, \u003ccode\u003escript-src\u003c/code\u003e, \u003ccode\u003estyle-src\u003c/code\u003e et \u003ccode\u003eworker-src\u003c/code\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoici les autres directives qui peuvent être mises-en-place :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ebase-uri\u003c/code\u003e : définit l\u0026rsquo;URI que le client web utilisera comme base de la page web affichée - norme \u003cspan class=\"green\"\u003eCSP2\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eblock-all-mixed-content\u003c/code\u003e : empêche que le client web (télé)charge du contenu sur le protocole HTTP alors que la page est consultée en mode HTTPS\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003echild-src\u003c/code\u003e : définit les sources valides relatives aux contenus autorisés - norme \u003cspan class=\"green\"\u003eCSP2\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econnect-src\u003c/code\u003e : définit quelles sources sont valides pour les connexions de type XMLHttpRequest, WebSocket, et assimilées. - norme \u003cspan class=\"dark-green\"\u003eCSP 1\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edisown-opener;\u003c/code\u003e : assure qu\u0026rsquo;une ressource ne puisse être ouverte lors de sa consultation - norme \u003cspan class=\"dark-red\"\u003eCSP3\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efont-src\u003c/code\u003e : directive ayant un impact sur les polices à afficher. - norme \u003cspan class=\"dark-green\"\u003eCSP 1\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eform-action\u003c/code\u003e : définit l\u0026rsquo;interaction avec l\u0026rsquo;élément HTML form. - norme \u003cspan class=\"green\"\u003eCSP2\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eframe-ancestor\u003c/code\u003e : directive pour les ressources partagées par les frames embarquées - norme \u003cspan class=\"green\"\u003eCSP2\u003c/span\u003e\n - \u003cem\u003ec\u0026rsquo;est l\u0026rsquo;équivalent de l\u0026rsquo;entête \u003ca href=\"web:http:x-frame-options\" rel=\"external\"\u003eX-Frame-Options\u003c/a\u003e\u003c/em\u003e…\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eframe-src\u003c/code\u003e : directive pour les ressources partagées par les frames embarquées. - norme \u003cspan class=\"dark-green\"\u003eCSP 1\u003c/span\u003e\n - \u003cspan class=\"orange\"\u003edépréciée\u003c/span\u003e\n en \u003cspan class=\"green\"\u003eCSP2\u003c/span\u003e\n - \u003cem\u003eréintroduite dans \u003cspan class=\"dark-red\"\u003eCSP 3\u003c/span\u003e\n\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eimg-src\u003c/code\u003e : directive ayant un impact sur les images à charger. - norme \u003cspan class=\"dark-green\"\u003eCSP 1\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emanifest-src\u003c/code\u003e : définit quel manifeste peut être appliquée à la ressource. - norme \u003cspan class=\"dark-red\"\u003eCSP3\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emedia-src\u003c/code\u003e : directive pour les ressources audio, et vidéo. - norme \u003cspan class=\"dark-green\"\u003eCSP 1\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enavigate-to\u003c/code\u003e : directive pour contrôler les ressources autorisées à la navigation - norme \u003cspan class=\"dark-red\"\u003eCSP3\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eobject-src\u003c/code\u003e : directive pour les ressources qui chargent des plugins, des applets et autres éléments embed. - norme \u003cspan class=\"dark-green\"\u003eCSP 1\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eplugin-types\u003c/code\u003e : directive qui définit le type des ressources qui peuvent être chargées. - norme \u003cspan class=\"green\"\u003eCSP2\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ereferrer\u003c/code\u003e : directive \u003cem\u003eéquivalent à l\u0026rsquo;entête \u003ca href=\"web:http:referrer\" rel=\"external\"\u003eReferrer\u003c/a\u003e\u003c/em\u003e - cette directive a ses propres mots-clés !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ereflected-xss\u003c/code\u003e : directive pour filtrer les attaques de type XSS - \u003cem\u003eéquivalent de l\u0026rsquo;entête \u003ca href=\"/fr/web/http/x-xss-protections/\"\u003eX-XSS-Protection\u003c/a\u003e\u003c/em\u003e - cette directive a ses propres mots-clés !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ereport-to\u003c/code\u003e : spécifie un jeton qui définit un groupe de rapports à envoyer. - norme \u003cspan class=\"dark-red\"\u003eCSP3\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ereport-uri:\u003c/code\u003e : directive qui définit l\u0026rsquo;URL où reporter les violations de sécurité. - norme \u003cspan class=\"dark-green\"\u003eCSP 1\u003c/span\u003e\n - \u003cem\u003edépréciée en \u003cspan class=\"dark-red\"\u003eCSP3\u003c/span\u003e\n, au profit de \u003ccode\u003ereport-to\u003c/code\u003e\u003c/em\u003e -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erequire-sri-for\u003c/code\u003e : directive qui oblige l\u0026rsquo;attribut \u003ca href=\"/fr/web/http/sri/\"\u003eSRI\u003c/a\u003e pour les scripts et autres styles. - cette directive a ses propres mots-clés !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esandbox\u003c/code\u003e : directive qui utilise une sandbox HTML pour protéger l\u0026rsquo;exécution des ressources. - cette directive a ses propres mots-clés ! - norme \u003cspan class=\"dark-green\"\u003eCSP 1\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003escript-nonce\u003c/code\u003e : directive qui autorise l\u0026rsquo;exécution d\u0026rsquo;un script seulement s\u0026rsquo;il y a correspondance avec l\u0026rsquo;attribut \u003ccode\u003enonce\u003c/code\u003e. \u003cem\u003ecf : les explications liées au mot-clé \u003ccode\u003enonce\u003c/code\u003e ci-dessous…\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003escript-src\u003c/code\u003e : directive qui régit les scripts exécutables, tels que JS. - norme \u003cspan class=\"dark-green\"\u003eCSP 1\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estyle-src\u003c/code\u003e : directive qui régit les feuilles de styles. - norme \u003cspan class=\"dark-green\"\u003eCSP 1\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eupgrade-insecure-requests\u003c/code\u003e : oblige toute requête faite en HTTP à basculer en HTTPS si une page est chargée en HTTPS.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eworker-src\u003c/code\u003e : définit quelles URL peuvent être chargées en tant que Worker, Sharedworker ou ServiceWorker.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl est très possible, du fait de l\u0026rsquo;évolution de la norme de cette entête que j\u0026rsquo;ai oublié la présentation de certaines directives… \u003cbr\u003e\nveuillez vérifier auprès du W3C.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eJe ne détaillerai pas plus les différentes directives… pour cela, veuillez lire les documentations sur lesquelles j\u0026rsquo;attire votre attention dans la section ad hoc, et les référentiels W3C.\u003c/div\u003e\n\n\u003ch3 id=\"notes\"\u003eNotes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDu fait que la directive \u003ccode\u003edefault-src\u003c/code\u003e n\u0026rsquo;a pas d\u0026rsquo;impact sur certaines directives, telles que \u003ccode\u003eframe-ancestor\u003c/code\u003e, \u003ccode\u003eform-action\u003c/code\u003e, si ces dernières ne sont pas spécifiées, alors l\u0026rsquo;émission de données correspondantes sera envoyée…\u003c/li\u003e\n\u003cli\u003eLa directive \u003ccode\u003eblock-all-mixed-content\u003c/code\u003e est évaluée après la directive \u003ccode\u003eupgrade-insecure-requests\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLa directive \u003ccode\u003echild-src\u003c/code\u003e remplace la directive \u003ccode\u003eframe-src\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003eSi la directive \u003ccode\u003echild-src\u003c/code\u003e n\u0026rsquo;est pas définie, elle est influencée par \u003ccode\u003edefault-src\u003c/code\u003e- \u003cem\u003ec\u0026rsquo;est le cas de toutes les directives assujetties à cette dernière\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eIl est préférable de l\u0026rsquo;utiliser pour les scripts \u0026ldquo;dépendants\u0026rdquo; plutôt que l\u0026rsquo;usage de la directive \u003ccode\u003escript-src\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eSi les directives \u003ccode\u003eframe-src\u003c/code\u003e, \u003ccode\u003ework-src\u003c/code\u003e ne sont pas spécifiées, la politique \u003ccode\u003echild-src\u003c/code\u003e s\u0026rsquo;applique.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eLa directive \u003ccode\u003eplugins-type\u003c/code\u003e n\u0026rsquo;accepte pas le caractère wildcard \u003ccode\u003e*\u003c/code\u003e ; il faut \u003cspan class=\"red\"\u003edéfinir un type MIME\u003c/span\u003e : \u003cem\u003ee.g : \u003ccode\u003eapplication/pdf\u003c/code\u003e\u003c/em\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"recommandations\"\u003eRecommandations\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eLa première des recommandations est : \u003cspan class=\"red\"\u003eIl n\u0026rsquo;y a rien de pire de ne rien faire que\u003c/span\u003e de spécifier plusieurs fois la même directive… \u003cbr\u003e\nseule la première directive est prise-en-compte !\u003c/li\u003e\n\u003cli\u003eLa deuxième est de démarrer avec la déclaration suivante : \u003ccode\u003edefault-src 'none'; img-src 'self'; script-src 'self'; style-src 'self';\u003c/code\u003e ; et de voir comment cela réagit ! ;-)\u003c/li\u003e\n\u003cli\u003eConcernant la directive \u003ccode\u003eobject-src\u003c/code\u003e, préférez l\u0026rsquo;usage du mot-clé \u003ccode\u003enone\u003c/code\u003e, sauf à avoir l\u0026rsquo;absolu nécessité d\u0026rsquo;exécuter des scripts Flash, ou Silverlight.\u003c/li\u003e\n\u003cli\u003eConcernant les directives \u003ccode\u003eblock-all-mixed-content\u003c/code\u003e et \u003ccode\u003eupgrade-insecure-requests\u003c/code\u003e, il est recommandé d\u0026rsquo;activer ou l\u0026rsquo;une, ou l\u0026rsquo;autre, mais pas les deux !\u003c/li\u003e\n\u003cli\u003eAttention à l\u0026rsquo;usage de la déclaration suivante : \u003ccode\u003escript-src 'self'\u003c/code\u003e qui peut ne pas être sûre en présence de JSONP.\u003c/li\u003e\n\u003cli\u003eIdéalement, utiliser la directive \u003ccode\u003ereport-uri\u003c/code\u003e qui postera du contenu JSON pour relever les violations de sécurité, par vos propres moyens, ou au-travers d\u0026rsquo;un service fourni par un tiers.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"mots-clés\"\u003eMots-clés\u003c/h3\u003e\n\u003cp\u003eAux directives, il est possible d\u0026rsquo;appliquer un ou plusieurs mots-clés :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e*\u003c/code\u003e : autorise toutes les ressources. Ce wilcard peut s\u0026rsquo;appliquer aussi dans l\u0026rsquo;écriture des schemes, des URL et des ports autorisés, tel que : \u003cbr\u003e\n\u003ccode\u003e*://*.domaine.xyz://\u003c/code\u003e : \u003cbr\u003e\n\u003cem\u003ecet exemple signifie l\u0026rsquo;autorisation de toutes les ressources des différents sous-domaines, quelque soit le protocole utilisé, et sur n\u0026rsquo;importe quel port de connexion.\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e'none'\u003c/code\u003e : refuse toutes les ressources - C\u0026rsquo;est la \u003cspan class=\"red\"\u003epolitique à préférer, en terme de sécurité absolue, sur la directive par défaut\u003c/span\u003e !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e'self'\u003c/code\u003e : autorise les ressources du domaine en cours ; ne gèrent pas les ressources de sous-domaines, s\u0026rsquo;ils existent… il faut les autoriser explicitement par l\u0026rsquo;ajout de l\u0026rsquo;URL correspondante ! - C\u0026rsquo;est la politique minimale à appliquer sur la directive par défaut.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e'strict-dynamic'\u003c/code\u003e : autorisera les scripts à charger leurs dépendances sans avoir à les autoriser spécifiquement - norme \u003cspan class=\"dark-red\"\u003eCSP3\u003c/span\u003e\n -\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e'unsafe-inline'\u003c/code\u003e : permet l\u0026rsquo;usage du code inline CSS ou JS.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e'unsafe-eval'\u003c/code\u003e : permet l\u0026rsquo;évaluation de tout…\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e'unsafe-hashed-attributes'\u003c/code\u003e : autorisera les gestionnaires d\u0026rsquo;événements selon leur hash. - norme \u003cspan class=\"dark-red\"\u003eCSP3\u003c/span\u003e\n -\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eMots-clés relatifs à la gestion des données - dans chaque cas, il est strictement nécessaire de spécifier une URI :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eblob:\u003c/code\u003e : autorise l\u0026rsquo;usage de binaires\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edata:\u003c/code\u003e : autorise l\u0026rsquo;usage des données relatives à certaines directives utilisées, telles que les directives \u003ccode\u003escript-src\u003c/code\u003e, \u003ccode\u003estyles-src\u003c/code\u003e,… cela peut être des images encodées en base64\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efilesystem:\u003c/code\u003e : autorise l\u0026rsquo;usage de ressources depuis le système de fichiers.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehttps:\u003c/code\u003e : oblige les ressources à être chargées absolument par le biais du protocole HTTPS.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emediastream:\u003c/code\u003e : autorise le chargement de streaming de médias audio, vidéo,…\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewss:\u003c/code\u003e : autorise le chargement des websockets !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eMots-clés relatifs à la directive \u003cem\u003ereferrer\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eorigin\u003c/code\u003e : le client web envoie toujours l\u0026rsquo;origine de l\u0026rsquo;entête vers le même site\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eorigin-when-cross-origin\u003c/code\u003e : le client web enverra l\u0026rsquo;origine de l\u0026rsquo;entête uniquement vers le même site même lorsque les origines sont croisées.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eno-referrer\u003c/code\u003e : n\u0026rsquo;envoie pas l\u0026rsquo;entête\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eno-referrer-when-downgrade\u003c/code\u003e : n\u0026rsquo;envoie pas l\u0026rsquo;entête quand le client navigue depuis HTTPS vers HTTP\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esame-origin\u003c/code\u003e : envoie l\u0026rsquo;entête si seulement vers le même site\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eunsafe-url\u003c/code\u003e :  envoie toujours l\u0026rsquo;entête vers tous.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eMots-clés relatifs à la directive \u003cem\u003ereflected-xss\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eallow\u003c/code\u003e : désactive toute protection contre les attaques XSS.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eblock\u003c/code\u003e : bloque le chargement des ressources si une attaque XSS est détectée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efilter\u003c/code\u003e : filtre la charge XSS avant son exécution\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eMots-clés relatifs à la directive \u003cem\u003erequire-sri-for\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003escript\u003c/code\u003e : oblige l\u0026rsquo;attribut integrity pour les scripts\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estyle\u003c/code\u003e : oblige l\u0026rsquo;attribut integrity pour les styles\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003escript, style\u003c/code\u003e : oblige l\u0026rsquo;attribut integrity pour les scripts et les styles\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eMots-clés relatifs à la directive \u003cem\u003esandbox\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003esandbox\u003c/code\u003e : active la protection avec toutes les restrictions en place. \u003cbr\u003e\nAucune des autres valeurs ne doit être spécifiée afin que toutes les restrictions soient respectées !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eallow-forms\u003c/code\u003e : permet une page à soumettre un formulaire\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eallow-pointer-lock\u003c/code\u003e : évalue la gestion du pointeur de souris.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eallow-modals\u003c/code\u003e : permet les interactions avec le client web.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eallow-popups\u003c/code\u003e : autorise l\u0026rsquo;ouverture de popups\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eallow-same-origin\u003c/code\u003e : permet à une page d\u0026rsquo;accéder à du contenu depuis le même site\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eallow-scripts\u003c/code\u003e : permet à une page d\u0026rsquo;exécuter ses scripts\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eallow-top-navigation\u003c/code\u003e : permet à une page de ???\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eIl existe deux mots-clés très spécifiques :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ehash\u003c/code\u003e : il permet d\u0026rsquo;autoriser un script, ou un style en particulier selon le hash définit… le hachage est calculé selon un des trois algorithmes SHA-2 \u003cem\u003e(sha256, sha384 - politique minimale recommandée, sha512)\u003c/em\u003e, encodé en base64. \u003cbr\u003e\ne.g. : \u003ccode\u003estyle-src 'sha256-HashDigestHere='\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enonce\u003c/code\u003e : acronyme de \u003cstrong\u003eNumber used Once\u003c/strong\u003e - \u003cem\u003eNuméro utilisé une seule fois\u003c/em\u003e - ; il permet d\u0026rsquo;autoriser un script inline selon la valeur dynamique aléatoire autorisé.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl est très possible, du fait de l\u0026rsquo;évolution de la norme de cette entête que j\u0026rsquo;ai oublié la présentation de certains mots-clés… \u003cbr\u003e\nveuillez vérifier auprès du W3C.\u003c/p\u003e\n\u003ch3 id=\"recommandations-1\"\u003eRecommandations\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eIl est \u003cspan class=\"IMP\"\u003erecommandé d\u0026rsquo;appliquer le mot-clé \u003ccode\u003ehttps:\u003c/code\u003e sur la directive par défaut\u003c/span\u003e, tel que : \u003ccode\u003edefault-src: https:\u003c/code\u003e. Cela désactive le code inline et oblige toute connexion en mode HTTPS seulement.\u003c/li\u003e\n\u003cli\u003eIl est clairement \u003cspan class=\"IMP\"\u003erecommandé d\u0026rsquo;éviter l\u0026rsquo;usage\u003c/span\u003e du mot-clé \u003ccode\u003eunsafe-inline\u003c/code\u003e ! \u003cbr\u003e\nMalheureusement, parfois certains scripts \u0026ldquo;embarqués\u0026rdquo; ou styles extérieurs nécessitent des données et autres codes qu\u0026rsquo;il est difficile de gérer finement ; c\u0026rsquo;est la solution du \u0026ldquo;moins pire\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eIl est assurément \u003cspan class=\"IMP\"\u003erecommandé de ne pas utiliser\u003c/span\u003e le mot-clé \u003ccode\u003eunsafe-eval\u003c/code\u003e !\u003c/li\u003e\n\u003cli\u003eAttention à l\u0026rsquo;usage du mot-clé \u003ccode\u003edata:\u003c/code\u003e : par ce biais, il peut remonter des contenus \u0026ldquo;dérivés\u0026rdquo; inhérents aux directives \u003ccode\u003eobject-src\u003c/code\u003e, \u003ccode\u003escript-src\u003c/code\u003e,…\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;attribut \u003ccode\u003enonce\u003c/code\u003e doit \u003cspan class=\"IMP\"\u003eêtre unique, re-généré à chaque fois, et bien entendu doit être non trivial et non devinable\u003c/span\u003e !`\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"risques\"\u003eRisques\u003c/h3\u003e\n\u003cp\u003eLes risques possibles sont liés à :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDes erreurs de configuration, dues à des incompréhensions - d\u0026rsquo;où l\u0026rsquo;intérêt de tester avant l\u0026rsquo;application ;)\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;application de politique trop permissive, tel que l\u0026rsquo;usage des mots-clés \u003ccode\u003eunsafe-*\u003c/code\u003e…\u003c/li\u003e\n\u003cli\u003eUtiliser le mot-clé \u003ccode\u003eunsafe-inline\u003c/code\u003e est l\u0026rsquo;équivalent de ne pas avoir de politique de sécurité ; quant à utiliser le mot-clé \u003ccode\u003eunsafe-eval\u003c/code\u003e est assurément l\u0026rsquo;équivalent d\u0026rsquo;un trou béant dans votre site web où vous permettez à tout le monde de faire n\u0026rsquo;importe quoi… \u0026lt;= vous, voilà, prévenus !!! \u003cbr\u003e\noui, j\u0026rsquo;exagère peut-être un peu… mais le risque est réel, et sérieux.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"examples\"\u003eExamples\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eContent-Security-Policy: default-src https:\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl est possible de la définir par le biais de l\u0026rsquo;élément HTML meta, 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\"\u003emeta\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehttp-equiv\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Content-Security-Policy\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003econtent\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;script-src \u0026#39;self\u0026#39;\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"nginx\"\u003enginx\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-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-Security-Policy\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;default-src\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;self\u0026#39;\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ealways\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"relayd\"\u003erelayd\u003c/h3\u003e\n\u003cp\u003eEt, oui, malheureusement, \u003ca class=\"tag\" href=\"/fr/tags/httpd\"\u003ehttpd\u003c/a\u003e\n ne peut pas gérer les entêtes, ce sera son binôme \n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.8\" title=\"Page du Manuel OpenBSD pour : relayd\"\u003erelayd(8)\u003c/a\u003e\n que l\u0026rsquo;on utilisera !\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ematch response header set \u0026#34;Content-Security-Policy\u0026#34; value \u0026#34;default-src \u0026#39;self\u0026#39; data: \u0026#39;unsafe-inline\u0026#39;; base-uri \\*://domain.tld ; form-action \u0026#39;self\u0026#39;; frame-ancestors \u0026#39;none\u0026#39;; referrer no-referrer; reflected-xss block; sandbox allow-same-origin ; script-src \u0026#39;self\u0026#39; cdnjs.cloudflare.com netdna.bootstrapcdn.com ;\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://scotthelme.co.uk/csp-cheat-sheet/\" rel=\"external\"\u003ehttps://scotthelme.co.uk/csp-cheat-sheet/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://content-security-policy.com/\" rel=\"external\"\u003ehttps://content-security-policy.com/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP\" rel=\"external\"\u003ehttps://developer.mozilla.org/en-US/docs/Web/HTTP/CSP\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.owasp.org/index.php/Content_Security_Policy\" rel=\"external\"\u003ehttps://www.owasp.org/index.php/Content_Security_Policy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://openweb.eu.org/articles/content-security-policy\" rel=\"external\"\u003ehttps://openweb.eu.org/articles/content-security-policy\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"autres-sites-intéressants\"\u003eAutres sites intéressants\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://report-uri.io\" rel=\"external\"\u003ehttps://report-uri.io\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport actuel : \u003ca href=\"http://caniuse.com/#search=csp\" rel=\"external\"\u003ehttp://caniuse.com/#search=csp\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Explications sur l'entête HTTP  nommée CSP : Content Security Policy","tags":["HTTP","Header","CSP"],"date_published":"2017-08-16T13:32:25+01:00","date_modified":"2018-10-24T11:43:25+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-16:/fr/web/http/cors#e47a3af0ccab5d84250d770da3f10f89f48ee0c29c36f58c6f0e49060b9743c4","url":"https://it-log.fr.eu.org/fr/web/http/cors/","title":"CORS : Cross-origin Resource Sharing (header)","author":{"name":"Stéphane HUC"},"content_text":"Définition CORS est une entête HTTP qui contrôle quels sites, externes ou non, peuvent accéder au contenu de votre site web, par le biais de scripts, tel que le propose XMLHttpRequest.\nC\u0026rsquo;est une technique très facile à mettre en place et dont le bénéfice est vraiment important !\nL\u0026rsquo;usage du symbole * accepte que n\u0026rsquo;importe quel site puisse se connecter ; sinon, remplissez une URL !\nElle fait partie des entêtes de base à générer pour protéger son site web, au même titre que l\u0026rsquo;usage de HSTS, et des autres entêtes, telles que X-Content-Type-Options, X-Frame-Options, ou X-XSS-Protections,…\nExemples Access-Control-Allow-Origin: *\nnginx add_header Access-Control-Allow-Origin \u0026#34;huc.fr.eu.org\u0026#34; always; relayd Et, oui, malheureusement, httpd ne peut pas gérer les entêtes, ce sera son binôme relayd(8) que l\u0026rsquo;on utilisera !\nmatch response header set \u0026#34;Access-Control-Allow-Origin\u0026#34; value \u0026#34;huc.fr.eu.org\u0026#34; Documentations https://developer.mozilla.org/fr/docs/Web/HTTP/CORS Access-Control-Allow-Credentials Access-Control-Allow-Headers Access-Control-Allow-Methods Access-Control-Allow-Origin Access-Control-Expose-Headers Access-Control-Max-Age Support actuel de l\u0026rsquo;entête : http://caniuse.com/#search=cors ","content_html":"\u003ch2 id=\"définition\"\u003eDéfinition\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eCORS\u003c/strong\u003e est une entête HTTP qui contrôle quels sites, externes ou non, peuvent accéder au contenu de votre site web, par le biais de scripts, tel que le propose XMLHttpRequest.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est une technique très facile à mettre en place et dont le bénéfice est vraiment important !\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;usage du symbole \u003ccode\u003e*\u003c/code\u003e accepte que n\u0026rsquo;importe quel site puisse se connecter ; sinon, remplissez une URL !\u003c/p\u003e\n\u003cp\u003eElle fait partie des entêtes de base à générer pour protéger son site web, au même titre que l\u0026rsquo;usage de \u003ca href=\"/fr/web/ssl/hsts/\"\u003eHSTS\u003c/a\u003e, et des autres entêtes, telles que \u003ca href=\"/fr/web/http/x-content-type-options/\"\u003eX-Content-Type-Options\u003c/a\u003e, \u003ca href=\"/fr/web/http/x-frame-options\"\u003eX-Frame-Options\u003c/a\u003e, ou \u003ca href=\"/fr/web/http/x-xss-protections/\"\u003eX-XSS-Protections\u003c/a\u003e,…\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eAccess-Control-Allow-Origin: *\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"nginx\"\u003enginx\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-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\"\u003eAccess-Control-Allow-Origin\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;huc.fr.eu.org\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ealways\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"relayd\"\u003erelayd\u003c/h3\u003e\n\u003cp\u003eEt, oui, malheureusement, \u003ca class=\"tag\" href=\"/fr/tags/httpd\"\u003ehttpd\u003c/a\u003e\n ne peut pas gérer les entêtes, ce sera son binôme \n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.8\" title=\"Page du Manuel OpenBSD pour : relayd\"\u003erelayd(8)\u003c/a\u003e\n que l\u0026rsquo;on utilisera !\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003ematch response header set \u0026#34;Access-Control-Allow-Origin\u0026#34; value \u0026#34;huc.fr.eu.org\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/fr/docs/Web/HTTP/CORS\" rel=\"external\"\u003ehttps://developer.mozilla.org/fr/docs/Web/HTTP/CORS\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials\" rel=\"external\"\u003eAccess-Control-Allow-Credentials\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Access-Control-Allow-Headers\" rel=\"external\"\u003eAccess-Control-Allow-Headers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Access-Control-Allow-Methods\" rel=\"external\"\u003eAccess-Control-Allow-Methods\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Access-Control-Allow-Origin\" rel=\"external\"\u003eAccess-Control-Allow-Origin\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Access-Control-Expose-Headers\" rel=\"external\"\u003eAccess-Control-Expose-Headers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Access-Control-Max-Age\" rel=\"external\"\u003eAccess-Control-Max-Age\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eSupport actuel de l\u0026rsquo;entête : \u003ca href=\"http://caniuse.com/#search=cors\" rel=\"external\"\u003ehttp://caniuse.com/#search=cors\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Explication sur l'entête HTTP nommée CORS : Cross-Origin Resource Sharing","tags":["HTTP","Header","CORS"],"date_published":"2017-08-16T13:31:25+01:00","date_modified":"2020-05-17T04:44:25+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-15:/fr/sys/openbsd/unbound#3c8a583714dbef28ecbbefdc1cee7dc67da862e9d7abd0a9273eb10133ee0083","url":"https://it-log.fr.eu.org/fr/sys/openbsd/unbound/","title":"OpenBSD : utiliser Unbound","author":{"name":"Stéphane HUC"},"content_text":"Description Le but d\u0026rsquo;utiliser Unbound est d\u0026rsquo;avoir localement sur sa station son propre serveur DNS Cache - selon la RFC 8499 , un Résolveur complet avec mémoire (en anglais, full-service resolver), c\u0026rsquo;est à dire un client DNS qui fournit un service de résolution complet, avec mémorisation des enregistrements DNS récoltés.\nUtiliser Unbound avec la gestion sécurisée des informations DNS, par le biais de la technologie DNSSEC, est un plus indéniable. (cela évite d\u0026rsquo;avoir à obtenir des informations DNS faussées, par une action pirate, par une action \u0026ldquo;étatique\u0026rdquo;…).\nSous OpenBSD, unbound est intégré nativement !\nPour activer unbound, tapez : # rcctl enable unbound Pour le démarrer : # rcctl start unbound Pour l\u0026rsquo;utiliser avec une connexion obtenue via, dhcp, ajoutez dans le fichier /etc/dhclient.conf : prepend domain-name-servers 127.0.0.1; Versions logicielles OS : OpenBSD 6.0 \u0026amp; supérieure Unbound : natif, intégré Configuration La configuration d\u0026rsquo;unbound ne pose pas de gros problème, en soit, il faut veiller à l\u0026rsquo;écriture correcte des informations !\nToutes les variables et leur impact sont expliquées dans la documentation officielle anglaise : https://unbound.net/documentation/unbound.conf.html\nVoyons quelques détails dits de sécurité à paramétrer absolument dans votre propre fichier de configuration : /var/unbound/etc/unbound.conf\nPour tester la configuration de vos fichiers, utilisez la commande unbound-checkconf !\nQuand vous avez terminé votre configuration, pensez à redémarrer le service lié à unbound.\nFichier root.hints Le fichier root.hints est une liste des serveurs de noms faisant autorité, les premiers serveurs DNS, dits roots.\nBien qu\u0026rsquo;OpenBSD semble avoir une liste intégrée, il est intéressant de récupérer ladite liste tous les 6 mois environ.\nPour le récupèrer : # ftp -o /var/unbound/db/root.hints http://www.internic.net/domain/named.cache\nPuis, modifiez le fichier de configuration, pour ajouter : root-hints: \u0026quot;/var/unbound/db/root.hints\nAstucePensez à créer un fichier cron pour mettre-à-jour régulièrement ce fichier… Gestion des réseaux autorisés access-control: 127.0.0.0/8 allow # autorise l\u0026rsquo;interface de bouclage local sur la couche IPv4 access-control: :1 allow # autorise l\u0026rsquo;interface de bouclage local sur la couche IPv6 access-control: 192.168.1.0/24 allow # autorise le réseau local access-control: 0.0.0.0/0 refuse # interdit tout le reste de l\u0026rsquo;Internet ! access-control: ::0/0 refuse # interdit tout Internet sur IPv6 À moins de savoir quoi modifier, laissez tel quel !\nLe segment réseau peut-être de type IPv4 ou IPv6. L\u0026rsquo;action à allouer peut-être :\nallow permet l\u0026rsquo;accès allow_snoop permet l\u0026rsquo;accès, en utilisant une technique de \u0026ldquo;cache snopping\u0026rdquo;, qui donne le droit d\u0026rsquo;examiner le contenu en cache. deny refuse l\u0026rsquo;accès - option par défaut, si non spécifiée deny_non_local, refuse refuse l\u0026rsquo;accès, tout en envoyant un message d\u0026rsquo;erreur adéquat. ou refuse_non_local Pour les autres options, ou afin de mieux saisir les subtilités, merci de lire la page officielle anglaise !\nDurcir et cacher certaines informations harden-algo-downgrade: no harden-glue: yes hide-identity: yes hide-version: yes private-address: 192.168.0.0/16 private-address: 172.16.0.0/12 private-address: 10.0.0.0/8 use-caps-for-id: no val-clean-additional: yes Explications\nharden-algo-downgrade empêche ou non de choisir l’algorithme le plus faible .\nSi no est choisi, ce sera l\u0026rsquo;algorithme le plus faible qui sera élu… Si les zones DNS ne sont pas configurées pour fonctionner correctement avec cette option, cela peut entraîner des échecs de validation ; dans ce cas, il faut la mettre sur no. Cette option n\u0026rsquo;est pas reconnue avec la version Jessie, utilisez la version backports ! Les variables private-address renforcent l\u0026rsquo;aspect privé de ces réseaux. Cela empêche l\u0026rsquo;inclusion de ces segments réseaux dans les réponses DNS, et protège de la technique des \u0026ldquo;Relais DNS\u0026rdquo; (qui utilise, par exemple, un navigateur internet comme relais ou proxy réseau).\nLa variable use-caps-for-id est expérimentale et peut créer des bogues, ou résultats incorrects - ne pas l\u0026rsquo;utiliser à moins d\u0026rsquo;être sûr de ce que vous faites…\nLa variable val-clean-additional assure de nettoyer toutes les données DNS non sécurisées\nOptimisation num-threads: 4 key-cache-slabs: 8 infra-cache-slabs: 8 msg-cache-slabs: 8 rrset-cache-slabs: 8 key-cache-size: 16m msg-cache-size: 4m rrset-cache-size: 8m outgoing-range: 206 qname-minimisation: yes so-rcvbuf: 1m so-sndbuf: 1m so-reuseport: yes Explications\nLa variable num-thread correspond au nombre de cœurs CPU dont dispose votre station, soit pour 4 CPU ayant chacun deux cœurs, on lui attribuera le chiffre 8. Une manière d\u0026rsquo;être sûr du nombre de cœurs utilisés dans votre machine est d\u0026rsquo;utiliser la commande suivante : :$ sysctl hw.ncpu hw.ncpu=4 :$ sysctl hw.ncpufound hw.ncpufound=4 Les variables terminant par le mot slabs doivent être paramétrées au double de la variable num-thread. Ces variables gèrent les conflits de verrouillage en les diminuant.\nLa gestion des variables *-cache-size est sensible et doit être ainsi paramétrée : la variable rrset-cache-size doit être le double de la variable msg-cache-size ; quant à la variable key-cache-size, elle doit être elle-même le double de la variable rrset.\nLa variable outgoing-range qui gère le nombre de connexions par cœurs CPU doit être ainsi calculée : 1024 / nb_coeurs_CPU - 50\nLa variable so-reuseport permet d\u0026rsquo;améliorer significativement les performances de l\u0026rsquo;usage du protocole UDP. n'est fonctionnelle que sous Linux ! La variable qname-minimisation a pour propos d\u0026rsquo;améliorer les informations privées liées à l\u0026rsquo;usage de DNS.\nLisez la documentation officielle anglaise pour les options so-rcvbuf, et so-sndbuf qui doivent être augmentées dans le cas de serveur surchargé. Autrement, laissez la valeur 0 par défaut - cela utilise les valeurs systèmes !\nGestion des caches # garde en cache les bons résultats prefetch: yes cache-min-ttl: 3600 cache-max-ttl: 86400 Gestion des journaux # gestion logs logfile: /var/log/unbound/unbound.log use-syslog: yes unwanted-reply-threshold: 10000000 val-log-level: 2 verbosity: 1 Explications\nSi l\u0026rsquo;option unwanted-reply-threshold est définie, le nombre paramétré total de réponses indésirables est gardé dans chacun des processus. Ce nombre paramétré atteint déclenche une action défensive de nettoyage des caches rrset et autres messages, un avertissement est affiché dans les journaux. Il est recommandé de positionner ce nombre à une valeur de 10 Millions ! Pour info, l\u0026rsquo;excellente documentation de Calomel recommande 10000.\nL\u0026rsquo;option verbosity est le degré de verbosité des journaux :\n0 signifie que seules les erreurs seront affichées ; 1 que ce sont des informations opérationnelles - valeur par défaut - ; 2 que celles-ci seront plus détaillées ; 3 définit les informations par niveau de requêtes et leurs sorties ; 4 restitue l\u0026rsquo;information du niveau d\u0026rsquo;algorithme utilisé ; 5, quant à lui, enregistre l\u0026rsquo;identification des clients en cas d\u0026rsquo;erreurs de cache. Mettre l\u0026rsquo;option val-log-level à 2 permet d\u0026rsquo;atteindre un niveau d\u0026rsquo;explications suffisant pour obtenir les raisons des échecs. très utile à utiliser pour unbound en mode DNSSEC ! ;)\nGérer des statistiques statistics-interval: 0 extended-statistics: yes statistics-cumulative: no Explications\nL\u0026rsquo;option statistics-cumulative est à paramétrer sur yes - si vous utilisez un outil d\u0026rsquo;affichage graphique des rapports, tel que Munin… Bloquer certains sites # bloque certaines pubs local-zone: \u0026#34;doubleclick.net\u0026#34; redirect local-data: \u0026#34;doubleclick.net A 127.0.0.1\u0026#34; local-zone: \u0026#34;googlesyndication.com\u0026#34; redirect local-data: \u0026#34;googlesyndication.com A 127.0.0.1\u0026#34; local-zone: \u0026#34;googleadservices.com\u0026#34; redirect local-data: \u0026#34;googleadservices.com A 127.0.0.1\u0026#34; local-zone: \u0026#34;google-analytics.com\u0026#34; redirect local-data: \u0026#34;google-analytics.com A 127.0.0.1\u0026#34; local-zone: \u0026#34;ads.youtube.com\u0026#34; redirect local-data: \u0026#34;ads.youtube.com A 127.0.0.1\u0026#34; local-zone: \u0026#34;adserver.yahoo.com\u0026#34; redirect local-data: \u0026#34;adserver.yahoo.com A 127.0.0.1\u0026#34; local-zone: \u0026#34;ask.com\u0026#34; redirect local-data: \u0026#34;ask.com A 127.0.0.1\u0026#34; InfoPour info, il existe des projets de listes, tels que :\nPGL-Yoyo l\u0026rsquo;excellent unbound-badhosts Dans le cas d\u0026rsquo;usage de listes, il faut les inclure en utilisant la déclaration : include: /var/unbound/etc/nom-fichier-liste\nDocumentation Pour savoir comment :\nconfigurer Unbound pour utiliser les protocoles DNSSEC, et DNS/TLS ! contrôler le service unbound autres documentations l\u0026rsquo;excellente documentation de Calomel.org, en anglais celles de Stéphane Bortzmeyer, en français Manpages cron(8) unbound(8) , unbound.conf(5) , unbound-checkconf(8) RFC 8499 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe but d\u0026rsquo;utiliser Unbound est d\u0026rsquo;avoir localement sur sa station son propre\nserveur DNS Cache - selon la \u003ca href=\"https://www.rfc-editor.org/info/rfc8499\" title=\"RFC Editor : Information à-propos de la RFC 8499\"\u003eRFC 8499\u003c/a\u003e\n, un \u003cstrong\u003eRésolveur complet avec mémoire\u003c/strong\u003e\n(en anglais, \u003cem\u003efull-service resolver\u003c/em\u003e), c\u0026rsquo;est à dire un client DNS qui\nfournit un service de résolution complet, avec mémorisation des enregistrements\nDNS récoltés.\u003c/p\u003e\n\u003cp\u003eUtiliser Unbound avec la gestion sécurisée des informations DNS, par le\nbiais de la technologie DNSSEC, est un plus indéniable. \u003cbr\u003e\n\u003cem\u003e(cela évite d\u0026rsquo;avoir à obtenir des informations DNS faussées, par une action\npirate, par une action \u0026ldquo;étatique\u0026rdquo;…)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eSous OpenBSD, \u003ccode\u003eunbound\u003c/code\u003e est intégré nativement !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour activer unbound, tapez : \u003ccode\u003e# rcctl enable unbound\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour le démarrer : \u003ccode\u003e# rcctl start unbound\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour l\u0026rsquo;utiliser avec une connexion obtenue via, dhcp, ajoutez dans le\nfichier \u003ccode\u003e/etc/dhclient.conf\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003eprepend domain-name-servers 127.0.0.1;\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"versions-logicielles\"\u003eVersions logicielles\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eOS : OpenBSD 6.0 \u0026amp; supérieure\u003c/li\u003e\n\u003cli\u003eUnbound : natif, intégré\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLa configuration d\u0026rsquo;unbound ne pose pas de gros problème, en soit, il faut\nveiller à l\u0026rsquo;écriture correcte des informations !\u003c/p\u003e\n\u003cp\u003eToutes les variables et leur impact sont expliquées dans la documentation\nofficielle anglaise : \u003ca href=\"https://unbound.net/documentation/unbound.conf.html\" rel=\"external\"\u003ehttps://unbound.net/documentation/unbound.conf.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVoyons quelques détails dits de sécurité à paramétrer absolument dans\nvotre propre fichier de configuration\u003c/strong\u003e : \u003cbr\u003e\n\u003ccode\u003e/var/unbound/etc/unbound.conf\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour tester la configuration de vos fichiers, utilisez la commande\n\u003ccode\u003eunbound-checkconf\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003eQuand vous avez terminé votre configuration, pensez à redémarrer le service lié\nà unbound.\u003c/p\u003e\n\u003ch3 id=\"fichier-roothints\"\u003eFichier root.hints\u003c/h3\u003e\n\u003cp\u003eLe fichier \u003ccode\u003eroot.hints\u003c/code\u003e est une liste des serveurs de noms faisant autorité,\nles premiers serveurs DNS, dits \u003ccode\u003eroots\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eBien qu\u0026rsquo;OpenBSD semble avoir une liste intégrée, il est intéressant de\nrécupérer ladite liste tous les 6 mois environ.\u003c/p\u003e\n\u003cp\u003ePour le récupèrer : \u003cbr\u003e\n\u003ccode\u003e# ftp -o /var/unbound/db/root.hints http://www.internic.net/domain/named.cache\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis, modifiez le fichier de configuration, pour ajouter : \u003cbr\u003e\n\u003ccode\u003eroot-hints: \u0026quot;/var/unbound/db/root.hints\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\"\u003ePensez à créer un fichier cron pour mettre-à-jour régulièrement ce fichier…\u003c/div\u003e\n\n\u003ch3 id=\"gestion-des-réseaux-autorisés\"\u003eGestion des réseaux autorisés\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eaccess-control: 127.0.0.0/8 allow\u003c/code\u003e # autorise l\u0026rsquo;interface de bouclage local\nsur la couche IPv4\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eaccess-control: :1 allow\u003c/code\u003e # autorise l\u0026rsquo;interface de bouclage local sur la\ncouche IPv6\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eaccess-control: 192.168.1.0/24 allow\u003c/code\u003e # autorise le réseau local\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eaccess-control: 0.0.0.0/0 refuse\u003c/code\u003e # interdit tout le reste de l\u0026rsquo;Internet !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eaccess-control: ::0/0 refuse\u003c/code\u003e # interdit tout Internet sur IPv6\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eÀ moins de savoir quoi modifier, laissez tel quel !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLe segment réseau peut-être de type IPv4 ou IPv6. L\u0026rsquo;action à allouer peut-être :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eallow\u003c/code\u003e permet l\u0026rsquo;accès\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eallow_snoop\u003c/code\u003e permet l\u0026rsquo;accès, en utilisant une technique de \u0026ldquo;cache snopping\u0026rdquo;,\nqui donne le droit d\u0026rsquo;examiner le contenu en cache.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edeny\u003c/code\u003e refuse l\u0026rsquo;accès - \u003ccode\u003eoption par défaut, si non spécifiée\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edeny_non_local\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erefuse\u003c/code\u003e refuse l\u0026rsquo;accès, tout en envoyant un message d\u0026rsquo;erreur adéquat.\u003c/li\u003e\n\u003cli\u003eou \u003ccode\u003erefuse_non_local\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003ePour les autres options, ou afin de mieux saisir les subtilités, merci de lire\nla \u003ca href=\"https://calomel.org/unbound_dns.html\" rel=\"external\"\u003epage officielle anglaise\u003c/a\u003e !\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"durcir-et-cacher-certaines-informations\"\u003eDurcir et cacher certaines informations\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-unbound\" data-lang=\"unbound\"\u003eharden-algo-downgrade: no\nharden-glue: yes\n\nhide-identity: yes\nhide-version: yes\n\nprivate-address: 192.168.0.0/16\nprivate-address: 172.16.0.0/12\nprivate-address: 10.0.0.0/8\n\nuse-caps-for-id: no\n\nval-clean-additional: yes\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eharden-algo-downgrade\u003c/code\u003e empêche ou non de choisir l’algorithme le plus faible .\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi \u003ccode\u003eno\u003c/code\u003e est choisi, ce sera l\u0026rsquo;algorithme le plus faible qui sera élu…\u003c/li\u003e\n\u003cli\u003eSi les zones DNS ne sont pas configurées pour fonctionner correctement\navec cette option, cela peut entraîner des échecs de validation ;\ndans ce cas, il faut la mettre sur \u003ccode\u003eno\u003c/code\u003e. \u003cbr\u003e\n\u003cem\u003eCette option n\u0026rsquo;est pas reconnue avec la version Jessie, utilisez la version\nbackports !\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLes variables \u003ccode\u003eprivate-address\u003c/code\u003e renforcent l\u0026rsquo;aspect privé de ces réseaux.\nCela empêche l\u0026rsquo;inclusion de ces segments réseaux dans les réponses DNS,\net protège de la technique des \u0026ldquo;Relais DNS\u0026rdquo;\n\u003cem\u003e(qui utilise, par exemple, un navigateur internet comme relais ou proxy\nréseau)\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa variable \u003ccode\u003euse-caps-for-id\u003c/code\u003e est expérimentale et peut créer des bogues,\nou résultats incorrects - \u003cem\u003ene pas l\u0026rsquo;utiliser à moins d\u0026rsquo;être sûr de ce que\nvous faites…\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa variable \u003ccode\u003eval-clean-additional\u003c/code\u003e assure de nettoyer toutes les données DNS\nnon sécurisées\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"optimisation\"\u003eOptimisation\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-unbound\" data-lang=\"unbound\"\u003enum-threads: 4\n\nkey-cache-slabs: 8\ninfra-cache-slabs: 8\nmsg-cache-slabs: 8\nrrset-cache-slabs: 8\n\nkey-cache-size: 16m\nmsg-cache-size: 4m\nrrset-cache-size: 8m\n\noutgoing-range: 206\n\nqname-minimisation: yes\n\nso-rcvbuf: 1m\nso-sndbuf: 1m\n\nso-reuseport: yes\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLa variable \u003ccode\u003enum-thread\u003c/code\u003e correspond au nombre de cœurs CPU dont dispose\nvotre station, soit pour 4 CPU ayant chacun deux cœurs, on lui attribuera\nle chiffre \u003ccode\u003e8\u003c/code\u003e. \u003cbr\u003e\nUne manière d\u0026rsquo;être sûr du nombre de cœurs utilisés dans votre machine\nest d\u0026rsquo;utiliser la commande suivante :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ sysctl hw.ncpu\nhw.ncpu=4\n:$ sysctl hw.ncpufound\nhw.ncpufound=4\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLes variables terminant par le mot \u003ccode\u003eslabs\u003c/code\u003e doivent être paramétrées\nau double de la variable \u003ccode\u003enum-thread\u003c/code\u003e. Ces variables gèrent les conflits\nde verrouillage en les diminuant.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa gestion des variables \u003ccode\u003e*-cache-size\u003c/code\u003e est sensible et doit être ainsi\nparamétrée : la variable \u003ccode\u003errset-cache-size\u003c/code\u003e doit être le double de la\nvariable \u003ccode\u003emsg-cache-size\u003c/code\u003e ; quant à la variable \u003ccode\u003ekey-cache-size\u003c/code\u003e, elle\ndoit être elle-même le double de la variable \u003ccode\u003errset\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa variable \u003ccode\u003eoutgoing-range\u003c/code\u003e qui gère le nombre de connexions par cœurs\nCPU doit être ainsi calculée : \u003cbr\u003e\n\u003cstrong\u003e1024 / nb_coeurs_CPU - 50\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa variable \u003ccode\u003eso-reuseport\u003c/code\u003e permet d\u0026rsquo;améliorer significativement les performances\nde l\u0026rsquo;usage du protocole UDP. \u003cbr\u003e\n\u003cspan class=\"red\"\u003en'est fonctionnelle que sous Linux !\u003c/span\u003e\n\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa variable \u003ccode\u003eqname-minimisation\u003c/code\u003e a pour propos d\u0026rsquo;améliorer les informations\nprivées liées à l\u0026rsquo;usage de DNS.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLisez la documentation officielle anglaise pour les options \u003ccode\u003eso-rcvbuf\u003c/code\u003e,\net \u003ccode\u003eso-sndbuf\u003c/code\u003e qui doivent être augmentées dans le cas de serveur surchargé.\nAutrement, laissez la valeur \u003ccode\u003e0\u003c/code\u003e par défaut - cela utilise les valeurs\nsystèmes !\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"gestion-des-caches\"\u003eGestion des caches\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-unbound\" data-lang=\"unbound\"\u003e# garde en cache les bons résultats\nprefetch: yes\n\ncache-min-ttl: 3600\ncache-max-ttl: 86400\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"gestion-des-journaux\"\u003eGestion des journaux\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-unbound\" data-lang=\"unbound\"\u003e# gestion logs\nlogfile: /var/log/unbound/unbound.log\nuse-syslog: yes\nunwanted-reply-threshold: 10000000\nval-log-level: 2\nverbosity: 1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSi l\u0026rsquo;option \u003ccode\u003eunwanted-reply-threshold\u003c/code\u003e est définie, le nombre paramétré\ntotal de réponses indésirables est gardé dans chacun des processus.\nCe nombre paramétré atteint déclenche une action défensive de nettoyage\ndes caches \u003ccode\u003errset\u003c/code\u003e et autres messages, un avertissement est affiché\ndans les journaux.\n\u003cstrong\u003eIl est recommandé de positionner ce nombre à une valeur de 10 Millions\u003c/strong\u003e ! \u003cbr\u003e\n\u003cem\u003ePour info, l\u0026rsquo;excellente \u003ca href=\"https://calomel.org/unbound_dns.html\" rel=\"external\"\u003edocumentation de Calomel\u003c/a\u003e recommande \u003cstrong\u003e10000\u003c/strong\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;option \u003ccode\u003everbosity\u003c/code\u003e est le degré de verbosité des journaux :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e0\u003c/code\u003e signifie que seules les erreurs seront affichées ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e1\u003c/code\u003e que ce sont des informations opérationnelles - \u003cem\u003evaleur par défaut\u003c/em\u003e - ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e2\u003c/code\u003e que celles-ci seront plus détaillées ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e3\u003c/code\u003e définit les informations par niveau de requêtes et leurs sorties ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e4\u003c/code\u003e restitue l\u0026rsquo;information du niveau d\u0026rsquo;algorithme utilisé ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e5\u003c/code\u003e, quant à lui, enregistre l\u0026rsquo;identification des clients en cas d\u0026rsquo;erreurs\nde cache.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMettre l\u0026rsquo;option \u003ccode\u003eval-log-level\u003c/code\u003e à \u003ccode\u003e2\u003c/code\u003e permet d\u0026rsquo;atteindre un niveau d\u0026rsquo;explications\nsuffisant pour obtenir les raisons des échecs. \u003cbr\u003e\n\u003cem\u003etrès utile à utiliser pour\n\n    \u003ca class=\"inside\" href=\"/fr/sys/openbsd/unbound-dnssec-dns-over-tls/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Unbound en mode DNSSEC \u0026#43; DNS/TLS'\"\u003eunbound en mode DNSSEC\u003c/a\u003e\n\n!\u003c/em\u003e ;)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"gérer-des-statistiques\"\u003eGérer des statistiques\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-unbound\" data-lang=\"unbound\"\u003estatistics-interval: 0\nextended-statistics: yes\nstatistics-cumulative: no\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eL\u0026rsquo;option \u003ccode\u003estatistics-cumulative\u003c/code\u003e est à paramétrer sur \u003ccode\u003eyes\u003c/code\u003e -\n\u003cem\u003esi vous utilisez un outil d\u0026rsquo;affichage graphique des rapports, tel que Munin…\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"bloquer-certains-sites\"\u003eBloquer certains sites\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-unbound\" data-lang=\"unbound\"\u003e# bloque certaines pubs\nlocal-zone: \u0026#34;doubleclick.net\u0026#34; redirect\nlocal-data: \u0026#34;doubleclick.net A 127.0.0.1\u0026#34;\nlocal-zone: \u0026#34;googlesyndication.com\u0026#34; redirect\nlocal-data: \u0026#34;googlesyndication.com A 127.0.0.1\u0026#34;\nlocal-zone: \u0026#34;googleadservices.com\u0026#34; redirect\nlocal-data: \u0026#34;googleadservices.com A 127.0.0.1\u0026#34;\nlocal-zone: \u0026#34;google-analytics.com\u0026#34; redirect\nlocal-data: \u0026#34;google-analytics.com A 127.0.0.1\u0026#34;\nlocal-zone: \u0026#34;ads.youtube.com\u0026#34; redirect\nlocal-data: \u0026#34;ads.youtube.com A 127.0.0.1\u0026#34;\nlocal-zone: \u0026#34;adserver.yahoo.com\u0026#34; redirect\nlocal-data: \u0026#34;adserver.yahoo.com A 127.0.0.1\u0026#34;\nlocal-zone: \u0026#34;ask.com\u0026#34; redirect\nlocal-data: \u0026#34;ask.com A 127.0.0.1\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\"\u003e\u003cp\u003ePour info, il existe des projets de listes, tels que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://pgl.yoyo.org/adservers/\" rel=\"external\"\u003ePGL-Yoyo\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;excellent \u003cstrong\u003e\u003ca href=\"https://www.geoghegan.ca/unbound-adblock.html\" rel=\"external\"\u003eunbound-badhosts\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans le cas d\u0026rsquo;usage de listes, il faut les inclure en utilisant la déclaration : \u003cbr\u003e\n\u003ccode\u003einclude: /var/unbound/etc/nom-fichier-liste\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003ePour savoir comment :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/unbound-dnssec-dns-over-tls/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Unbound en mode DNSSEC \u0026#43; DNS/TLS'\"\u003econfigurer Unbound pour utiliser les protocoles DNSSEC, et DNS/TLS\u003c/a\u003e\n !\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/unbound-control/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Unbound control'\"\u003econtrôler le service unbound\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\u003el\u0026rsquo;excellente \u003ca href=\"https://framagit.org/BlackLists/BlockZones/raw/master/cron/monthly.local\" rel=\"external\"\u003edocumentation de Calomel\u003c/a\u003e.org, \u003cem\u003een anglais\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.bortzmeyer.org/search?pattern=unbound\" rel=\"external\"\u003ecelles\u003c/a\u003e de Stéphane Bortzmeyer, en français\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/cron.8\" title=\"Page du Manuel OpenBSD pour : cron\"\u003ecron(8)\u003c/a\u003e\n\u003c/li\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, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/unbound-checkconf.8\" title=\"Page du Manuel OpenBSD pour : unbound-checkconf\"\u003eunbound-checkconf(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch3 id=\"rfc-8499\"\u003eRFC 8499\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/rfc8499\" title=\"RFC 8499 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc8499\" title=\"RFC 8499 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc8499.txt\" title=\"RFC 8499 : 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/rfc8499.html\" title=\"RFC 8499 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc8499.txt.pdf\" title=\"RFC 8499 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc8499.txt\" title=\"RFC 8499 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Utiliser le serveur unbound - résolveur DNS cache + DNSSEC - sous OpenBSD","tags":["OpenBSD","unbound","DNS","RFC","RFC8499"],"date_published":"2017-08-15T18:56:30+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-14:/fr/web/ssl/hsts#2dc27cfb2a3556145bf7c24ecd225ba3973f0a8ba7e122bd42a9f7b00e4379fd","url":"https://it-log.fr.eu.org/fr/web/ssl/hsts/","title":"HSTS : HTTP Strict Transport Security (header)","author":{"name":"Stéphane HUC"},"content_text":"Description Sous ce nom barbare qu\u0026rsquo;est HSTS se cache une technique assez simple à mettre-en-œuvre et au bénéfice intéressant.\nCette technologie demande au client web de se connecter uniquement au protocole HTTPS, même si le serveur web permet la connexion sur le port associé au protocole HTTP. Cette technique transparente pour le client impose que toutes les connexions se font obligatoirement sur le port associé au protocole HTTPS, généralement le port 443.\nPar contre, cette technique est très restrictive car elle empêche que le client web puisse contourner le protocole, en gérant finement les erreurs liées ; la finalité étant d\u0026rsquo;avertir le client des dysfonctionnements possibles.\nTechniquement, c\u0026rsquo;est une entête HTTP !\nC\u0026rsquo;est la première entête HTTPS à mettre en place, facile à gérer et nativement gérée par beaucoup de serveurs web !\nOptions Il y a trois options, dont une absolument nécessaire !\nmax-age définit la durée dans le temps pendant laquelle le client web est obligé à être redirigée. Cette durée, en nombre de secondes, doit être minimale de six mois, et maximale de deux ans. C\u0026rsquo;est l\u0026rsquo;option par défaut à implémenter ! includeSubDomains : cette directive oblige le client à traiter tous les sous-domaines relatifs à un nom de domaine à être eux aussi résolu en HTTPS ! preload : cette directive permet à votre domaine d\u0026rsquo;être géré par la liste de préchargement HSTS, après soumission. Elle a pour propos d\u0026rsquo;empêcher certaines attaques mais n\u0026rsquo;est vraiment recommandé que pour les sites dits sensibles. Si vous vous êtes soumis à ladite liste, il est impératif que l\u0026rsquo;option \u0026lsquo;\u0026lsquo;includeSubDomains\u0026rsquo;\u0026rsquo; soit gérée ! AttentionL\u0026rsquo;usage de l\u0026rsquo;option includeSubDomains semble vraiment importante à paramétrer sur votre nom de domaine principal. Celle-ci empêcherait une attaque par détournement de DNS, qui consiste à faire croire en l\u0026rsquo;usage d\u0026rsquo;un sous-domaine pour capturer le trafic d\u0026rsquo;un client web et en prendre le contrôle. Du fait du rôle de cette option, tout sous-domaine \u0026ldquo;déclaré\u0026rdquo; se voit obliger de communiquer en HTTPS, en vérifiant les certificats, la relation avec le nom de domaine principal et de sous-domaines et en interrogeant l\u0026rsquo;autorité de contrôle. Exemples Strict-Transport-Security: max-age=63072000 : Ce qui correspond à une période de deux années.\nhttpd Pour le serveur web d\u0026rsquo;OpenBSD :\nserver mon.domaine.net { listen on * tls port 443 # Enable HTTP Strict Transport Security (defaults to 1 year). hsts (…) } nginx Pour le serveur nginx :\nadd_header Strict-Transport-Security \u0026quot;max-age=31536000;\u0026quot; always;\nDocumentations https://man.openbsd.org/httpd.conf#hsts Wikipédia : https://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security Support actuel : http://caniuse.com/#search=hsts RFC 6797 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eSous ce nom barbare qu\u0026rsquo;est \u003cstrong\u003eHSTS\u003c/strong\u003e se cache une technique assez simple\nà mettre-en-œuvre et au bénéfice intéressant.\u003c/p\u003e\n\u003cp\u003eCette technologie demande au client web de se connecter uniquement au\nprotocole HTTPS, même si le serveur web permet la connexion sur le port\nassocié au protocole HTTP. \u003cbr\u003e\nCette technique transparente pour le client impose que toutes les connexions\nse font obligatoirement sur le port associé au protocole HTTPS,\ngénéralement le port 443.\u003c/p\u003e\n\u003cp\u003ePar contre, cette technique est très restrictive car elle empêche que le\nclient web puisse contourner le protocole, en gérant finement les erreurs\nliées ; la finalité étant d\u0026rsquo;avertir le client des dysfonctionnements possibles.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eTechniquement, c\u0026rsquo;est une entête HTTP !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est la première entête HTTPS à mettre en place, facile à gérer et nativement\ngérée par beaucoup de serveurs web !\u003c/p\u003e\n\u003ch3 id=\"options\"\u003eOptions\u003c/h3\u003e\n\u003cp\u003eIl y a trois options, dont une absolument nécessaire !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emax-age\u003c/code\u003e définit la durée dans le temps pendant laquelle le client\nweb est obligé à être redirigée. Cette durée, en nombre de secondes,\ndoit être minimale de six mois, et maximale de deux ans. \u003cstrong\u003eC\u0026rsquo;est l\u0026rsquo;option\npar défaut à implémenter !\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eincludeSubDomains\u003c/code\u003e : cette directive oblige le client à traiter tous\nles sous-domaines relatifs à un nom de domaine à être eux aussi résolu en HTTPS !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epreload\u003c/code\u003e : cette directive permet à votre domaine d\u0026rsquo;être géré par\nla \u003ca href=\"https://hstspreload.org\" rel=\"external\"\u003eliste de préchargement HSTS\u003c/a\u003e, après soumission.\nElle a pour propos d\u0026rsquo;empêcher certaines attaques mais n\u0026rsquo;est vraiment\nrecommandé que pour les sites dits sensibles. Si vous vous êtes soumis\nà ladite liste, il est impératif que l\u0026rsquo;option \u0026lsquo;\u0026lsquo;includeSubDomains\u0026rsquo;\u0026rsquo; soit gérée !\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;usage de l\u0026rsquo;option \u003ccode\u003eincludeSubDomains\u003c/code\u003e semble vraiment importante à\nparamétrer sur votre nom de domaine principal. Celle-ci empêcherait une\n\u003ca href=\"https://scotthelme.co.uk/hsts-polish-dns-hijacking-attack/\" rel=\"external\"\u003eattaque par détournement de DNS\u003c/a\u003e,\nqui consiste à faire croire en l\u0026rsquo;usage d\u0026rsquo;un sous-domaine pour capturer\nle trafic d\u0026rsquo;un client web et en prendre le contrôle. Du fait du rôle de\ncette option, tout sous-domaine \u0026ldquo;déclaré\u0026rdquo; se voit obliger de communiquer\nen HTTPS, en vérifiant les certificats, la relation avec le nom de domaine\nprincipal et de sous-domaines et en interrogeant l\u0026rsquo;autorité de contrôle.\u003c/div\u003e\n\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eStrict-Transport-Security: max-age=63072000\u003c/code\u003e :\nCe qui correspond à une période de deux années.\u003c/p\u003e\n\u003ch3 id=\"httpd\"\u003ehttpd\u003c/h3\u003e\n\u003cp\u003ePour le serveur web d\u0026rsquo;OpenBSD :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003eserver mon.domaine.net {\n    listen on * tls port 443\n    # Enable HTTP Strict Transport Security (defaults to 1 year).\n    hsts\n    (…)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"nginx\"\u003enginx\u003c/h3\u003e\n\u003cp\u003ePour le serveur nginx :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eadd_header Strict-Transport-Security \u0026quot;max-age=31536000;\u0026quot; always;\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/httpd.conf#hsts\" rel=\"external\"\u003ehttps://man.openbsd.org/httpd.conf#hsts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eWikipédia : \u003ca href=\"https://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security\" rel=\"external\"\u003ehttps://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport actuel : \u003ca href=\"http://caniuse.com/#search=hsts\" rel=\"external\"\u003ehttp://caniuse.com/#search=hsts\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch3 id=\"rfc-6797\"\u003eRFC 6797\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/rfc6797\" title=\"RFC 6797 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc6797\" title=\"RFC 6797 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc6797.txt\" title=\"RFC 6797 : 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/rfc6797.html\" title=\"RFC 6797 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc6797.txt.pdf\" title=\"RFC 6797 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc6797.txt\" title=\"RFC 6797 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003chr\u003e\n","summary":"Comprendre l'entête de sécurité HSTS","tags":["SSL","HSTS","HTTPS","header","RFC","RFC6797"],"date_published":"2017-08-14T03:09:49+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-14:/fr/web/ssl/redirect-http-https#f432e3522b13f1e60ca89aa64683cb5ce148338ce9b2864151708bf3a96abeea","url":"https://it-log.fr.eu.org/fr/web/ssl/redirect-http-https/","title":"Redirection HTTP vers HTTPS","author":{"name":"Stéphane HUC"},"content_text":"Description La technique de redirection du trafic HTTP vers HTTPS est généralement simple à comprendre et à mettre en place : Quand un client web interroge un site internet sur le port 80, il doit être redirigé automatiquement vers le port 443 qui distribue le même site, les mêmes ressources mais de manière chiffrée, par l\u0026rsquo;usage de certificats SSL au niveau du serveur.\nLa redirection doit être de type permanente.\nLe bénéfice de sécurité est maximale pour un coût de mise-en-place simple et aisé.\nCette technique dev(r?)ait être complétée de la technologie HSTS afin de s\u0026rsquo;assurer que toute nouvelle connexion, au site web, soit directement transmise sur le port HTTPS.\nExemples Apache \u0026lt;VirtualHost *:80\u0026gt; ServerName mon.domaine.net Redirect permanent / https://mon.domaine.net/ \u0026lt;/VirtualHost\u0026gt; httpd Pour le serveur web d\u0026rsquo;OpenBSD :\nserver mon.domaine.net { listen on * port 80 block return 301 \u0026#34;https://$SERVER_NAME$REQUEST_URI\u0026#34; } nginx server { listen 80; server_name mon.domaine.net return 301 https://$server_name$request_uri; } ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLa technique de redirection du trafic \u003cabbr title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n vers \u003cabbr title=\"HyperText Transfer Protocol Secure\"\u003eHTTPS\u003c/abbr\u003e\n est généralement simple à comprendre et à mettre en place : \u003cbr\u003e\nQuand un client web interroge un site internet sur le port 80, il doit être redirigé automatiquement vers le port 443 qui distribue le même site, les mêmes ressources mais de manière chiffrée, par l\u0026rsquo;usage de certificats SSL au niveau du serveur.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLa redirection doit être de type permanente.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLe bénéfice de sécurité est maximale pour un coût de mise-en-place simple et aisé.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCette technique dev(r?)ait être complétée de la technologie \u003ca href=\"/fr/web/ssl/hsts/\"\u003eHSTS\u003c/a\u003e\u003c/em\u003e afin de  s\u0026rsquo;assurer que toute nouvelle connexion, au site web, soit directement transmise sur le port HTTPS.\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003ch3 id=\"apache\"\u003eApache\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-Apache\" data-lang=\"Apache\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;VirtualHost\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e*:80\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  ServerName mon.domaine.net\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Redirect permanent / https://mon.domaine.net/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/VirtualHost\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"httpd\"\u003ehttpd\u003c/h3\u003e\n\u003cp\u003ePour le serveur web d\u0026rsquo;OpenBSD :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003eserver mon.domaine.net {\n    listen on * port 80\n    block return 301 \u0026#34;https://$SERVER_NAME$REQUEST_URI\u0026#34;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"nginx\"\u003enginx\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-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eserver\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:#f99b15\"\u003e80\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#5bc4bf\"\u003eserver_name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003emon.domaine.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e301\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ehttps://\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$server_name$request_uri\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","summary":"Comment effectuer une redirection du protocole HTTP vers le protocole sécurisé HTTPS","tags":["SSL","HTTP","HTTPS"],"date_published":"2017-08-14T02:20:51+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-14:/fr/web/ssl/hpkp#baf64c10feafd04d85300b847f5fe1d465a9df7d2be98382446738d07c55dedf","url":"https://it-log.fr.eu.org/fr/web/ssl/hpkp/","title":"HPKP : HTTP Public Key Pinning (header) [dépréciée]","author":{"name":"Stéphane HUC"},"content_text":"Description AttentionCette fonctionnalité est dépréciée, car difficile à mettre en place, sans parler des dangereux effets de bords si mal maîtrisée…\nau profit de l\u0026rsquo;entête Expect-CT !\nSous ce nom très barbare, HPKP se cache une fonctionnalité de sécurité qui est censée protéger les sites internet contre le vol de leur identité. Cette technique protège les certificats SSL par l\u0026rsquo;ajout de clés publiques d\u0026rsquo;authentification adressées au client web. Si les clés ne correspondent pas, le client web doit interdire purement et simplement l\u0026rsquo;accès au site internet en question.\nC\u0026rsquo;est une technique très complexe à implémenter car il faut gérer correctement ces clés, les latences entre les différentes clés, celles utilisées, celles de sauvegarde. Elle est recommandée uniquement pour les sites dits à haut risque.\nDocumentations En savoir plus : https://developer.mozilla.org/fr/docs/Web/Security/Public_Key_Pinning https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Public-Key-Pins-Report-Only Outils : https://scotthelme.co.uk/hpkp-toolset/ Support actuel : http://caniuse.com/#search=hpkp RFC 7469 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT ","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\"\u003e\u003cp\u003eCette fonctionnalité est dépréciée, car difficile à mettre en place,\nsans parler des dangereux effets de bords si mal maîtrisée…\u003c/p\u003e\n\u003cp\u003eau profit de l\u0026rsquo;entête \u003ccode\u003eExpect-CT\u003c/code\u003e !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eSous ce nom très barbare, \u003cstrong\u003eHPKP\u003c/strong\u003e se cache une fonctionnalité de sécurité\nqui est censée protéger les sites internet contre le vol de leur identité.\nCette technique protège les certificats SSL par l\u0026rsquo;ajout de clés publiques\nd\u0026rsquo;authentification adressées au client web. Si les clés ne correspondent pas,\nle client web doit interdire purement et simplement l\u0026rsquo;accès au site internet\nen question.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est une technique très complexe à implémenter car il faut gérer correctement\nces clés, les latences entre les différentes clés, celles utilisées, celles\nde sauvegarde. Elle est recommandée uniquement pour les sites dits à haut risque.\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEn savoir plus : \u003ca href=\"https://developer.mozilla.org/fr/docs/Web/Security/Public_Key_Pinning\" rel=\"external\"\u003ehttps://developer.mozilla.org/fr/docs/Web/Security/Public_Key_Pinning\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Public-Key-Pins-Report-Only\" rel=\"external\"\u003ehttps://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Public-Key-Pins-Report-Only\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eOutils : \u003ca href=\"https://scotthelme.co.uk/hpkp-toolset/\" rel=\"external\"\u003ehttps://scotthelme.co.uk/hpkp-toolset/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport actuel : \u003ca href=\"http://caniuse.com/#search=hpkp\" rel=\"external\"\u003ehttp://caniuse.com/#search=hpkp\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch3 id=\"rfc-7469\"\u003eRFC 7469\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/rfc7469\" title=\"RFC 7469 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc7469\" title=\"RFC 7469 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc7469.txt\" title=\"RFC 7469 : 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/rfc7469.html\" title=\"RFC 7469 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc7469.txt.pdf\" title=\"RFC 7469 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc7469.txt\" title=\"RFC 7469 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003chr\u003e\n","summary":"Explications sur la technologie SSL nommée HPKP, liée à la RFC 7469","tags":["SSL","HPKP","HTTPS","header","RFC","RFC7469"],"date_published":"2017-08-14T01:56:28+02:00","date_modified":"2017-08-16T12:05:15+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-08-06:/fr/sys/openbsd/xenodm#44c7e6c7e5b4f65e68472fabec6355c735b122fc7daab9f46bd24631f5871149","url":"https://it-log.fr.eu.org/fr/sys/openbsd/xenodm/","title":"xenodm : Gestionnaire de sessions X pour OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"Description xenodm est un gestionnaire de sessions X, fourni dans le système de base d\u0026rsquo;OpenBSD, depuis 6.1 - le serveur X et les sessions graphiques !\nC\u0026rsquo;est un dérivé du gestionnaire xdm, purgé de beaucoup de codes, donc plus léger, et débarrassé de potentielles failles de sécurités :\nTime has passed by and nowadays, xdm(1) is mainly used just to manage the local X server running on laptop or desktop machines. Moreover `XDCMP's security is weak (based on DES) and doesn't support IPv6 well. So it's time to retire it. So Xenocara is getting a “new” X Display Manager which will be called “xenodm”. Xenodm is based on xdm source code. I\u0026rsquo;ve removed all support for XDMCP and other old cruft like ugly games with signals and setjmp(3)/longjmp(3) to set timeouts on potentially blocking operations. Another goal was to un-tangle the ifdef maze that supported various flavors of authentication methods, to only keep the BSDauth code used in OpenBSD.\nAttentionATTENTION : Ne pas utiliser xenodm avec l\u0026rsquo;environnement graphique Gnome3 !\nPour Gnome : Il est fortement recommandé d\u0026rsquo;utiliser GDM.\nConfiguration Tous les fichiers de configuration se trouvent normalement être sur : /etc/X11/xenodm/\nQuelques explications :\nxenodm-config Le fichier /etc/X11/xenodm/xenodm-config est le fichier de configuration central du serveur xenodm. Il \u0026ldquo;redirige\u0026rdquo; vers les autres fichiers de configuration spécifique… certains sont décrits ci-dessous.\nAstuceCréer vos fichiers personnels, tel quel dans ~/.config/xenodm/ ; faites vos modifications dedans, puis modifier les variables DisplayManager* dans le fichier /etc/X11/xenodm/xenodm-config en la faisant pointer vers vos fichiers personnels !\nMais attention à chaque upgrade de version d\u0026rsquo;OpenBSD, certains paramètres pourraient être dysfonctionnels - si vous avez des problèmes de connexion avec votre configuration personnalisée de xenodm, il serait plus prudent de repartir sur la base des fichiers originaux.\nAuto-connexion Vous désirez vous connecter automatiquement avec votre identifiant, sans avoir à le saisir constamment ?\nAjouter la variable suivante DisplayManager._0.autoLogin, de telle manière : DisplayManager._0.autoLogin: Identifiant\nDangerATTENTION : du fait de ne pas avoir à taper votre mot-de-passe, toute personne peut utiliser votre ordinateur et entrer directement dans votre session, avec tous les risques que cela comporte : vols d\u0026rsquo;informations, modifications voire suppressions de documents, etc… xenodm-config : Exemple Exemple de fichier etc/X11/xenodm/xenodm-config :\n! $OpenBSD: xenodm-config.cpp,v 1.1 2016/10/23 08:30:37 matthieu Exp $ ! ! ! ! ! DisplayManager.authDir: /etc/X11/xenodm DisplayManager.errorLogFile: /var/log/xenodm.log DisplayManager.keyFile: /etc/X11/xenodm/xenodm-keys DisplayManager.servers: /etc/X11/xenodm/Xservers !DisplayManager*resources: /etc/X11/xenodm/Xresources DisplayManager*resources: /home/UserId/.config/xenodm/Xresources ! All displays should use authorization, but we cannot be sure ! X terminals may not be configured that way, so they will require ! individual resource settings. DisplayManager*authorize: true ! DisplayManager*startup: /etc/X11/xenodm/Xstartup DisplayManager*session: /etc/X11/xenodm/Xsession DisplayManager*reset: /etc/X11/xenodm/Xreset DisplayManager*authComplain: true ! The following three resources set up display :0 as the console. !DisplayManager._0.setup: /etc/X11/xenodm/Xsetup_0 DisplayManager._0.setup: /home/UserId/.config/xenodm/Xsetup_0 !DisplayManager._0.startup: /etc/X11/xenodm/GiveConsole DisplayManager._0.startup: /home/UserId/.config/xenodm/GiveConsole DisplayManager._0.reset: /etc/X11/xenodm/TakeConsole DisplayManager.*.authName: MIT-MAGIC-COOKIE-1 Les lignes commençant par un ! sont toutes des lignes de commentaires. Par principe de précaution, j\u0026rsquo;ai dédoublé les lignes DisplayManager*resources, DisplayManager._0.setup, DisplayManager._0.startup en commentant celles en rapport avec les fichiers dans le répertoire de configuration principal, pour paramétrer ceux de fichiers dans le $HOME. Remplacez UserId par votre identifiant de session… Xresources Le fichier /etc/X11/xenodm/Xresources permet de modifier l\u0026rsquo;apparence du gestionnaire (couleurs, polices, textes, etc.).\nAttentionCe fichier NE doit PAS avoir des droits en exécution ! Arrêter l\u0026rsquo;exécution de xenodm Pour sortir de l\u0026rsquo;exécution de xenodm, il est nécessaire de configurer le fichier Xresources afin d\u0026rsquo;ajouter ce qui suit :\nxlogin.login.translations: #override \\ Ctrl\u0026lt;Key\u0026gt;R: abort-display() Cette astuce permet de basculer en mode console, en arrêtant le serveur de xenodm, par l\u0026rsquo;appui sur les touches Ctrl+R.\nInterdire la connexion root Pour interdire la connexion du compte root, il faut modifier ce fichier de configuration et décommenter la ligne 128, de telle manière :\nxlogin.Login.allowRootLogin: false AttentionCeci est une recommandation pratique de sécurité ! Xresource : Exemple personnalisé Exemple personnalisé du fichier $HOME/.config/xenodm/Xresource :\n! $OpenBSD: Xresources.in,v 1.1 2017/07/26 21:14:54 matthieu Exp $ DisplayManager*terminateServer: true ! ---------------------------------------------------------------------- ! XLogin ! xlogin.Login.allowRootLogin: false xlogin.Login.echoPasswd: false xlogin.Login.fail: Authorization failed xlogin.Login.greeting: xlogin.Login.namePrompt: xlogin.Login.passwdPrompt: xlogin.Login.y: 340 xlogin.Login.width: 480 xlogin*borderWidth: 0 xlogin.Login.frameWidth: 0 xlogin.Login.innerFramesWidth: 0 xlogin.Login.sepWidth: 0 xlogin.Login.face: DejaVu Sans-16 xlogin.Login.failFace: DejaVu Sans-18:bold xlogin.Login.greetFace: DejaVu Sans-0 xlogin.Login.promptFace: DejaVu Sans-18 ! ---------------------------------------------------------------------- ! XMessage ! !xmessage*background: nord0 !xmessage*foreground: nord4 xmessage*borderWidth: 0 xmessage*font: -*-terminus-bold-*-*-*-16-*-*-*-*-*-iso8859-15 xmessage*message.scrollHorizontal: Never xmessage*message.scrollVertical: Never xmessage*timeout: 0 Xsession Le fichier /etc/X11/xenodm/Xsession s\u0026rsquo;occupe de l\u0026rsquo;entrée en session personnelle.\nAttentionCe fichier doit avoir des droits en exécution ! Un peu de décryptage utile :\ncréation et gestion d\u0026rsquo;un fichier personnel ~/.xsession-errors, dont le but est de permettre au système d\u0026rsquo;écrire dedans tout problème relatif à l\u0026rsquo;exécution de l\u0026rsquo;entrée en session. C\u0026rsquo;est le fichier à vérifier IMPÉRATIVEMENT si vous rencontrez des problèmes de connexion. gestion de l\u0026rsquo;agent SSH - si celui-ci est installé ET fonctionnel, c\u0026rsquo;est la raison pour laquelle il est demandé la saisie des clés SSH lors de la connexion. Si erreur, la session se fermera immédiatement. gestion du fichier personnel ~/.xsession : si le fichier existe ET qu\u0026rsquo;il n\u0026rsquo;est pas vide, il sera exécuté. si le fichier a des droits en exécution, il sera appelé directement à ce propos, il est recommandé dans le manpage que celui-ci doit avoir ces fameux droits. s\u0026rsquo;il n\u0026rsquo;a pas de droits en exécution, un appel système au shell sera fait pour l\u0026rsquo;exécuter. si le fichier n\u0026rsquo;existe pas, le système vérifiera l\u0026rsquo;existence d\u0026rsquo;un fichier personnel ~/.Xresources - copie personnelle du fichier /etc/X11/xenodm/Xresources - pour le charger, ainsi exécuter les binaires xterm, et fvwm par défaut. C\u0026rsquo;est le seul cas, où si ce fichier existe, il sera lu… Xsetup_0 Le fichier /etc/X11/xenodm/Xsetup_0 nous permet d\u0026rsquo;utiliser des binaires X, tels que xconsole (c\u0026rsquo;est la fameuse console de log qui s\u0026rsquo;affiche par défaut), xclock, display, etc.\nAttentionCe fichier doit avoir des droits en exécution ! Exemple de fichier /etc/X11/xenodm/Xsetup_0 :\n#!/bin/sh # $OpenBSD: Xsetup_0,v 1.1 2016/10/23 08:30:37 matthieu Exp $ if [ \u0026#34;$DISPLAY\u0026#34; = \u0026#34;:0\u0026#34; -o \u0026#34;$DISPLAY\u0026#34; = \u0026#34;:0.0\u0026#34; ] then xconsole -geometry 480x130-0-0 -daemon -notify -verbose -fn fixed -exitOnFail fi ⇒ display permet, entres autres, d\u0026rsquo;avoir une image en fond d\u0026rsquo;écran… /usr/local/bin/display -window root /home/user/Images/Wallpapers/OBSD_From_Dark_to_the_Light.png (Retrouvez l\u0026rsquo;image en question…)\n⇒ qiv permet, entres autres, d\u0026rsquo;avoir un fond d\u0026rsquo;écran aléatoire, selon les options fournies… à chaque fois que xenodm est relancé ! /usr/local/bin/qiv -zr /home/user/Images/Wallpapers/* \u0026amp; (cet outil ne fait pas partie du système de base).\n⇒ xclock permet d\u0026rsquo;afficher une horloge… /usr/X11R6/bin/xclock -d -update 1 -render \u0026amp;\nPour fermer automatiquement l\u0026rsquo;horloge, on récupère son id - dans le fichier Xsetup_0, sous la ligne déclarant le binaire, e.g. : echo $! \u0026gt; /var/run/xclock.pid\nExemple personnalisé Exemple personnalisé du fichier $HOME/.config/xenodm/Xsetup_0 :\n#!/bin/ksh # $OpenBSD: Xsetup_0,v 1.1 2016/10/23 08:30:37 matthieu Exp $ if [ \u0026#34;$DISPLAY\u0026#34; = \u0026#34;:0\u0026#34; -o \u0026#34;$DISPLAY\u0026#34; = \u0026#34;:0.0\u0026#34; ]; then BG_COLOR=$(/usr/X1R6/bin/xrdb -query | awk \u0026#39;/xroot.background/ { print $2 }\u0026#39;) OS_NAME=$(uname -n) OS_INFO=$(uname -smr) USER=id_user # changer par votre identifiant utilisateur /usr/X11R6/bin/xrandr --output default --dpi 96 /usr/X11R6/bin/xset fp+ /usr/local/share/fonts/roboto /usr/X11R6/bin/xsetroot -solid $BG_COLOR # obtenir un fichier aléatoire dans un répertoire précis set +A files /home/$USER/Images/OpenBSD-Art/* N=${#files[@]} # Number of members in the array ((N=RANDOM%N)) img=${files[$N]} /usr/local/bin/feh -b --bg-center -B $BG_COLOR -. -Z $img \u0026amp; /usr/local/bin/qiv -zrd7 /home/$USER/Images/Wallpapers/* \u0026amp; # menu ( while true; do /usr/X11R6/bin/xmessage -center \\ -buttons \u0026#34;[ Sleep ]\u0026#34;:20,\u0026#34;[ Restart ]\u0026#34;:21,\u0026#34;[ Shutdown ]\u0026#34;:22 \u0026#34;\u0026#34; ACTION=$? echo \u0026#34;Xmessage said: $ACTION\u0026#34; if [ $ACTION -eq 20 ]; then /usr/sbin/zzz; elif [ $ACTION -eq 21 ]; then /usr/X11R6/bin/xsetroot -cursor_name watch /sbin/shutdown -r now elif [ $ACTION -eq 22 ]; then /usr/X11R6/bin/xsetroot -cursor_name watch /sbin/shutdown -p now else echo \u0026#34;Something bad happened to Xmessage.\u0026#34;; fi # stop looping if xclock died (hopefully killed by GiveConsole) if [ -z \u0026#34;$(pgrep -U root /usr/X11R6/bin/xclock)\u0026#34; ]; then break; fi done ) \u0026amp; /usr/X11R6/bin/xclock -geometry -0+0 -d -update 1 -render \\ -strftime \u0026#34;$OS_NAME ($OS_INFO) | %a. %d %b. %Y %H:%M:%S \u0026#34; \u0026amp; #/usr/X11R6/bin/xclock -d -update 1 -render \u0026amp; echo $! \u0026gt; /var/run/xclock.pid fi #sxpm OpenBSD.xpm \u0026amp; À la différence, mon fichier appelle le shell ksh, car pour définir un fichier image aléatoire, je définis :\nun tableau nommé files dans lequel est attribué les noms de fichiers du répertoire cible… la variable N qui, dans un premier temps, définit le nombre d\u0026rsquo;éléments du tableau files, puis après être passer par un calcul RANDOM, la variable img qui est attribué selon le Nème élément du tableau files, qui est ensuite appelé par le logiciel feh. Normalement, feh devrait afficher l\u0026rsquo;image au centre de l\u0026rsquo;écran… ça bogue, puisque elle est affichée depuis le haut à gauche.\nLa boucle while permet d\u0026rsquo;afficher un menu linéaire, sous la zone de saisie de session, affichant : [ Sleep ] [ Restart ] [ Shutdown ]. Cliquer avec la souris sur l\u0026rsquo;une ou l\u0026rsquo;autre des actions permet de déclencher l\u0026rsquo;action nommée.\nPour l\u0026rsquo;exécution correcte de ce script Xsetup_0, il faudra installer par le biais du gestionnaire de paquets, et feh, et qiv.\nGiveConsole Le fichier /etc/X11/xenodm/GiveConsole a pour propos de traiter des instructions en sortie de xenodm.\nAttentionCe fichier doit avoir des droits en exécution ! Exemple personnalisé Exemple personnalisé du fichier $HOME/.config/xenodm/GiveConsole :\n#!/bin/sh # Assign ownership of the console to the invoking user # $OpenBSD: GiveConsole,v 1.1 2016/10/23 08:30:37 matthieu Exp $ # # By convention, both xconsole and xterm -C check that the # console is owned by the invoking user and is readable before attaching # the console output. This way a random user can invoke xterm -C without # causing serious grief. # chown $USER /dev/console if [ -c /dev/drm0 ]; then chown $USER /dev/drm0 fi /usr/X11R6/bin/sessreg -a -l $DISPLAY -u none -x /etc/X11/xenodm/Xservers $USER if test -r /var/run/xclock.pid; then kill $(cat /var/run/xclock.pid); fi pkill feh pkill xmessage Documentation Manpages xenodm ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003exenodm\u003c/strong\u003e est un gestionnaire de sessions X, fourni dans le système de\nbase d\u0026rsquo;OpenBSD, depuis 6.1 - le serveur X et les sessions graphiques !\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est un dérivé du gestionnaire \u003ccode\u003exdm\u003c/code\u003e, purgé de beaucoup de codes, donc\nplus léger, et débarrassé de potentielles failles de sécurités :\u003c/p\u003e\n\u003cblockquote\u003e\nTime has passed by and nowadays, xdm(1) is mainly used just to manage the\nlocal X server running on laptop or desktop machines. Moreover `XDCMP's\nsecurity is weak (based on DES) and doesn't support IPv6 well. So it's\ntime to retire it. So Xenocara is getting a “new” X Display Manager which\nwill be called “xenodm”.\n\u003cp\u003eXenodm is based on xdm source code. I\u0026rsquo;ve removed all support for XDMCP\nand other old cruft like ugly games with signals and setjmp(3)/longjmp(3)\nto set timeouts on potentially blocking operations. Another goal was to\nun-tangle the ifdef maze that supported various flavors of authentication\nmethods, to only keep the BSDauth code used in OpenBSD.\u003c/p\u003e\n\u003c/blockquote\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 : \u003cbr\u003e\nNe pas utiliser \u003ccode\u003exenodm\u003c/code\u003e avec l\u0026rsquo;environnement graphique Gnome3 !\u003c/p\u003e\n\u003cp\u003ePour Gnome : Il est \u003cstrong\u003efortement recommandé d\u0026rsquo;utiliser GDM\u003c/strong\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eTous les fichiers de configuration se trouvent normalement être sur :\n\u003ccode\u003e/etc/X11/xenodm/\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eQuelques explications :\u003c/p\u003e\n\u003ch3 id=\"xenodm-config\"\u003exenodm-config\u003c/h3\u003e\n\u003cp\u003eLe fichier \u003ccode\u003e/etc/X11/xenodm/xenodm-config\u003c/code\u003e est le fichier de configuration\ncentral du serveur xenodm. Il \u0026ldquo;redirige\u0026rdquo; vers les autres fichiers de\nconfiguration spécifique… certains sont décrits ci-dessous.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eCréer vos fichiers personnels, tel quel dans \u003ccode\u003e~/.config/xenodm/\u003c/code\u003e ; faites\nvos modifications dedans, puis modifier les variables \u003ccode\u003eDisplayManager*\u003c/code\u003e\ndans le fichier \u003ccode\u003e/etc/X11/xenodm/xenodm-config\u003c/code\u003e en la faisant pointer\nvers vos fichiers personnels !\u003c/p\u003e\n\u003cp\u003eMais \u003cstrong\u003eattention à chaque upgrade\u003c/strong\u003e de version d\u0026rsquo;OpenBSD, certains paramètres\npourraient être dysfonctionnels - si vous avez des problèmes de connexion\navec votre configuration personnalisée de xenodm, il serait plus prudent\nde repartir sur la base des fichiers originaux.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"auto-connexion\"\u003eAuto-connexion\u003c/h4\u003e\n\u003cp\u003eVous désirez vous connecter automatiquement avec votre identifiant, sans\navoir à le saisir constamment ?\u003c/p\u003e\n\u003cp\u003eAjouter la variable suivante \u003ccode\u003eDisplayManager._0.autoLogin\u003c/code\u003e, de telle manière : \u003cbr\u003e\n\u003ccode\u003eDisplayManager._0.autoLogin:    Identifiant\u003c/code\u003e\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 : du fait de ne pas avoir à taper votre mot-de-passe,\ntoute personne peut utiliser votre ordinateur et entrer directement dans\nvotre session, avec tous les risques que cela comporte : vols d\u0026rsquo;informations,\nmodifications voire suppressions de documents, etc…\u003c/div\u003e\n\n\u003ch4 id=\"xenodm-config--exemple\"\u003exenodm-config : Exemple\u003c/h4\u003e\n\u003cp\u003eExemple de fichier \u003ccode\u003eetc/X11/xenodm/xenodm-config\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\"\u003e! $OpenBSD: xenodm-config.cpp,v 1.1 2016/10/23 08:30:37 matthieu Exp $\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\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\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\"\u003eDisplayManager.authDir: /etc/X11/xenodm\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDisplayManager.errorLogFile:    /var/log/xenodm.log\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDisplayManager.keyFile:         /etc/X11/xenodm/xenodm-keys\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDisplayManager.servers:         /etc/X11/xenodm/Xservers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e!DisplayManager*resources:      /etc/X11/xenodm/Xresources\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDisplayManager*resources:       /home/UserId/.config/xenodm/Xresources\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e! All displays should use authorization, but we cannot be sure\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e! X terminals may not be configured that way, so they will require\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e! individual resource settings.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDisplayManager*authorize:       true\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\"\u003eDisplayManager*startup:         /etc/X11/xenodm/Xstartup\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDisplayManager*session:         /etc/X11/xenodm/Xsession\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDisplayManager*reset:           /etc/X11/xenodm/Xreset\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDisplayManager*authComplain:    true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e! The following three resources set up display :0 as the console.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e!DisplayManager._0.setup:       /etc/X11/xenodm/Xsetup_0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDisplayManager._0.setup:        /home/UserId/.config/xenodm/Xsetup_0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e!DisplayManager._0.startup:     /etc/X11/xenodm/GiveConsole\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDisplayManager._0.startup:      /home/UserId/.config/xenodm/GiveConsole\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDisplayManager._0.reset:        /etc/X11/xenodm/TakeConsole\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eDisplayManager.*.authName:      MIT-MAGIC-COOKIE-1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eLes lignes commençant par un \u003ccode\u003e!\u003c/code\u003e sont toutes des lignes de commentaires.\u003c/li\u003e\n\u003cli\u003ePar principe de précaution, j\u0026rsquo;ai dédoublé les lignes \u003ccode\u003eDisplayManager*resources\u003c/code\u003e,\n\u003ccode\u003eDisplayManager._0.setup\u003c/code\u003e, \u003ccode\u003eDisplayManager._0.startup\u003c/code\u003e en commentant\ncelles en rapport avec les fichiers dans le répertoire de configuration\nprincipal, pour paramétrer ceux de fichiers dans le $HOME.\u003c/li\u003e\n\u003cli\u003eRemplacez \u003ccode\u003eUserId\u003c/code\u003e par votre identifiant de session…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"xresources\"\u003eXresources\u003c/h3\u003e\n\u003cp\u003eLe fichier \u003ccode\u003e/etc/X11/xenodm/Xresources\u003c/code\u003e permet de modifier l\u0026rsquo;apparence\ndu gestionnaire \u003cem\u003e(couleurs, polices, textes, etc.)\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\"\u003eCe fichier NE doit PAS avoir des droits en exécution !\u003c/div\u003e\n\n\u003chr\u003e\n\u003ch4 id=\"arrêter-lexécution-de-xenodm\"\u003eArrêter l\u0026rsquo;exécution de xenodm\u003c/h4\u003e\n\u003cp\u003ePour sortir de l\u0026rsquo;exécution de xenodm, il est nécessaire de configurer le\nfichier Xresources afin d\u0026rsquo;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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.login.translations: #override \\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003eCtrl\u0026lt;Key\u0026gt;R: abort-display()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCette astuce permet de basculer en mode console, en arrêtant le serveur\nde xenodm, par l\u0026rsquo;appui sur les touches \u003ckbd\u003eCtrl+R\u003c/kbd\u003e.\u003c/p\u003e\n\u003ch4 id=\"interdire-la-connexion-root\"\u003eInterdire la connexion root\u003c/h4\u003e\n\u003cp\u003ePour interdire la connexion du compte root, il faut modifier ce fichier\nde configuration et décommenter la ligne 128, 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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.allowRootLogin:    false\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\"\u003eCeci est une recommandation pratique de sécurité !\u003c/div\u003e\n\n\u003ch4 id=\"xresource--exemple-personnalisé\"\u003eXresource : Exemple personnalisé\u003c/h4\u003e\n\u003cp\u003eExemple personnalisé du fichier \u003ccode\u003e$HOME/.config/xenodm/Xresource\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\"\u003e! $OpenBSD: Xresources.in,v 1.1 2017/07/26 21:14:54 matthieu 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:#06b6ef\"\u003eDisplayManager*terminateServer: true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\u003cspan style=\"color:#06b6ef\"\u003e! XLogin\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\"\u003exlogin.Login.allowRootLogin: 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:#06b6ef\"\u003exlogin.Login.echoPasswd:   false\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.fail:         Authorization failed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.greeting:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.namePrompt:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.passwdPrompt:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003exlogin.Login.y:                340\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.width:            480\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin*borderWidth:            0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.frameWidth:       0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.innerFramesWidth: 0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.sepWidth:         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\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.face:       DejaVu Sans-16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.failFace:   DejaVu Sans-18:bold\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.greetFace:  DejaVu Sans-0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exlogin.Login.promptFace: DejaVu Sans-18\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\u003cspan style=\"color:#06b6ef\"\u003e! XMessage\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!xmessage*background: nord0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e!xmessage*foreground: nord4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exmessage*borderWidth: 0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exmessage*font: -*-terminus-bold-*-*-*-16-*-*-*-*-*-iso8859-15\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exmessage*message.scrollHorizontal: Never\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exmessage*message.scrollVertical: Never\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exmessage*timeout: 0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"xsession\"\u003eXsession\u003c/h3\u003e\n\u003cp\u003eLe fichier \u003ccode\u003e/etc/X11/xenodm/Xsession\u003c/code\u003e s\u0026rsquo;occupe de l\u0026rsquo;entrée en session\npersonnelle.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eCe fichier doit avoir des droits en exécution !\u003c/div\u003e\n\n\u003cp\u003eUn peu de décryptage utile :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecréation et gestion d\u0026rsquo;un fichier personnel \u003ccode\u003e~/.xsession-errors\u003c/code\u003e, dont\nle but est de permettre au système d\u0026rsquo;écrire dedans tout problème\nrelatif à l\u0026rsquo;exécution de l\u0026rsquo;entrée en session. C\u0026rsquo;est le fichier à\nvérifier IMPÉRATIVEMENT si vous rencontrez des problèmes de connexion.\u003c/li\u003e\n\u003cli\u003egestion de l\u0026rsquo;agent SSH - si celui-ci est installé ET fonctionnel,\nc\u0026rsquo;est la raison pour laquelle il est demandé la saisie des clés SSH\nlors de la connexion. Si erreur, la session se fermera immédiatement.\u003c/li\u003e\n\u003cli\u003egestion du fichier personnel \u003ccode\u003e~/.xsession\u003c/code\u003e :\n\u003cul\u003e\n\u003cli\u003esi le fichier existe ET qu\u0026rsquo;il n\u0026rsquo;est pas vide, il sera exécuté.\u003c/li\u003e\n\u003cli\u003esi le fichier a des droits en exécution, il sera appelé directement\n\u003cul\u003e\n\u003cli\u003eà ce propos, il est recommandé dans le\n\u003ca href=\"https://man.openbsd.org/xenodm.1#SESSION_PROGRAM\" rel=\"external\"\u003emanpage\u003c/a\u003e que\ncelui-ci \u003cstrong\u003edoit avoir\u003c/strong\u003e ces fameux droits.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003es\u0026rsquo;il n\u0026rsquo;a pas de droits en exécution, un appel système au shell\nsera fait pour l\u0026rsquo;exécuter.\u003c/li\u003e\n\u003cli\u003esi le fichier n\u0026rsquo;existe pas, le système vérifiera l\u0026rsquo;existence d\u0026rsquo;un\nfichier personnel \u003ccode\u003e~/.Xresources\u003c/code\u003e - \u003cem\u003ecopie personnelle du fichier\n\u003ccode\u003e/etc/X11/xenodm/Xresources\u003c/code\u003e\u003c/em\u003e - pour le charger, ainsi exécuter\nles binaires \u003ccode\u003exterm\u003c/code\u003e, et \u003ccode\u003efvwm\u003c/code\u003e par défaut. C\u0026rsquo;est le seul cas,\noù si ce fichier existe, il sera lu…\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"xsetup_0\"\u003eXsetup_0\u003c/h3\u003e\n\u003cp\u003eLe fichier \u003ccode\u003e/etc/X11/xenodm/Xsetup_0\u003c/code\u003e nous permet d\u0026rsquo;utiliser des binaires\nX, tels que \u003ccode\u003exconsole\u003c/code\u003e \u003cem\u003e(c\u0026rsquo;est la fameuse console de log qui s\u0026rsquo;affiche\npar défaut)\u003c/em\u003e, \u003ccode\u003exclock\u003c/code\u003e, \u003ccode\u003edisplay\u003c/code\u003e, etc.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eCe fichier doit avoir des droits en exécution !\u003c/div\u003e\n\n\u003cp\u003eExemple de fichier \u003ccode\u003e/etc/X11/xenodm/Xsetup_0\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#!/bin/sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# $OpenBSD: Xsetup_0,v 1.1 2016/10/23 08:30:37 matthieu Exp $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eif [ \u0026#34;$DISPLAY\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;:0\u0026#34; -o \u0026#34;$DISPLAY\u0026#34; = \u0026#34;:0.0\u0026#34; ]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       \u003cspan style=\"color:#06b6ef\"\u003exconsole -geometry 480x130-0-0 -daemon -notify -verbose -fn fixed -exitOnFail\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\u003e⇒ \u003ccode\u003edisplay\u003c/code\u003e permet, entres autres, d\u0026rsquo;avoir une image en fond d\u0026rsquo;écran… \u003cbr\u003e\n\u003ccode\u003e/usr/local/bin/display -window root /home/user/Images/Wallpapers/OBSD_From_Dark_to_the_Light.png\u003c/code\u003e \u003cbr\u003e\n\u003cem\u003e(Retrouvez l\u0026rsquo;\u003ca href=\"https://huc.fr.eu.org/img/EBNH/OBSD/OBSD_From_Dark_to_the_Light.png\" rel=\"external\"\u003eimage\u003c/a\u003e en question…)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003ccode\u003eqiv\u003c/code\u003e permet, entres autres, d\u0026rsquo;avoir un fond d\u0026rsquo;écran aléatoire, selon\nles options fournies… à chaque fois que xenodm est relancé ! \u003cbr\u003e\n\u003ccode\u003e/usr/local/bin/qiv -zr /home/user/Images/Wallpapers/* \u0026amp;\u003c/code\u003e \u003cbr\u003e\n\u003cem\u003e(cet outil ne fait pas partie du système de base).\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003ccode\u003exclock\u003c/code\u003e permet d\u0026rsquo;afficher une horloge…  \u003cbr\u003e\n\u003ccode\u003e/usr/X11R6/bin/xclock -d -update 1 -render \u0026amp;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour fermer automatiquement l\u0026rsquo;horloge, on récupère son id - dans le fichier\n\u003ccode\u003eXsetup_0\u003c/code\u003e, sous la ligne déclarant le binaire, \u003cabbr title=\"exemplī grātia\"\u003ee.g.\u003c/abbr\u003e\n : \u003cbr\u003e\n\u003ccode\u003eecho $! \u0026gt; /var/run/xclock.pid\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"exemple-personnalisé\"\u003eExemple personnalisé\u003c/h4\u003e\n\u003cp\u003eExemple personnalisé du fichier \u003ccode\u003e$HOME/.config/xenodm/Xsetup_0\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#!/bin/ksh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# $OpenBSD: Xsetup_0,v 1.1 2016/10/23 08:30:37 matthieu Exp $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eif [ \u0026#34;$DISPLAY\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;:0\u0026#34; -o \u0026#34;$DISPLAY\u0026#34; = \u0026#34;:0.0\u0026#34; ]; then\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eBG_COLOR\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$(/usr/X1R6/bin/xrdb -query | awk \u0026#39;/xroot.background/ { print $2 }\u0026#39;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    OS_NAME=$(uname -n)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    OS_INFO=$(uname -smr)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    USER=id_user    # changer par votre identifiant 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\u003e    \u003cspan style=\"color:#06b6ef\"\u003e/usr/X11R6/bin/xrandr --output default --dpi 96\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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/usr/X11R6/bin/xset fp+ /usr/local/share/fonts/roboto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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/usr/X11R6/bin/xsetroot -solid $BG_COLOR\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# obtenir un fichier aléatoire dans un répertoire précis\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eset +A files /home/$USER/Images/OpenBSD-Art/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eN\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e${#files[@]}           # Number of members in the array\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    ((N=RANDOM%N))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    img=${files[$N]}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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/usr/local/bin/feh -b --bg-center -B $BG_COLOR -. -Z $img \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:#06b6ef\"\u003e/usr/local/bin/qiv -zrd7 /home/$USER/Images/Wallpapers/* \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# menu\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\"\u003ewhile true; do\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003e/usr/X11R6/bin/xmessage -center \\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         \u003cspan style=\"color:#06b6ef\"\u003e-buttons \u0026#34;[ Sleep ]\u0026#34;:20,\u0026#34;[ Restart ]\u0026#34;:21,\u0026#34;[ Shutdown ]\u0026#34;:22 \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\"\u003eACTION\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        echo \u0026#34;Xmessage said: $ACTION\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        if   [ $ACTION -eq 20 ]; then /usr/sbin/zzz;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        elif [ $ACTION -eq 21 ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            /usr/X11R6/bin/xsetroot -cursor_name watch\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            /sbin/shutdown -r now\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        elif [ $ACTION -eq 22 ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            /usr/X11R6/bin/xsetroot -cursor_name watch\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e            /sbin/shutdown -p now\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        else echo \u0026#34;Something bad happened to Xmessage.\u0026#34;;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        # stop looping if xclock died (hopefully killed by GiveConsole)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        if [ -z \u0026#34;$(pgrep -U root /usr/X11R6/bin/xclock)\u0026#34; ]; then break; fi\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    done\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    ) \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:#06b6ef\"\u003e/usr/X11R6/bin/xclock -geometry -0+0 -d -update 1 -render \\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#06b6ef\"\u003e-strftime \u0026#34;$OS_NAME ($OS_INFO) | %a. %d %b. %Y  %H:%M:%S \u0026#34; \u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#/usr/X11R6/bin/xclock -d -update 1 -render \u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eecho $! \u0026gt; /var/run/xclock.pid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\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#sxpm OpenBSD.xpm \u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eÀ la différence, mon fichier appelle le shell \u003ccode\u003eksh\u003c/code\u003e, car pour définir un\nfichier image aléatoire, je définis :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eun tableau nommé \u003ccode\u003efiles\u003c/code\u003e dans lequel est attribué les noms de fichiers\ndu répertoire cible…\u003c/li\u003e\n\u003cli\u003ela variable \u003ccode\u003eN\u003c/code\u003e qui, dans un premier temps, définit le nombre d\u0026rsquo;éléments\ndu tableau \u003ccode\u003efiles\u003c/code\u003e, puis après être passer par un calcul \u003ccode\u003eRANDOM\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003ela variable \u003ccode\u003eimg\u003c/code\u003e qui est attribué selon le \u003ccode\u003eN\u003c/code\u003eème élément du tableau\n\u003ccode\u003efiles\u003c/code\u003e, qui est ensuite appelé par le logiciel \u003ccode\u003efeh\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNormalement, \u003ccode\u003efeh\u003c/code\u003e devrait afficher l\u0026rsquo;image au centre de l\u0026rsquo;écran… \u003cbr\u003e\n\u003cem\u003eça bogue, puisque elle est affichée depuis le haut à gauche\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eLa boucle \u003ccode\u003ewhile\u003c/code\u003e permet d\u0026rsquo;afficher un menu linéaire, sous la zone de saisie\nde session, affichant : \u003ccode\u003e[ Sleep ] [ Restart ] [ Shutdown ]\u003c/code\u003e.  \u003cbr\u003e\nCliquer avec la souris sur l\u0026rsquo;une ou l\u0026rsquo;autre des actions permet de déclencher\nl\u0026rsquo;action nommée.\u003c/p\u003e\n\u003cp\u003ePour l\u0026rsquo;exécution correcte de ce script \u003ccode\u003eXsetup_0\u003c/code\u003e, il faudra installer par\nle biais du gestionnaire de paquets, et \u003ccode\u003efeh\u003c/code\u003e, et \u003ccode\u003eqiv\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"giveconsole\"\u003eGiveConsole\u003c/h3\u003e\n\u003cp\u003eLe fichier \u003ccode\u003e/etc/X11/xenodm/GiveConsole\u003c/code\u003e a pour propos de traiter des\ninstructions en sortie de xenodm.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eCe fichier doit avoir des droits en exécution !\u003c/div\u003e\n\n\u003ch4 id=\"exemple-personnalisé-1\"\u003eExemple personnalisé\u003c/h4\u003e\n\u003cp\u003eExemple personnalisé du fichier \u003ccode\u003e$HOME/.config/xenodm/GiveConsole\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#!/bin/sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Assign ownership of the console to the invoking user\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# $OpenBSD: GiveConsole,v 1.1 2016/10/23 08:30:37 matthieu 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# By convention, both xconsole and xterm -C check that the\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# console is owned by the invoking user and is readable before attaching\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# the console output.  This way a random user can invoke xterm -C without\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# causing serious grief.\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\"\u003echown $USER /dev/console\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 [ -c /dev/drm0 ]; then\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003echown $USER /dev/drm0\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\"\u003e/usr/X11R6/bin/sessreg -a -l $DISPLAY -u none -x /etc/X11/xenodm/Xservers $USER\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 test -r /var/run/xclock.pid; then kill $(cat /var/run/xclock.pid); fi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003epkill feh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epkill xmessage\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\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\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\u003chr\u003e\n\u003chr\u003e\n","summary":"Explications sur le serveur graphique xenodm sous OpenBSD et personnalisations","tags":["OpenBSD","xenodm"],"date_published":"2017-08-06T19:29:05+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-31:/fr/sys/openbsd/signify#98975deaab554d01eee14c3e859d1e0f1b3055cd0d7a9fb3497799c57d261961","url":"https://it-log.fr.eu.org/fr/sys/openbsd/signify/","title":"[Mini-Tuto] Signify (OpenBSD)","author":{"name":"Stéphane HUC"},"content_text":"Description Un mini-tutoriel concernant l\u0026rsquo;usage de l\u0026rsquo;outil signify !\nPour ceux qui ne connaissent pas, signify est un outil natif du projet OpenBSD, dont le but est de générer une signature cryptographique d\u0026rsquo;un fichier ou ensemble de fichiers.\nVérification de signature Vous avez récupéré un fichier de clé publique, créé avec signify, ainsi que le fichier de signature ; pour vérifier que les fichiers fournis avec soient intègres, il vous faudra utiliser signify ainsi : :$ signify -C -p Nom_Projet.pub -x Nom_Projet.sig\nCette commande signifie de vérifier avec la clé publique du projet Untel, tous les fichiers écrites dans le fichier de signature.\nCette commande peut être légèrement abrégée : :$ signify -Cp Nom_Projet.pub -x Nom_Projet.sig\nCréation de signature Maintenant, voyons comment créer un ensemble de fichiers de clé privée/publique avec signify : :$ signify -G -p Nom_Projet.pub -s Nom_Projet.sec\nL\u0026rsquo;invite de commande vous demandera d\u0026rsquo;écrire une passphrase et de la confirmer !\nNe pas oublier la passphrase ; et, mettez en sécurité le fichier de clé privée `*.sec`, en lieu sûr ! Si pour des raisons quelconques, vous avez besoin de générer une signature sans passphrase, exécutez signify ainsi : :$ signify -G -n -p Nom_Projet.pub -s Nom_Projet.sec\nGénération du fichier de signature Nous savons donc vérifier un ensemble de fichiers grâce à un fichier de signature, créer un ensemble de clé privée/publique, voyons comment générer un fichier de signature !\n:$ signify -S -e -x Nom_Projet.sig -s Nom_Projet.sec\nCas d\u0026rsquo;utilisation Profitons de la possibilité de coupler l\u0026rsquo;outil signify, avec une fonction de hachage cryptographique, telle sha512 !\nEn premier lieu, générons un fichier de condensats cryptographiques, e.g : :$ find ./ -exec sha512 {} + \u0026gt; Nom_Projet.sha512 Puis, occupons nous du fichier de signature : :$ signify -S -s Nom_Projet.sec -m Nom_Projet.sha512 -e -x Nom_Projet.sig AstuceÀ-propos de l\u0026rsquo;usage de l\u0026rsquo;algorithme de cryptographie sha512 : La génération de hashes cryptographiques peut être faite par l\u0026rsquo;outil cksum en utilisant l\u0026rsquo;option -a pour cibler l\u0026rsquo;algorithme sha512 (entres autres…) ! InfoLe terme \u0026ldquo;somme de contrôle\u0026rdquo; est communément accepté pour parler des condensats/hashes cryptos générés à partir d\u0026rsquo;une fonction de hash. Cet usage peut être considéré comme impropre par des spécialistes. Par exemple, pour explication :\nUne somme de contrôle est utile pour détecter des modifications accidentelles des données, mais n\u0026rsquo;a pas vocation à assurer une protection contre les modifications intentionnelles. Plus précisément, elle ne peut en général pas assurer directement l\u0026rsquo;intégrité cryptographique des données. Pour éviter de telles modifications, il est possible d\u0026rsquo;utiliser une fonction de hachage adaptée, comme SHA-256, couplée à un élément secret (clé secrète), ce qui correspond au principe du HMAC. source\nDocumentation Le manpage officiel - en anglais - : signify Celui de la fonction de hachage cryptographique - en anglais - : sha512 Celui à-propos de l\u0026rsquo;outil en ligne de commande - en anglais - : cksum La page Somme_de_contrôle WP . ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUn mini-tutoriel concernant l\u0026rsquo;usage de l\u0026rsquo;outil \n\u003ca class=\"man\" href=\"https://man.openbsd.org/signify\" title=\"Page du Manuel OpenBSD pour : signify\"\u003esignify\u003c/a\u003e\n !\u003c/p\u003e\n\u003cp\u003ePour ceux qui ne connaissent pas, \u003cem\u003esignify\u003c/em\u003e est un outil natif du projet\nOpenBSD, dont le but est de générer une signature cryptographique d\u0026rsquo;un\nfichier ou ensemble de fichiers.\u003c/p\u003e\n\u003ch2 id=\"vérification-de-signature\"\u003eVérification de signature\u003c/h2\u003e\n\u003cp\u003eVous avez récupéré un fichier de clé publique, créé avec signify, ainsi\nque le fichier de signature ; pour vérifier que les fichiers fournis\navec soient intègres, il vous faudra utiliser signify ainsi : \u003cbr\u003e\n\u003ccode\u003e:$ signify -C -p Nom_Projet.pub -x Nom_Projet.sig\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCette commande signifie de vérifier avec la clé publique du projet\nUntel, tous les fichiers écrites dans le fichier de signature.\u003c/p\u003e\n\u003cp\u003eCette commande peut être légèrement abrégée : \u003cbr\u003e\n\u003ccode\u003e:$ signify -Cp Nom_Projet.pub -x Nom_Projet.sig\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"création-de-signature\"\u003eCréation de signature\u003c/h2\u003e\n\u003cp\u003eMaintenant, voyons comment créer un ensemble de fichiers de clé\nprivée/publique avec signify : \u003cbr\u003e\n\u003ccode\u003e:$ signify -G -p Nom_Projet.pub -s Nom_Projet.sec\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;invite de commande vous demandera d\u0026rsquo;écrire une passphrase et de la\nconfirmer !\u003c/p\u003e\n\u003cspan class=\"red\"\u003eNe pas oublier la passphrase ; et, mettez en sécurité le\nfichier de clé privée `*.sec`, en lieu sûr !\u003c/span\u003e\n\n\u003cp\u003eSi pour des raisons quelconques, vous avez besoin de générer une\nsignature sans passphrase, exécutez signify ainsi : \u003cbr\u003e\n\u003ccode\u003e:$ signify -G -n -p Nom_Projet.pub -s Nom_Projet.sec\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"génération-du-fichier-de-signature\"\u003eGénération du fichier de signature\u003c/h2\u003e\n\u003cp\u003eNous savons donc vérifier un ensemble de fichiers grâce à un fichier de\nsignature, créer un ensemble de clé privée/publique, voyons comment\ngénérer un fichier de signature !\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ signify -S -e -x Nom_Projet.sig -s Nom_Projet.sec\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"cas-dutilisation\"\u003eCas d\u0026rsquo;utilisation\u003c/h3\u003e\n\u003cp\u003eProfitons de la possibilité de coupler l\u0026rsquo;outil signify, avec une fonction de\nhachage cryptographique, telle \u003ccode\u003esha512\u003c/code\u003e !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEn premier lieu, générons un fichier de condensats cryptographiques, e.g : \u003cbr\u003e\n\u003ccode\u003e:$ find ./ -exec sha512 {} + \u0026gt; Nom_Projet.sha512\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePuis, occupons nous du fichier de signature : \u003cbr\u003e\n\u003ccode\u003e:$ signify -S -s Nom_Projet.sec -m Nom_Projet.sha512 -e -x Nom_Projet.sig\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À-propos de l\u0026rsquo;usage de l\u0026rsquo;algorithme de cryptographie sha512 : \u003cbr\u003e\nLa génération de hashes cryptographiques peut être faite par l\u0026rsquo;outil \u003ccode\u003ecksum\u003c/code\u003e\nen utilisant l\u0026rsquo;option \u003ccode\u003e-a\u003c/code\u003e pour cibler l\u0026rsquo;algorithme \u003ccode\u003esha512\u003c/code\u003e \u003cem\u003e(entres autres…)\u003c/em\u003e !\u003c/div\u003e\n\n\u003chr\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eLe terme \u0026ldquo;somme de contrôle\u0026rdquo; est communément accepté pour parler des\ncondensats/hashes cryptos générés à partir d\u0026rsquo;une fonction de hash. Cet usage\npeut être considéré comme impropre par des spécialistes. Par exemple,\npour explication :\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eUne somme de contrôle est utile pour détecter des modifications accidentelles\ndes données, mais n\u0026rsquo;a pas vocation à assurer une protection contre les\nmodifications intentionnelles. Plus précisément, elle ne peut en général pas\nassurer directement l\u0026rsquo;intégrité cryptographique des données. Pour éviter de\ntelles modifications, il est possible d\u0026rsquo;utiliser une fonction de hachage adaptée,\ncomme SHA-256, couplée à un élément secret (clé secrète), ce qui correspond au\nprincipe du HMAC. \u003cem\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Somme_de_contr%C3%B4le#Somme_de_contr%C3%B4le_et_cryptographie\" rel=\"external\"\u003esource\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe manpage officiel - \u003cem\u003een anglais\u003c/em\u003e - : \n\u003ca class=\"man\" href=\"https://man.openbsd.org/signify\" title=\"Page du Manuel OpenBSD pour : signify\"\u003esignify\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eCelui de la fonction de hachage cryptographique - \u003cem\u003een anglais\u003c/em\u003e - : \n\u003ca class=\"man\" href=\"https://man.openbsd.org/sha512\" title=\"Page du Manuel OpenBSD pour : sha512\"\u003esha512\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eCelui à-propos de l\u0026rsquo;outil en ligne de commande - \u003cem\u003een anglais\u003c/em\u003e - : \n\u003ca class=\"man\" href=\"https://man.openbsd.org/cksum\" title=\"Page du Manuel OpenBSD pour : cksum\"\u003ecksum\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eLa page \u003ca href=\"https://fr.wikipedia.org/wiki/Somme_de_contr%c3%b4le\" title=\"Article Wikipédia : Somme_de_contrôle\"\u003e\n    Somme_de_contrôle\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\u003c/a\u003e\n.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Petit rappel pour l'utilisation de l'outil signify sous OpenBSD.","tags":["OpenBSD","Signify","Mini-Tuto"],"date_published":"2017-07-31T13:50:49+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-31:/fr/sys/openbsd/usb-thetering-urndis#c26b6e9e0f8c45137d4213b79260cdeb65304b9f0c5827799af69d6980f34f9e","url":"https://it-log.fr.eu.org/fr/sys/openbsd/usb-thetering-urndis/","title":"OpenBSD : USB Thetering (urndis)… Partage de connexion réseau","author":{"name":"Stéphane HUC"},"content_text":"Description L\u0026rsquo;USB Thetering est le partage d\u0026rsquo;une connexion réseau, depuis votre smartphone avec votre station informatique.\nVotre connexion réseau, telle celle d\u0026rsquo;internet, sur votre smartphone, peut soit venir du Wifi, soit d\u0026rsquo;une connexion 3G/4G.\nTesté sur OpenBSD 6.x - Driver urndis(4) Smartphone utilisé : Xiaomi Redmi - Android 4.4.2 (KitKat) Xiaomi Mi A2 Lite - Android 9, 10 Testé : partage de connexion par Wifi, 3G/4G Configuration Connectez votre smartphone à Internet, et vérifiez que vous pouvez bien surfez avec.\nConnectez le smartphone par USB à votre station OpenBSD, puis vérifiez aussitôt la connexion :\n:$ dmesg | tail -n1 ugen0 at uhub0 port 2 \u0026#34;MediaTek MT65xx Android Phone\u0026#34; rev 2.00/2.16 addr 2 Dans cet exemple, le téléphone est ici reconnu comme un Android Phone.\nSelon votre version d\u0026rsquo;Android : Activer la fonction \u0026ldquo;USB Thetering\u0026rdquo; : \u0026ldquo;Menu Système\u0026rdquo; \u0026gt; \u0026ldquo;More\u0026rdquo; \u0026gt; \u0026ldquo;USB Thetering\u0026rdquo; - (Android KitKat) ou, Menu \u0026ldquo;Réseau et Internet\u0026rdquo; : Point d\u0026rsquo;accès et partage de connexion \u0026gt; Via USB - (Android 9, 10) InfoLe menu pour activer la fonction peut être sensiblement différent, selon la marque de votre téléphone, la version du système d\u0026rsquo;exploitation utilisé, et la langue utilisée sur votre smartphone.\n(Celui de l\u0026rsquo;exemple est celui d\u0026rsquo;une ROM MIUI 8)\nPuis, vérifiez aussitôt :\n:$ dmesg | tail -n3 urndis0 at uhub0 port 2 configuration 1 interface 0 \u0026#34;MediaTek MT65xx Android Phone\u0026#34; rev 2.00/2.16 addr 2 urndis0: using RNDIS, address f2:5d:d2:80:94:b5 ugen0 at uhub0 port 2 configuration 1 \u0026#34;MediaTek MT65xx Android Phone\u0026#34; rev 2.00/2.16 addr 2 Coup de chance, nous avons le pilote urndis… il se comporte comme un pilote réseau pour communiquer entre le smartphone - généralement des Android - et la station, par le biais du port USB.\nAttentionSi vous n\u0026rsquo;avez pas ce message, ou si vous avez tout autre message : n\u0026rsquo;allez pas plus loin, la suite de ce tutoriel ne vous servira pas ! Puisque c\u0026rsquo;est un pilote Ethernet, alors simplifions-nous la vie avec ifconfig : :$ ifconfig urndis0 urndis0: flags=8802\u0026lt;BROADCAST,SIMPLEX,MULTICAST\u0026gt; mtu 1500 lladdr f2:5d:d2:80:94:b5 index 70 priority 0 llprio 3 Paramétrons le fichier /etc/hostname.urndis0\u0026rsquo;, pour y ajouter au moins la valeur dhcp, à minima… Faites un chmod 0640 dessus !!! Puis demandons une adresse IP :\n:# dhclient urndis0 DHCPREQUEST on urndis0 to 255.255.255.255 DHCPNACK from 192.168.42.129 (06:45:e6:2f:3f:51) DHCPDISCOVER on urndis0 - interval 1 DHCPDISCOVER on urndis0 - interval 1 DHCPDISCOVER on urndis0 - interval 2 DHCPOFFER from 192.168.42.129 (06:45:e6:2f:3f:51) DHCPREQUEST on urndis0 to 255.255.255.255 DHCPACK from 192.168.42.129 (06:45:e6:2f:3f:51) bound to 192.168.42.125 -- renewal in 21600 seconds. :$ ifconfig urndis0 urndis0: flags=8843\u0026lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST\u0026gt; mtu 1500 lladdr f2:5d:d2:80:94:b5 index 70 priority 0 llprio 3 inet 192.168.42.125 netmask 0xffffff00 broadcast 192.168.42.255 Pour un démarrage automatique de dhcp lors du montage du périphérique, on modifie le fichier /etc/hotplug/attach, ainsi : 3) # network devices; requires hostname.$DEVNAME sh /etc/netstart $DEVNAME ;; PF Selon vos règles PF, si vous en avez, selon comme elles sont construites, il est certainement préférable de relancer PF !\nTest Maintenant, testez votre connexion Internet depuis votre station OpenBSD. Et, zou, la patate… 😃\nDocumentations Manpages ifconfig(8) urndis(4) ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;USB Thetering est le partage d\u0026rsquo;une connexion réseau, depuis votre smartphone\navec votre station informatique.\u003c/p\u003e\n\u003cp\u003eVotre connexion réseau, telle celle d\u0026rsquo;internet, sur votre smartphone, peut\nsoit venir du Wifi, soit d\u0026rsquo;une connexion 3G/4G.\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eTesté sur OpenBSD 6.x - \u003cem\u003eDriver urndis(4)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eSmartphone utilisé :\n\u003cul\u003e\n\u003cli\u003eXiaomi Redmi - Android 4.4.2 \u003cem\u003e(KitKat)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eXiaomi Mi A2 Lite - Android 9, 10\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eTesté : partage de connexion par Wifi, 3G/4G\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eConnectez votre smartphone à Internet, et vérifiez que vous pouvez bien\nsurfez avec.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eConnectez le smartphone par USB à votre station OpenBSD, puis vérifiez\naussitôt la connexion :\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ dmesg | tail -n1\nugen0 at uhub0 port 2 \u0026#34;MediaTek MT65xx Android Phone\u0026#34; rev 2.00/2.16 addr 2\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003eDans cet exemple, le téléphone est ici reconnu comme un Android Phone.\u003c/em\u003e\u003c/p\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003eSelon votre version d\u0026rsquo;Android :\n\u003cul\u003e\n\u003cli\u003eActiver la fonction \u0026ldquo;USB Thetering\u0026rdquo; : \u0026ldquo;Menu Système\u0026rdquo; \u0026gt; \u0026ldquo;More\u0026rdquo; \u0026gt; \u0026ldquo;USB Thetering\u0026rdquo; -\n\u003cem\u003e(Android KitKat)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eou, Menu \u0026ldquo;Réseau et Internet\u0026rdquo; : Point d\u0026rsquo;accès et partage de connexion \u0026gt; Via USB -\n\u003cem\u003e(Android 9, 10)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eLe menu pour activer la fonction peut être sensiblement différent, selon\nla marque de votre téléphone, la version du système d\u0026rsquo;exploitation utilisé,\net la langue utilisée sur votre smartphone.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e(Celui de l\u0026rsquo;exemple est celui d\u0026rsquo;une ROM MIUI 8)\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003ePuis, vérifiez aussitô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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ dmesg | tail -n3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eurndis0 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;MediaTek MT65xx Android Phone\u0026#34;\u003c/span\u003e rev 2.00/2.16 addr \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eurndis0: using RNDIS, address f2:5d:d2:80:94:b5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eugen0 at uhub0 port \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e configuration \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;MediaTek MT65xx Android Phone\u0026#34;\u003c/span\u003e rev 2.00/2.16 addr \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCoup de chance, nous avons le pilote \u003cstrong\u003eurndis\u003c/strong\u003e… il se comporte comme un\npilote réseau pour communiquer entre le smartphone - \u003cem\u003egénéralement des\nAndroid\u003c/em\u003e - et la station, par le biais du port USB.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eSi vous n\u0026rsquo;avez pas ce message, ou si vous avez tout autre message :\nn\u0026rsquo;allez pas plus loin, la suite de ce tutoriel ne vous servira pas !\u003c/div\u003e\n\n\u003col start=\"4\"\u003e\n\u003cli\u003ePuisque c\u0026rsquo;est un pilote \u003cstrong\u003eEthernet\u003c/strong\u003e, alors simplifions-nous la vie\navec \u003ccode\u003eifconfig\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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ifconfig urndis0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eurndis0: \u003cspan style=\"color:#ef6155\"\u003eflags\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e8802\u0026lt;BROADCAST,SIMPLEX,MULTICAST\u0026gt; mtu \u003cspan style=\"color:#f99b15\"\u003e1500\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        lladdr f2:5d:d2:80:94:b5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        index \u003cspan style=\"color:#f99b15\"\u003e70\u003c/span\u003e priority \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e llprio \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003eParamétrons le fichier \u003ccode\u003e/etc/hostname.urndis0\u003c/code\u003e\u0026rsquo;, pour y ajouter au moins\nla valeur \u003ccode\u003edhcp\u003c/code\u003e, à minima… \u003cbr\u003e\n\u003cstrong\u003eFaites un chmod 0640 dessus !!!\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ePuis demandons une adresse 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# dhclient urndis0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDHCPREQUEST on urndis0 to 255.255.255.255\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDHCPNACK from 192.168.42.129 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e06:45:e6:2f:3f:51\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDHCPDISCOVER on urndis0 - interval \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDHCPDISCOVER on urndis0 - interval \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDHCPDISCOVER on urndis0 - interval \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDHCPOFFER from 192.168.42.129 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e06:45:e6:2f:3f:51\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDHCPREQUEST on urndis0 to 255.255.255.255\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDHCPACK from 192.168.42.129 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e06:45:e6:2f:3f:51\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebound to 192.168.42.125 -- renewal in \u003cspan style=\"color:#f99b15\"\u003e21600\u003c/span\u003e seconds.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ifconfig urndis0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eurndis0: \u003cspan style=\"color:#ef6155\"\u003eflags\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e8843\u0026lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST\u0026gt; mtu \u003cspan style=\"color:#f99b15\"\u003e1500\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        lladdr f2:5d:d2:80:94:b5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        index \u003cspan style=\"color:#f99b15\"\u003e70\u003c/span\u003e priority \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e llprio \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        inet 192.168.42.125 netmask 0xffffff00 broadcast 192.168.42.255\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"6\"\u003e\n\u003cli\u003ePour un démarrage automatique de \u003ccode\u003edhcp\u003c/code\u003e lors du montage du périphérique,\non modifie le fichier \u003ccode\u003e/etc/hotplug/attach\u003c/code\u003e, ainsi :\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\"\u003e3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       \u003cspan style=\"color:#776e71\"\u003e# network devices; requires hostname.$DEVNAME\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       \u003cspan style=\"color:#06b6ef\"\u003esh /etc/netstart $DEVNAME\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\u003cp\u003eSelon vos règles PF, si vous en avez, selon comme elles sont construites,\nil est certainement préférable de relancer PF !\u003c/p\u003e\n\u003ch2 id=\"test\"\u003eTest\u003c/h2\u003e\n\u003cp\u003eMaintenant, testez votre connexion Internet depuis votre station OpenBSD.\nEt, zou, la patate… 😃\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/ifconfig.8\" title=\"Page du Manuel OpenBSD pour : ifconfig\"\u003eifconfig(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/urndis.4\" title=\"Page du Manuel OpenBSD pour : urndis\"\u003eurndis(4)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment faire un partage de connexion internet avec votre smartphone par USB sous OpenBSD - urndis(4)","tags":["OpenBSD","USB","Thetering","urndis"],"date_published":"2017-07-31T12:10:35+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-31:/fr/dev/shell/split-archive#d0f2d277fedcacfbb573b5d8efd9cae873ca9f38ef1a8a6acfad5b76a2fd14e3","url":"https://it-log.fr.eu.org/fr/dev/shell/split-archive/","title":"Shell : découper/reconstruire une archive…","author":{"name":"Stéphane HUC"},"content_text":"Description Le code ci-dessous compresse le fichier archive et le découpe par tranche de 100 Mo, en ajoutant une extension incrémentée alphabétique… (tel que : _aa pour le premier fichier, _ab pour le second, _ac pour le troisième, etc…)\nDécouper Découper une archive tar Pour découper une archive tar, utilisons le binaire split :\ntar cz fichier | split -b 100m - archive_split.tgz_\nAttentionAttention : sous OpenBSD, tar supporte mal les gros fichiers et se mettra en erreur ! Découper une archive gzip Pour découper votre archive au format gzip :\ngzip -c fichier | split -b 100m - archive_split.gz_\nReconstruire Dans un premier temps, il nous faut \u0026ldquo;concaténer\u0026rdquo; l\u0026rsquo;archive, nous utiliserons dans les deux cas l\u0026rsquo;outil cat, puis ensuite il faut la décompresser pour obtenir le(s) fichiers(s) de l\u0026rsquo;archive.\nReconstruire l\u0026rsquo;archive tar cat archive_split.tgz_* | tar xz\nReconstruire l\u0026rsquo;archive gzip cat archive_split.gz_* | gunzip -c \u0026gt; fichier\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe code ci-dessous compresse le fichier archive et le découpe par tranche\nde 100 Mo, en ajoutant une extension incrémentée alphabétique… \u003cbr\u003e\n\u003cem\u003e(tel que : \u003ccode\u003e_aa\u003c/code\u003e pour le premier fichier, \u003ccode\u003e_ab\u003c/code\u003e pour le second, \u003ccode\u003e_ac\u003c/code\u003e pour le\ntroisième, etc…)\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"découper\"\u003eDécouper\u003c/h2\u003e\n\u003ch3 id=\"découper-une-archive-tar\"\u003eDécouper une archive tar\u003c/h3\u003e\n\u003cp\u003ePour découper une archive tar, utilisons le binaire \u003cstrong\u003esplit\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003etar cz fichier | split -b 100m - archive_split.tgz_\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 : sous OpenBSD, tar supporte mal les gros fichiers et se mettra en\nerreur !\u003c/div\u003e\n\n\u003ch3 id=\"découper-une-archive-gzip\"\u003eDécouper une archive gzip\u003c/h3\u003e\n\u003cp\u003ePour découper votre archive au format gzip :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003egzip -c fichier | split -b 100m - archive_split.gz_\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"reconstruire\"\u003eReconstruire\u003c/h2\u003e\n\u003cp\u003eDans un premier temps, il nous faut \u0026ldquo;concaténer\u0026rdquo; l\u0026rsquo;archive, nous utiliserons\ndans les deux cas l\u0026rsquo;outil \u003cstrong\u003ecat\u003c/strong\u003e, puis ensuite il faut la décompresser\npour obtenir le(s) fichiers(s) de l\u0026rsquo;archive.\u003c/p\u003e\n\u003ch3 id=\"reconstruire-larchive-tar\"\u003eReconstruire l\u0026rsquo;archive tar\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ecat archive_split.tgz_* | tar xz\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"reconstruire-larchive-gzip\"\u003eReconstruire l\u0026rsquo;archive gzip\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ecat archive_split.gz_* | gunzip -c \u0026gt; fichier\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment découper une archive tar, .gz, .bz dans un shell (Bash, ksh), puis la reconstruire !","tags":["shell","archive"],"date_published":"2017-07-31T00:00:00+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-31:/fr/post/split-archive#e813da1d6ec67d60186859ca6a3e1ac896556367efa255e3e03bdfcf7454a5fc","url":"https://it-log.fr.eu.org/fr/post/split-archive/","title":"Shell : découper/reconstruire une archive…","author":{"name":"Stéphane HUC"},"content_text":"Description Le code ci-dessous compresse le fichier archive et le découpe par tranche de 100 Mo, en ajoutant une extension incrémentée alphabétique… (tel que : _aa pour le premier fichier, _ab pour le second, _ac pour le troisième, etc…)\nDécouper Découper une archive tar Pour découper une archive tar, utilisons le binaire split :\ntar cz fichier | split -b 100m - archive_split.tgz_\nAttentionAttention : sous OpenBSD, tar supporte mal les gros fichiers et se mettra en erreur ! Découper une archive gzip Pour découper votre archive au format gzip :\ngzip -c fichier | split -b 100m - archive_split.gz_\nReconstruire Dans un premier temps, il nous faut \u0026ldquo;concaténer\u0026rdquo; l\u0026rsquo;archive, nous utiliserons dans les deux cas l\u0026rsquo;outil cat, puis ensuite il faut la décompresser pour obtenir le(s) fichiers(s) de l\u0026rsquo;archive.\nReconstruire l\u0026rsquo;archive tar cat archive_split.tgz_* | tar xz\nReconstruire l\u0026rsquo;archive gzip cat archive_split.gz_* | gunzip -c \u0026gt; fichier\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe code ci-dessous compresse le fichier archive et le découpe par tranche\nde 100 Mo, en ajoutant une extension incrémentée alphabétique… \u003cbr\u003e\n\u003cem\u003e(tel que : \u003ccode\u003e_aa\u003c/code\u003e pour le premier fichier, \u003ccode\u003e_ab\u003c/code\u003e pour le second, \u003ccode\u003e_ac\u003c/code\u003e pour le troisième, etc…)\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"découper\"\u003eDécouper\u003c/h2\u003e\n\u003ch3 id=\"découper-une-archive-tar\"\u003eDécouper une archive tar\u003c/h3\u003e\n\u003cp\u003ePour découper une archive tar, utilisons le binaire \u003cstrong\u003esplit\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003etar cz fichier | split -b 100m - archive_split.tgz_\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 : sous OpenBSD, tar supporte mal les gros\nfichiers et se mettra en erreur !\u003c/div\u003e\n\n\u003ch3 id=\"découper-une-archive-gzip\"\u003eDécouper une archive gzip\u003c/h3\u003e\n\u003cp\u003ePour découper votre archive au format gzip :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003egzip -c fichier | split -b 100m - archive_split.gz_\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"reconstruire\"\u003eReconstruire\u003c/h2\u003e\n\u003cp\u003eDans un premier temps, il nous faut \u0026ldquo;concaténer\u0026rdquo; l\u0026rsquo;archive, nous utiliserons\ndans les deux cas l\u0026rsquo;outil \u003cstrong\u003ecat\u003c/strong\u003e, puis ensuite il faut la décompresser\npour obtenir le(s) fichiers(s) de l\u0026rsquo;archive.\u003c/p\u003e\n\u003ch3 id=\"reconstruire-larchive-tar\"\u003eReconstruire l\u0026rsquo;archive tar\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ecat archive_split.tgz_* | tar xz\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"reconstruire-larchive-gzip\"\u003eReconstruire l\u0026rsquo;archive gzip\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ecat archive_split.gz_* | gunzip -c \u0026gt; fichier\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment découper une archive tar, .gz, .bz dans un shell (Bash, ksh), puis la reconstruire !","tags":["shell","archive"],"date_published":"2017-07-31T00:00:00+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/web/php/php-warning-unknown-unable-to-create-temporary-file#bb5aa2b32bbed5e20736ddce85e711fe1f9260d221549974239adfcaac2786fb","url":"https://it-log.fr.eu.org/fr/web/php/php-warning-unknown-unable-to-create-temporary-file/","title":"PHP Warning:  Unknown: Unable to create temporary file","author":{"name":"Stéphane HUC"},"content_text":"Description Dans vos logs d\u0026rsquo;erreur web, vous avez le message d\u0026rsquo;erreur suivant :\nFastCGI sent in stderr: \u0026quot;PHP message: PHP Warning: Unknown: Unable to create temporary file, Check permissions in temporary files directory. in Unknown on line 0\nOu celui-ci, qui est sensiblement différent :\nPHP Warning: File upload error - unable to create a temporary file in Unknown on line 0\nLe problème est très simple: PHP ne peut pas créer les fichiers temporaires dont il a besoin de créer, dans le répertoire temporaire indiqué dans votre fichier de configuration /etc/php-fpm.d/$domain.conf.\nDépannage Ouvrez votre fichier de configuration php-fpm relatif à votre site web.\nVérifiez les informations suivantes :\n(…) user = ??? group = ??? (…) env[TMP] = /var/www/tmp env[TMPDIR] = /var/www/tmp env[TEMP] = /var/www/tmp (…) php_admin_value[upload_tmp_dir] = /tmp Relevez les informations relatives à user, group, et env[TMP]\nVérifiez que le répertoire nommé dans les variables env ait bien les droits utilisateurs liés à user:group. Vérifiez les droits en écriture… sous OpenBSD, sous Debian/Ubuntu, des droits 0705 semblent fonctionnels, à défaut 0755 devraient remédier à la situation ! Si php_admin_value[open_basedir] est activée, ou l\u0026rsquo;option open_basedir, veillez à ajouter le répertoire /tmp parmi les répertoires autorisés ! # chown user:group /var/www/tmp\nInfoVous remarquez que la variable php_admin_value[upload_tmp_dir] pointe vers /tmp. C\u0026rsquo;est normal, il pointe vers le répertoire temporaire dans le chroot web… Si le chroot web est /var/www, le répertoire temporaire relatif est bel est bien /tmp. Quoiqu\u0026rsquo;il en soit, vérifiez que celui-ci est exactement les mêmes droits utilisateurs nécessaire à PHP ! ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eDans vos logs d\u0026rsquo;erreur web, vous avez le message d\u0026rsquo;erreur suivant :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eFastCGI sent in stderr: \u0026quot;PHP message: PHP Warning:  Unknown: Unable to create temporary file, Check permissions in temporary files directory. in Unknown on line 0\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eOu celui-ci, qui est sensiblement différent :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ePHP Warning:  File upload error - unable to create a temporary file in Unknown on line 0\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLe problème est très simple: PHP ne peut pas créer les fichiers temporaires\ndont il a besoin de créer, dans le répertoire temporaire indiqué dans votre\nfichier de configuration \u003ccode\u003e/etc/php-fpm.d/$domain.conf\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003cp\u003eOuvrez votre fichier de configuration php-fpm relatif à votre site web.\u003c/p\u003e\n\u003cp\u003eVérifiez les informations 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\"\u003euser\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\"\u003egroup\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:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eenv\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eTMP\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e /var/www/tmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eenv\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eTMPDIR\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e /var/www/tmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eenv\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eTEMP\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e /var/www/tmp\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\u003ephp_admin_value\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eupload_tmp_dir\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e /tmp\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRelevez les informations relatives à \u003ccode\u003euser\u003c/code\u003e, \u003ccode\u003egroup\u003c/code\u003e, et \u003ccode\u003eenv[TMP]\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVérifiez que le répertoire nommé dans les variables \u003ccode\u003eenv\u003c/code\u003e ait bien les droits\nutilisateurs liés à \u003ccode\u003euser:group\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eVérifiez les droits en écriture… \u003cem\u003esous OpenBSD, sous Debian/Ubuntu, des droits\n0705 semblent fonctionnels\u003c/em\u003e, à défaut 0755 devraient remédier à la situation !\u003c/li\u003e\n\u003cli\u003eSi \u003ccode\u003ephp_admin_value[open_basedir]\u003c/code\u003e est activée, ou l\u0026rsquo;option \u003ccode\u003eopen_basedir\u003c/code\u003e,\nveillez à ajouter le répertoire \u003ccode\u003e/tmp\u003c/code\u003e parmi les répertoires autorisés !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003e# chown user:group /var/www/tmp\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\"\u003eVous remarquez que la variable \u003ccode\u003ephp_admin_value[upload_tmp_dir]\u003c/code\u003e pointe vers\n\u003ccode\u003e/tmp\u003c/code\u003e. C\u0026rsquo;est normal, il pointe vers le répertoire temporaire dans le chroot web… \u003cbr\u003e\nSi le chroot web est \u003ccode\u003e/var/www\u003c/code\u003e, le répertoire temporaire relatif est bel est\nbien \u003ccode\u003e/tmp\u003c/code\u003e. \u003cbr\u003e\nQuoiqu\u0026rsquo;il en soit, vérifiez que celui-ci est exactement les mêmes droits\nutilisateurs nécessaire à PHP !\u003c/div\u003e\n\n\u003chr\u003e\n","summary":"Résoudre l'ensemble d'erreurs liée à 'PHP Warning:  Unknown: Unable to create temporary file' !","tags":["PHP","Erreur","Unknown"],"date_published":"2017-07-29T21:42:59+02:00","date_modified":"2017-08-14T14:22:43+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/web/php/php-warning-open-basedir-restriction-in-effect#703edb3353b2f2c3e59e457e518821c83534740c1c6cdd3be13456947f1463e4","url":"https://it-log.fr.eu.org/fr/web/php/php-warning-open-basedir-restriction-in-effect/","title":"PHP Warning: open_basedir restriction in effect","author":{"name":"Stéphane HUC"},"content_text":"Description C\u0026rsquo;est un ensemble de message d\u0026rsquo;erreurs php-fpm !\nElles signifient que vous utilisez la variable php_admin_value[open_basedir].\nDépannage PHP Warning: is_dir(): open_basedir restriction in effect Vous avez un message ressemblant à celui-ci :\n[error] 85001#0: *47 FastCGI sent in stderr: \u0026quot;PHP message: PHP Warning: is_dir(): open_basedir restriction in effect. File(/var/www/cache/) is not within the allowed path(s): (/htdocs/:/var/www/cache/:/logs/:/run/:/tmp/) in /htdocs/www/dc/master/inc/libs/clearbricks/net.http.feed/class.feed.reader.php on line 116\u0026quot; while reading response header from upstream, client: 88.136.16.221, server: www.stephane-huc.net, request: \u0026quot;GET /dc/master/admin/ HTTP/2.0\u0026quot;, upstream: \u0026quot;fastcgi://unix:/run/php-fpm.sock:\u0026quot;, host: \u0026quot;www.stephane-huc.net\u0026quot;\nVérifiez :\nque le répertoire, dans lequel le script php utilisé cherche à écrire, fasse bien partie des répertoires qui soient autorisés, sinon ajoutez-le… et qu\u0026rsquo;il ait bien les droits utilisateur user et group écrits dans le fichier /etc/php-fpm.d/$domain.conf. PHP Warning: is_readable(): open_basedir restriction in effect Vous avez un message ressemblant à celui-ci :\n[error] 85001#0: *47 FastCGI sent in stderr: \u0026quot;PHP message: PHP Warning: is_readable(): open_basedir restriction in effect. File(/var/www/cache/script.php) is not within the allowed path(s): (/htdocs/:/var/www/cache/:/logs/:/run/:/tmp/) in /htdocs/www/dc/master/inc/core/class.dc.update.php on line 75\nVérifiez :\nque le script utilisé ait les droits utilisateur nécessaires à l\u0026rsquo;exécution de celui-ci ; cf, les instructions user et group du fichier /etc/php-fpm.d/$domain.conf. PHP Warning: require(): open_basedir restriction in effect Vous avez un message ressemblant à celui-ci :\n[error] 91433#0: *1 FastCGI sent in stderr: \u0026quot;PHP message: PHP Warning: require(): open_basedir restriction in effect. File(/htdocs/www/dc/master/inc/admin/prepend.php) is not within the allowed path(s): (/htdocs/www:/cache/:/logs/:/run/:/tmp/) in /htdocs/www/dc/master/admin/index.php on line 23 PHP message: PHP Fatal error: require(): Failed opening required '/htdocs/www/dc/master/admin/../inc/admin/prepend.php' (include_path='.:/pear/lib:/var/www/pear/lib') in /htdocs/www/dc/master/admin/index.php on line 23\u0026quot; while reading response header from upstream, client: 88.136.16.221, server: www.stephane-huc.net, request: \u0026quot;GET /dc/master/admin/ HTTP/2.0\u0026quot;, upstream: \u0026quot;fastcgi://unix:/run/php-fpm.sock:\u0026quot;, host: \u0026quot;www.stephane-huc.net\u0026quot;\nVérifiez :\nque le script appelé soit bien dans les répertoires autorisés, et qu\u0026rsquo;il ait les droits utilisateur user et group lié à php-fpm… ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eC\u0026rsquo;est un ensemble de message d\u0026rsquo;erreurs php-fpm !\u003c/p\u003e\n\u003cp\u003eElles signifient que vous utilisez la variable \u003ccode\u003ephp_admin_value[open_basedir]\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"php-warning--is_dir-open_basedir-restriction-in-effect\"\u003ePHP Warning:  is_dir(): open_basedir restriction in effect\u003c/h3\u003e\n\u003cp\u003eVous avez un message ressemblant à celui-ci :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e[error] 85001#0: *47 FastCGI sent in stderr: \u0026quot;PHP message: PHP Warning:  is_dir(): open_basedir restriction in effect. File(/var/www/cache/) is not within the allowed path(s): (/htdocs/:/var/www/cache/:/logs/:/run/:/tmp/) in /htdocs/www/dc/master/inc/libs/clearbricks/net.http.feed/class.feed.reader.php on line 116\u0026quot; while reading response header from upstream, client: 88.136.16.221, server: www.stephane-huc.net, request: \u0026quot;GET /dc/master/admin/ HTTP/2.0\u0026quot;, upstream: \u0026quot;fastcgi://unix:/run/php-fpm.sock:\u0026quot;, host: \u0026quot;www.stephane-huc.net\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVérifiez :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eque le répertoire, dans lequel le script php utilisé cherche à\nécrire, fasse bien partie des répertoires qui soient autorisés, sinon\najoutez-le…\u003c/li\u003e\n\u003cli\u003eet qu\u0026rsquo;il ait bien les droits utilisateur \u003ccode\u003euser\u003c/code\u003e et \u003ccode\u003egroup\u003c/code\u003e écrits dans\nle fichier \u003ccode\u003e/etc/php-fpm.d/$domain.conf\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"php-warning--is_readable-open_basedir-restriction-in-effect\"\u003ePHP Warning:  is_readable(): open_basedir restriction in effect\u003c/h3\u003e\n\u003cp\u003eVous avez un message ressemblant à celui-ci :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e[error] 85001#0: *47 FastCGI sent in stderr: \u0026quot;PHP message: PHP Warning:  is_readable(): open_basedir restriction in effect. File(/var/www/cache/script.php) is not within the allowed path(s): (/htdocs/:/var/www/cache/:/logs/:/run/:/tmp/) in /htdocs/www/dc/master/inc/core/class.dc.update.php on line 75\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVérifiez :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eque le script utilisé ait les droits utilisateur nécessaires à l\u0026rsquo;exécution\nde celui-ci ; cf, les instructions \u003ccode\u003euser\u003c/code\u003e et \u003ccode\u003egroup\u003c/code\u003e du fichier\n\u003ccode\u003e/etc/php-fpm.d/$domain.conf\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"php-warning--require-open_basedir-restriction-in-effect\"\u003ePHP Warning:  require(): open_basedir restriction in effect\u003c/h3\u003e\n\u003cp\u003eVous avez un message ressemblant à celui-ci :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e[error] 91433#0: *1 FastCGI sent in stderr: \u0026quot;PHP message: PHP Warning:  require(): open_basedir restriction in effect. File(/htdocs/www/dc/master/inc/admin/prepend.php) is not within the allowed path(s): (/htdocs/www:/cache/:/logs/:/run/:/tmp/) in /htdocs/www/dc/master/admin/index.php on line 23 PHP message: PHP Fatal error:  require(): Failed opening required '/htdocs/www/dc/master/admin/../inc/admin/prepend.php' (include_path='.:/pear/lib:/var/www/pear/lib') in /htdocs/www/dc/master/admin/index.php on line 23\u0026quot; while reading response header from upstream, client: 88.136.16.221, server: www.stephane-huc.net, request: \u0026quot;GET /dc/master/admin/ HTTP/2.0\u0026quot;, upstream: \u0026quot;fastcgi://unix:/run/php-fpm.sock:\u0026quot;, host: \u0026quot;www.stephane-huc.net\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVérifiez :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eque le script appelé soit bien dans les répertoires autorisés,\u003c/li\u003e\n\u003cli\u003eet qu\u0026rsquo;il ait les droits utilisateur \u003ccode\u003euser\u003c/code\u003e et \u003ccode\u003egroup\u003c/code\u003e lié à php-fpm…\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Résoudre les différentes raisons possibles dont le résultat est l'erreur 'PHP Warning: open_basedir restriction in effect' !","tags":["PHP","Erreur","open_basedir"],"date_published":"2017-07-29T21:42:59+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/dev/bash/function-array-key-exists#1d9b67a8bc3f774becf4b8c816b97bbb35eadf7247dcf9e2782b2909171fc670","url":"https://it-log.fr.eu.org/fr/dev/bash/function-array-key-exists/","title":"Bash : function array_key_exists()","author":{"name":"Stéphane HUC"},"content_text":"Description array_key_exists() : vérifie l\u0026rsquo;existence d\u0026rsquo;une clé dans un tableau !\nÉquivalent à la function PHP array_key_exists()\nCode source function array_key_exists() { # equivalent to PHP array_key_exists # call: array_key_exists key array local key=\u0026#34;$1\u0026#34; IFS=\u0026#34; \u0026#34;; shift; read -a array \u0026lt;\u0026lt;\u0026lt; \u0026#34;$@\u0026#34; if [[ \u0026#34;${array[$key]}\u0026#34; ]]; then return 0; else return 1; fi unset array key IFS } Paramètres key est la clé à rechercher haystack est le tableau dans lequel chercher Valeurs de retour Retourne 0 pour la clé key, si elle est trouvée dans le tableau haystack ; considérez cette valeur comme TRUE Autrement retourne 1 : considérez cette valeur comme FALSE Exemple declare -a color=(\u0026#34;blue\u0026#34;, \u0026#34;red\u0026#34;, \u0026#34;green\u0026#34;, \u0026#34;grey\u0026#34;); key=1 if array_key_exists \u0026#34;${key}\u0026#34; \u0026#34;${color[@]}\u0026#34;; then echo \u0026#34;key: ${key} exists!\u0026#34; else echo \u0026#34;This key: ${key} not exists!\u0026#34; fi ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003earray_key_exists()\u003c/code\u003e : vérifie l\u0026rsquo;existence d\u0026rsquo;une clé dans un tableau !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eÉquivalent à la function \u003ca href=\"http://php.net/manual/en/function.array-key-exists.php\" rel=\"external\"\u003ePHP array_key_exists\u003c/a\u003e()\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"code-source\"\u003eCode source\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-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e array_key_exists\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:#776e71\"\u003e# equivalent to PHP array_key_exists\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#776e71\"\u003e# call: array_key_exists key array\u003c/span\u003e\n\u003c/span\u003e\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\"\u003ekey\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; read -a array \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u0026lt;\u0026lt;\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\"\u003earray\u003c/span\u003e[\u003cspan style=\"color:#ef6155\"\u003e$key\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\"\u003eelse\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e 1; \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 array key IFS\n\u003c/span\u003e\u003c/span\u003e\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"paramètres\"\u003eParamètres\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ekey\u003c/code\u003e est la clé à rechercher\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehaystack\u003c/code\u003e est le tableau dans lequel chercher\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"valeurs-de-retour\"\u003eValeurs de retour\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRetourne \u003ccode\u003e0\u003c/code\u003e pour la clé \u003ccode\u003ekey\u003c/code\u003e, si elle est trouvée dans le tableau \u003ccode\u003ehaystack\u003c/code\u003e ; \nconsidérez cette valeur comme \u003ccode\u003eTRUE\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAutrement retourne \u003ccode\u003e1\u003c/code\u003e : considérez cette valeur comme \u003ccode\u003eFALSE\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"exemple\"\u003eExemple\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-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeclare -a \u003cspan style=\"color:#ef6155\"\u003ecolor\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;blue\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;red\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;green\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;grey\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\"\u003ekey\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\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e array_key_exists \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ekey\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\"\u003ecolor\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;key: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ekey\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e exists!\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\"\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   echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;This key: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ekey\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e not exists!\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\u003chr\u003e\n","summary":"Fonction array_key_exists() en bash équivalente à celle de PHP","tags":["Bash","array"],"date_published":"2017-07-29T18:56:36+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/dev/bash/function-array-search#84780525c1f563065dee5323490d277d1ca135b63da3d8933a63f7eef1639e73","url":"https://it-log.fr.eu.org/fr/dev/bash/function-array-search/","title":"Bash : function array_search()","author":{"name":"Stéphane HUC"},"content_text":"Description array_search() : recherche dans un tableau la clé associée à une valeur\nÉquivalent à la function [PHP array_search\nCode source function array_search() { # equivalent to PHP array_search # call: array_search needle array local needle=\u0026#34;$1\u0026#34; IFS=\u0026#34; \u0026#34;; shift; read -a array \u0026lt;\u0026lt;\u0026lt; \u0026#34;$@\u0026#34; for (( i=0; i \u0026lt; ${#array[*]}; i++ )); do if [[ \u0026#34;${array[$i]}\u0026#34; == \u0026#34;${needle}\u0026#34; ]]; then echo \u0026#34;$i\u0026#34;; fi done return 1 unset array needle IFS } Paramètres needle est la valeur à rechercher haystack est le tableau dans lequel chercher Valeurs de retour Retourne la clé pour needle, si elle est trouvée dans le tableau haystack Autrement retourne 1 : considérez cette valeur comme FALSE Exemple declare -a color=(\u0026#34;blue\u0026#34;, \u0026#34;red\u0026#34;, \u0026#34;green\u0026#34;, \u0026#34;grey\u0026#34;); echo \u0026#34;$(array_search \u0026#34;red\u0026#34; \u0026#34;${color[@]}\u0026#34;)\u0026#34; ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003earray_search()\u003c/code\u003e : recherche dans un tableau la clé associée à une valeur\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eÉquivalent à la function [\u003ca href=\"http://php.net/manual/en/function.array-search.php\" rel=\"external\"\u003ePHP array_search\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"code-source\"\u003eCode source\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-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e array_search\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:#776e71\"\u003e# equivalent to PHP array_search\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# call: array_search needle array\u003c/span\u003e\n\u003c/span\u003e\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\"\u003eneedle\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; read -a array \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u0026lt;\u0026lt;\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\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e((\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ei\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0; i \u0026lt; \u003cspan style=\"color:#f99b15\"\u003e${#\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003earray\u003c/span\u003e[*]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e; i++ \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\"\u003eneedle\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 echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$i\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:#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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    unset array needle IFS\n\u003c/span\u003e\u003c/span\u003e\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"paramètres\"\u003eParamètres\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eneedle\u003c/code\u003e est la valeur à rechercher\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehaystack\u003c/code\u003e est le tableau dans lequel chercher\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"valeurs-de-retour\"\u003eValeurs de retour\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRetourne la clé pour \u003ccode\u003eneedle\u003c/code\u003e, si elle est trouvée dans le tableau \u003ccode\u003ehaystack\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAutrement retourne \u003ccode\u003e1\u003c/code\u003e : considérez cette valeur comme \u003ccode\u003eFALSE\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"exemple\"\u003eExemple\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-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeclare -a \u003cspan style=\"color:#ef6155\"\u003ecolor\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;blue\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;red\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;green\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;grey\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\u003eecho \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003earray_search \u003cspan style=\"color:#48b685\"\u003e\u0026#34;red\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\"\u003ecolor\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n","summary":"Fonction array_search() en bash équivalente à celle de PHP","tags":["Bash","array"],"date_published":"2017-07-29T18:19:29+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/firewall/iptables-accept-wan#e7a94a09f2916eadd9d1e959c3a36a394e6ff6ca4f424a923bae5f20afb19fe2","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-accept-wan/","title":"iptables accepte de gèrer les connexions sortantes vers WAN","author":{"name":"Stéphane HUC"},"content_text":"Description ⇒ Accepter les connexions vers Internet (WAN ), en admettant que votre adresse ip fasse partie de la classe C, segment réseau de type 192.168.0.0 :\niptables -A OUTPUT -o eth0 -s 192.168.0.1 -m conntrack --ctstate ! INVALID -j ACCEPT\nIl peut-être intéressant de la faire suivre de cette règle de rejet …\nJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e⇒ Accepter les connexions vers Internet (\u003cabbr title=\"World Area Network\"\u003eWAN\u003c/abbr\u003e\n),\nen admettant que votre adresse ip fasse partie de la classe C, segment\nréseau de type 192.168.0.0 :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eiptables -A OUTPUT -o eth0 -s 192.168.0.1 -m conntrack --ctstate ! INVALID -j ACCEPT\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eIl peut-être intéressant de la faire suivre de cette règle de \n\u003ca class=\"inside\" href=\"/fr/sec/firewall/iptables-reject-wan/\" title=\"Lien interne vers l\u0026#39;article : 'iptables rejette les connexions entrantes WAN'\"\u003erejet\u003c/a\u003e\n…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/accept_wan/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour autoriser les connexions sortantes vers WAN avec Iptables","tags":["firewall","iptables","accept","WAN","astuce"],"date_published":"2017-07-29T14:03:15+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/firewall/iptables-reject-wan#32bee1567274684a9a283ac5c8f9d5125039f4b713adaaf00734ecc6604e7992","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-reject-wan/","title":"iptables rejette les connexions entrantes WAN","author":{"name":"Stéphane HUC"},"content_text":"Description ⇒ Si l\u0026rsquo;on est une station, refuser poliment les paquets demandant une connexion et venant d\u0026rsquo;Internet se dit ainsi :\niptables -A INPUT -i eth0 -s 0.0.0.0/0 -d 192.168.0.1 -m conntrack --ctstate NEW -j REJECT\nIl peut-être intéressant de la faire précéder de cette règle iptables accepte de gèrer les connexions sortantes vers WAN …\nJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e⇒ Si l\u0026rsquo;on est une station, refuser poliment les paquets demandant une connexion\net venant d\u0026rsquo;Internet se dit ainsi :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eiptables -A INPUT -i eth0 -s 0.0.0.0/0 -d 192.168.0.1 -m conntrack --ctstate NEW -j REJECT\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl peut-être intéressant de la faire précéder de cette règle \n\n\u003ca class=\"inside\" href=\"/fr/sec/firewall/iptables-accept-wan/\" title=\"Lien interne vers l\u0026#39;article : 'iptables accepte de gèrer les connexions sortantes vers WAN'\"\u003eiptables accepte de gèrer les connexions sortantes vers WAN\u003c/a\u003e\n\n…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/reject_wan/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour rejeter les connexions entrantes depuis WAN avec Iptables","tags":["firewall","iptables","reject","WAN","astuce"],"date_published":"2017-07-29T13:42:29+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/firewall/iptables-multiport#3d490a580e0f030c36512c2d694d94a3eb9c27c2b782f7d204e4134b9c57629f","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-multiport/","title":"iptables gère le mode multiport","author":{"name":"Stéphane HUC"},"content_text":"Description L\u0026rsquo;extension multiport d\u0026rsquo;iptables permet de spécifier une et une seule règle pour cibler plusieurs services !\niptables -A INPUT -i eth0 -p TCP -m multiport --dports 20-22,80,443 -m conntrack --ctstate NEW -j ACCEPT\nExemples Au lieu d\u0026rsquo;écrire :\n# autorise entree-sortie vers ssh, si est server ssh iptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.1 -m conntrack --ctstate ! INVALID -p TCP --dport 22 -j ACCEPT iptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -p TCP --sport 22 -j ACCEPT # autorise entree-sortie vers DNS \u0026amp;amp;lt;-\u0026amp;amp;gt; LAN, si est server DNS iptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.1 -m conntrack --ctstate ! INVALID -p TCP --dport 53 -j ACCEPT iptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -p TCP --sport 53 -j ACCEPT # autorise entree-sortie vers Cups \u0026amp;amp;lt;-\u0026amp;amp;gt; LAN, si est server Cups iptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.1 -m conntrack --ctstate ! INVALID -p TCP --dport 631 -j ACCEPT iptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -p TCP --sport 631 -j ACCEPT Écrivez donc :\niptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.1 -p TCP -m multiport --dports 22,53,631 -m conntrack --ctstate ! INVALID -j ACCEPT iptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.0/24 -p TCP -m multiport --sports 22,53,631 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT J\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;extension \u003ccode\u003emultiport\u003c/code\u003e d\u0026rsquo;iptables permet de spécifier une et une seule\nrègle pour cibler plusieurs services !\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eiptables -A INPUT -i eth0 -p TCP -m multiport --dports 20-22,80,443 -m conntrack --ctstate NEW -j ACCEPT\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cp\u003eAu lieu d\u0026rsquo;écrire :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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# autorise entree-sortie vers ssh, si est server ssh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.1 -m conntrack --ctstate ! INVALID -p TCP --dport \u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -p TCP --sport \u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\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# autorise entree-sortie vers DNS \u0026amp;amp;lt;-\u0026amp;amp;gt; LAN, si est server DNS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.1 -m conntrack --ctstate ! INVALID -p TCP --dport \u003cspan style=\"color:#f99b15\"\u003e53\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -p TCP --sport \u003cspan style=\"color:#f99b15\"\u003e53\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\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# autorise entree-sortie vers Cups \u0026amp;amp;lt;-\u0026amp;amp;gt; LAN, si est server Cups\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.1 -m conntrack --ctstate ! INVALID -p TCP --dport \u003cspan style=\"color:#f99b15\"\u003e631\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -p TCP --sport \u003cspan style=\"color:#f99b15\"\u003e631\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eÉcrivez donc :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.1 -p TCP -m multiport --dports 22,53,631 -m conntrack --ctstate ! INVALID -j ACCEPT\niptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.0/24 -p TCP -m multiport --sports 22,53,631 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/multiport/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour gèrer le mode multiport avec Iptables","tags":["firewall","iptables","multiport","astuce"],"date_published":"2017-07-29T13:23:41+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/firewall/iptables-accept-passive-ftp#4708521560cf393ac47a06d51b6c1b4c78fb9380a3b21583dd7ff0bf0d26f599","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-accept-passive-ftp/","title":"iptables accepte de gèrer le mode FTP passif","author":{"name":"Stéphane HUC"},"content_text":"Description AttentionLes modules ip_conntrack, et ip_conntrack_ftp doivent être chargés ! iptables -A OUTPUT -o eth0 -p tcp --sport 1024: -m conntrack --ctstate ! INVALID -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 1024: -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT J\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","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\"\u003eLes modules \u003ccode\u003eip_conntrack\u003c/code\u003e, et \u003ccode\u003eip_conntrack_ftp\u003c/code\u003e doivent être chargés !\u003c/div\u003e\n\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A OUTPUT -o eth0 -p tcp --sport 1024: -m conntrack --ctstate ! INVALID -j ACCEPT\niptables -A INPUT -i eth0  -p tcp --dport 1024: -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/ftp_passif/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour gèrer les connexions en mode FTP passif avec Iptables","tags":["firewall","iptables","accept","FTP","astuce"],"date_published":"2017-07-29T13:07:00+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/firewall/iptables-accept-active-ftp#492f10cfcf05c264c776c1ed2fe2dd230802b61cb564e6a57fc09b1aef149b4c","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-accept-active-ftp/","title":"iptables accepte de gèrer le mode FTP actif","author":{"name":"Stéphane HUC"},"content_text":"Description Exemple de règles pour gèrer les connexions en mode FTP actif avec Iptables :\niptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 20,21 -m conntrack --ctstate ! INVALID -j ACCEPT iptables -A INPUT -i eth0 -p tcp -m multiport --dports 20,21 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT J\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eExemple de règles pour gèrer les connexions en mode FTP actif avec Iptables :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 20,21 -m conntrack --ctstate ! INVALID -j ACCEPT\niptables -A INPUT -i eth0  -p tcp -m multiport --dports 20,21 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/ftp_actif/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour gèrer les connexions en mode FTP actif avec Iptables","tags":["firewall","iptables","accept","FTP","astuce"],"date_published":"2017-07-29T12:38:55+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/firewall/iptables-limit-flood#81b032282d7338b8505db4c958ffd92842ef1988a2c2ae88fbef094f717a63b8","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-limit-flood/","title":"iptables limite le flood","author":{"name":"Stéphane HUC"},"content_text":"Description Une des attaques possible est de saturer votre interface réseau par un nombre conséquent de connexions ou tentatives de connexion dans un espace de temps très restreint.\nPour éviter de saturer l\u0026rsquo;interface réseau, on utilise une technique limitant le nombre de connexions au-delà desquelles toute autre tentative sera rejetée.\n⇒ TCP Syn flood :\niptables -A INPUT -i eth0 -p tcp --syn -m limit --limit 3/s -j ACCEPT\n⇒ UDP Syn flood :\niptables -A INPUT -i eth0 -p udp -m limit --limit 10/s -j ACCEPT\nAttentionATTENTION : Certains sites mettent le flag --syn après le protocole udp, sachez que ce flag n\u0026rsquo;existe pas pour le protocole udp. ⇒ Ping flood :\niptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT iptables -A INPUT -i eth0 -p icmp --icmp-type echo-reply -m limit --limit 1/s -j ACCEPT J\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUne des attaques possible est de saturer votre interface réseau par un nombre\nconséquent de connexions ou tentatives de connexion dans un espace de temps\ntrès restreint.\u003c/p\u003e\n\u003cp\u003ePour éviter de saturer l\u0026rsquo;interface réseau, on utilise une technique limitant\nle nombre de connexions au-delà desquelles toute autre tentative sera rejetée.\u003c/p\u003e\n\u003cp\u003e⇒ TCP Syn flood :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eiptables -A INPUT -i eth0 -p tcp --syn -m limit --limit 3/s -j ACCEPT\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ UDP Syn flood :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eiptables -A INPUT -i eth0 -p udp -m limit --limit 10/s -j ACCEPT\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\u003c/strong\u003e : Certains sites mettent le flag \u003ccode\u003e--syn\u003c/code\u003e après le protocole \u003ccode\u003eudp\u003c/code\u003e,\nsachez que ce flag n\u0026rsquo;existe pas pour le protocole udp.\u003c/div\u003e\n\n\u003cp\u003e⇒ Ping flood  :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT\niptables -A INPUT -i eth0 -p icmp --icmp-type echo-reply -m limit --limit 1/s -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/limit_flood/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour limiter le nombre de connexions avec Iptables","tags":["firewall","iptables","limit","flood","astuce"],"date_published":"2017-07-29T12:38:55+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/firewall/iptables-established-related-connections#a0929e0b6108fff4710528ef193b4301aa8b3734810ab0a629bb55c2e079f8b6","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-established-related-connections/","title":"iptables accept les connexions établies ou relatives","author":{"name":"Stéphane HUC"},"content_text":"Description ⇒ Règle simple, juste pour le protocole tcp :\niptables -A INPUT -i eth0 -d 192.168.0.1 -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -S 192.168.0.1 -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT ⇒ Règle plus évoluée, pour les protocoles icmp, tcp et udp :\niptables -A INPUT -p tcp ! --syn -m conntrack --ctstate ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp -m conntrack --ctstate RELATED -j ACCEPT iptables -A INPUT -p udp -m conntrack --ctstate ESTABLISHED -j ACCEPT iptables -A INPUT -p icmp -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT iptables -A OUTPUT -p tcp ! --syn -m conntrack --ctstate ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp -m conntrack --ctstate RELATED -j ACCEPT iptables -A OUTPUT -p udp -m conntrack --ctstate ESTABLISHED -j ACCEPT iptables -A OUTPUT -p icmp -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT J\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e⇒ Règle simple, juste pour le protocole tcp :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A INPUT -i eth0 -d 192.168.0.1 -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT\niptables -A OUTPUT -o eth0 -S 192.168.0.1 -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Règle plus évoluée, pour les protocoles icmp, tcp et udp :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A INPUT -p tcp ! --syn -m conntrack --ctstate ESTABLISHED -j ACCEPT\niptables -A INPUT -p tcp -m conntrack --ctstate RELATED -j ACCEPT\n\niptables -A INPUT -p udp -m conntrack --ctstate ESTABLISHED -j ACCEPT\niptables -A INPUT -p icmp -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\niptables -A OUTPUT -p tcp ! --syn -m conntrack --ctstate ESTABLISHED -j ACCEPT\niptables -A OUTPUT -p tcp -m conntrack --ctstate RELATED -j ACCEPT\n\niptables -A OUTPUT -p udp -m conntrack --ctstate ESTABLISHED -j ACCEPT\niptables -A OUTPUT -p icmp -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/accept_established/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour gèrer les connexions établies ou relatives avec Iptables","tags":["firewall","iptables","accept","established","related","astuce"],"date_published":"2017-07-29T12:30:33+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/ssh/home-chiffre#c5bdbe49ae3205a3a8edae877f3299c2b0846cb6b795c549c1ef2e22aeed20cf","url":"https://it-log.fr.eu.org/fr/sec/ssh/home-chiffre/","title":"SSH : Gestion de connexion avec Home chiffré","author":{"name":"Stéphane HUC"},"content_text":"Description Eh, oui, lorsqu\u0026rsquo;on utilise des comptes utilisateurs sur un ordinateur/serveur avec un \u0026ldquo;/home\u0026rdquo; chiffré… Adieu la connexion SSH avec les clés d\u0026rsquo;authentification !\nMais non… nous allons remédier à la situation.\nCréation d\u0026rsquo;un répertoire hors Home chiffré Le plus simple est de créer un répertoire hors votre Home chiffré, tel que $HOME/.ssh/$USER. Ce dernier peut être absolument ailleurs, tel que dans /etc/ssh… pourvu qu\u0026rsquo;il soit lisible hors chiffrement du répertoire Home.\n:# mkdir -p /home/.ssh/USER :# chown -R USER:USER /home/.ssh/USER :# chmod 0700 /home/.ssh/USER Bien sûr vous remplacez la mention USER par l\u0026rsquo;identifiant utilisateur désiré.\nPuis vous créez avec vos droits utilisateurs un fichier nommé authorized_keys où vous copiez votre clé d\u0026rsquo;authentification SSH, de préférence ED25519.\nN\u0026rsquo;oubliez pas de mettre des droits minimum dessus, tel que :\n$ chmod 0600 /home/.ssh/USER/authorized_keys\nModification fichier sshd_config Maintenant, il faut modifier le fichier de configuration du serveur SSH, à savoir /etc/ssh/sshd_config, pour modifier la ligne AuthorizedKeysFiles de telle manière :\n# sed -i -e \u0026quot;s#AuthorizedKeysFile %h/.ssh/authorized_keys#AuthorizedKeysFile /home/.ssh/%u/authorized_keys#\u0026quot; /etc/ssh/sshd_config\nVérifiez les droits d\u0026rsquo;accès et d\u0026rsquo;appartenances utilisateurs !\nOu, par tout autre moyen de votre crû, avec des droits administrateurs, bien sûr !\nPuis, relancez le service ssh ;-)\nEt, voilà !\nRemerciements source ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eEh, oui, lorsqu\u0026rsquo;on utilise des comptes utilisateurs sur un\nordinateur/serveur avec un \u0026ldquo;/home\u0026rdquo; chiffré… Adieu la connexion SSH avec les\nclés d\u0026rsquo;authentification !\u003c/p\u003e\n\u003cp\u003eMais non… nous allons remédier à la situation.\u003c/p\u003e\n\u003ch2 id=\"création-dun-répertoire-hors-home-chiffré\"\u003eCréation d\u0026rsquo;un répertoire hors Home chiffré\u003c/h2\u003e\n\u003cp\u003eLe plus simple est de créer un répertoire hors votre Home chiffré, tel\nque \u003ccode\u003e$HOME/.ssh/$USER\u003c/code\u003e. Ce dernier peut être absolument ailleurs, tel\nque dans \u003ccode\u003e/etc/ssh\u003c/code\u003e… pourvu qu\u0026rsquo;il soit lisible hors chiffrement du\nrépertoire Home.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# mkdir -p /home/.ssh/USER\n:# chown -R USER:USER /home/.ssh/USER\n:# chmod 0700 /home/.ssh/USER\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBien sûr vous remplacez la mention \u003ccode\u003eUSER\u003c/code\u003e par l\u0026rsquo;identifiant utilisateur\ndésiré.\u003c/p\u003e\n\u003cp\u003ePuis vous créez avec vos droits utilisateurs un fichier nommé\n\u003ccode\u003eauthorized_keys\u003c/code\u003e où vous copiez votre clé d\u0026rsquo;authentification SSH, de\npréférence ED25519.\u003c/p\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas de mettre des droits minimum dessus, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ chmod 0600 /home/.ssh/USER/authorized_keys\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"modification-fichier-sshd_config\"\u003eModification fichier sshd_config\u003c/h2\u003e\n\u003cp\u003eMaintenant, il faut modifier le fichier de configuration du serveur SSH,\nà savoir \u003ccode\u003e/etc/ssh/sshd_config\u003c/code\u003e, pour modifier la ligne\n\u003ccode\u003eAuthorizedKeysFiles\u003c/code\u003e de telle manière :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# sed -i -e \u0026quot;s#AuthorizedKeysFile     %h/.ssh/authorized_keys#AuthorizedKeysFile      /home/.ssh/%u/authorized_keys#\u0026quot; /etc/ssh/sshd_config\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVérifiez les droits d\u0026rsquo;accès et d\u0026rsquo;appartenances utilisateurs !\u003c/p\u003e\n\u003cp\u003eOu, par tout autre moyen de votre crû, avec des droits administrateurs,\nbien sûr !\u003c/p\u003e\n\u003cp\u003ePuis, relancez le service ssh ;-)\u003c/p\u003e\n\u003cp\u003eEt, voilà !\u003c/p\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://stephen.rees-carter.net/thought/encrypted-home-directories-ssh-key-authentication\" rel=\"external\"\u003esource\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment configurer SSH pour arriver à se connecter à son répertoire personnel chiffré !","tags":["SSH","HOME","Erreur"],"date_published":"2017-07-29T11:30:24+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/firewall/iptables-accept-lo#07397244b921cbddc51006075381082dc381015a62990066a8273f5ab52375e0","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-accept-lo/","title":"iptables accepte tout flux sur l'interface locale","author":{"name":"Stéphane HUC"},"content_text":"Description Permettre à l\u0026rsquo;interface locale de discuter est important !\n⇒ Autorise la connexion sur l\u0026rsquo;interface locale :\niptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT iptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT ⇒ règle simpliste :\niptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT J\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ePermettre à l\u0026rsquo;interface locale de discuter est important !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Autorise la connexion sur l\u0026rsquo;interface locale :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT\niptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ règle simpliste :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A INPUT -i lo -j ACCEPT\niptables -A OUTPUT -o lo -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/accept_lo/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour autoriser le flux sur l'interface locale avec Iptables","tags":["firewall","iptables","accept","lo","astuce"],"date_published":"2017-07-29T12:19:32+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/firewall/iptables-drop-null-xmas-scan#af04fa3f150f8fda33c10318ee25b4b869192a2d0769cc13f07e7e1bb5da5f3a","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-drop-null-xmas-scan/","title":"iptables refuse les scans NULL et XMAS","author":{"name":"Stéphane HUC"},"content_text":"Description Il existe un type de scan de port, dit XMAS et NULL ; pour s\u0026rsquo;en protéger :\niptables -A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP J\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eIl existe un type de scan de port, dit XMAS et NULL ; pour s\u0026rsquo;en protéger :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP\niptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP\niptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP\niptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/drop_xmas_nullscan/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour refuser les scans nommés NULL, XMAS avec Iptables","tags":["firewall","iptables","drop","scan","astuce"],"date_published":"2017-07-29T12:01:48+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/firewall/iptables-accept-ping#19117d3acf620f74ac619de134017ce53588b63e8b70dcd4dcd368a6b2324dff","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-accept-ping/","title":"iptables accepte de gèrer le ping","author":{"name":"Stéphane HUC"},"content_text":"Description ⇒ Règle simpliste :\niptables -A OUTPUT -o eth0 -p icmp -m conntrack --ctstate ! INVALID -j ACCEPT iptables -A INPUT -i eth0 -p icmp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT ⇒ Règles plus fines :\nAttentionATTENTION : Remplacez la mention adr_ip_gw par l\u0026rsquo;adresse ip de votre routeur/passerelle… celle-ci est précisée comme source ou destination parce que ce type d\u0026rsquo;ICMP ne doit être envoyé ou reçu que de votre passerelle. iptables -A INPUT -p icmp -m icmp --icmp-type0 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment \u0026#34;ICMP Echo reply\u0026#34; iptables -A INPUT -p icmp -m icmp --icmp-type3/0 -m conntrack --ctstate RELATED -j ACCEPT -m comment --comment \u0026#34;ICMP Destination Net Unreachable\u0026#34; iptables -A INPUT -p icmp -m icmp --icmp-type3/1 -m conntrack --ctstate RELATED -j ACCEPT -m comment --comment \u0026#34;ICMP Destination Host Unreachable\u0026#34; iptables -A INPUT -p icmp -m icmp --icmp-type8 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment \u0026#34;ICMP Echo mssg\u0026#34; iptables -A INPUT -s adr_ip_gw -p icmp -m icmp --icmp-type9 -m conntrack --ctstate RELATED -j ACCEPT -m comment --comment \u0026#34;ICMP Router Advert\u0026#34; iptables -A INPUT -s adr_ip_gw -p icmp -m icmp --icmp-type10 -m conntrack --ctstate NEW -j ACCEPT -m comment --comment \u0026#34;ICMP Router Select\u0026#34; iptables -A INPUT -p icmp -m icmp --icmp-type11 -m conntrack --ctstate RELATED -j ACCEPT -m comment --comment \u0026#34;ICMP Time exceeded\u0026#34; iptables -A INPUT -p icmp -m icmp --icmp-type12 -m conntrack --ctstate RELATED -j ACCEPT -m comment --comment \u0026#34;ICMP Param pb\u0026#34; iptables -A INPUT -p icmp -m icmp --icmp-type13 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment \u0026#34;ICMP Timestamp mssg\u0026#34; iptables -A INPUT -p icmp -m icmp --icmp-type14 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment \u0026#34;ICMP Timestamp reply\u0026#34; iptables -A INPUT -p icmp -m icmp --icmp-type17 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment \u0026#34;ICMP Addr Mask mssg\u0026#34; iptables -A INPUT -s adr_ip_gw -p icmp -m icmp --icmp-type18 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment \u0026#34;ICMP Addr Mask reply\u0026#34; iptables -A INPUT -p icmp -m icmp --icmp-type30 -m conntrack --ctstate NEW,RELATED -j ACCEPT -m comment --comment \u0026#34;ICMP Traceroute\u0026#34; iptables -A OUTPUT -p icmp -m icmp --icmp-type0 -m conntrack --ctstate ESTABLISHED -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type3/0 -m conntrack --ctstate RELATED -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type3/1 -m conntrack --ctstate RELATED -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type8 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -d adr_ip_gw -p icmp -m icmp --icmp-type9 -m conntrack --ctstate RELATED -j ACCEPT iptables -A OUTPUT -d adr_ip_gw -p icmp -m icmp --icmp-type10 -m conntrack --ctstate NEW -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type11 -m conntrack --ctstate RELATED -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type12 -m conntrack --ctstate RELATED -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type13 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type14 -m conntrack --ctstate ESTABLISHED -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type17 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -d adr_ip_gw -p icmp -m icmp --icmp-type18 -m conntrack --ctstate ESTABLISHED -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type30 -m conntrack --ctstate NEW,RELATED -j ACCEPT Je vous invite très fortement à lire ATTENTIVEMENT sur le filtrage d\u0026rsquo;ICMP sous Linux : Linux : firewall ICMP J\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e⇒ Règle simpliste :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A OUTPUT -o eth0 -p icmp -m conntrack --ctstate ! INVALID -j ACCEPT\niptables -A INPUT -i eth0 -p icmp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Règles plus fines :\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\nRemplacez la mention \u003cstrong\u003eadr_ip_gw\u003c/strong\u003e par l\u0026rsquo;adresse ip de votre routeur/passerelle… \u003cbr\u003e\ncelle-ci est précisée comme source ou destination parce que ce type d\u0026rsquo;ICMP\nne doit être envoyé ou reçu que de votre passerelle.\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\u003eiptables -A INPUT -p icmp -m icmp --icmp-type0 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Echo reply\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -p icmp -m icmp --icmp-type3/0  -m conntrack --ctstate RELATED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Destination Net Unreachable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -p icmp -m icmp --icmp-type3/1  -m conntrack --ctstate RELATED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Destination Host Unreachable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -p icmp -m icmp --icmp-type8  -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Echo mssg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -s adr_ip_gw -p icmp -m icmp --icmp-type9 -m conntrack --ctstate RELATED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Router Advert\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -s adr_ip_gw -p icmp -m icmp --icmp-type10 -m conntrack --ctstate NEW -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Router Select\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -p icmp -m icmp --icmp-type11  -m conntrack --ctstate RELATED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Time exceeded\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -p icmp -m icmp --icmp-type12  -m conntrack --ctstate RELATED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Param pb\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -p icmp -m icmp --icmp-type13  -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Timestamp mssg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -p icmp -m icmp --icmp-type14  -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Timestamp reply\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -p icmp -m icmp --icmp-type17  -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Addr Mask mssg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -s adr_ip_gw -p icmp -m icmp --icmp-type18  -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Addr Mask reply\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -p icmp -m icmp --icmp-type30  -m conntrack --ctstate NEW,RELATED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Traceroute\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\u003eiptables -A OUTPUT -p icmp -m icmp --icmp-type0 -m conntrack --ctstate ESTABLISHED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -p icmp -m icmp --icmp-type3/0 -m conntrack --ctstate RELATED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -p icmp -m icmp --icmp-type3/1 -m conntrack --ctstate RELATED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -p icmp -m icmp --icmp-type8 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -d adr_ip_gw -p icmp -m icmp --icmp-type9 -m conntrack --ctstate RELATED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -d adr_ip_gw -p icmp -m icmp --icmp-type10 -m conntrack --ctstate NEW -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -p icmp -m icmp --icmp-type11 -m conntrack --ctstate RELATED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -p icmp -m icmp --icmp-type12 -m conntrack --ctstate RELATED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -p icmp -m icmp --icmp-type13 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -p icmp -m icmp --icmp-type14 -m conntrack --ctstate ESTABLISHED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -p icmp -m icmp --icmp-type17 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -d adr_ip_gw -p icmp -m icmp --icmp-type18 -m conntrack --ctstate ESTABLISHED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -p icmp -m icmp --icmp-type30 -m conntrack --ctstate NEW,RELATED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eJe vous invite très fortement à lire ATTENTIVEMENT sur le filtrage d\u0026rsquo;ICMP\nsous Linux : \n\n\u003ca class=\"inside\" href=\"/fr/sec/firewall/linux-firewall-icmp/\" title=\"Lien interne vers l\u0026#39;article : 'Linux : firewall ICMP'\"\u003eLinux : firewall ICMP\u003c/a\u003e\n\n\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/ping/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour gèrer le ping avec Iptables","tags":["firewall","iptables","accept","ping","astuce"],"date_published":"2017-07-29T11:56:01+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/sec/firewall/iptables-drop-bogons#b9d5f527e6a33b389ece89ebb46cc4eed39391ce51d1b8a38b54429c8effd554","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-drop-bogons/","title":"iptables refuse les réseaux Bogons","author":{"name":"Stéphane HUC"},"content_text":"Description La RFC 1918 nous fait comprendre que les adresses de type privé ne doivent pas être publié sur Internet. De fait, puisque nul ne doit contacter l\u0026rsquo;interface réseau internet, il est bon de dropper tout flux qui y correspond !\nLa RFC 5735 définit l\u0026rsquo;ensemble des réseaux dits spécifiques, qu\u0026rsquo;il est bon de ne pas retrouver sur Internet !\niptables -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP # adr Class A privee iptables -A INPUT -i eth0 -s 100.64.0.0/10 -j DROP # définit par la RFC 6598 iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP # adr de Loopback iptables -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP # adr Link Local Network iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP # adr Class B privee iptables -A INPUT -i eth0 -s 192.0.0.0/24 -j DROP iptables -A INPUT -i eth0 -s 192.0.2.0/24 -j DROP # adr TEST-NET iptables -A INPUT -i eth0 -s 192.88.99.0/24 -j DROP iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP # adr Class C Privee iptables -A INPUT -i eth0 -s 198.18.0.0/15 -j DROP iptables -A INPUT -i eth0 -s 198.51.100.0/24 -j DROP iptables -A INPUT -i eth0 -s 203.0.113.0/24 -j DROP iptables -A INPUT -i eth0 -s 224.0.0.1/4 -j DROP # adr Class D MultiCast iptables -A INPUT -i eth0 -s 240.0.0.0/4 -j DROP # adr Class E Reservee iptables -A INPUT -i eth0 -s 255.255.255.255 -j DROP # aucun flux ne doit être de source avec l\u0026#39;adressage de loopbak... iptables -A OUTPUT -o eth0 -d 0.0.0.0/8 -j DROP iptables -A OUTPUT -o eth0 -d 10.0.0.0/8 -j DROP # adr Class A privee iptables -A OUTPUT -o eth0 -d 100.64.0.0/10 -j DROP # définit par la RFC 6598 iptables -A OUTPUT -o eth0 -d 127.0.0.0/8 -j DROP # adr de Loopback iptables -A OUTPUT -o eth0 -d 169.254.0.0/16 -j DROP # adr Link Local Network iptables -A OUTPUT -o eth0 -d 172.16.0.0/12 -j DROP # adr Class B privee iptables -A OUTPUT -o eth0 -d 192.0.0.0/24 -j DROP iptables -A OUTPUT -o eth0 -d 192.0.2.0/24 -j DROP # adr TEST-NET iptables -A OUTPUT -o eth0 -d 192.88.99.0/24 -j DROP iptables -A OUTPUT -o eth0 -d 192.168.0.0/16 -j DROP # adr Class C Privee iptables -A OUTPUT -o eth0 -d 198.18.0.0/15 -j DROP iptables -A OUTPUT -o eth0 -d 198.51.100.0/24 -j DROP iptables -A OUTPUT -o eth0 -d 203.0.113.0/24 -j DROP iptables -A OUTPUT -o eth0 -d 224.0.0.1/4 -j DROP # adr Class D MultiCast iptables -A OUTPUT -o eth0 -d 240.0.0.0/4 -j DROP # adr Class E Reservee iptables -A OUTPUT -o eth0 -d 255.255.255.255 ! -p icmp -j DROP # aucun flux ne doit être à destination avec l\u0026#39;adressage de loopbak, sauf sur le protocole ICMP... AttentionPensez à supprimer la ligne correspondant à votre réseau ! Documentations RFC 1918 , RFC 5735 J\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLa \u003cstrong\u003eRFC 1918\u003c/strong\u003e nous fait comprendre que les adresses de type privé ne doivent\npas être publié sur Internet. De fait, puisque nul ne doit contacter l\u0026rsquo;interface\nréseau internet, il est bon de dropper tout flux qui y correspond !\u003c/p\u003e\n\u003cp\u003eLa \u003cstrong\u003eRFC 5735\u003c/strong\u003e définit l\u0026rsquo;ensemble des réseaux dits spécifiques, qu\u0026rsquo;il est\nbon de ne pas retrouver sur Internet !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr Class A privee\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 100.64.0.0/10 -j DROP \u003cspan style=\"color:#776e71\"\u003e# définit par la RFC 6598\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr de Loopback\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP  \u003cspan style=\"color:#776e71\"\u003e# adr Link Local Network\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr Class B privee\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 192.0.0.0/24 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 192.0.2.0/24 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr TEST-NET\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 192.88.99.0/24 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr Class C Privee\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 198.18.0.0/15 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 198.51.100.0/24 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 203.0.113.0/24 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 224.0.0.1/4 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr Class D MultiCast\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 240.0.0.0/4 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr Class E Reservee\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -i eth0 -s 255.255.255.255 -j DROP \u003cspan style=\"color:#776e71\"\u003e# aucun flux ne doit être de source avec l\u0026#39;adressage de loopbak...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 0.0.0.0/8 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 10.0.0.0/8 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr Class A privee\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 100.64.0.0/10 -j DROP \u003cspan style=\"color:#776e71\"\u003e# définit par la RFC 6598\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 127.0.0.0/8 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr de Loopback\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 169.254.0.0/16 -j DROP  \u003cspan style=\"color:#776e71\"\u003e# adr Link Local Network\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 172.16.0.0/12 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr Class B privee\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 192.0.0.0/24 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 192.0.2.0/24 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr TEST-NET\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 192.88.99.0/24 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 192.168.0.0/16 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr Class C Privee\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 198.18.0.0/15 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 198.51.100.0/24 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 203.0.113.0/24 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 224.0.0.1/4 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr Class D MultiCast\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 240.0.0.0/4 -j DROP \u003cspan style=\"color:#776e71\"\u003e# adr Class E Reservee\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -o eth0 -d 255.255.255.255 ! -p icmp -j DROP \u003cspan style=\"color:#776e71\"\u003e# aucun flux ne doit être à destination avec l\u0026#39;adressage de loopbak, sauf sur le protocole ICMP...\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\"\u003ePensez à supprimer la ligne correspondant à votre réseau !\u003c/div\u003e\n\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.rfc-editor.org/info/rfc1918\" title=\"RFC Editor : Information à-propos de la RFC 1918\"\u003eRFC 1918\u003c/a\u003e\n, \u003ca href=\"https://www.rfc-editor.org/info/rfc5735\" title=\"RFC Editor : Information à-propos de la RFC 5735\"\u003eRFC 5735\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/drop_private2public/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour refuser les réseaux Bogons avec Iptables","tags":["firewall","iptables","drop","Bogons","astuce"],"date_published":"2017-07-29T11:49:33+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-29:/fr/web/nginx/perishablepress-6g#ad72dbfc3ca56c71d2a8b81deab482fda631188f3d8855bdfd1dfa198c11de14","url":"https://it-log.fr.eu.org/fr/web/nginx/perishablepress-6g/","title":"PerishablePress 6G pour nginx","author":{"name":"Stéphane HUC"},"content_text":"Description Le projet Perishable Press 6G est un projet de règles de filtrage pour le serveur Apache, version 2 de préférence, à utiliser dans le fichier .htaccess.\nPersonnellement, j\u0026rsquo;avoue préférer nginx.\nJe rappelle que les règles .htaccess n\u0026rsquo;existent pas pour nginx, même si on peut recréer le principe, de manière différente !\nDonc, j\u0026rsquo;ai eu l\u0026rsquo;idée de convertir ces règles de filtrage et autres blacklistages pour l\u0026rsquo;intégrer à l\u0026rsquo;usage que j\u0026rsquo;ai de nginx.\nÀ moins que je ne me trompe, cela devrait donner ce qui suit ci-dessous :\nConfiguration 6G:[QUERY STRINGS] Dans le fichier de configuration du domaine à gérer, contexte server :\n# 6G Perishable Press: Queries String # @ https://perishablepress.com/6g/ location ~* \u0026amp;quot;(eval\\()\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(127\\.0\\.0\\.1)\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;([a-z0-9]{2000})\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(javascript\\:)(.*)(\\;)\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(base64_encode)(.*)(\\()\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(GLOBALS|REQUEST)(=|\\[|%)\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(\u0026amp;lt;|%3C).*script.*(\u0026amp;gt;|%3)\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(\\|\\.\\.\\.|\\.\\./|~|`|\u0026amp;lt;|\u0026amp;gt;|\\|)\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(boot\\.ini|etc/passwd|self/environ)\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(thumbs?(_editor|open)?|tim(thumb)?)\\.php\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(\\\u0026#39;|\\\u0026amp;quot;)(.*)(drop|insert|md5|select|union)\u0026amp;quot; { return 444; } WordPress: plugin TimThumb Si jamais vous utilisez le plugin TimTumb, il vous faudra commenter la ligne suivante :\nlocation ~* \u0026amp;quot;(thumbs?(_editor|open)?|tim(thumb)?)\\.php\u0026amp;quot; { return 444; }\n6G:[REQUEST METHOD] Toujours dans le contexte server, utilisons la capacité native de nginx, si la connexion n\u0026rsquo;est pas de type GET, ou HEAD, alors bloquons le flux :\nif ($request_method !~ ^(GET|HEAD)$ ) { return 444; } Nuage informatique Pour ceux qui utilisent un serveur de nuage informatique, tel que Nextcloud, ajoutez au moins la méthode PUT, tel que :\nif ($request_method !~ ^(GET|HEAD|PUT)$ ) { return 444; } Formulaires Si vous avez dans votre site, des pages qui ont des formulaires qui envoient les données par la requête POST, ajoutez la dans la déclaration ci-dessus, tel que :\nif ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } 6G:[REFERRERS] Pour ce filtrage, utilisons la déclaration map, dans le contexte http du serveur :\n# @ https://perishablepress.com/6g/ map $http_referer $bad_referer { default 0; ~*\\{.*\\: 1; # ShellShock #~([a-z0-9]{2000}) 1; ~(?i)(semalt.com|todaperfeita) 1; La règle ~([a-z0-9]{2000}) 1; est mis en commentaire - je n\u0026rsquo;ai pas encore trouvé comment faire pour l\u0026rsquo;inclure sans retour d\u0026rsquo;erreur !\nPuis, rajouter dans le contexte server ladite déclaration :\nif ($bad_referer) { return 444; } 6G:[REQUEST STRINGS] Les filtres sur les requêtes sont toutes aussi simples que celles sur les queries… de type location, dans le contexte server :\n# 6G Perishable Press : Request String # @ https://perishablepress.com/6g/ location ~* \u0026amp;quot;(https?|ftp|php):/\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(=\\\\\u0026#39;|=\\%27|/\\\\\u0026#39;/?)\\.\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;/(\\$(\\\u0026amp;amp;)?|\\*|\\\u0026amp;quot;|\\.|,|\u0026amp;amp;|\u0026amp;amp;amp;?)/?$\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(\\{0\\}|\\(/\\(|\\.\\.\\.|\\+\\+\\+|\\\\\u0026amp;quot;\\\\\u0026amp;quot;)\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(~|`|\u0026amp;lt;|\u0026amp;gt;|:|;|,|%|\\|\\s|\\{|\\}|\\[|\\]|\\|)\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;/(=|\\$\u0026amp;amp;|_mm|(wp-)?config\\.|cgi-|etc/passwd|muieblack)\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;(\u0026amp;amp;pws=0|_vti_|\\(null\\)|\\{\\$itemURL\\}|echo(.*)kae|etc/passwd|eval\\(|self/environ)\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;\\.(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf)$\u0026amp;quot; { return 444; } location ~* \u0026amp;quot;/(^$|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell)\\.php\u0026amp;quot; { return 444; } CGI Pour ceux qui utilisent un service CGI, supprimez la mention cgi-| de la ligne suivante :\nlocation ~* \u0026amp;quot;/(=|\\$\u0026amp;amp;|_mm|(wp-)?config\\.|cgi-|etc/passwd|muieblack)\u0026amp;quot; { return 444; } 6G:[USER AGENTS] Là encore, utilisons l\u0026rsquo;astuce de la déclaration map, dans le contexte http :\n# @ https://perishablepress.com/6g/ map $http_user_agent $bad_bot { default 0; ~*\\{.*\\: 1; # ShellShock #~(?i)([a-z0-9]{2000}) 1; ~(?i)(archive.org|binlar|casper|checkpriv|choppy|clshttp|cmsworld|diavol|dotbot|extract|feedfinder|flicky|g00g1e|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|postrank|purebot|pycurl|python|seekerspider|siclab|skygrid|sqlmap|sucker|turnit|vikspider|winhttp|xxxyy|youda|zmeu|zune) 2; Puis écrivons dans le contexte server :\nif ($bad_bot) { return 444; } Et, voilà !\nPS : Pensez à redémarrer le serveur nginx, après avoir lancé le test de la config !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe projet \u003cstrong\u003e\u003ca href=\"https://perishablepress.com/6g\" rel=\"external\"\u003ePerishable Press 6G\u003c/a\u003e\u003c/strong\u003e est un projet de règles de filtrage\npour le serveur Apache, version 2 de préférence, à utiliser dans le\nfichier \u003ccode\u003e.htaccess\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePersonnellement, j\u0026rsquo;avoue préférer nginx.\u003c/p\u003e\n\u003cp\u003eJe rappelle que les règles .htaccess n\u0026rsquo;existent pas pour nginx, même si\non peut recréer le principe, de manière différente !\u003c/p\u003e\n\u003cp\u003eDonc, j\u0026rsquo;ai eu l\u0026rsquo;idée de convertir ces règles de filtrage et autres blacklistages\npour l\u0026rsquo;intégrer à l\u0026rsquo;usage que j\u0026rsquo;ai de nginx.\u003c/p\u003e\n\u003cp\u003eÀ moins que je ne me trompe, cela devrait donner ce qui suit ci-dessous :\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"6gquery-strings\"\u003e6G:[QUERY STRINGS]\u003c/h3\u003e\n\u003cp\u003eDans le fichier de configuration du domaine à gérer, contexte \u003ccode\u003eserver\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:#776e71\"\u003e# 6G Perishable Press: Queries String\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# @ https://perishablepress.com/6g/\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(eval\\()\u0026amp;quot\u003c/span\u003e;  \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(127\\.0\\.0\\.1)\u0026amp;quot\u003c/span\u003e;  \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e([a-z0-9]{2000})\u0026amp;quot\u003c/span\u003e;  \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(javascript\\:)(.*)(\\\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e)\u0026amp;quot\u003c/span\u003e;  \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(base64_encode)(.*)(\\()\u0026amp;quot\u003c/span\u003e;  \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(GLOBALS|REQUEST)(=|\\[|%)\u0026amp;quot\u003c/span\u003e;  \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(\u0026amp;lt\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e|%3C).*script.*(\u0026amp;gt\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e|%3)\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(\\|\\.\\.\\.|\\.\\./|~|`|\u0026amp;lt\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e|\u0026amp;gt\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e|\\|)\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(boot\\.ini|etc/passwd|self/environ)\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(thumbs?(_editor|open)?|tim(thumb)?)\\.php\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(\\\u0026#39;|\\\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e)(.*)(drop|insert|md5|select|union)\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\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\u003ch4 id=\"wordpress-plugin-timthumb\"\u003eWordPress: plugin TimThumb\u003c/h4\u003e\n\u003cp\u003eSi jamais vous utilisez le plugin TimTumb, il vous faudra commenter la ligne\nsuivante :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003elocation ~* \u0026amp;quot;(thumbs?(_editor|open)?|tim(thumb)?)\\.php\u0026amp;quot; { return 444; }\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"6grequest-method\"\u003e6G:[REQUEST METHOD]\u003c/h3\u003e\n\u003cp\u003eToujours dans le contexte \u003ccode\u003eserver\u003c/code\u003e, utilisons la capacité native de nginx,\nsi la connexion n\u0026rsquo;est pas de type GET, ou HEAD, alors bloquons 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-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$request_method\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e!~\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e^(GET|HEAD)\u003c/span\u003e$ \u003cspan style=\"color:#48b685\"\u003e)\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"nuage-informatique\"\u003eNuage informatique\u003c/h3\u003e\n\u003cp\u003ePour ceux qui utilisent un serveur de nuage informatique, tel que Nextcloud,\najoutez au moins la méthode \u003ccode\u003ePUT\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-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$request_method\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e!~\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e^(GET|HEAD|PUT)\u003c/span\u003e$ \u003cspan style=\"color:#48b685\"\u003e)\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"formulaires\"\u003eFormulaires\u003c/h3\u003e\n\u003cp\u003eSi vous avez dans votre site, des pages qui ont des formulaires qui envoient\nles données par la requête POST, ajoutez la dans la déclaration ci-dessus,\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-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$request_method\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e!~\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e^(GET|HEAD|POST)\u003c/span\u003e$ \u003cspan style=\"color:#48b685\"\u003e)\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"6greferrers\"\u003e6G:[REFERRERS]\u003c/h3\u003e\n\u003cp\u003ePour ce filtrage, utilisons la déclaration \u003ccode\u003emap\u003c/code\u003e, dans le contexte \u003ccode\u003ehttp\u003c/code\u003e\ndu 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-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# @ https://perishablepress.com/6g/\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003emap\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$http_referer\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$bad_referer\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault\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:#5bc4bf\"\u003e~*\\{.*\\:\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e; \u003cspan style=\"color:#776e71\"\u003e# ShellShock\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#~([a-z0-9]{2000}) 1;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e~(?i)(semalt.com|todaperfeita)\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 règle \u003ccode\u003e~([a-z0-9]{2000}) 1;\u003c/code\u003e  est mis en commentaire - je n\u0026rsquo;ai pas encore\ntrouvé comment faire pour l\u0026rsquo;inclure sans retour d\u0026rsquo;erreur !\u003c/p\u003e\n\u003cp\u003ePuis, rajouter dans le contexte \u003ccode\u003eserver\u003c/code\u003e ladite déclaration :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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$bad_referer\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"6grequest-strings\"\u003e6G:[REQUEST STRINGS]\u003c/h3\u003e\n\u003cp\u003eLes filtres sur les requêtes sont toutes aussi simples que celles sur les\n\u003ca href=\"/fr/web/nginx/perishablepress-6g/#6gquery-strings\"\u003equeries\u003c/a\u003e… de type \u003ccode\u003elocation\u003c/code\u003e, dans le contexte \u003ccode\u003eserver\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:#776e71\"\u003e# 6G Perishable Press : Request String\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# @ https://perishablepress.com/6g/\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(https?|ftp|php):/\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(=\\\\\u0026#39;|=\\%27|/\\\\\u0026#39;/?)\\.\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e/(\\$(\\\u0026amp;amp\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e)?|\\*|\\\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e|\\.|,|\u0026amp;amp\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e|\u0026amp;amp\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003eamp\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e?)/?$\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(\\{0\\}|\\(/\\(|\\.\\.\\.|\\+\\+\\+|\\\\\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e\\\\\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e)\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(~|`|\u0026amp;lt\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e|\u0026amp;gt\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e|:|\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e|,|%|\\|\\s|\\{|\\}|\\[|\\]|\\|)\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e/(=|\\$\u0026amp;amp\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e|_mm|(wp-)?config\\.|cgi-|etc/passwd|muieblack)\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e(\u0026amp;amp\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003epws=0|_vti_|\\(null\\)|\\{\\$itemURL\\}|echo(.*)kae|etc/passwd|eval\\(|self/environ)\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e\\.(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf)$\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e}\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e/(^$|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell)\\.php\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\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\u003ch4 id=\"cgi\"\u003eCGI\u003c/h4\u003e\n\u003cp\u003ePour ceux qui utilisent un service CGI, supprimez la mention \u003ccode\u003ecgi-|\u003c/code\u003e de la\nligne 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-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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026amp;quot\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e/(=|\\$\u0026amp;amp\u003c/span\u003e;\u003cspan style=\"color:#815ba4\"\u003e|_mm|(wp-)?config\\.|cgi-|etc/passwd|muieblack)\u0026amp;quot\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\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\u003ch3 id=\"6guser-agents\"\u003e6G:[USER AGENTS]\u003c/h3\u003e\n\u003cp\u003eLà encore, utilisons l\u0026rsquo;astuce de la déclaration \u003ccode\u003emap\u003c/code\u003e, dans le 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:#776e71\"\u003e# @ https://perishablepress.com/6g/\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003emap\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$http_user_agent\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$bad_bot\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault\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:#5bc4bf\"\u003e~*\\{.*\\:\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e; \u003cspan style=\"color:#776e71\"\u003e# ShellShock\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#~(?i)([a-z0-9]{2000}) 1;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e~(?i)(archive.org|binlar|casper|checkpriv|choppy|clshttp|cmsworld|diavol|dotbot|extract|feedfinder|flicky|g00g1e|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|postrank|purebot|pycurl|python|seekerspider|siclab|skygrid|sqlmap|sucker|turnit|vikspider|winhttp|xxxyy|youda|zmeu|zune)\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis écrivons dans le contexte \u003ccode\u003eserver\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\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$bad_bot\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\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\u003ePS : Pensez à redémarrer le serveur nginx, après avoir lancé le test de la config !\u003c/p\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Comment paramétrer les règles de blocage d'adresses IP du projet 'Perishable Press 6G' avec nginx","tags":["nginx","block","PerishablePress","6G"],"date_published":"2017-07-29T10:52:11+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-28:/fr/sec/firewall/iptables-ip-forward#af4562aedd1dc6b9ecfaeec8d3e6de73e4f5f34d9af94455f4a4d439ff0b685d","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-ip-forward/","title":"iptables partage la connexion internet","author":{"name":"Stéphane HUC"},"content_text":"Description AstuceÀ utiliser pour une machine faisant office de passerelle… Partager une connexion sous linux est assez simple…\n⇒ Dans un premier temps, il faut autoriser la redirection d\u0026rsquo;IP, avec des droits administrateur :\n# echo 1 \u0026gt; /proc/sys/net/ipv4/ip_forward\n⇒ Ensuite autoriser la redirection avec iptables\nAvec une adresse ip extérieur statique : iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 1.2.3.4 où l\u0026rsquo;adresse IP 1.2.3.4 est à remplacer par votre réelle adresse IP extèrieure.\nAvec une adresse ip extérieur dynamique : iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE\nConfiguration ⇒ Ajouter à votre fichier /etc/sysctl.conf :\nnet.ipv4.ip_forward=1\nExemples iptables -A FORWARD -i eth0 -o ppp0 -s 192.168.0.0/24 -m conntrack --ctstate ! INVALID -j ACCEPT iptables -A FORWARD -i ppp0 -o eth0 -d 192.168.0.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE J\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\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\"\u003eÀ utiliser pour une machine faisant office de passerelle…\u003c/div\u003e\n\n\u003cp\u003ePartager une connexion sous linux est assez simple…\u003c/p\u003e\n\u003cp\u003e⇒ Dans un premier temps, il faut autoriser la redirection d\u0026rsquo;IP, avec des\ndroits administrateur :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# echo 1 \u0026gt; /proc/sys/net/ipv4/ip_forward\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Ensuite autoriser la redirection avec iptables\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAvec une adresse ip extérieur statique : \u003cbr\u003e\n\u003ccode\u003eiptables -t nat -A POSTROUTING -o eth1  -j SNAT --to 1.2.3.4\u003c/code\u003e \u003cbr\u003e\noù  l\u0026rsquo;adresse IP \u003ccode\u003e1.2.3.4\u003c/code\u003e est à remplacer par votre réelle adresse IP\nextèrieure.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAvec une adresse ip extérieur dynamique : \u003cbr\u003e\n\u003ccode\u003eiptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003e⇒ Ajouter à votre fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003enet.ipv4.ip_forward=1\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A FORWARD -i eth0 -o ppp0 -s 192.168.0.0/24 -m conntrack --ctstate ! INVALID -j ACCEPT\niptables -A FORWARD -i ppp0 -o eth0 -d 192.168.0.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\niptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/partage_connexion/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour partager une connexion vers Internet avec Iptables","tags":["firewall","iptables","forward","astuce"],"date_published":"2017-07-28T16:09:39+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-28:/fr/sec/ssh/connaitre-protocole-ssh#ee7489d2bd2de6ba01229ec39313e226154b000a471a6a66454ae6e79bc44d06","url":"https://it-log.fr.eu.org/fr/sec/ssh/connaitre-protocole-ssh/","title":"SSH : Mieux Connaître le Protocole SSH","author":{"name":"Stéphane HUC"},"content_text":"Installation d\u0026rsquo;OpenSSH Debian \u0026amp; *Buntu Sur une Debian GNU/Linux, ou une *Buntu, et autre dérivées : apt install ssh…\nQuelle que soit la distribution Linux utilisé, le fichier de configuration se trouve être /etc/ssh/sshd_config*.\nOpenBSD Sur OpenBSD, c\u0026rsquo;est installé dans le système de base !\nUtilisation de SSH SSH est très facile à utiliser :\nConnexion à distance vers le serveur ssh server.domaine.com ou ssh adresse_ip est la méthode de base.\nDans ce cas, si la connexion se fait, il vous sera demandé votre nom d\u0026rsquo;utilisateur sur ce serveur, et le mot de passe correspondant.\nssh votre_nom_user@server.domaine.com ou ssh -l votre_nom_user server.domaine.com est la manière de spécifier explicitement votre nom d\u0026rsquo;utilisateur.\nDans ce cas, dès la connexion établie, il ne vous sera demandé plus que le mot de passe correspondant à votre identifiant utilisateur.\nExécution de commandes à distance Il suffit d\u0026rsquo;établir une connexion avec la commande à lancer : ssh votre_nom_user@server.domaine.com date\nPrécisément, cette commande interroge le serveur pour connaître ses date et heure.\nCopie de fichier à distance C\u0026rsquo;est la commande scp, tout autant sécurisée, qui le permet aussi simplement.\nscp monfichier votre_nom_user@server.domaine.com:/~/ enverra le fichier dans votre répertoire personnel sur le serveur en question.\nscp votre_nom_user@server.domaine.com:/~/monfichier monfichier ira chercher sur le serveur votre fichier et le déposera dans votre répertoire en cours.\nPour faire une copie récursive d\u0026rsquo;un répertoire : ssh -r /votre_rep votre_nom_user@server.domaine.com:/~/\nTransfert ftp Le transfert de fichiers par ftp, de manière sécurisée, est aussi possible…\nUtilisez la commande suivante : sftp votre_nom_user@server.domaine.com\nCertains clients FTP graphique acceptent ce mode de connexion, il suffit de choisir le mode de connexion sftp over SSH2.\nAuthentification sécurisée par SSH Configuration du service OpenSSH permet des méthodes diverses d\u0026rsquo;authentification, et ce en fonction de la politique de sécurité privilégiée.\nUne des premières choses à faire est d\u0026rsquo;interdire l\u0026rsquo;accès au compte root, afin de ne pas \u0026ldquo;tenter le diable\u0026rdquo; : Il faut donc modifier la ligne PermitRootLogin en lui donnant la valeur no. Forcer la sécurité sur la deuxième version du protocole est à envisager sérieusement ; par la modification de la ligne Protocol en lui donnant la valeur 2 (version de protocole plus sécurisée) Créer l\u0026rsquo;authentification par mot de passe, et interdire les mots de passe vides. Donc s\u0026rsquo;assurer que la ligne PasswdAuthentication soit à yes et que PermitEmptypasswords soit à no. Encourager l\u0026rsquo;authentification par clé publique est à promouvoir ; car une clé appartient à un utilisateur et un seul\u0026hellip; Cela signifie positionner la ligne PubkeyAuthentication à yes et supprimer le symbole dièze devant la ligne AutorizedKeysFile. Pour finir par supprimer les protocoles moins sécurisés : ce qui signifie d\u0026rsquo;imposer aux lignes RSAAuthentication, RhostsAuthentication, RhostsRSAAuthentication et HostbasedAuthentication la valeur no et d\u0026rsquo;ignorer IgnoreRhosts par yes, si elles sont présentes dans le fichier ! Pour information, il est possible de manière rudimentaire et exclusive de spécifier les autorisations uniquement à certains utilisateurs ou à un groupe d\u0026rsquo;utilisateurs. On se servira pour cela des directives AllowUsers et AllowGroups que l\u0026rsquo;on ajoutera au fichier de configuration. Une fois le fichier sshd_config modifié, pensez donc à (re)démarrer le service : /etc/init.d/sshd restart ou service ssh restart\nUsage de clé publique L\u0026rsquo;usage de clé publique ayant été notifié dans le fichier de configuration et aux utilisateurs,il est possible de les créer par la commande suivante ssh-keygen.\nssh-keygen -t rsa -b 2048 AttentionATTENTION : Il est recommandé les deux choses suivantes :\nne pas générer des clés plus petites que 2048 bits , préférez une valeur de 4096 bits ; de même, les protocoles de chiffrement DSA et ECDSA ne doivent plus être utilisés … utilisez RSA ou au mieux un protocole de chiffrement à courbes elliptiques, tel ed25519 ! Pour plus d\u0026rsquo;informations, veuillez lire mon autre article\nLors de la génération de celle-ci, il vous sera demandé de taper une passphrase que vous choisirez consciencieusement.\nDans un cas, comme dans l\u0026rsquo;autre, cela crée une clé privée et une clé publique dans votre répertoire personnel $HOME/.ssh/ ; pour les clés RSA, ce sont les fichiers id_rsa et id_rsa.pub, et réciproquement pour les autres clés.\nVeillez à ne jamais fournir la clé privée, et ce sous aucun prétexte. Votre sécurité en dépend fortement !\nUne fois, vos clés générées, copiez votre clé publique sur le serveur : scp -p $HOME/.ssh/id_rsa.pub votre_nom_user@server.domaine.com:/~/.ssh/authorized_keys\nEnsuite on va garder en mémoire la passphrase dans notre ordinateur afin de ne pas être obligé de la taper à chaque fois : eval ssh-agent ssh-add Pour la dernière fois, il va vous être demandé de taper votre passphrase, faites-le.\nLors de vos prochaines connexions en SSH sur le serveur, il ne vous restera plus… qu\u0026rsquo;à travailler !\nCréation de Tunnel Pour créer un tunnel de connexion ssh, qui permette d\u0026rsquo;encapsuler d\u0026rsquo;autres protocoles, il vous faut vous l\u0026rsquo;écrire ainsi : ssh -L numero_port_encapsulé:adresse_ip_local:numero_port_routé adresse_ip_server\nL\u0026rsquo;option -L indique l\u0026rsquo;exécution locale, L\u0026rsquo;option -R indique l\u0026rsquo;exécution à distance. Tunnel X Pour créer un tunnel graphique X-Windows, il faut d\u0026rsquo;abord vérifier que l\u0026rsquo;option X11 Forwarding soit à yes dans le fichier /etc/ssh/sshd_config.\nCela étant fait, il ne vous reste plus qu\u0026rsquo;à vous connecter à votre hote distant : ssh -X nom_machine.nom_domaine.tld\nIl est possible de lancer en même temps une application : ssh -X nom_machine.nom_domaine.tld nom_logiciel \u0026amp;\nCe mémo a été écrit la première fois, par mes soins, sur mon autre site \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"installation-dopenssh\"\u003eInstallation d\u0026rsquo;OpenSSH\u003c/h2\u003e\n\u003ch3 id=\"debian--buntu\"\u003eDebian \u0026amp; *Buntu\u003c/h3\u003e\n\u003cp\u003eSur une Debian GNU/Linux, ou une *Buntu, et autre dérivées :\n\u003ccode\u003eapt install ssh\u003c/code\u003e…\u003c/p\u003e\n\u003cp\u003eQuelle que soit la distribution Linux utilisé, le fichier de\nconfiguration se trouve être \u003ccode\u003e/etc/ssh/sshd_config*\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"openbsd\"\u003eOpenBSD\u003c/h3\u003e\n\u003cp\u003eSur OpenBSD, c\u0026rsquo;est installé dans le système de base !\u003c/p\u003e\n\u003ch2 id=\"utilisation-de-ssh\"\u003eUtilisation de SSH\u003c/h2\u003e\n\u003cp\u003eSSH est très facile à utiliser :\u003c/p\u003e\n\u003ch3 id=\"connexion-à-distance-vers-le-serveur\"\u003eConnexion à distance vers le serveur\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003essh server.domaine.com\u003c/code\u003e ou \u003ccode\u003essh adresse_ip\u003c/code\u003e est la méthode de base.\u003c/p\u003e\n\u003cp\u003eDans ce cas, si la connexion se fait, il vous sera demandé votre nom\nd\u0026rsquo;utilisateur sur ce serveur, et le mot de passe correspondant.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003essh votre_nom_user@server.domaine.com\u003c/code\u003e ou\n\u003ccode\u003essh -l votre_nom_user server.domaine.com\u003c/code\u003e est la manière de spécifier\nexplicitement votre nom d\u0026rsquo;utilisateur.\u003c/p\u003e\n\u003cp\u003eDans ce cas, dès la connexion établie, il ne vous sera demandé plus que\nle mot de passe correspondant à votre identifiant utilisateur.\u003c/p\u003e\n\u003ch3 id=\"exécution-de-commandes-à-distance\"\u003eExécution de commandes à distance\u003c/h3\u003e\n\u003cp\u003eIl suffit d\u0026rsquo;établir une connexion avec la commande à lancer : \u003cbr\u003e\n\u003ccode\u003essh votre_nom_user@server.domaine.com date\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePrécisément, cette commande interroge le serveur pour connaître ses date\net heure.\u003c/p\u003e\n\u003ch3 id=\"copie-de-fichier-à-distance\"\u003eCopie de fichier à distance\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est la commande \u003ccode\u003escp\u003c/code\u003e, tout autant sécurisée, qui le permet aussi\nsimplement.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003escp monfichier votre_nom_user@server.domaine.com:/~/\u003c/code\u003e enverra le\nfichier dans votre répertoire personnel sur le serveur en question.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003escp votre_nom_user@server.domaine.com:/~/monfichier monfichier\u003c/code\u003e ira\nchercher sur le serveur votre fichier et le déposera dans votre\nrépertoire en cours.\u003c/p\u003e\n\u003cp\u003ePour faire une copie récursive d\u0026rsquo;un répertoire :\n\u003ccode\u003essh -r /votre_rep votre_nom_user@server.domaine.com:/~/\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"transfert-ftp\"\u003eTransfert ftp\u003c/h3\u003e\n\u003cp\u003eLe transfert de fichiers par ftp, de manière sécurisée, est aussi\npossible…\u003c/p\u003e\n\u003cp\u003eUtilisez la commande suivante : \u003ccode\u003esftp votre_nom_user@server.domaine.com\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCertains clients FTP graphique acceptent ce mode de connexion, il suffit\nde choisir le mode de connexion \u003cstrong\u003esftp over SSH2\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"authentification-sécurisée-par-ssh\"\u003eAuthentification sécurisée par SSH\u003c/h2\u003e\n\u003ch3 id=\"configuration-du-service\"\u003eConfiguration du service\u003c/h3\u003e\n\u003cp\u003eOpenSSH permet des méthodes diverses d\u0026rsquo;authentification, et ce en\nfonction de la politique de sécurité privilégiée.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUne des premières choses à faire est d\u0026rsquo;interdire l\u0026rsquo;accès au compte root, afin de ne pas \u0026ldquo;tenter le diable\u0026rdquo; : \u003cbr\u003e Il faut donc modifier la ligne \u003ccode\u003ePermitRootLogin\u003c/code\u003e en lui donnant la valeur \u003cstrong\u003eno\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eForcer la sécurité sur la deuxième version du protocole est à envisager sérieusement ; \u003cbr\u003e par la modification de la ligne \u003cstrong\u003eProtocol\u003c/strong\u003e en lui donnant la valeur \u003ccode\u003e2\u003c/code\u003e \u003cem\u003e(version de protocole plus sécurisée)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eCréer l\u0026rsquo;authentification par mot de passe, et interdire les mots de passe vides. \u003cbr\u003e Donc s\u0026rsquo;assurer que la ligne \u003ccode\u003ePasswdAuthentication\u003c/code\u003e soit à \u003ccode\u003eyes\u003c/code\u003e et que \u003ccode\u003ePermitEmptypasswords\u003c/code\u003e soit à \u003ccode\u003eno\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eEncourager l\u0026rsquo;authentification par clé publique est à promouvoir ; car une clé appartient à un utilisateur et un seul\u0026hellip; \u003cbr\u003e Cela signifie positionner la ligne \u003ccode\u003ePubkeyAuthentication\u003c/code\u003e à \u003ccode\u003eyes\u003c/code\u003e et supprimer le symbole dièze devant la ligne \u003ccode\u003eAutorizedKeysFile\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ePour finir par supprimer les protocoles moins sécurisés : \u003cbr\u003e ce qui signifie d\u0026rsquo;imposer aux lignes \u003ccode\u003eRSAAuthentication\u003c/code\u003e, \u003ccode\u003eRhostsAuthentication\u003c/code\u003e, \u003ccode\u003eRhostsRSAAuthentication\u003c/code\u003e et \u003ccode\u003eHostbasedAuthentication\u003c/code\u003e la valeur \u003ccode\u003eno\u003c/code\u003e et d\u0026rsquo;ignorer \u003ccode\u003eIgnoreRhosts\u003c/code\u003e par \u003ccode\u003eyes\u003c/code\u003e, si elles sont présentes dans le fichier !\u003c/li\u003e\n\u003cli\u003ePour information, il est possible de manière rudimentaire et exclusive de spécifier les autorisations uniquement à certains utilisateurs ou à un groupe d\u0026rsquo;utilisateurs. \u003cbr\u003e On se servira pour cela des directives \u003ccode\u003eAllowUsers\u003c/code\u003e et \u003ccode\u003eAllowGroups\u003c/code\u003e que l\u0026rsquo;on ajoutera au fichier de configuration.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne fois le fichier \u003ccode\u003esshd_config\u003c/code\u003e modifié, pensez donc à\n(re)démarrer le service : \u003cbr\u003e\n\u003ccode\u003e/etc/init.d/sshd restart\u003c/code\u003e ou \u003ccode\u003eservice ssh restart\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"usage-de-clé-publique\"\u003eUsage de clé publique\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;usage de clé publique ayant été notifié dans le fichier de\nconfiguration et aux utilisateurs,il est possible de les créer par la\ncommande suivante \u003ccode\u003essh-keygen\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003essh-keygen -t rsa -b 2048\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\u003eATTENTION : Il est recommandé les deux choses suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan class=\"red\"\u003ene pas générer des clés plus petites que 2048 bits\u003c/span\u003e\n, \u003cstrong\u003epréférez\u003c/strong\u003e une valeur de\n\u003cstrong\u003e4096 bits\u003c/strong\u003e ;\u003c/li\u003e\n\u003cli\u003ede même, \u003cspan class=\"red\"\u003eles protocoles de chiffrement \u003cstrong\u003eDSA\u003c/strong\u003e et\n\u003cstrong\u003eECDSA\u003c/strong\u003e ne doivent plus être utilisés\u003c/span\u003e\n… \u003cstrong\u003eutilisez RSA\u003c/strong\u003e ou au mieux un protocole de chiffrement à courbes elliptiques, tel ed25519 !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour plus d\u0026rsquo;informations, veuillez lire mon autre \u003ca class=\"inside\" href=\"/fr/sec/ssh/configuration-securisee/\" title=\"Lien interne vers l\u0026#39;article : 'SSH : Configuration Sécurisée'\"\u003earticle\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eLors de la génération de celle-ci, il vous sera demandé de taper une\npassphrase que vous choisirez consciencieusement.\u003c/p\u003e\n\u003cp\u003eDans un cas, comme dans l\u0026rsquo;autre, cela crée une clé privée et une clé\npublique dans votre répertoire personnel \u003ccode\u003e$HOME/.ssh/\u003c/code\u003e ; \u003cbr\u003e pour les\nclés RSA, ce sont les fichiers \u003cstrong\u003eid_rsa\u003c/strong\u003e et \u003cstrong\u003eid_rsa.pub\u003c/strong\u003e,\net réciproquement pour les autres clés.\u003c/p\u003e\n\u003cp\u003e\u003cspan em\u003eVeillez à ne jamais fournir la clé privée, et ce sous aucun\nprétexte. Votre sécurité en dépend fortement !\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003eUne fois, vos clés générées, copiez votre clé publique sur le serveur : \u003cbr\u003e\n\u003ccode\u003escp -p $HOME/.ssh/id_rsa.pub votre_nom_user@server.domaine.com:/~/.ssh/authorized_keys\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEnsuite on va garder en mémoire la passphrase dans notre ordinateur afin\nde ne pas être obligé de la taper à chaque fois : \u003cbr\u003e\n\u003ccode\u003eeval ssh-agent ssh-add\u003c/code\u003e \u003cbr\u003e\nPour la dernière fois, il va vous être demandé de taper votre passphrase, faites-le.\u003c/p\u003e\n\u003cp\u003eLors de vos prochaines connexions en SSH sur le serveur, il ne vous\nrestera plus… qu\u0026rsquo;à travailler !\u003c/p\u003e\n\u003ch3 id=\"création-de-tunnel\"\u003eCréation de Tunnel\u003c/h3\u003e\n\u003cp\u003ePour créer un tunnel de connexion ssh, qui permette d\u0026rsquo;encapsuler\nd\u0026rsquo;autres protocoles, il vous faut vous l\u0026rsquo;écrire ainsi : \u003cbr\u003e\n\u003ccode\u003essh -L numero_port_encapsulé:adresse_ip_local:numero_port_routé adresse_ip_server\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eL\u0026rsquo;option \u003ccode\u003e-L\u003c/code\u003e indique l\u0026rsquo;exécution locale,\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;option \u003ccode\u003e-R\u003c/code\u003e indique l\u0026rsquo;exécution à distance.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"tunnel-x\"\u003eTunnel X\u003c/h3\u003e\n\u003cp\u003ePour créer un tunnel graphique X-Windows, il faut d\u0026rsquo;abord vérifier que\nl\u0026rsquo;option \u003ccode\u003eX11 Forwarding\u003c/code\u003e soit à \u003ccode\u003eyes\u003c/code\u003e dans le fichier\n\u003ccode\u003e/etc/ssh/sshd_config\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eCela étant fait, il ne vous reste plus qu\u0026rsquo;à vous connecter à votre hote\ndistant : \u003cbr\u003e \u003ccode\u003essh -X nom_machine.nom_domaine.tld\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl est possible de lancer en même temps une application : \u003cbr\u003e\n\u003ccode\u003essh -X nom_machine.nom_domaine.tld nom_logiciel \u0026amp;\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eCe mémo a été écrit la première fois, par mes soins, sur mon autre site\n\u0026ldquo;\u003ca href=\"https://memoire-grise-liberee.fr.eu.org/Linux/securite/ssh/\" rel=\"external\"\u003eMémoire Grise\nLibérée\u003c/a\u003e\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n","summary":"Apprendre ce qu'est SSH : son protocole, son usage correct au quotidien, ses particularités.","tags":["SSH"],"date_published":"2017-07-28T14:59:05+01:00","date_modified":"2020-02-19T15:51:05+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-28:/fr/sec/firewall/iptables-accept-lan#5ae874b5e5bd92b1252fa4fc087bb70ebf961ae4b5347c349524551401f70bff","url":"https://it-log.fr.eu.org/fr/sec/firewall/iptables-accept-lan/","title":"iptables accept le trafic interne au LAN","author":{"name":"Stéphane HUC"},"content_text":"Description ⇒ Demander à iptables d\u0026rsquo;accepter tout le trafic de votre ip vers votre lan, en admettant que vos machines soient sur un réseau de classe C, dont le segment est 192.168.0.0 :\niptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.0 / 24 -m conntrack --ctstate ! INVALID -j ACCEPT iptables -A INPUT -i eth0 -s 192.168.0.0 / 24 -d 192.168.0.1 -m conntrack --ctstate ! INVALID -j ACCEPT ⇒ Accepter le flux de type broadcast :\niptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.255 -m conntrack --ctstate ! INVALID -j ACCEPT iptables -A INPUT -i eth0 -s 192.168.0.255 -d 192.168.0.1 -m conntrack --ctstate ! INVALID -j ACCEPT ⇒ Accepter le flux BootDHCP vers LAN :\niptables -A INPUT -i eth0 -p udp --sport bootpc --dport bootps -m conntrack --ctstate NEW -j ACCEPT J\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;Mémoire Grise Libérée\u0026rdquo;.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e⇒ Demander à iptables d\u0026rsquo;accepter tout le trafic de votre ip vers votre lan,\nen admettant que vos machines soient sur un réseau de classe C, dont le\nsegment est 192.168.0.0 :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.0 / 24 -m conntrack --ctstate ! INVALID -j ACCEPT\niptables -A INPUT  -i eth0 -s 192.168.0.0 / 24 -d 192.168.0.1 -m conntrack --ctstate ! INVALID -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Accepter le flux de type broadcast :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A OUTPUT -o eth0 -s 192.168.0.1  -d 192.168.0.255 -m conntrack --ctstate ! INVALID  -j ACCEPT\niptables -A INPUT  -i eth0 -s 192.168.0.255 -d 192.168.0.1  -m conntrack --ctstate ! INVALID  -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Accepter le flux BootDHCP vers LAN :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eiptables -A INPUT  -i eth0 -p udp --sport bootpc --dport bootps -m conntrack --ctstate NEW -j ACCEPT\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit ce mémo, pour la première fois, sur mon autre site : \u0026ldquo;\u003ca href=\"http://memoire-grise-liberee.fr.eu.org/Linux/IpTables/FAQ/accept_ip2lan/\" rel=\"external\"\u003eMémoire Grise Libérée\u003c/a\u003e\u0026rdquo;.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Exemple de règles pour gèrer les connexions venant seulement des autres machines sur le LAN avec Iptables","tags":["firewall","iptables","accept","LAN","astuce"],"date_published":"2017-07-28T15:22:49+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-28:/fr/sec/linux/durcir-kernel-modules#39bce1f86e2922cd1dc25cbdc40d5443222c4ae4428453e5b81f0c188b540f50","url":"https://it-log.fr.eu.org/fr/sec/linux/durcir-kernel-modules/","title":"Durcir Linux : désactiver les modules noyau","author":{"name":"Stéphane HUC"},"content_text":"Description Ou, comment titrer : Améliorons l\u0026rsquo;intégrité du noyau en désactivant la gestion des modules !\nEn effet, pour améliorer l\u0026rsquo;intégrité du noyau, il est possible, même recommandé, de désactiver la gestion des modules ; cela a pour propos d\u0026rsquo;empêcher que quiconque ayant un accès machine puisse charger un module indésirable.\nConfiguration AttentionGardez à l\u0026rsquo;esprit que si vous désactivez la gestion des modules, cela risque de vous poser des problèmes de gestion matérielle sur une station… Exemple : impossible d\u0026rsquo;utiliser des périphériques USB.\nPréférez utiliser cela sur un serveur.\nVous êtes prévenus !\nsysctl Le sous-système sysctl nous permet d\u0026rsquo;activer ou de désactiver la gestion des modules par la variable kernel.modules_disabled.\nUne valeur à 0 permet la gestion des modules, tandis qu\u0026rsquo;une valeur à 1 désactive la gestion des modules ! De même, il est possible, bien-sûr, de le gérer à-partir du fichier /etc/sysctl.conf.\nMise en garde Votre système d\u0026rsquo;exploitation fonctionnera, certes, mais seulement en partie ! Bref, il faut avouer : c\u0026rsquo;est assez ennuyeux, voire ennuyant…\nL\u0026rsquo;astuce est de configurer le fichier /etc/rc.local - qui est appelé en dernier au chargement du système, du moins sur Debian et *Buntu - en incluant la commande suivante :\nsysctl -w kernel.modules_disabled=1\nmais de laisser la valeur de cette variable à 0 dans le fichier de configuration de sysctl !\nAinsi le système au démarrage chargera tous les modules nécessaires à son bon fonctionnement, et ensuite, interdira tout autre chargement de modules non autorisé !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOu, comment titrer : \u003cstrong\u003eAméliorons l\u0026rsquo;intégrité du noyau en désactivant la gestion des modules !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eEn effet, pour améliorer l\u0026rsquo;intégrité du noyau, il est possible, même recommandé,\nde désactiver la gestion des modules ; cela a pour propos d\u0026rsquo;empêcher que\nquiconque ayant un accès machine puisse charger un module indésirable.\u003c/p\u003e\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\"\u003e\u003cp\u003eGardez à l\u0026rsquo;esprit que si vous désactivez la gestion des modules,\ncela risque de vous poser des problèmes de gestion matérielle sur une station… \u003cbr\u003e\n\u003cem\u003eExemple : impossible d\u0026rsquo;utiliser des périphériques USB.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003ePréférez utiliser cela sur un serveur.\u003c/p\u003e\n\u003cp\u003e\u003cspan class=\"red\"\u003eVous êtes prévenus !\u003c/span\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"sysctl\"\u003esysctl\u003c/h3\u003e\n\u003cp\u003eLe sous-système \u003ccode\u003esysctl\u003c/code\u003e nous permet d\u0026rsquo;activer ou de désactiver la gestion\ndes modules par la variable \u003ccode\u003ekernel.modules_disabled\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUne valeur à \u003ccode\u003e0\u003c/code\u003e permet la gestion des modules,\u003c/li\u003e\n\u003cli\u003etandis qu\u0026rsquo;une valeur à \u003ccode\u003e1\u003c/code\u003e désactive la gestion des modules !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDe même, il est possible, bien-sûr, de le gérer à-partir du fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"mise-en-garde\"\u003eMise en garde\u003c/h3\u003e\n\u003cp\u003eVotre système d\u0026rsquo;exploitation fonctionnera, certes, mais seulement en partie ! \u003cbr\u003e\n\u003cem\u003eBref, il faut avouer : c\u0026rsquo;est assez ennuyeux, voire ennuyant\u003c/em\u003e…\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eL\u0026rsquo;astuce\u003c/strong\u003e est de configurer le fichier \u003ccode\u003e/etc/rc.local\u003c/code\u003e - \u003cem\u003equi est appelé\nen dernier au chargement du système, du moins sur Debian et *Buntu\u003c/em\u003e - en\nincluant la commande suivante :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esysctl -w kernel.modules_disabled=1\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003emais de laisser la valeur de cette variable à \u003ccode\u003e0\u003c/code\u003e dans le fichier de configuration\nde sysctl !\u003c/p\u003e\n\u003cp\u003eAinsi le système au démarrage chargera tous les modules nécessaires à son\nbon fonctionnement, et ensuite, interdira tout autre chargement de modules\nnon autorisé !\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment sécuriser sa distribution GNU/Linux en modifiant le noyau Linux","tags":["Linux","Harden","noyau","modules"],"date_published":"2017-07-28T14:23:43+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-28:/fr/sec/linux/durcir-partitionnement#c11385d71f0b984488f368c265b45ba011c88749644fdb5f3d45a558a62a0255","url":"https://it-log.fr.eu.org/fr/sec/linux/durcir-partitionnement/","title":"Durcir Linux : modifier le partitionnement","author":{"name":"Stéphane HUC"},"content_text":"Description Tout bon linuxien sait que le partitionnement système se gère à partir du fichier /etc/fstab…\nModifions la configuration par défaut, qui utilise le drapeau defaults concernant l\u0026rsquo;option de montage, pour être plus restrictif… ce qui aura pour avantage de compliquer la vie si jamais votre station ou serveur étaient infectés !\nAttentionToutes ces modifications sont des modifications système, donc, sont à exécuter avec des droits administrateurs ! Configuration /boot, /opt, /usr Concernant le partitionnement lié à /boot, /opt, /usr, il est intéressant de les monter en lecture seule et d\u0026rsquo;interdire les fichiers périphériques nommés device, pour un serveur - sur une station, cela posera des difficultés ergonomiques indéniables.\nCe qui donnerait à minima :\nUUID=97aabf8d-fa78-4176-b681-888370fbc186 /boot ext4 defaults,nodev,ro 0 2 UUID=20c0ddea-2db4-4ee5-982f-71b8df26c2fb /opt ext4 defaults,nodev,ro 0 2 UUID=d84f16a8-d107-49d7-992d-bd9e78488ffd /usr ext4 defaults,nodev,ro 0 2 AstuceÉtant donné ce que signifie la valeur defaults, soit rw,suid,dev,exec,auto,nouser,async, on peut donc écrire les options defaults,nodev,ro par async,auto,exec,nodev,nouser,ro,suid ! Mise en garde pour /boot, /opt, /usr Mettre l\u0026rsquo;accès en lecture ro sur les partitionnements /boot et sur /usr posent quelques petits soucis. Quant à /opt, pour les rares fois, où c\u0026rsquo;est vraiment nécessaire, on verra plus bas comment permettre l\u0026rsquo;écriture, si besoin. ⇒ /boot : besoin d\u0026rsquo;un accès en écriture, lors du démarrage, pour l\u0026rsquo;environnement lié à grub, et surtout du binaire grub-editenv… qui ne peut écrire de fait ; résultat, il faut réécrire le fichier /etc/fstab avec l\u0026rsquo;option rw. Ouvrez le fichier /etc/rc.local - du moins, pour Debian, *Buntu, et assimilés - et écrivez dedans : mount -f -o remount,ro /boot\n⇒ /usr : besoin d\u0026rsquo;un accès en écriture, lors de mises-à-jour système, principalement. Vous aurez le droit à la complainte suivante lors de l\u0026rsquo;exécution de l\u0026rsquo;invocation post du gestionnaire de paquets (apt, dpkg, etc.) : \\\nmount: /usr: point de montage actif. E: Problem executing scripts DPkg::Post-Invoke \u0026#39;mount -o remount,ro /usr\u0026#39; E: Sub-process returned an error code Ce n'est absolument rien de grave ; il vous avertit juste qu'il n'est pas capable de remonter `/usr` en lecture seule. À vous de voir si vous voulez vraiment mettre `/usr` en lecture seule, et que ce message d'erreur ne vous ennuie pas ; pour ne pas être embetter, mieux vaut laisser en `rw`. Pour résoudre les problèmes ci-dessus, soit vous éditez le fichier /etc/apt/apt.conf - s\u0026rsquo;il existe - soit vous créez un fichier, tel que /etc/apt/apt.conf.d/00apt, et écrivez le code suivant :\nDPkg::Pre-Invoke {\u0026#34;mount -o remount,rw /boot\u0026#34;;\u0026#34;mount -o remount,rw /opt\u0026#34;}; DPkg::Post-Invoke {\u0026#34;mount -o remount,ro /boot\u0026#34;;\u0026#34;mount -o remount,ro /opt\u0026#34;}; Ainsi les gestionnaires apt, dpkg doivent remonter les partitionnements en question en écriture avant de faire la mise-à-jour système, et de le remettre en lecture seulement, après…\nInformations ANSSI pour /boot, /opt, /usr Pour info, la documentation de l\u0026rsquo;ANSSI en Octobre 2015, à-propos de configurer Linux de manière sécurisée, informe que :\n/boot devrait avoir les options nosuid,nodev,noexec - il est même recommandé l\u0026rsquo;usage de l\u0026rsquo;option noauto de manière optionnelle, car cela sous-tend qu\u0026rsquo;il faut comprendre les incidences et la gestion générée d\u0026rsquo;ajouter cette dernière option ! /opt devrait avoir au moins les options nosuid,nodev /usr devrait avoir l\u0026rsquo;option, à minima, nodev Incompatibilités logicielles connues Il peut arriver que certains logiciels refusent de fonctionner. Réflexe : exécutez-le depuis un terminal, et vérifiez son chemin d\u0026rsquo;exécution.\n/opt : google-chrome nécessite pour sa sandbox l\u0026rsquo;usage de l\u0026rsquo;option suid. /tmp Occupons nous du partitionnement lié à /tmp, et déclarons l\u0026rsquo;option la plus importante, dans ce cas noexec, parce que nous ne voulons pas que n\u0026rsquo;importe qui se serve de ce répertoire pour lancer n\u0026rsquo;importe quoi :\nUUID=1a7a999d-1e26-45f7-96c0-7d381887350d /tmp ext4 defaults,nodev,noexec,nosuid 0 2\nMise en garde pour /tmp Le problème principal est le même que pour les options sur les partitionnements /boot, et /usr, en mettant l\u0026rsquo;option noexec, lors des mises-à-jours systèmes ou de l\u0026rsquo;installation d\u0026rsquo;un nouveau logiciel, cela ne pourra pas s’exécuter correctement !\nIl faut pour cela rajouter dans les invocations pre et post en demandant de remonter le partitionnement /tmp avec les droits exec, puis à les enlever après le traitement.\nDPkg::Pre-Invoke {\u0026#34;mount -o remount,rw /boot\u0026#34;;\u0026#34;mount -o remount,rw /opt\u0026#34;;\u0026#34;mount -o remount,exec /tmp\u0026#34;}; DPkg::Post-Invoke {\u0026#34;mount -o remount,ro /boot\u0026#34;;\u0026#34;mount -o remount,ro /opt\u0026#34;;\u0026#34;mount -o remount,noexec /tmp\u0026#34;}; Informations ANSSI pour /tmp La documentation ANSSI sur la configuration Linux recommande les options nosuid,nodev,noexec pour la partition /tmp…\n/var, /var/log, /var/tmp Et les partitions /var, /var/log, /var/tmp ?\n/var : On peut rajouter les options grpquota,nodev,usrquota… UUID=e47dcfed-0d0a-486f-8f1c-63f9e8132590 /var ext4 defaults,grpquota,nodev,usrquota 0 2\nDangerATTENTION, ce qui suit ne fonctionne pas avec SystemD ! Quant au répertoire /var/tmp, il est intéressant de le supprimer, puis de le lier vers le répertoire ou la partition /tmp, qui sera ainsi bien gérée.\n:# rm -rf /var/tmp :# ln -s /tmp /var/tmp AstucePensez à sauvegarder les fichiers dedans, pour les restaurer ensuite… au besoin ! Informations ANSSI pour /var, /var/log, /var/tmp La documentation ANSSI sur la configuration Linux recommande les options nosuid,nodev,noexec pour toutes les partitions /var, /var/log, /var/tmp…\nAttentionAttention à l\u0026rsquo;impact de l\u0026rsquo;usage de l\u0026rsquo;option noexec sur la partition /var, qui empêchera la création de répertoires et fichiers temporaires lors des mises-à-jours, par exemple ! / la partition racine Il est de bon ton, en terme de sécurité système, d\u0026rsquo;empêcher l\u0026rsquo;usage de dev pour la racine système :\nUUID=7b8b0d04-7d60-44dd-98f3-6134065a42c3 / ext4 errors=remount-ro,nodev 0 1\n/srv Cette partition, dont le but actuel, est de \u0026ldquo;cloisonner\u0026rdquo; des services serveurs, tels que web, base de données, a aussi sa propre recommandation de la part de l\u0026rsquo;ANSSI :\nl\u0026rsquo;usage des options nosuid,nodev et de manière optionnelle, si vous savez gèrer, les options noexec,ro… il est clair que l\u0026rsquo;option ro pose son lot de problèmes, ne serait-ce que pour certains sites web qui ont besoin au moins d\u0026rsquo;un répertoire où écrire… à moins que vous redirigez ce genre d\u0026rsquo;écritures ! /home L\u0026rsquo;ANSSI recommande les options nosuid,nodev,noexec…\nAttentionAttention, toutefois, si vous utilisez le répertoire ~/bin qui, dans les distributions telles que Debian, Ubuntu, (et assimilées), est inclus dans la variable d\u0026rsquo;environnement PATH, puisque l\u0026rsquo;option noexec vous empêchera d\u0026rsquo;exécuter tout binaire, même vos personnels ! shm shm est l\u0026rsquo;accronyme de shared memory ; en doux français : mémoire partagée.\nSécuriser le point de montage correspondant est intéressant, afin d\u0026rsquo;empêcher l\u0026rsquo;attaque contre certains services par ce biais, tel que celui d\u0026rsquo;un serveur web, par exemple.\n/run/shm Si vous avez le répertoire /run/shm, configurez le fichier /etc/fstab, ainsi :\ntmpfs /run/shm tmpfs defaults,nodev,noexec,nosuid 0 0\n/dev/shm Si vous n\u0026rsquo;avez que /dev/shm, qui normalement ne pointe pas vers /run/shm, modifiez /etc/fstab en remplaçant /run/shm, par /dev/shm.\nUtilisation Remonter une partition Bon, comme vous avez certainement dû le comprendre, pour remonter dynamiquement un partitionnement, sans avoir à redémarrer le système, on utilise la commande suivante - avec les droits administrateurs, bien sûr - :\n:# mount -o remount,options /nom_partition\nEt si vous avez le droit à une erreur, telle que /partitionnement busy, préférez redémarrer la machine !\nTLDR Fichier /etc/apt/apt.conf.d/00apt Un exemple de fichier /etc/apt/apt.conf.d/00apt modifié selon les recommandations ci-dessus :\nDPkg::Pre-Invoke{ \u0026#34;mount -o remount,rw /boot\u0026#34;; \u0026#34;mount -o remount,exec /tmp\u0026#34;; \u0026#34;mount -o remount,exec /var\u0026#34;; }; DPkg::Post-Invoke { \u0026#34;mount -o remount,ro /boot\u0026#34;; \u0026#34;mount -o remount,noexec /tmp\u0026#34;; \u0026#34;mount -o remount,noexec /var\u0026#34;; }; Fichier /etc/fstab Un exemple de fichier /etc/fstab modifié selon les recommandations ci-dessus :\nUUID=6a45556d-df24-4fa5-97fd-5761935c7cfe / ext4 errors=remount-ro,nodev 0 1 # /boot was on /dev/sda11 during installation UUID=e703ff5e-8dd8-430b-b336-c2021477f2cf /boot ext4 defaults,nodev,noexec,nosuid 0 2 # /boot/efi was on /dev/sda1 during installation UUID=634A-AB2B /boot/efi vfat umask=0077 0 1 # /home was on /dev/sda10 during installation UUID=d51067e6-899d-4455-bb87-62ec74e75418 /home ext4 defaults,nodev,nosuid 0 2 # /opt was on /dev/sda9 during installation UUID=ed5f8cdc-5298-485e-aaa0-52603440f129 /opt ext4 defaults,nodev,nosuid 0 2 # /tmp was on /dev/sda8 during installation UUID=0f78ac20-f350-4a1b-ba0c-37e143cb64f5 /tmp ext4 defaults,nodev,noexec,nosuid 0 2 # /usr was on /dev/sda5 during installation UUID=70d74e44-ce91-4786-a747-a2fca4a2262a /usr ext4 defaults,nodev,ro 0 2 # /usr/local was on /dev/sda6 during installation UUID=e1f892e2-ebf9-4e7e-8640-f63a41f2df22 /usr/local ext4 defaults,nodev 0 2 # /var was on /dev/sda3 during installation UUID=50552290-0f4d-4a65-abfa-9fac98ae98d2 /var ext4 defaults,nodev,noexec,grpquota,nosuid,usrquota 0 2 # /var/log was on /dev/sda7 during installation UUID=6dac116d-dc39-46e1-a324-55a2905ea266 /var/log ext4 defaults,nodev,noexec,nosuid 0 2 # swap was on /dev/sda4 during installation UUID=96dc1eab-0dc2-4fcb-b758-0d01450e12b5 none swap sw 0 0 tmpfs /dev/shm tmpfs defaults,nodev,nouser,nosuid 0 0 ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eTout bon linuxien sait que le partitionnement système se gère à partir du\nfichier \u003ccode\u003e/etc/fstab\u003c/code\u003e…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eModifions la configuration par défaut, qui utilise le drapeau \u003ccode\u003edefaults\u003c/code\u003e\nconcernant l\u0026rsquo;option de montage, pour être plus restrictif… \u003cbr\u003e\n\u003cem\u003ece qui aura pour avantage de compliquer la vie si jamais votre station ou\nserveur étaient infectés !\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\"\u003eToutes ces modifications sont des modifications système, donc, sont à exécuter\navec des droits administrateurs !\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"boot-opt-usr\"\u003e/boot, /opt, /usr\u003c/h3\u003e\n\u003cp\u003eConcernant le partitionnement lié à \u003ccode\u003e/boot\u003c/code\u003e, \u003ccode\u003e/opt\u003c/code\u003e, \u003ccode\u003e/usr\u003c/code\u003e, il est\nintéressant de les monter en lecture seule et d\u0026rsquo;interdire les fichiers\npériphériques nommés \u003cspan lang=\"en\"\u003edevice\u003c/span\u003e, pour un serveur -\n\u003cem\u003esur une station, cela posera des difficultés ergonomiques indéniables\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eCe qui donnerait à 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:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e97aabf8d-fa78-4176-b681-888370fbc186  /boot   ext4    defaults,nodev,ro   0   2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e20c0ddea-2db4-4ee5-982f-71b8df26c2fb /opt            ext4    defaults,nodev,ro        0       2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003ed84f16a8-d107-49d7-992d-bd9e78488ffd  /usr    ext4    defaults,nodev,ro   0   2\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Étant donné ce que signifie la valeur \u003ccode\u003edefaults\u003c/code\u003e, soit \u003ccode\u003erw,suid,dev,exec,auto,nouser,async\u003c/code\u003e,\non peut donc écrire les options \u003ccode\u003edefaults,nodev,ro\u003c/code\u003e par \u003ccode\u003easync,auto,exec,nodev,nouser,ro,suid\u003c/code\u003e !\u003c/div\u003e\n\n\u003ch4 id=\"mise-en-garde-pour-boot-opt-usr\"\u003eMise en garde pour /boot, /opt, /usr\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eMettre l\u0026rsquo;accès en lecture \u003ccode\u003ero\u003c/code\u003e sur les partitionnements \u003ccode\u003e/boot\u003c/code\u003e et sur \u003ccode\u003e/usr\u003c/code\u003e\nposent quelques petits soucis.\u003c/li\u003e\n\u003cli\u003eQuant à \u003ccode\u003e/opt\u003c/code\u003e, pour les rares fois, où c\u0026rsquo;est vraiment nécessaire, on\nverra plus bas \u003ca href=\"/fr/sec/linux/durcir-partitionnement/#remonter-une-partition\"\u003ecomment permettre l\u0026rsquo;écriture\u003c/a\u003e,\nsi besoin.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e⇒ \u003ccode\u003e/boot\u003c/code\u003e : besoin d\u0026rsquo;un accès en écriture, lors du démarrage, pour l\u0026rsquo;environnement\nlié à grub, et surtout du binaire \u003ccode\u003egrub-editenv\u003c/code\u003e… qui ne peut écrire\nde fait ; résultat, il faut réécrire le fichier \u003ccode\u003e/etc/fstab\u003c/code\u003e avec\nl\u0026rsquo;option \u003ccode\u003erw\u003c/code\u003e. \u003cbr\u003e\nOuvrez le fichier \u003ccode\u003e/etc/rc.local\u003c/code\u003e - \u003cem\u003edu moins, pour Debian, *Buntu,\net assimilés\u003c/em\u003e - et écrivez dedans : \u003cbr\u003e\n\u003ccode\u003emount -f -o remount,ro /boot\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e⇒ \u003ccode\u003e/usr\u003c/code\u003e : besoin d\u0026rsquo;un accès en écriture, lors de mises-à-jour système,\nprincipalement. Vous aurez le droit à la complainte suivante lors de\nl\u0026rsquo;exécution de l\u0026rsquo;invocation \u003cem\u003epost\u003c/em\u003e du gestionnaire de paquets \u003cem\u003e(\u003cstrong\u003eapt\u003c/strong\u003e,\n\u003cstrong\u003edpkg\u003c/strong\u003e, etc.)\u003c/em\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-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emount: /usr: point de montage actif.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eE: Problem executing scripts DPkg::Post-Invoke \u003cspan style=\"color:#48b685\"\u003e\u0026#39;mount -o remount,ro /usr\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eE: Sub-process returned an error code\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cpre\u003e\u003ccode\u003eCe n'est absolument rien de grave ; il vous avertit juste qu'il n'est\npas capable de remonter `/usr` en lecture seule. À vous de voir si vous\nvoulez vraiment mettre `/usr` en lecture seule, et que ce message d'erreur\nne vous ennuie pas ; pour ne pas être embetter, mieux vaut laisser en `rw`.\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003cp\u003ePour résoudre les problèmes ci-dessus, soit vous éditez le fichier \u003ccode\u003e/etc/apt/apt.conf\u003c/code\u003e -\n\u003cem\u003es\u0026rsquo;il existe\u003c/em\u003e - soit vous créez un fichier, tel que \u003ccode\u003e/etc/apt/apt.conf.d/00apt\u003c/code\u003e,\net écrivez le code 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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDPkg::Pre-Invoke {\u0026#34;mount -o remount,rw /boot\u0026#34;;\u0026#34;mount -o remount,rw /opt\u0026#34;};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDPkg::Post-Invoke {\u0026#34;mount -o remount,ro /boot\u0026#34;;\u0026#34;mount -o remount,ro /opt\u0026#34;};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi les gestionnaires \u003cstrong\u003eapt\u003c/strong\u003e, \u003cstrong\u003edpkg\u003c/strong\u003e doivent remonter les partitionnements\nen question en écriture avant de faire la mise-à-jour système, et de le\nremettre en lecture seulement, après…\u003c/p\u003e\n\u003ch4 id=\"informations-anssi-pour-boot-opt-usr\"\u003eInformations ANSSI pour /boot, /opt, /usr\u003c/h4\u003e\n\u003cp\u003ePour info, la documentation de l\u0026rsquo;ANSSI en Octobre 2015, à-propos de\n\u003ca href=\"http://www.ssi.gouv.fr/uploads/2015/10/NP_Linux_Configuration.pdf\" rel=\"external\"\u003econfigurer Linux de manière sécurisée\u003c/a\u003e,\ninforme que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/boot\u003c/code\u003e devrait avoir les options \u003ccode\u003enosuid,nodev,noexec\u003c/code\u003e - \u003cem\u003eil est même\nrecommandé l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003enoauto\u003c/code\u003e de manière optionnelle, car\ncela sous-tend qu\u0026rsquo;il faut comprendre les incidences et la gestion\ngénérée d\u0026rsquo;ajouter cette dernière option !\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/opt\u003c/code\u003e devrait avoir au moins les options \u003ccode\u003enosuid,nodev\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/usr\u003c/code\u003e devrait avoir l\u0026rsquo;option, à minima, \u003ccode\u003enodev\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"incompatibilités-logicielles-connues\"\u003eIncompatibilités logicielles connues\u003c/h4\u003e\n\u003cp\u003eIl peut arriver que certains logiciels refusent de fonctionner. Réflexe :\nexécutez-le depuis un terminal, et vérifiez son chemin d\u0026rsquo;exécution.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/opt\u003c/code\u003e : \u003cstrong\u003egoogle-chrome\u003c/strong\u003e nécessite pour sa sandbox l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003esuid\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"tmp\"\u003e/tmp\u003c/h3\u003e\n\u003cp\u003eOccupons nous du partitionnement lié à \u003ccode\u003e/tmp\u003c/code\u003e, et déclarons l\u0026rsquo;option la\nplus importante, dans ce cas \u003ccode\u003enoexec\u003c/code\u003e, parce que nous ne voulons pas que\nn\u0026rsquo;importe qui se serve de ce répertoire pour lancer n\u0026rsquo;importe quoi :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eUUID=1a7a999d-1e26-45f7-96c0-7d381887350d /tmp            ext4    defaults,nodev,noexec,nosuid       0       2\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"mise-en-garde-pour-tmp\"\u003eMise en garde pour /tmp\u003c/h4\u003e\n\u003cp\u003eLe problème principal est le même que pour les options sur les partitionnements\n\u003ccode\u003e/boot\u003c/code\u003e, et \u003ccode\u003e/usr\u003c/code\u003e, en mettant l\u0026rsquo;option \u003ccode\u003enoexec\u003c/code\u003e, lors des mises-à-jours\nsystèmes ou de l\u0026rsquo;installation d\u0026rsquo;un nouveau logiciel, cela \u003cstrong\u003ene pourra pas\ns’exécuter correctement\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003eIl faut pour cela rajouter dans les invocations \u003cem\u003epre\u003c/em\u003e et \u003cem\u003epost\u003c/em\u003e en\ndemandant de remonter le partitionnement \u003ccode\u003e/tmp\u003c/code\u003e avec les droits \u003ccode\u003eexec\u003c/code\u003e,\npuis à les enlever après le traitement.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003eDPkg::Pre-Invoke {\u0026#34;mount -o remount,rw /boot\u0026#34;;\u0026#34;mount -o remount,rw /opt\u0026#34;;\u0026#34;mount -o remount,exec /tmp\u0026#34;};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDPkg::Post-Invoke {\u0026#34;mount -o remount,ro /boot\u0026#34;;\u0026#34;mount -o remount,ro /opt\u0026#34;;\u0026#34;mount -o remount,noexec /tmp\u0026#34;};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"informations-anssi-pour-tmp\"\u003eInformations ANSSI pour /tmp\u003c/h4\u003e\n\u003cp\u003eLa documentation ANSSI sur la configuration Linux recommande les options\n\u003ccode\u003enosuid,nodev,noexec\u003c/code\u003e pour la partition \u003ccode\u003e/tmp\u003c/code\u003e…\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"var-varlog-vartmp\"\u003e/var, /var/log, /var/tmp\u003c/h3\u003e\n\u003cp\u003eEt les partitions \u003ccode\u003e/var\u003c/code\u003e, \u003ccode\u003e/var/log\u003c/code\u003e, \u003ccode\u003e/var/tmp\u003c/code\u003e  ?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/var\u003c/code\u003e : On peut rajouter les options \u003ccode\u003egrpquota,nodev,usrquota\u003c/code\u003e…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003eUUID=e47dcfed-0d0a-486f-8f1c-63f9e8132590 /var            ext4    defaults,grpquota,nodev,usrquota        0       2\u003c/code\u003e\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, ce qui suit ne fonctionne pas avec SystemD !\u003c/strong\u003e\u003c/div\u003e\n\n\u003cp\u003eQuant au répertoire \u003ccode\u003e/var/tmp\u003c/code\u003e, il est intéressant de le supprimer, puis\nde le lier vers le répertoire ou la partition \u003ccode\u003e/tmp\u003c/code\u003e, qui sera ainsi bien gé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\u003e:# rm -rf /var/tmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# ln -s /tmp /var/tmp\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\"\u003ePensez à sauvegarder les fichiers dedans, pour les restaurer ensuite… au besoin !\u003c/div\u003e\n\n\u003ch4 id=\"informations-anssi-pour-var-varlog-vartmp\"\u003eInformations ANSSI pour /var, /var/log, /var/tmp\u003c/h4\u003e\n\u003cp\u003eLa documentation ANSSI sur la configuration Linux recommande les options\n\u003ccode\u003enosuid,nodev,noexec\u003c/code\u003e pour toutes les partitions \u003ccode\u003e/var\u003c/code\u003e, \u003ccode\u003e/var/log\u003c/code\u003e,\n\u003ccode\u003e/var/tmp\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 à l\u0026rsquo;impact de l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003enoexec\u003c/code\u003e sur la partition \u003ccode\u003e/var\u003c/code\u003e,\nqui empêchera la création de répertoires et fichiers temporaires lors des\nmises-à-jours, par exemple !\u003c/div\u003e\n\n\u003chr\u003e\n\u003ch3 id=\"-la-partition-racine\"\u003e/ la partition racine\u003c/h3\u003e\n\u003cp\u003eIl est de bon ton, en terme de sécurité système, d\u0026rsquo;empêcher l\u0026rsquo;usage de \u003cstrong\u003edev\u003c/strong\u003e\npour la racine système :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eUUID=7b8b0d04-7d60-44dd-98f3-6134065a42c3 /               ext4    errors=remount-ro,nodev 0       1\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"srv\"\u003e/srv\u003c/h3\u003e\n\u003cp\u003eCette partition, dont le but actuel, est de \u0026ldquo;cloisonner\u0026rdquo; des services serveurs,\ntels que web, base de données, a aussi sa propre recommandation de la part\nde l\u0026rsquo;ANSSI :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;usage des options \u003ccode\u003enosuid,nodev\u003c/code\u003e et de manière optionnelle, \u003cem\u003esi vous savez gèrer\u003c/em\u003e,\nles options \u003ccode\u003enoexec,ro\u003c/code\u003e… \u003cbr\u003e\n\u003cem\u003eil est clair que l\u0026rsquo;option \u003ccode\u003ero\u003c/code\u003e pose son lot de problèmes, ne serait-ce que pour\ncertains sites web qui ont besoin au moins d\u0026rsquo;un répertoire où écrire… \u003cbr\u003e\nà moins que vous redirigez ce genre d\u0026rsquo;écritures !\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"home\"\u003e/home\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;ANSSI recommande les options \u003ccode\u003enosuid,nodev,noexec\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, toutefois, si vous utilisez le répertoire \u003ccode\u003e~/bin\u003c/code\u003e qui, \u003cem\u003edans les\ndistributions telles que Debian, Ubuntu, (et assimilées)\u003c/em\u003e, est inclus dans la\nvariable d\u0026rsquo;environnement \u003ccode\u003ePATH\u003c/code\u003e, puisque l\u0026rsquo;option \u003ccode\u003enoexec\u003c/code\u003e vous empêchera\nd\u0026rsquo;exécuter tout binaire, même vos personnels !\u003c/div\u003e\n\n\u003ch3 id=\"shm\"\u003eshm\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eshm\u003c/strong\u003e est l\u0026rsquo;accronyme de \u003cem\u003eshared memory\u003c/em\u003e ; en doux français : \u003cem\u003emémoire partagée\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eSécuriser le point de montage correspondant est intéressant, afin d\u0026rsquo;empêcher\nl\u0026rsquo;attaque contre certains services par ce biais, tel que celui d\u0026rsquo;un serveur web,\npar exemple.\u003c/p\u003e\n\u003ch4 id=\"runshm\"\u003e/run/shm\u003c/h4\u003e\n\u003cp\u003eSi vous avez le répertoire \u003ccode\u003e/run/shm\u003c/code\u003e, configurez le fichier \u003ccode\u003e/etc/fstab\u003c/code\u003e, ainsi :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003etmpfs     /run/shm    tmpfs       defaults,nodev,noexec,nosuid 0   0\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"devshm\"\u003e/dev/shm\u003c/h4\u003e\n\u003cp\u003eSi vous n\u0026rsquo;avez que \u003ccode\u003e/dev/shm\u003c/code\u003e, qui normalement ne pointe pas vers \u003ccode\u003e/run/shm\u003c/code\u003e,\nmodifiez \u003ccode\u003e/etc/fstab\u003c/code\u003e en remplaçant \u003ccode\u003e/run/shm\u003c/code\u003e, par \u003ccode\u003e/dev/shm\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003ch3 id=\"remonter-une-partition\"\u003eRemonter une partition\u003c/h3\u003e\n\u003cp\u003eBon, comme vous avez certainement dû le comprendre, pour remonter dynamiquement\nun partitionnement, sans avoir à redémarrer le système, on utilise la commande\nsuivante - \u003cem\u003e\u003cstrong\u003eavec les droits administrateurs, bien sûr\u003c/strong\u003e\u003c/em\u003e - :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# mount -o remount,options /nom_partition\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEt si vous avez le droit à une erreur, telle que \u003ccode\u003e/partitionnement busy\u003c/code\u003e,\npréférez redémarrer la machine !\u003c/p\u003e\n\u003ch2 id=\"tldr\"\u003eTLDR\u003c/h2\u003e\n\u003ch3 id=\"fichier-etcaptaptconfd00apt\"\u003eFichier /etc/apt/apt.conf.d/00apt\u003c/h3\u003e\n\u003cp\u003eUn exemple de fichier \u003ccode\u003e/etc/apt/apt.conf.d/00apt\u003c/code\u003e modifié selon les recommandations\nci-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-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDPkg::Pre-Invoke{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;mount -o remount,rw /boot\u0026#34;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;mount -o remount,exec /tmp\u0026#34;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;mount -o remount,exec /var\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\"\u003eDPkg::Post-Invoke {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;mount -o remount,ro /boot\u0026#34;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;mount -o remount,noexec /tmp\u0026#34;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e\u0026#34;mount -o remount,noexec /var\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\u003ch3 id=\"fichier-etcfstab\"\u003eFichier /etc/fstab\u003c/h3\u003e\n\u003cp\u003eUn exemple de fichier \u003ccode\u003e/etc/fstab\u003c/code\u003e modifié selon les recommandations ci-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-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e6a45556d-df24-4fa5-97fd-5761935c7cfe /               ext4    errors=remount-ro,nodev 0       1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /boot was on /dev/sda11 during installation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003ee703ff5e-8dd8-430b-b336-c2021477f2cf /boot           ext4    defaults,nodev,noexec,nosuid        0       2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /boot/efi was on /dev/sda1 during installation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e634A-AB2B  /boot/efi       vfat    umask=0077      0       1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /home was on /dev/sda10 during installation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003ed51067e6-899d-4455-bb87-62ec74e75418 /home           ext4    defaults,nodev,nosuid        0       2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /opt was on /dev/sda9 during installation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eed5f8cdc-5298-485e-aaa0-52603440f129 /opt            ext4    defaults,nodev,nosuid        0       2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /tmp was on /dev/sda8 during installation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e0f78ac20-f350-4a1b-ba0c-37e143cb64f5 /tmp            ext4    defaults,nodev,noexec,nosuid        0       2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /usr was on /dev/sda5 during installation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e70d74e44-ce91-4786-a747-a2fca4a2262a /usr            ext4    defaults,nodev,ro        0       2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /usr/local was on /dev/sda6 during installation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003ee1f892e2-ebf9-4e7e-8640-f63a41f2df22 /usr/local      ext4    defaults,nodev        0       2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /var was on /dev/sda3 during installation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e50552290-0f4d-4a65-abfa-9fac98ae98d2 /var            ext4    defaults,nodev,noexec,grpquota,nosuid,usrquota        0       2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /var/log was on /dev/sda7 during installation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e6dac116d-dc39-46e1-a324-55a2905ea266 /var/log        ext4    defaults,nodev,noexec,nosuid        0       2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# swap was on /dev/sda4 during installation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUUID\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e96dc1eab-0dc2-4fcb-b758-0d01450e12b5 none            swap    sw              0       0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etmpfs   /dev/shm    tmpfs      defaults,nodev,nouser,nosuid 0   0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n","summary":"Comment sécuriser sa distribution GNU/Linux en durcissant le partitionnement","tags":["Linux","Harden","partition"],"date_published":"2017-07-28T12:56:04+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/web/nginx/nginx-block-attacks#65fed253397931d4d67d6e7ec5d69c0d0f121046287599087b07156a09d781c9","url":"https://it-log.fr.eu.org/fr/web/nginx/nginx-block-attacks/","title":"Nginx : bloquer certaines attaques ! (astuce)","author":{"name":"Stéphane HUC"},"content_text":"Description Si Korben nous informe du comment bloquer certaines attaques pour et par le serveur web Nginx - sa manière de le faire n\u0026rsquo;est pas forcément des meilleures !\nUtilisons le contexte location, et écrivons-les ainsi :\n## Block Queries location ~ \u0026#34;(\\\u0026#34;|%22).*(\u0026lt;|\u0026gt;|%3)\u0026#34; { return 403; } location ~ \u0026#34;(javascript\\:).*(\\;)\u0026#34; { return 403; } location ~ \u0026#34;(\\|\\.\\./|`|=\\\u0026#39;$|=%27$)\u0026#34; { return 403; } location ~ \u0026#34;(\\;|\\\u0026#39;|\\\u0026#34;|%22).*(union|select|concat|insert|drop|update|md5|benchmark|or|and|if)\u0026#34; { return 403; } location ~ \u0026#34;(\u0026lt;|%3C).*script.*(\u0026gt;|%3)\u0026#34; { return 403; } location ~ \u0026#34;[a-zA-Z0-9_]=http://\u0026#34; { return 403; } location ~ \u0026#34;[a-zA-Z0-9_]=(\\.\\.//?)+\u0026#34; { return 403; } location ~ \u0026#34;[a-zA-Z0-9_]=/([a-z0-9_.]//?)+\u0026#34; { return 403; } location ~* \u0026#34;.*(asp|bs)$\u0026#34; { return 403; } location ~* \u0026#34;.*(admin|cgi|manager|pma|user|wp|wordpress).*\u0026#34; { return 403; } location ~ \u0026#34;^base64_(en|de)code\\(.*\\)|localhost|mosconfig\u0026#34; { return 403; } AstuceAu lieu de retourner une erreur 403, informant que la requête est valide, mais refusée par le serveur, préférez retourner une erreur 444 - où le serveur refuse d\u0026rsquo;envoyer toute information, et ferme la connexion directement !\nc\u0026rsquo;est cela aussi le pouvoir tant réputé de nginx ;-)\nDocumentation if is evil ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eSi Korben nous informe du \u003ca href=\"http://korben.info/nginx-comment-bloquer-les-attaques-les-plus-courantes.html\" rel=\"external\"\u003ecomment bloquer certaines\nattaques\u003c/a\u003e\npour et par le serveur web Nginx - sa manière de le faire n\u0026rsquo;est pas\nforcément des meilleures !\u003c/p\u003e\n\u003cp\u003eUtilisons le contexte \u003ccode\u003elocation\u003c/code\u003e, et écrivons-les 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-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e## Block Queries\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\u0026#34;(\\\u0026#34;|%22).*(\u0026lt;|\u0026gt;|%3)\u0026#34;\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\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\u0026#34;(javascript\\:).*(\\;)\u0026#34;\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\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\u0026#34;(\\|\\.\\./|`|=\\\u0026#39;$|=%27$)\u0026#34;\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\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\u0026#34;(\\;|\\\u0026#39;|\\\u0026#34;|%22).*(union|select|concat|insert|drop|update|md5|benchmark|or|and|if)\u0026#34;\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\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\u0026#34;(\u0026lt;|%3C).*script.*(\u0026gt;|%3)\u0026#34;\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\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\u0026#34;[a-zA-Z0-9_]=http://\u0026#34;\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\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\u0026#34;[a-zA-Z0-9_]=(\\.\\.//?)+\u0026#34;\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\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\u0026#34;[a-zA-Z0-9_]=/([a-z0-9_.]//?)+\u0026#34;\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;.*(asp|bs)\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$\u0026#34;\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\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*\u003c/span\u003e  \u003cspan style=\"color:#48b685\"\u003e\u0026#34;.*(admin|cgi|manager|pma|user|wp|wordpress).*\u0026#34;\u003c/span\u003e  { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\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\u0026#34;^base64_(en|de)code\\(.*\\)|localhost|mosconfig\u0026#34;\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\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\u003eAu lieu de retourner une erreur 403, informant que la\nrequête est valide, mais refusée par le serveur, préférez retourner une\nerreur 444 - où le serveur refuse d\u0026rsquo;envoyer toute information, et ferme\nla connexion directement !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ec\u0026rsquo;est cela aussi le pouvoir tant réputé de nginx\u003c/strong\u003e ;-)\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cdel\u003e\u003ca href=\"http://wiki.nginx.org/IfIsEvil\" rel=\"external\"\u003eif is evil\u003c/a\u003e\u003c/del\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment bloquer certaines attaques web avec le serveur Nginx","tags":["nginx","block","astuce"],"date_published":"2017-07-27T17:50:20+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/sys/debian/apt-gpg-error#45880c1cbc323a7a98c998d3fc112ef35f01e8cddbccdcf9ddb08cabb710c2d6","url":"https://it-log.fr.eu.org/fr/sys/debian/apt-gpg-error/","title":"Apt : Gpg Error","author":{"name":"Stéphane HUC"},"content_text":" Attention2020 : Cette manière de faire est obsolète… veuillez plutôt consulter mon article\nApt : Ajouter une clé GPG\n!!!\nDescription Un petit script bash pour aider à résoudre simplement l\u0026rsquo;erreur gpg liée à la mise-à-jour des dépôts debian, ubuntu…\nCe script, très simple, permet de lancer la suite de commande gpg nécessaire à ajouter pour que les dépôts ne retournent pas cette erreur :\nW: GPG error: ftp://ftp.domain.org testing Release: The following signatures couldn\u0026#39;t be verified because the public key is not available: NO_PUBKEY 010203040A0B0C0D W: There is no public key available for the following key IDs: 010203040A0B0C0D Code La solution :\n#!/bin/sh gpg --keyserver keyserver.ubuntu.com --recv-key $1 gpg -a --export $1 | sudo apt-key add - ","content_html":"\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003e2020 : Cette manière de faire est obsolète… veuillez plutôt consulter mon\narticle\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/debian/add-apt-key/\" title=\"Lien interne vers l\u0026#39;article : 'Apt : Ajouter une clé GPG'\"\u003eApt : Ajouter une clé GPG\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e!!!\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUn petit script bash pour aider à résoudre simplement l\u0026rsquo;erreur gpg liée\nà la mise-à-jour des dépôts debian, ubuntu…\u003c/p\u003e\n\u003cp\u003eCe script, très simple, permet de lancer la suite de\ncommande gpg nécessaire à ajouter pour que les dépôts\nne retournent pas cette erreur :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eW: GPG error: ftp://ftp.domain.org testing Release:\nThe following signatures couldn\u0026#39;t be verified because the public key is not available: NO_PUBKEY 010203040A0B0C0D\nW: There is no public key available for the following key IDs:\n010203040A0B0C0D\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"code\"\u003eCode\u003c/h2\u003e\n\u003cp\u003eLa solution :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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/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\u003egpg --keyserver keyserver.ubuntu.com --recv-key \u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg -a --export \u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e | sudo apt-key add -\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n","summary":"Debian: résoudre l'erreur de l'outil apt : GPG Error","tags":["Debian","apt","erreur","GPG"],"date_published":"2017-07-27T16:05:08+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/sec/ssh/configuration-securisee#95441a2a7b5a6d2bb87016e9927529c713e9c9d7402c68fc03cac5ab2f63abc5","url":"https://it-log.fr.eu.org/fr/sec/ssh/configuration-securisee/","title":"SSH : Configuration Sécurisée","author":{"name":"Stéphane HUC"},"content_text":"Description Le propos de cet article est d\u0026rsquo;aider à comprendre ce qu\u0026rsquo;il faut configurer pour obtenir une configuration sécurisée de votre client SSH.\nCela nécessite que votre version du client OpenSSH soit supérieure à la version 6.5 !\nConfiguration Côté client, le plus simple est de modifier votre fichier de configuration, dans votre home personnel, ~/.ssh/config…\nCet article n\u0026rsquo;aborde que la partie concernant le client ; pour la partie serveur, merci de lire mon autre article : OpenSSH : Durcir la configuration du serveur SSH Chiffrements Les algorithmes de Chiffrement à autoriser :\nCiphers chacha20-poly1305@openssh.com\nÀ vérifier au cas par cas… regardez donc le log d\u0026rsquo;authentification sur votre serveur !\nÉchange de clés Les algorithmes des clés d\u0026rsquo;échange à privilègier sont :\nKexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com\nAlgorithmes de la clé d\u0026rsquo;Hôte Les recommandations actuelles pour les algorithmes des clés d\u0026rsquo;hôte sont : HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-ed25519\nMessage Authentication Codes Les algorithmes des Code d\u0026rsquo;Authentification de Messages à définir sont : MACs umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com\nTL;DR Voici un exemple de configuration sécurisée minimal :\nHost * Ciphers chacha20-poly1305@openssh.com HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-ed25519 KexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com MACs umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com ChallengeResponseAuthentication no #CheckHostIP yes Compression yes #CompressionLevel 9 # unsupported! ControlMaster auto ControlPersist yes ControlPath ~/.ssh/socket-%r@%h:%p HashKnownHosts yes ForwardAgent no ForwardX11 no ForwardX11Trusted yes PasswordAuthentication yes Protocol 2 PubkeyAuthentication yes ServerAliveInterval 30 ServerAliveCountMax 7 #StrictHostKeyChecking yes TCPKeepAlive yes #UseRoaming no # Do not using with ≥ v7! (for oldier versions) VerifyHostKeyDNS yes VisualHostKey yes AddKeysToAgent yes #UseKeychain yes IdentityFile ~/.ssh/id_ed25519 Selon le manpage officiel, les configurations personnalisées à certains hôtes doivent être écrites avant la configuration générale Host * !\nUtilisation Attentionne pas utiliser les protocoles de chiffrement DSA, ECDSA , mais utilisez RSA en forçant le nombre de bits - de 4096 à 16384 -, ET en utilisant PKBDF, ou mieux utilisez directement ED25519, ayant déjà PKBDF. Les créations suivantes sont à faire côté client, bien sûr !\nMettre-à-jour vos clés RSA ssh-keygen -o -p -f id_rsa -a 64\nL\u0026rsquo;option -f spécifie le fichier de clé privée à utiliser. L\u0026rsquo;option -o est celle qui utilise le durcissement PKBDF. et pour finir, l\u0026rsquo;option -a définit le nombre de tours \u0026ldquo;de moulinettes\u0026rdquo; que va effectuer la génération. InfoSi cette option n\u0026rsquo;est pas spécifiée, la valeur par défaut est 16. Vous pouvez lui demander 1000 tours, néanmoins pour les paranoïaques la valeur de 64 semble préférable ET suffisante. Nouvelles clés Nouvelle clé ED25519 InfoIl n\u0026rsquo;est pas nécessaire de spécifier l\u0026rsquo;usage de l\u0026rsquo;option -o ; en effet, la génération des clés Ed25519 utilise toujours ce format par défaut ! ssh-keygen -t ed25519 -f fichier_id -a nb_tours\nTel que, par exemple :\nssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -a 64\nNouvelle clé RSA + PKBDF ssh-keygen -t rsa -b nb_bits -f fichier_id -o -a nb_tours\nTel que, pour l\u0026rsquo;exemple :\nssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -o -a 64\nAstuces Si vous avez paramétré l\u0026rsquo;option LoginGraceTime sur le serveur, 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.\nEn effet, selon le nombre de tours que vous avez paramétrés pour la génération de votre clé, ou sa mise-à-jour, le déchiffrement et la réponse du serveur prendra plus de temps, peut-être plus que le temps d\u0026rsquo;ouverture, de la fenêtre de connexion, autorisé.\nDocumentations Manpages ssh , ssh_config(5) ssh-keygen Autres Quand Martin Kleppman a écrit sur le propos d\u0026rsquo;améliorer la sécurité de ses clés privées SSH… Pat Regan nous fait un petit rappel historique de comment utiliser PKCS#8 pour en aboutir à la conclusion d\u0026rsquo;utiliser PKBDF… ou comment Ted Unangst nous explique comment monter à niveau ses vieilles clés en utilisant PKBDF… Voici une très bonne lecture, sur le propos de sécuriser son serveur SSH, en utilisant les bons algorithmes, et autres méthodes d\u0026rsquo;authentification… (osbolète) Voire le référentiel de sécurité de l\u0026rsquo;ANSSI à-propos des recommandations de sécurité autour de SSH. (cf : https://www.ssi.gouv.fr/administration/guide/recommandations-pour-un-usage-securise-dopenssh/ ) ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe propos de cet article est d\u0026rsquo;aider à comprendre ce qu\u0026rsquo;il faut configurer\npour obtenir une configuration sécurisée de votre client SSH.\u003c/p\u003e\n\u003cp\u003eCela nécessite \u003cspan hi\u003eque votre version du client OpenSSH soit supérieure\nà la version 6.5\u003c/span\u003e !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eCôté client, le plus simple est de modifier votre fichier de\nconfiguration, dans votre home personnel, \u003ccode\u003e~/.ssh/config\u003c/code\u003e…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eCet article n\u0026rsquo;aborde que la partie concernant le client ; pour la partie\nserveur, merci de lire mon autre article : \n\n\u003ca class=\"inside\" href=\"/fr/sec/ssh/sshd-durci/\" title=\"Lien interne vers l\u0026#39;article : 'OpenSSH : Durcir la configuration du serveur SSH'\"\u003eOpenSSH : Durcir la configuration du serveur SSH\u003c/a\u003e\n\n\u003c/p\u003e\n\u003ch3 id=\"chiffrements\"\u003eChiffrements\u003c/h3\u003e\n\u003cp\u003eLes algorithmes de \u003cstrong\u003eChiffrement\u003c/strong\u003e à autoriser :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eCiphers chacha20-poly1305@openssh.com\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eÀ vérifier au cas par cas… \u003cbr\u003e\nregardez donc le log d\u0026rsquo;authentification sur votre serveur !\u003c/p\u003e\n\u003ch3 id=\"échange-de-clés\"\u003eÉchange de clés\u003c/h3\u003e\n\u003cp\u003eLes \u003cstrong\u003ealgorithmes des clés d\u0026rsquo;échange\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-la-clé-dhôte\"\u003eAlgorithmes de la clé d\u0026rsquo;Hôte\u003c/h3\u003e\n\u003cp\u003eLes recommandations actuelles pour les \u003cstrong\u003ealgorithmes des clés d\u0026rsquo;hôte\u003c/strong\u003e sont : \u003cbr\u003e\n\u003ccode\u003eHostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-ed25519\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"message-authentication-codes\"\u003eMessage Authentication Codes\u003c/h3\u003e\n\u003cp\u003eLes algorithmes des \u003cstrong\u003eCode d\u0026rsquo;Authentification de Messages\u003c/strong\u003e à définir sont : \u003cbr\u003e\n\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=\"tldr\"\u003eTL;DR\u003c/h3\u003e\n\u003cp\u003eVoici un exemple de configuration sécurisée minimal :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\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\"\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\"\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\"\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\"\u003eChallengeResponseAuthentication no\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#CheckHostIP yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eCompression yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#CompressionLevel 9 # unsupported!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eControlMaster auto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eControlPersist yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eControlPath ~/.ssh/socket-%r@%h:%p\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eHashKnownHosts yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eForwardAgent no\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eForwardX11 no\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eForwardX11Trusted yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ePasswordAuthentication yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eProtocol 2\u003c/span\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    \u003cspan style=\"color:#06b6ef\"\u003eServerAliveInterval 30\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eServerAliveCountMax 7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#StrictHostKeyChecking yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eTCPKeepAlive yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#UseRoaming no # Do not using with ≥ v7! (for oldier versions)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eVerifyHostKeyDNS yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eVisualHostKey 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\"\u003eAddKeysToAgent yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#UseKeychain yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eIdentityFile ~/.ssh/id_ed25519\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSelon le manpage officiel, les configurations personnalisées à certains\nhôtes doivent être écrites avant la configuration générale \u003ccode\u003eHost *\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\u003cspan class=\"red\"\u003ene pas utiliser les protocoles de chiffrement DSA, ECDSA\u003c/span\u003e\n,\nmais \u003cstrong\u003eutilisez \u003ca href=\"/fr/sec/ssh/configuration-securisee/#nouvelle-clé-rsa-+-pkbdf\"\u003eRSA\u003c/a\u003e en forçant le\nnombre de bits\u003c/strong\u003e - \u003cem\u003ede 4096 à 16384 -\u003c/em\u003e, \u003cstrong\u003eET en utilisant PKBDF\u003c/strong\u003e, ou mieux\n\u003cstrong\u003eutilisez directement \u003ca href=\"/fr/sec/ssh/configuration-securisee/#nouvelle-clé-ed25519\"\u003eED25519\u003c/a\u003e, ayant déjà PKBDF\u003c/strong\u003e.\u003c/div\u003e\n\n\u003cp\u003eLes créations suivantes sont à faire côté client, bien sûr !\u003c/p\u003e\n\u003ch3 id=\"mettre-à-jour-vos-clés-rsa\"\u003eMettre-à-jour vos clés RSA\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003essh-keygen -o -p -f id_rsa -a 64\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eL\u0026rsquo;option \u003ccode\u003e-f\u003c/code\u003e spécifie le fichier de clé privée à utiliser.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;option \u003ccode\u003e-o\u003c/code\u003e est celle qui utilise le durcissement PKBDF.\u003c/li\u003e\n\u003cli\u003eet pour finir, l\u0026rsquo;option \u003ccode\u003e-a\u003c/code\u003e définit le nombre de tours \u0026ldquo;de moulinettes\u0026rdquo; que\nva effectuer la génération.\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 cette option n\u0026rsquo;est pas spécifiée, la valeur par défaut est \u003ccode\u003e16\u003c/code\u003e. \u003cbr\u003e\nVous pouvez lui demander \u003ccode\u003e1000\u003c/code\u003e tours, néanmoins pour les paranoïaques\nla valeur de \u003ccode\u003e64\u003c/code\u003e semble préférable ET suffisante.\u003c/div\u003e\n\n\u003ch3 id=\"nouvelles-clés\"\u003eNouvelles clés\u003c/h3\u003e\n\u003ch4 id=\"nouvelle-clé-ed25519\"\u003eNouvelle clé ED25519\u003c/h4\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eIl n\u0026rsquo;est pas nécessaire de spécifier l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003e-o\u003c/code\u003e ; en effet,\nla génération des clés Ed25519 utilise toujours ce format par défaut !\u003c/div\u003e\n\n\u003cp\u003e\u003ccode\u003essh-keygen -t ed25519 -f fichier_id -a nb_tours\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eTel que, par exemple :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003essh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -a 64\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"nouvelle-clé-rsa--pkbdf\"\u003eNouvelle clé RSA + PKBDF\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003essh-keygen -t rsa -b nb_bits -f fichier_id -o -a nb_tours\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eTel que, pour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003essh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -o -a 64\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"astuces\"\u003eAstuces\u003c/h2\u003e\n\u003cp\u003eSi vous avez paramétré l\u0026rsquo;option \u003ccode\u003eLoginGraceTime\u003c/code\u003e sur le serveur, pensez à\n\u003cstrong\u003eaugmenter sa valeur, sinon\u003c/strong\u003e vous aurez \u003cstrong\u003ele droit à ne pas\npouvoir vous connecter, sans aucun message d\u0026rsquo;erreur\u003c/strong\u003e dans le log\nd\u0026rsquo;authentification.\u003c/p\u003e\n\u003cp\u003eEn effet, selon le nombre de tours que vous avez paramétrés pour la\ngénération de votre clé, ou sa mise-à-jour, le déchiffrement et la\nréponse du serveur prendra plus de temps, peut-être plus que le temps\nd\u0026rsquo;ouverture, de la fenêtre de connexion, autorisé.\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/ssh\" title=\"Page du Manuel OpenBSD pour : ssh\"\u003essh\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/ssh_config.5\" title=\"Page du Manuel OpenBSD pour : ssh_config\"\u003essh_config(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ssh-keygen\" title=\"Page du Manuel OpenBSD pour : ssh-keygen\"\u003essh-keygen\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"autres\"\u003eAutres\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eQuand \u003ca href=\"https://martin.kleppmann.com/2013/05/24/improving-security-of-ssh-private-keys.html\" rel=\"external\"\u003eMartin Kleppman a écrit\u003c/a\u003e sur le propos d\u0026rsquo;améliorer la sécurité de ses clés privées SSH…\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://blog.patshead.com/2013/09/generating-new-more-secure-ssh-keys.html\" rel=\"external\"\u003ePat Regan\u003c/a\u003e nous fait un petit rappel historique de comment utiliser PKCS#8 pour en aboutir à la conclusion d\u0026rsquo;utiliser PKBDF…\u003c/li\u003e\n\u003cli\u003eou comment \u003ca href=\"http://www.tedunangst.com/flak/post/new-openssh-key-format-and-bcrypt-pbkdf\" rel=\"external\"\u003eTed Unangst\u003c/a\u003e nous explique comment monter à niveau ses vieilles clés en utilisant PKBDF…\u003c/li\u003e\n\u003cli\u003eVoici une très bonne lecture, sur le propos de \u003ca href=\"https://stribika.github.io/2015/01/04/secure-secure-shell.html\" rel=\"external\"\u003esécuriser son serveur SSH\u003c/a\u003e, en utilisant les bons algorithmes, et autres méthodes d\u0026rsquo;authentification… \u003cem\u003e(osbolète)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eVoire le \u003ca href=\"https://www.ssi.gouv.fr/uploads/2014/01/NT_OpenSSH.pdf\" rel=\"external\"\u003eréférentiel de sécurité\u003c/a\u003e de l\u0026rsquo;ANSSI à-propos des recommandations de sécurité autour de SSH. \u003cem\u003e(cf : \u003ca href=\"https://www.ssi.gouv.fr/administration/guide/recommandations-pour-un-usage-securise-dopenssh/\" rel=\"external\"\u003ehttps://www.ssi.gouv.fr/administration/guide/recommandations-pour-un-usage-securise-dopenssh/\u003c/a\u003e )\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment configurer SSH pour une utilisation plus sécurisée, et une génération correcte des clés SSH.","tags":["SSH","harden"],"date_published":"2017-07-27T14:26:58+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/sys/software/filezilla-sftp-connection-closed-by-server-with-exitcode-10#2b3a697f0cf60ebe1cd1e726e4be9663300dfbe93c7949ba766223d42b41dad2","url":"https://it-log.fr.eu.org/fr/sys/software/filezilla-sftp-connection-closed-by-server-with-exitcode-10/","title":"Filezilla : SFTP Connection closed by server with exitcode 10","author":{"name":"Stéphane HUC"},"content_text":"Description Vous avez le message d\u0026rsquo;erreur en titre, avec Filezilla : SFTP Connection closed by server with exitcode 10\nOuvrez le Gestionnaire de Sites, Onglet \u0026ldquo;Paramètres de transfert\u0026rdquo;, cliquez sur la case à cocher [ ] Limiter le nombre de connexions simultanées pour la paramétrer à 1*.\nValidez et connectez-vous à nouveau !\n* ou selon votre configuration SSH, voire MySecureShell - Option LimitConnectionByUser\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVous avez le message d\u0026rsquo;erreur en titre, avec Filezilla : \u003cbr\u003e\n\u003ccode\u003eSFTP Connection closed by server with exitcode 10\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eOuvrez le Gestionnaire de Sites, Onglet \u0026ldquo;Paramètres de transfert\u0026rdquo;, cliquez\nsur la case à cocher \u003ccode\u003e[ ] Limiter le nombre de connexions simultanées\u003c/code\u003e\npour la paramétrer à \u003ccode\u003e1\u003c/code\u003e\u003csup\u003e*\u003c/sup\u003e.\u003c/p\u003e\n\u003cp\u003eValidez et connectez-vous à nouveau !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003csup\u003e*\u003c/sup\u003e \u003cem\u003eou selon votre configuration SSH, voire MySecureShell - Option LimitConnectionByUser\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment régler l'erreur de connexion SFTP 'Connection closed by server with exitcode 10' dans Filezilla","tags":["Filezilla","SFTP","erreur","astuce"],"date_published":"2017-07-27T15:00:38+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/web/nginx/nginx-block-exec-scripts#259f23f4ad359b2ced02a06e90c3d6f0353e0706e05b7e1323165df4bfc7f8ee","url":"https://it-log.fr.eu.org/fr/web/nginx/nginx-block-exec-scripts/","title":"Nginx : Bloquer l'exécution de scripts (astuce)","author":{"name":"Stéphane HUC"},"content_text":"Description Une petite astuce relative à nginx, afin de bloquer l\u0026rsquo;exécution de scripts, dans les répertoires où vous ne désirez pas qu\u0026rsquo;ils s\u0026rsquo;exécutent, tels que ASP, PHP, Shell, etc :\nlocation ~* /(repertoire1|repertoire2|repertoire_xyz|image|css|js)/.*.(asp|cgi|jsp|php|pl|py|sh)$ { return 403; } ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUne petite astuce relative à nginx, afin de bloquer l\u0026rsquo;exécution de scripts,\ndans les répertoires où vous ne désirez pas qu\u0026rsquo;ils s\u0026rsquo;exécutent, tels que\nASP, PHP, Shell, etc :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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*\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/(repertoire1|repertoire2|repertoire_xyz|image|css|js)/.*.(asp|cgi|jsp|php|pl|py|sh)\u003c/span\u003e$ {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\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","summary":"Comment bloquer l'exécution de scripts avec le serveur web nginx","tags":["nginx","block","astuce"],"date_published":"2017-07-27T14:53:46+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/web/nginx/nginx-block-user-agent#60ad27d1b4bc6bdb0747fa64e54d4716581c3611588d67e9f93bb8316e8552f9","url":"https://it-log.fr.eu.org/fr/web/nginx/nginx-block-user-agent/","title":"Nginx : Bloquer 'User Agent' (astuce)","author":{"name":"Stéphane HUC"},"content_text":"Description Bloquer un UA n\u0026rsquo;est pas bien difficile avec nginx !\nUtilisons le module map dans le contexte http, tel que :\nmap $http_user_agent $bad_bot { default 0; ~(?i)(\u0026#34;\u0026#34;|Curl|Wget) 1; } Dans le fichier de configuration, lié à votre domaine, rajouter :\nif ($bad_bot) { return 403; } Astuce Préférez l\u0026rsquo;usage du code erreur 444 ;-) Vous pouvez faire de même, bien sûr, pour bloquer de mauvais \u0026ldquo;referers\u0026rdquo; ! Documentation if is evil](http://wiki.nginx.org/IfIsEvil) ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eBloquer un \u003cabbr title=\"User Agent\"\u003eUA\u003c/abbr\u003e\n n\u0026rsquo;est pas bien difficile avec nginx !\u003c/p\u003e\n\u003cp\u003eUtilisons le module \u003ccode\u003emap\u003c/code\u003e dans le contexte \u003ccode\u003ehttp\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-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_user_agent\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$bad_bot\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault\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:#5bc4bf\"\u003e~(?i)(\u0026#34;\u0026#34;|Curl|Wget)\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans le fichier de configuration, lié à votre domaine, rajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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$bad_bot\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e403\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\u003cul\u003e\n\u003cli\u003ePréférez l\u0026rsquo;usage du code erreur 444 ;-)\u003c/li\u003e\n\u003cli\u003eVous pouvez faire de même, bien sûr, pour bloquer de mauvais \u0026ldquo;referers\u0026rdquo; !\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cdel\u003eif is evil](\u003ca href=\"http://wiki.nginx.org/IfIsEvil)\" rel=\"external\"\u003ehttp://wiki.nginx.org/IfIsEvil)\u003c/a\u003e\u003c/del\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment bloquer un agent utilisateur web - (user agent) - avec le serveur web nginx","tags":["nginx","block","UA","astuce"],"date_published":"2017-07-27T14:42:43+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/web/nginx/nginx-block-shellshock#d555892862c985328d0532dbd8947aa19d5853707025ec6bec2d797141616f53","url":"https://it-log.fr.eu.org/fr/web/nginx/nginx-block-shellshock/","title":"Nginx : Bloquer ShellShock (astuce)","author":{"name":"Stéphane HUC"},"content_text":"Description Shellshock est une faille de sécurité présente dans le shell Bash, découverte en Septembre 2014. Normalement, cette faille a été corrigée dans Bash ; il est hautement recommandé d\u0026rsquo;avoir la version la plus récente.\nL\u0026rsquo;explication ci-dessous explique comment empêcher l\u0026rsquo;accès depuis le serveur web nginx.\nDans votre contexte http, utilisez la déclaration map, telle que :\nmap $http_user_agent $bad_bot { default 0; ~*\\{.*\\:\\; 1; } map $http_referer $bad_referer { default 0; ~*\\{.*\\:\\; 1; } C\u0026rsquo;est l\u0026rsquo;expression régulière *\\{.*\\:\\; qui fait son travail ; à savoir qu\u0026rsquo;on peut légèrement la raccourcir, et cela fonctionne, apparemment, aussi : *\\{.*\\:\nEnsuite, vous utilisez les conditions suivantes pour fermer la connexion, sans autre forme de procédé :\nif ($bad_bot) { return 444; } if ($bad_referer) { return 444; } Si ces conditions ne sont pas acceptées dans le contexte http, déclarez-les dans le contexte server ;-)\nAstuceSi vous souhaitez ne pas logger ces attaques, il faut créer de nouvelles map, telle que :\nmap $bad_ua$bad_referer $bads { default 0; ~1 1; } map $bads $loggable { default 1; ~1 0; } Puis soit dans le contexte http, soit dans le contexte server, il vous faut cibler votre journal d\u0026rsquo;accès, tel que :\naccess_log /path/to/access.log combined if=$loggable;\nDocumentation http://forum.nginx.org/read.php?2,257792,257814#msg-257814 Shellshock_(faille_informatique) WP ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eShellshock\u003c/strong\u003e est une faille de sécurité présente dans le shell Bash,\ndécouverte en Septembre 2014. \u003cem\u003eNormalement, cette faille a été corrigée\ndans Bash ; il est hautement recommandé d\u0026rsquo;avoir la version la plus récente.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;explication ci-dessous explique comment empêcher l\u0026rsquo;accès depuis le\nserveur web nginx.\u003c/p\u003e\n\u003cp\u003eDans votre contexte \u003ccode\u003ehttp\u003c/code\u003e, utilisez la déclaration \u003ccode\u003emap\u003c/code\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-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_user_agent\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$bad_bot\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault\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:#5bc4bf\"\u003e~*\\{.*\\:\\\u003c/span\u003e; \u003cspan style=\"color:#5bc4bf\"\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\"\u003emap\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$http_referer\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$bad_referer\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault\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:#5bc4bf\"\u003e~*\\{.*\\:\\\u003c/span\u003e; \u003cspan style=\"color:#5bc4bf\"\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eC\u0026rsquo;est l\u0026rsquo;expression régulière \u003ccode\u003e*\\{.*\\:\\;\u003c/code\u003e qui fait son travail ;\nà savoir qu\u0026rsquo;on peut légèrement la raccourcir, et cela fonctionne,\napparemment, aussi : \u003ccode\u003e*\\{.*\\:\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEnsuite, vous utilisez les conditions suivantes pour fermer la connexion,\nsans autre forme de procédé :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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$bad_bot\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\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:#48b685\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$bad_referer\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e; }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi ces conditions ne sont pas acceptées dans le contexte \u003ccode\u003ehttp\u003c/code\u003e,\ndéclarez-les dans le contexte \u003ccode\u003eserver\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\u003eSi vous souhaitez ne pas logger ces attaques, il faut créer de nouvelles\n\u003ccode\u003emap\u003c/code\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-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$bad_ua$bad_referer\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$bads\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault\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:#5bc4bf\"\u003e~1\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\"\u003emap\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$bads\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$loggable\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault\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:#5bc4bf\"\u003e~1\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}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis soit dans le contexte \u003ccode\u003ehttp\u003c/code\u003e, soit dans le contexte \u003ccode\u003eserver\u003c/code\u003e,\nil vous faut cibler votre journal d\u0026rsquo;accès, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eaccess_log /path/to/access.log combined if=$loggable;\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://forum.nginx.org/read.php?2,257792,257814#msg-257814\" rel=\"external\"\u003ehttp://forum.nginx.org/read.php?2,257792,257814#msg-257814\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Shellshock_%28faille_informatique%29\" title=\"Article Wikipédia : Shellshock_(faille_informatique)\"\u003e\n    Shellshock_(faille_informatique)\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Bloquer la faille ShellShock avec le serveur web nginx","tags":["nginx","Shellshock","Bash","block","astuce"],"date_published":"2017-07-27T14:34:16+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/web/nginx/nginx-autoindex#6345be327a37841760ca1f428aed8901aecac451f556d8849bc3589c8d42dd6c","url":"https://it-log.fr.eu.org/fr/web/nginx/nginx-autoindex/","title":"Nginx Autoindex (astuce)","author":{"name":"Stéphane HUC"},"content_text":"Description Tout petit mémo relatif à nginx, ou comment faire pour qu\u0026rsquo;apparaisse le listing d\u0026rsquo;un répertoire, avec nginx ?\nIl faut utiliser l\u0026rsquo;option autoindex on; !\nDocumentation http://nginx.org/en/docs/http/ngx_http_autoindex_module.html Exemple Index of /apt/ ../ archive.canonical/ 25-Jan-2016 18:18 - archive.ubuntu/ 25-Jan-2016 18:18 - epson/ 06-Feb-2016 23:04 - extra.linuxmint/ 25-Jan-2016 18:55 - libreoffice/ 12-Feb-2016 23:40 - packages.linuxmint/ 25-Jan-2016 19:50 - security.ubuntu/ 25-Jan-2016 18:18 - sil/ 13-Feb-2016 23:35 - wine/ 12-Feb-2016 23:40 - README 03-Mar-2016 03:51 1694 ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eTout petit mémo relatif à nginx, ou\n\u003cstrong\u003ecomment faire pour qu\u0026rsquo;apparaisse le listing d\u0026rsquo;un répertoire, avec nginx ?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eIl faut utiliser l\u0026rsquo;option \u003ccode\u003eautoindex on;\u003c/code\u003e !\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://nginx.org/en/docs/http/ngx_http_autoindex_module.html\" rel=\"external\"\u003ehttp://nginx.org/en/docs/http/ngx_http_autoindex_module.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"exemple\"\u003eExemple\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-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIndex of /apt/\n\u003c/span\u003e\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\u003earchive.canonical/                                 25-Jan-2016 18:18                   -\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003earchive.ubuntu/                                    25-Jan-2016 18:18                   -\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eepson/                                             06-Feb-2016 23:04                   -\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eextra.linuxmint/                                   25-Jan-2016 18:55                   -\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elibreoffice/                                       12-Feb-2016 23:40                   -\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epackages.linuxmint/                                25-Jan-2016 19:50                   -\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esecurity.ubuntu/                                   25-Jan-2016 18:18                   -\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esil/                                               13-Feb-2016 23:35                   -\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewine/                                              12-Feb-2016 23:40                   -\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eREADME                                             03-Mar-2016 03:51                1694\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n","summary":"Nginx: lister automatiquement l'index d'un répertoire","tags":["nginx","autoindex","astuce"],"date_published":"2017-07-27T14:00:35+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/sys/software/raid-access-livecd#ae0ee3e4010284b1285dbdf325c002ee8ec98a3e5225a69a139cf7eb2a695ee0","url":"https://it-log.fr.eu.org/fr/sys/software/raid-access-livecd/","title":"RAID : Comment accéder avec un LiveCD","author":{"name":"Stéphane HUC"},"content_text":"Description L\u0026rsquo;objet de ce post est simplement un mémo, à savoir comment accéder à un partitionnement RAID, non chiffré, et cela grâce à un LiveCD !\nDémarrer sur le LiveCD Ouvrez une console terminal Installer \u0026lsquo;\u0026lsquo;mdadm\u0026rsquo;\u0026rsquo; * Utiliser la commande mdadm, telle que : mdadm --assemble --scan * cela aura pour effet de monter les différents partitionnements que la commande sera capable de reconnaître. Et, si vous voulez écrire dans l\u0026rsquo;une ou l\u0026rsquo;autre des partitions, ainsi montées, ouvrez un navigateur de fichiers. * * Ces opérations se font toujours en appelant les droits administrateurs ! Autrement vous n\u0026rsquo;y aurez qu\u0026rsquo;un accès en lecture…\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;objet de ce post est simplement un mémo, à savoir comment accéder à un\npartitionnement RAID, non chiffré, et cela grâce à un LiveCD !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDémarrer sur le LiveCD\u003c/li\u003e\n\u003cli\u003eOuvrez une console terminal\u003c/li\u003e\n\u003cli\u003eInstaller \u0026lsquo;\u0026lsquo;mdadm\u0026rsquo;\u0026rsquo; \u003csup\u003e*\u003c/sup\u003e\u003c/li\u003e\n\u003cli\u003eUtiliser la commande mdadm, telle que : \u003ccode\u003emdadm --assemble --scan\u003c/code\u003e \u003csup\u003e*\u003c/sup\u003e \u003cbr\u003e\n\u003cem\u003ecela aura pour effet de monter les différents partitionnements que\nla commande sera capable de reconnaître\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eEt, si vous voulez écrire dans l\u0026rsquo;une ou l\u0026rsquo;autre des partitions, ainsi\nmontées, ouvrez un navigateur de fichiers. \u003csup\u003e*\u003c/sup\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003csup\u003e*\u003c/sup\u003e Ces opérations se font toujours en appelant les droits administrateurs !\n\u003cem\u003eAutrement vous n\u0026rsquo;y aurez qu\u0026rsquo;un accès en lecture…\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Astuce pour accèder à un RAID à partir d'un LiveCD","tags":["RAID","LiveCD","astuce"],"date_published":"2017-07-27T13:54:44+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/sec/linux/dnscrypt#c34fd35bb83b52a58d69c3b16de2b5ca2720b88bdccdf6ccffd9b0603e741061","url":"https://it-log.fr.eu.org/fr/sec/linux/dnscrypt/","title":"Durcir Linux : utiliser Dnscrypt","author":{"name":"Stéphane HUC"},"content_text":"Description DangerCet article est très probablement trop ancien, pour refléter l\u0026rsquo;actualité du logiciel dnscrypt. Il a été écrit en 2017, et non mis-à-jour. Nommé Durcir Linux : utiliser dnscrypt est un bien grand mot… en fait, nous n\u0026rsquo;allons pas durcir directement Linux, mais nous allons utiliser un petit outil, bien pratique, dont le but est de chiffrer les communications DNS !\nDNSCrypt est un outil, à l\u0026rsquo;origine développé par OpenDNS, qui maintenant a sa vie propre, au-travers du site : dnscrypt.org.\nRevenons en au but de ce petit outil, à savoir d’authentifier les communications DNS, entre votre client logiciel DNS, et les serveurs DNS que vous utilisez pour pouvoir surfer sur Internet. Il utilise des signatures cryptographiques pour communiquer. Il interroge des serveurs DNS publics, compatible avec l\u0026rsquo;outil.\nIl peut-être actif conjointement à votre serveur DNS cache local. pour cela, je vous renvoie à la documentation officielle\nAttentionBien comprendre que cela ne protège pas des failles dues à DNS. dnscrypt authentifie le trafic DNS, avec un serveur DNS compatible, et ainsi empêche qu\u0026rsquo;un serveur malintentionné se fasse passer pour un serveur authentique.\ndnscrypt n\u0026rsquo;est pas non plus un service VPN, et n\u0026rsquo;a pas l\u0026rsquo;intention de fournir de tels services, vous ne pouvez pas faire passer tous vos flux TCP/IP, ni UDP, à l\u0026rsquo;intérieur… Seules les requêtes DNS, sur les ports 53 et 443, en UDP.\nSoyez avertis aussi que les serveurs DNS compatibles peuvent très bien journaliser votre trafic !\nIl fonctionne sur les protocoles IPv4 et IPv6.\nInstallation Du côté de Debian, et assimilés, le client existe dans les dépôts officiels, pour toutes les versions de Debian, de stable à Sid.\nDu côté des *Buntu, il existe les ppa suivants :\ncelui de Xu Zhen, ou mieux intégré, celui de Pascal Mons - je me baserai sur ce dernier à vous de les ajouter, puis de les installer.\nSinon, vous attendez la future LTS [[http://packages.ubuntu.com/search?suite=xenial\u0026amp;searchon=names\u0026amp;keywords=dnscrypt|Xenial]], ou vous mettez-à-jour vers [[http://packages.ubuntu.com/search?suite=wily\u0026amp;searchon=names\u0026amp;keywords=dnscrypt|Willy]] !\nConfiguration Le fichier de configuration principal est situé dans /etc/default/dnscrypt-proxy.\nVous y retrouverez différentes options faciles à comprendre !\nNetwork Manager Pensez à bien modifier votre configuration dans l\u0026rsquo;outil Network Manager, et à paramétrer votre onglet [ Paramètres IPv4 ] en modifiant :\nla méthode sur \u0026lsquo;Adresses automatiques uniquement (DHCP)\u0026rsquo;, puis à écrire dans le champ \u0026lsquo;Serveurs DNS\u0026rsquo;, la valeur suivante \u0026lsquo;127.0.0.2\u0026rsquo;, enregistrez !\n/etc/network/interfaces Si vous n\u0026rsquo;utilisez pas Network Manager, modifiez directement votre fichier /etc/network/interfaces, en ajouter la mention :\ndns-nameservers 127.0.0.2\ndans ce cas, pensez à redémarrer votre réseau !\nInfoOui, c\u0026rsquo;est bien l\u0026rsquo;adresse localhost 127.0.0.2… car l\u0026rsquo;outil dnscrypt-proxy travaille en relation avec dnsmasq, qui lui fonctionne, par défaut, sur l\u0026rsquo;adresse localhost normale.\nCelui de Xu Zhen, ce sera l\u0026rsquo;adresse localhost \u0026lsquo;127.0.0.1\u0026rsquo;.\nMise en garde AttentionÀ ce propos, si vous changez l\u0026rsquo;option liée à l\u0026rsquo;utilisateur en changeant son nom, soit… c\u0026rsquo;est votre droit - mais pensez à supprimer celui créé par l\u0026rsquo;installateur, et à créer le vôtre dans les mêmes conditions, tel que :\n:# adduser --system --quiet --home /run/dnscrypt --shell /bin/false --group --disabled-password --disabled-login votre_user_dnscrypt\nCela est d\u0026rsquo;ailleurs indiqué dans le fichier de configuration !\nVous êtes libre de changer aussi son répertoire maison ; pensez à vérifier la création dudit répertoire, et à supprimer celui par défaut !\nAstuceToutes les options que renferme le manpage lié à l\u0026rsquo;outil sont utilisables dans le fichier de configuration : $ man dnscrypt\nIl suffit dans ce cas d\u0026rsquo;enlever les 2 symboles -- qui les précédent.\nÀ ce propos, si vous avez la bonne idée d\u0026rsquo;utiliser l\u0026rsquo;option logfile, telle que logfile=/var/log/dnscypt-proxy.log et si vous utilisez apparmor aussi, il faudra changer le profil apparmor lié à l\u0026rsquo;outil, pour y ajouter la ligne suivante : /var/log/dnscypt-proxy.log rw,\nVous trouverez une liste des différents serveurs DNS compatibles, leurs noms, leurs adresses IP, leurs clés d\u0026rsquo;authentification, etc… dans le fichier /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv.\nVous pouvez changer ces informations dans le fichier de configuration.\n","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\"\u003eCet article est très probablement trop ancien, pour refléter l\u0026rsquo;actualité du\nlogiciel \u003cstrong\u003ednscrypt\u003c/strong\u003e. Il a été écrit en 2017, et non mis-à-jour.\u003c/div\u003e\n\n\u003cp\u003eNommé \u003cstrong\u003eDurcir Linux : utiliser dnscrypt\u003c/strong\u003e est un bien grand mot… en fait, nous\nn\u0026rsquo;allons pas durcir directement Linux, mais nous allons utiliser un petit\noutil, bien pratique, dont le but est de chiffrer les communications DNS !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDNSCrypt\u003c/strong\u003e est un outil, à l\u0026rsquo;origine développé par \u003ca href=\"https://www.opendns.com/about/innovations/dnscrypt/\" rel=\"external\"\u003eOpenDNS\u003c/a\u003e, qui\nmaintenant a sa vie propre, au-travers du site : \u003ca href=\"https://dnscrypt.org\" rel=\"external\"\u003ednscrypt.org\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eRevenons en au but de ce petit outil, à savoir d’authentifier les communications\nDNS, entre votre client logiciel DNS, et les serveurs DNS que vous utilisez\npour pouvoir surfer sur Internet. Il utilise des signatures cryptographiques\npour communiquer. Il interroge des serveurs DNS publics, compatible avec l\u0026rsquo;outil.\u003c/p\u003e\n\u003cp\u003eIl peut-être actif conjointement à votre serveur DNS cache local. \u003cbr\u003e\n\u003cem\u003epour cela, je vous renvoie à la documentation officielle\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\u003eBien comprendre que cela ne protège pas des failles dues à DNS. \u003cstrong\u003ednscrypt\nauthentifie le trafic DNS, avec un serveur DNS compatible\u003c/strong\u003e, et ainsi empêche\nqu\u0026rsquo;un serveur malintentionné se fasse passer pour un serveur authentique.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ednscrypt n\u0026rsquo;est pas non plus un service VPN\u003c/strong\u003e, et n\u0026rsquo;a pas l\u0026rsquo;intention de\nfournir de tels services, vous ne pouvez pas faire passer tous vos flux TCP/IP,\nni UDP, à l\u0026rsquo;intérieur… \u003cbr\u003e\n\u003cstrong\u003eSeules les requêtes DNS, sur les ports 53 et 443, en UDP.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSoyez avertis aussi que les serveurs DNS compatibles peuvent très bien\njournaliser votre trafic !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eIl fonctionne sur les protocoles IPv4 et IPv6.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eDu côté de Debian, et assimilés, le client existe dans les dépôts officiels,\npour toutes les versions de Debian, de stable à Sid.\u003c/p\u003e\n\u003cp\u003eDu côté des *Buntu, il existe les ppa suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecelui de \u003ca href=\"https://launchpad.net/~xuzhen666/+archive/ubuntu/dnscrypt\" rel=\"external\"\u003eXu Zhen\u003c/a\u003e,\u003c/li\u003e\n\u003cli\u003eou mieux intégré, celui de \u003ca href=\"https://launchpad.net/~anton+/+archive/ubuntu/dnscrypt\" rel=\"external\"\u003ePascal Mons\u003c/a\u003e - \u003cem\u003eje me baserai sur ce dernier\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eà vous de les ajouter, puis de les installer.\u003c/p\u003e\n\u003cp\u003eSinon, vous attendez la future LTS [[http://packages.ubuntu.com/search?suite=xenial\u0026amp;searchon=names\u0026amp;keywords=dnscrypt|Xenial]],\nou vous mettez-à-jour vers [[http://packages.ubuntu.com/search?suite=wily\u0026amp;searchon=names\u0026amp;keywords=dnscrypt|Willy]] !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLe fichier de configuration principal est situé dans \u003ccode\u003e/etc/default/dnscrypt-proxy\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eVous y retrouverez différentes options faciles à comprendre !\u003c/p\u003e\n\u003ch3 id=\"network-manager\"\u003eNetwork Manager\u003c/h3\u003e\n\u003cp\u003ePensez à bien modifier votre configuration dans l\u0026rsquo;outil\nNetwork Manager, et à paramétrer votre onglet [ Paramètres IPv4 ] en modifiant :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela méthode sur \u0026lsquo;Adresses automatiques uniquement (DHCP)\u0026rsquo;,\u003c/li\u003e\n\u003cli\u003epuis à écrire dans le champ \u0026lsquo;Serveurs DNS\u0026rsquo;, la valeur suivante \u0026lsquo;127.0.0.2\u0026rsquo;,\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eenregistrez !\u003c/p\u003e\n\u003ch3 id=\"etcnetworkinterfaces\"\u003e/etc/network/interfaces\u003c/h3\u003e\n\u003cp\u003eSi vous n\u0026rsquo;utilisez pas Network Manager, modifiez directement votre fichier\n\u003ccode\u003e/etc/network/interfaces\u003c/code\u003e, en ajouter la mention :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003edns-nameservers 127.0.0.2\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003edans ce cas, pensez à redémarrer votre réseau !\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eOui, c\u0026rsquo;est bien l\u0026rsquo;adresse localhost \u003ccode\u003e127.0.0.2\u003c/code\u003e… \u003cbr\u003e\ncar l\u0026rsquo;outil \u003ccode\u003ednscrypt-proxy\u003c/code\u003e travaille en relation avec \u003ccode\u003ednsmasq\u003c/code\u003e, qui\nlui fonctionne, par défaut, sur l\u0026rsquo;adresse localhost normale.\u003c/p\u003e\n\u003cp\u003eCelui de Xu Zhen, ce sera l\u0026rsquo;adresse localhost \u0026lsquo;127.0.0.1\u0026rsquo;.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"mise-en-garde\"\u003eMise 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\u003eÀ ce propos, si vous changez l\u0026rsquo;option liée à l\u0026rsquo;utilisateur en changeant son nom,\nsoit… c\u0026rsquo;est votre droit - mais pensez à supprimer celui créé par l\u0026rsquo;installateur,\net à créer le vôtre dans les mêmes conditions, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# adduser --system --quiet --home /run/dnscrypt --shell /bin/false --group --disabled-password --disabled-login votre_user_dnscrypt\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eCela est d\u0026rsquo;ailleurs indiqué dans le fichier de configuration !\u003c/p\u003e\n\u003cp\u003eVous êtes libre de changer aussi son répertoire maison ; pensez à vérifier\nla création dudit répertoire, et à supprimer celui par défaut !\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eToutes les options que renferme le manpage lié à l\u0026rsquo;outil sont utilisables dans\nle fichier de configuration : \u003cbr\u003e\n\u003ccode\u003e$ man dnscrypt\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl suffit dans ce cas d\u0026rsquo;enlever les 2 symboles \u003ccode\u003e--\u003c/code\u003e qui les précédent.\u003c/p\u003e\n\u003cp\u003eÀ ce propos, si vous avez la bonne idée d\u0026rsquo;utiliser l\u0026rsquo;option \u003ccode\u003elogfile\u003c/code\u003e, telle que\n\u003ccode\u003elogfile=/var/log/dnscypt-proxy.log\u003c/code\u003e et si vous utilisez \u003ccode\u003eapparmor\u003c/code\u003e aussi, il\nfaudra changer le profil apparmor lié à l\u0026rsquo;outil, pour y ajouter la ligne\nsuivante : \u003cbr\u003e\n\u003ccode\u003e/var/log/dnscypt-proxy.log rw,\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eVous trouverez une liste des différents serveurs DNS compatibles, leurs noms,\nleurs adresses IP, leurs clés d\u0026rsquo;authentification, etc… \u003cbr\u003e\ndans le fichier \u003ccode\u003e/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eVous pouvez changer ces informations dans le fichier de configuration.\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment sécuriser sa distribution GNU/Linux en utilisant dnscrypt","tags":["Linux","Harden","dnscrypt"],"date_published":"2017-07-27T13:47:18+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/sec/scan/rkhunter-warning-suspicious-files-dev#3f2cc62be72a52ab2a0df41305dcf7f185e76e34b172e9f538e70e6a10d5b566","url":"https://it-log.fr.eu.org/fr/sec/scan/rkhunter-warning-suspicious-files-dev/","title":"Rkhunter : Warning: Suspicious file types found in /dev","author":{"name":"Stéphane HUC"},"content_text":"Description Rkhunter émet cet avis : Warning: Suspicious file types found in /dev: /dev/.udev/rules.d/root.rules: ASCII text\nNormalement, en effet aucun fichier text ne devrait se trouver dans le répertoire des fichiers périphériques, nommé dev !\nMais si dans votre cas, votre installation système est fraîche, toute neuve, pas de panique… en effet, depuis assez récemment, quelques distributions, telle que Ubuntu, le font !\nAnalyse Si le contenu du fichier en question est très similaire à ceci :\nSUBSYSTEM==\u0026quot;block\u0026quot;, ENV{MAJOR}==\u0026quot;252\u0026quot;, ENV{MINOR}==\u0026quot;0\u0026quot;, SYMLINK+=\u0026quot;root\u0026quot;\nCela semble normal ! Et, donc être un fameux faux positif de rkhunter !\n⇒ modifions le fichier /etc/rkhunter.conf, pour ajouter la ligne suivante, dans la bonne section : ALLOWDEVFILE=\u0026quot;/dev/.udev/rules.d/root.rules\u0026quot;\nPuis recharger la base de données, avec l\u0026rsquo;option --propupd de rkhunter, et lancez un nouveau test !\nSi malheureusement ce n\u0026rsquo;est pas le cas… une petite réinstallation système ?!\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eRkhunter émet cet avis : \u003cbr\u003e\n\u003cq\u003eWarning: Suspicious file types found in /dev: /dev/.udev/rules.d/root.rules: ASCII text\u003c/q\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNormalement, en effet aucun fichier text ne devrait se trouver dans le\nrépertoire des fichiers périphériques, nommé \u003ccode\u003edev\u003c/code\u003e !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMais si dans votre cas, votre installation système est fraîche, toute neuve,\npas de panique… en effet, depuis assez récemment, quelques distributions,\ntelle que Ubuntu, le font !\u003c/p\u003e\n\u003ch2 id=\"analyse\"\u003eAnalyse\u003c/h2\u003e\n\u003cp\u003eSi le contenu du fichier en question est très similaire à ceci :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eSUBSYSTEM==\u0026quot;block\u0026quot;, ENV{MAJOR}==\u0026quot;252\u0026quot;, ENV{MINOR}==\u0026quot;0\u0026quot;, SYMLINK+=\u0026quot;root\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCela semble normal ! \u003cbr\u003e\nEt, donc être un fameux faux positif de rkhunter !\u003c/p\u003e\n\u003cp\u003e⇒ modifions le fichier \u003ccode\u003e/etc/rkhunter.conf\u003c/code\u003e, pour ajouter la ligne suivante,\ndans la bonne section : \u003cbr\u003e\n\u003ccode\u003eALLOWDEVFILE=\u0026quot;/dev/.udev/rules.d/root.rules\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis recharger la base de données, avec l\u0026rsquo;option \u003ccode\u003e--propupd\u003c/code\u003e de rkhunter,\net lancez un nouveau test !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSi malheureusement\u003c/strong\u003e ce n\u0026rsquo;est pas le cas… une petite \u003cstrong\u003eréinstallation système\u003c/strong\u003e ?!\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment résoudre l'avis de détection par rkhunter : Warning: Suspicious file types found in /dev","tags":["rkhunter","detection","dev"],"date_published":"2017-07-27T13:17:42+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/sec/scan/rkhunter-warning-hidden-directory-found#d4905b29423ad1c30fa531f0d370484923a690bd7e1b3bb7933592c597613e3e","url":"https://it-log.fr.eu.org/fr/sec/scan/rkhunter-warning-hidden-directory-found/","title":"Rkhunter : Warning: Hidden directory found","author":{"name":"Stéphane HUC"},"content_text":"Description Rkhunter émet cet avis : Warning: Hidden directory found: /dev/.static, ou Warning: Hidden directory found: /dev/.udev\nSi votre installation système est toute fraîche, n\u0026rsquo;ayez pas peur, vous êtes \u0026ldquo;tombé\u0026rdquo; sur un des fameux faux positif de ce binaire !\nConfiguration Modifiez donc les variables ALLOWHIDDENFILE correspondante, dans le fichier /etc/rkhunter.conf !\nALLOWHIDDENFILE=\u0026quot;/dev/.static\u0026quot;\nRecharger la base de donnée, grâce à l\u0026rsquo;option --propupd, et relancez le test.\nSinon, si ce n\u0026rsquo;est pas le cas, malheureusement… il vous faudra envisager le pire !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eRkhunter émet cet avis : \u003cbr\u003e\n\u003cq\u003eWarning: Hidden directory found: /dev/.static\u003c/q\u003e, ou \u003cbr\u003e\n\u003cq\u003eWarning: Hidden directory found: /dev/.udev\u003c/q\u003e\u003c/p\u003e\n\u003cp\u003eSi votre installation système est toute fraîche, n\u0026rsquo;ayez pas peur, vous êtes\n\u0026ldquo;tombé\u0026rdquo; sur un des fameux faux positif de ce binaire !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eModifiez donc les variables \u003ccode\u003eALLOWHIDDENFILE\u003c/code\u003e correspondante, dans le\nfichier \u003ccode\u003e/etc/rkhunter.conf\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eALLOWHIDDENFILE=\u0026quot;/dev/.static\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eRecharger la base de donnée, grâce à l\u0026rsquo;option \u003ccode\u003e--propupd\u003c/code\u003e, et relancez le test.\u003c/p\u003e\n\u003cp\u003eSinon, si ce n\u0026rsquo;est pas le cas, malheureusement… il vous faudra envisager le pire !\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment résoudre l'avis de détection par rkhunter : Warning: Hidden directory found","tags":["rkhunter","detection","hidden"],"date_published":"2017-07-27T10:58:31+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/sec/scan/rkhunter-warning-hidden-file-found#750577712415229fa87c3a455709b8ee0d16cf3257b03c313d7c7176d0777666","url":"https://it-log.fr.eu.org/fr/sec/scan/rkhunter-warning-hidden-file-found/","title":"Rkhunter : Warning: Hidden file found","author":{"name":"Stéphane HUC"},"content_text":"Description Rkhunter émet cet avis : Warning: Hidden file found: /dev/.initramfs: symbolic link to /run/initramfs\u0026rsquo; !\nSi votre installation système est toute fraîche, n\u0026rsquo;ayez pas peur, vous êtes \u0026ldquo;tombé\u0026rdquo; sur un des fameux faux positif de ce binaire !\nConfiguration Modifions le fichier /etc/rkhunter.conf, pour ajouter : ALLOWHIDDENFILE=\u0026quot;/dev/.initramfs\u0026quot;\nRecharger la base de donnée, grâce à l\u0026rsquo;option --propupd, et relancez le test.\nSinon, si ce n\u0026rsquo;est pas le cas, malheureusement… il vous faudra envisager le pire !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eRkhunter émet cet avis : \u003cbr\u003e\n\u003cquote\u003eWarning: Hidden file found: /dev/.initramfs: symbolic link to /run/initramfs\u0026rsquo;\u003c/quote\u003e !\u003c/p\u003e\n\u003cp\u003eSi votre installation système est toute fraîche, n\u0026rsquo;ayez pas peur, vous êtes\n\u0026ldquo;tombé\u0026rdquo; sur un des fameux faux positif de ce binaire !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eModifions le fichier \u003ccode\u003e/etc/rkhunter.conf\u003c/code\u003e, pour ajouter : \u003cbr\u003e\n\u003ccode\u003eALLOWHIDDENFILE=\u0026quot;/dev/.initramfs\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eRecharger la base de donnée, grâce à l\u0026rsquo;option \u003ccode\u003e--propupd\u003c/code\u003e, et relancez le test.\u003c/p\u003e\n\u003cp\u003eSinon, si ce n\u0026rsquo;est pas le cas, malheureusement… il vous faudra envisager le pire !\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment résoudre l'avis de détection par rkhunter : Warning: Hidden file found","tags":["rkhunter","detection","hidden"],"date_published":"2017-07-27T10:48:31+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/web/nginx/nginx-error-404-fail-permission-denied#7b627c87d4766cd4e12d6868f2715551284f521434b9d70184fc2742f8192031","url":"https://it-log.fr.eu.org/fr/web/nginx/nginx-error-404-fail-permission-denied/","title":"Nginx : Erreur 404 ; failed (13: Permission denied)","author":{"name":"Stéphane HUC"},"content_text":"Description Vous avez un message Error 404, sur une des pages visitées.\nEt les logs du server web nginx vous avertissent de ce message :\n2016/02/13 11:35:52 [crit] 995#0: *48 open() \u0026#34;/srv/www/site.web/www/\u0026#34; failed (13: Permission denied), (…) Modifiez les droits en écriture à la racine de votre site !\nPar exemple :\n:# chmod 0705 /srv/www/site.web/www Même pas besoin de redémarrer nginx !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVous avez un message \u003cstrong\u003eError 404\u003c/strong\u003e, sur une des pages visitées.\u003c/p\u003e\n\u003cp\u003eEt les logs du server web nginx vous avertissent de ce message :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-log\" data-lang=\"log\"\u003e2016/02/13 11:35:52 [crit] 995#0: *48 open() \u0026#34;/srv/www/site.web/www/\u0026#34; failed (13: Permission denied), (…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eModifiez les droits en écriture à la racine de votre site !\u003c/strong\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:# chmod \u003cspan style=\"color:#f99b15\"\u003e0705\u003c/span\u003e /srv/www/site.web/www\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMême pas besoin de redémarrer nginx !\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment résoudre l'erreur 404 - Error 404 - liée à des problèmes de droits sur répertoires et fichiers pour nginx","tags":["nginx","Erreur","404","astuce"],"date_published":"2017-07-27T07:11:48+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-27:/fr/sec/linux/chattr#7aebd31042ef1ee430ef3163594bf624b36fd65586e2fd9266805b44c60f4ff3","url":"https://it-log.fr.eu.org/fr/sec/linux/chattr/","title":"Durcir Linux : Utiliser chattr","author":{"name":"Stéphane HUC"},"content_text":"Description Dans la continuité de mon article précédent Durcir Linux : modifier le partitionnement il est une commande intéressante à utiliser : chattr\nCet outil permet de modifier les attributs de fichiers, répertoires.\nIl existe une option qui est fortement pratique : l\u0026rsquo;option i - dont le but est de rendre figé, immuable l\u0026rsquo;état d\u0026rsquo;un fichier, ou répertoire et d\u0026rsquo;interdire toute modification ultérieure, même par l\u0026rsquo;administrateur système, généralement nommé root.\nLes répertoires à protéger, tout particulièrement, sont :\n/bin, /boot, /etc, /usr, /root, /sbin, ainsi que les fichiers liés à : /initrd, /lib, /lib64, /vmlinuz ⇒ Pour protéger/figer/rendre immuable, un petit coup de commande :\nchattr -R +i /bin /boot /etc /usr /root /sbin /lib* /initrd* /vmlinuz* 2\u0026gt; /dev/null chattr -R -i /etc/adjtime /etc/blkid.tab /etc/mtab /etc/network/run /etc/udev/rules.d 2\u0026gt; /dev/null InfoLa deuxième ligne est importante, car ces fichiers ne doivent pas être figés, sinon le système ne peut s\u0026rsquo;en servir ! ⇒ Pour enlever l\u0026rsquo;option i sur lesdits répertoires et fichiers, en question, il suffit d\u0026rsquo;écrire la commande ainsi :\nchattr -R -i /boot /usr /bin /sbin /lib* /root /vmlinuz* /initrd* /etc 2\u0026gt; /dev/null\nMise en garde Tout outil nécessitant une modification système, comme par exemple visudo, ou les outils de gestion de paquets, tels que ceux ci-dessous, impose la gymnastique de rendre muable avant leur usage, et d\u0026rsquo;avoir le réflexe de figer en suivant !\nN\u0026rsquo;oubliez pas que si le système vous refuse l\u0026rsquo;action, c\u0026rsquo;est que vous avez probablement figer l\u0026rsquo;état de différents binaires. ;-)\napt, dpkg, synaptic Ces commandes peuvent être insérées dans un script, pour vous faciliter la vie, et mieux, aussi vous devriez les intégrer à votre script de gestion apt.\nSi jamais vous avez la bonne idée d\u0026rsquo;abuser de cette commande, veuillez comprendre absolument qu\u0026rsquo;avec les outils apt, dpkg, synaptic, - et très certainement, tout outil gérant l\u0026rsquo;installation logicielle -, il vous faudra :\nutiliser l\u0026rsquo;option -i ; utilisez l\u0026rsquo;outil d\u0026rsquo;installation logiciel, et veillez à remettre l\u0026rsquo;option +i en suivant… Vous êtes avertis, autrement vous seriez surpris par quelques dysfonctionnements.\nUtilisation Dans le fichier /etc/apt/apt.conf.d/00apt, ajouter :\nen première ligne, dans l\u0026rsquo;invocation pre, un appel vers le script ci-dessous, tel que : DPkg::Pre-Invoke{ \u0026#34;/repertoire/chattr_sys 0\u0026#34;; (…) } et, en dernière ligne, dans l\u0026rsquo;invocation post : DPkg::Post-Invoke { (…) \u0026#34;/repertoire/chattr_sys 1\u0026#34;; } Script shell #!/bin/sh ### # # Author: Stéphane HUC # mail: devs@stephane-huc.net # # License: GNU/GPL 3 # # Github: https://git.framasoft.org/hucste/tools # # Date: 2016/05/12 # ### ### # # Change attributes system # ### arg=\u0026#34;$1\u0026#34; dirname=\u0026#34;$(dirname $(readlink -f -- \u0026#34;$0\u0026#34;))\u0026#34; email_to=\u0026#34;email@domain.tld\u0026#34; # write your mail, here email_from=\u0026#34;Admin \u0026lt;admin@domain.tld\u0026gt;\u0026#34; mail=0 # if u wish mail, set to 1 HOST=\u0026#34;$(cat /etc/hostname)\u0026#34; active() { chattr -R +i /bin /boot /chroot /etc /opt /usr /root /sbin /lib* /initrd* /vmlinuz* 2\u0026gt; /dev/null chattr -R -i /etc/adjtime /etc/blkid.tab /etc/mtab /etc/network/run /etc/udev/rules.d /var/lib /var/run 2\u0026gt; /dev/null printf \u0026#34;Chattr immutable: active\\n\u0026#34; } disable() { chattr -R -i /bin /boot /chroot /etc /opt /usr /root /sbin /lib* /initrd* /vmlinuz* 2\u0026gt; /dev/null printf \u0026#34;Chattr immutable: disable\\n\u0026#34; } send_mail() { case \u0026#34;$1\u0026#34; in 1|on|true) mssg=\u0026#34;ACTIVE\u0026#34; ;; 0|off|false) mssg=\u0026#34;DISABLE\u0026#34; ;; esac [ \u0026#34;$mail\u0026#34; -gt 0 ] \u0026amp;\u0026amp; echo \u0026#34;Chattr immutable: ${mssg} on $HOST\u0026#34; | mail -S from=\u0026#34;${email_from}\u0026#34; -s \u0026#34;Chattr immutable ~ $HOST\u0026#34; \u0026#34;${email_to}\u0026#34; sleep 1 unset mssg } launcher() { case \u0026#34;$arg\u0026#34; in 1|on|true) active; send_mail \u0026#34;$arg\u0026#34; ;; 0|off|false) disable; send_mail \u0026#34;$arg\u0026#34; ;; *) clear N=\u0026#34;service ${0##*/}\u0026#34; echo \u0026#34;Usage: $N 0|off|false to disable immutable systems...\u0026#34; \u0026gt;\u0026amp;2 echo \u0026#34;Usage: $N 1|on|true to active immutable systems...\u0026#34; \u0026gt;\u0026amp;2 exit 1 ;; esac } verify_uid() { if [ $(id -u) -ne 0 ]; then printf \u0026#34;[ \\\\33[1;31m %s \\\\33[0;39m ] %s \\n\u0026#34; \u0026#34;KO\u0026#34; \u0026#34;Need to get rights admins!\u0026#34; exit 1 fi } verify_uid launcher Vous pouvez retrouver la dernière version de ce script sur mon gitlab !\nDocumentation Manpage un coup de manpage, vous renseignera encore plus profondément : $ man chattr ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eDans la continuité de mon article précédent \u003cstrong\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sec/linux/durcir-partitionnement/\" title=\"Lien interne vers l\u0026#39;article : 'Durcir Linux : modifier le partitionnement'\"\u003eDurcir Linux : modifier le partitionnement\u003c/a\u003e\n\n\u003c/strong\u003e\nil est une commande intéressante à utiliser : \u003ccode\u003echattr\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCet outil permet de modifier les attributs de fichiers, répertoires.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eIl existe une option qui est fortement pratique : l\u0026rsquo;option \u003ccode\u003ei\u003c/code\u003e - \u003cem\u003edont le\nbut est de rendre figé, immuable l\u0026rsquo;état d\u0026rsquo;un fichier, ou répertoire et\nd\u0026rsquo;interdire toute modification ultérieure, même par l\u0026rsquo;administrateur système,\ngénéralement nommé \u003ccode\u003eroot\u003c/code\u003e\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eLes répertoires à protéger, tout particulièrement, sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/bin\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/boot\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/etc\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/usr\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/root\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/sbin\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003eainsi que les fichiers liés à : \u003ccode\u003e/initrd\u003c/code\u003e, \u003ccode\u003e/lib\u003c/code\u003e, \u003ccode\u003e/lib64\u003c/code\u003e, \u003ccode\u003e/vmlinuz\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Pour protéger/figer/rendre immuable, un petit coup de commande :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003echattr -R +i /bin /boot /etc /usr /root /sbin /lib* /initrd* /vmlinuz* 2\u0026gt; /dev/null\nchattr -R -i /etc/adjtime /etc/blkid.tab /etc/mtab /etc/network/run /etc/udev/rules.d 2\u0026gt; /dev/null\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\"\u003eLa deuxième ligne est importante, car ces fichiers ne doivent pas être figés,\nsinon le système ne peut s\u0026rsquo;en servir !\u003c/div\u003e\n\n\u003cp\u003e⇒ Pour enlever l\u0026rsquo;option \u003ccode\u003ei\u003c/code\u003e sur lesdits répertoires et fichiers, en question,\nil suffit d\u0026rsquo;écrire la commande ainsi :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003echattr -R -i /boot /usr /bin /sbin /lib* /root /vmlinuz* /initrd* /etc 2\u0026gt; /dev/null\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"mise-en-garde\"\u003eMise en garde\u003c/h2\u003e\n\u003cp\u003eTout outil nécessitant une modification système, comme par exemple \u003cstrong\u003evisudo\u003c/strong\u003e,\nou les outils de gestion de paquets, tels que ceux ci-dessous, impose la\ngymnastique de rendre muable avant leur usage, et d\u0026rsquo;avoir le réflexe de\nfiger en suivant !\u003c/p\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas que si le système vous refuse l\u0026rsquo;action, c\u0026rsquo;est que vous avez\nprobablement figer l\u0026rsquo;état de différents binaires. ;-)\u003c/p\u003e\n\u003ch3 id=\"apt-dpkg-synaptic\"\u003eapt, dpkg, synaptic\u003c/h3\u003e\n\u003cp\u003eCes commandes peuvent être insérées dans un script, pour vous faciliter\nla vie, et mieux, aussi vous devriez les intégrer à votre script de gestion\n\u003ccode\u003eapt\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSi jamais vous avez la bonne idée d\u0026rsquo;abuser de cette commande, veuillez\ncomprendre absolument qu\u0026rsquo;avec les outils \u003cstrong\u003eapt\u003c/strong\u003e, \u003cstrong\u003edpkg\u003c/strong\u003e, \u003cstrong\u003esynaptic\u003c/strong\u003e, -\n\u003cem\u003eet très certainement, tout outil gérant l\u0026rsquo;installation logicielle\u003c/em\u003e -, il vous\nfaudra :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eutiliser l\u0026rsquo;option \u003ccode\u003e-i\u003c/code\u003e ;\u003c/li\u003e\n\u003cli\u003eutilisez l\u0026rsquo;outil d\u0026rsquo;installation logiciel,\u003c/li\u003e\n\u003cli\u003eet veillez à remettre l\u0026rsquo;option \u003ccode\u003e+i\u003c/code\u003e en suivant…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVous êtes avertis, autrement vous seriez surpris par quelques dysfonctionnements.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eDans le fichier \u003ccode\u003e/etc/apt/apt.conf.d/00apt\u003c/code\u003e, ajouter :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003een première ligne, dans l\u0026rsquo;invocation \u003cem\u003epre\u003c/em\u003e, un appel vers le script ci-dessous,\ntel que :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eDPkg::Pre-Invoke{\n   \u0026#34;/repertoire/chattr_sys 0\u0026#34;;\n(…)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003eet, en dernière ligne, dans l\u0026rsquo;invocation \u003cem\u003epost\u003c/em\u003e :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eDPkg::Post-Invoke {\n(…)\n   \u0026#34;/repertoire/chattr_sys 1\u0026#34;;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"script-shell\"\u003eScript shell\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-bash\" data-lang=\"bash\"\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###\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#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# License: GNU/GPL 3\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: https://git.framasoft.org/hucste/tools\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: 2016/05/12\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###\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# Change attributes system\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\"\u003earg\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:#ef6155\"\u003edirname\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:#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\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eemail_to\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;email@domain.tld\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e# write your mail, here\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eemail_from\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Admin \u0026lt;admin@domain.tld\u0026gt;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  \u003cspan style=\"color:#776e71\"\u003e# if u wish mail, set to 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:#ef6155\"\u003eHOST\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\u003ecat /etc/hostname\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\u003eactive\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    chattr -R +i /bin /boot /chroot /etc /opt /usr /root /sbin /lib* /initrd* /vmlinuz* 2\u0026gt; /dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    chattr -R -i /etc/adjtime /etc/blkid.tab /etc/mtab /etc/network/run /etc/udev/rules.d /var/lib /var/run 2\u0026gt; /dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Chattr immutable: active\\n\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\u003edisable\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    chattr -R -i /bin /boot /chroot /etc /opt /usr /root /sbin /lib* /initrd* /vmlinuz* 2\u0026gt; /dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Chattr immutable: disable\\n\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\u003esend_mail\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:#ef6155\"\u003e$1\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        1|on|true\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003emssg\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;ACTIVE\u0026#34;\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        0|off|false\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003emssg\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\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:#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 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$mail\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -gt \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Chattr immutable: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003emssg\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e on \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOST\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | mail -S \u003cspan style=\"color:#ef6155\"\u003efrom\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\"\u003eemail_from\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -s \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Chattr immutable ~ \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOST\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\"\u003eemail_to\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    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    unset mssg\n\u003c/span\u003e\u003c/span\u003e\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\u003elauncher\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:#ef6155\"\u003e$arg\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        1|on|true\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            active;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            send_mail \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$arg\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        0|off|false\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            send_mail \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$arg\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            clear\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#ef6155\"\u003eN\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;service \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e0\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            echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Usage: \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$N\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e 0|off|false to disable immutable systems...\u0026#34;\u003c/span\u003e \u0026gt;\u0026amp;\u003cspan style=\"color:#f99b15\"\u003e2\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;Usage: \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$N\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e 1|on|true to active immutable systems...\u0026#34;\u003c/span\u003e \u0026gt;\u0026amp;\u003cspan style=\"color:#f99b15\"\u003e2\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:#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\u003everify_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:#815ba4\"\u003e$(\u003c/span\u003eid -u\u003cspan style=\"color:#815ba4\"\u003e)\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        printf \u003cspan style=\"color:#48b685\"\u003e\u0026#34;[ \\\\33[1;31m %s \\\\33[0;39m ] %s \\n\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Need to get rights admins!\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    \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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003everify_uid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elauncher\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVous pouvez retrouver la dernière version de ce script sur mon \u003ca href=\"https://framagit.org/hucste/tools/-/raw/master/Debian/chattr_sys\" rel=\"external\"\u003egitlab\u003c/a\u003e !\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003ch3 id=\"manpage\"\u003eManpage\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eun coup de \u003cstrong\u003emanpage\u003c/strong\u003e, vous renseignera encore plus profondément : \u003ccode\u003e$ man chattr\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment sécuriser sa distribution GNU/Linux en utilisant le binaire chattr","tags":["Linux","Harden","chattr"],"date_published":"2017-07-27T07:07:17+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-26:/fr/sec/firewall/linux-firewall-icmpv6#05c970ee5ebc4fa283784de54b51e56dbf451fa51b5be18553b9f5a203935255","url":"https://it-log.fr.eu.org/fr/sec/firewall/linux-firewall-icmpv6/","title":"Linux : firewall ICMPv6","author":{"name":"Stéphane HUC"},"content_text":"Description Ou cette fois-ci, comment titrer : Filtrer le protocole ICMPv6 sous Linux - l\u0026rsquo;équivalent du protocole ICMP mais pour IPv6\nIl y a quelques heures, j\u0026rsquo;ai écrit cet autre mémo … maintenant, je retranscris à-propos des mesures de filtrage à mettre en place autour de ce protocole qu\u0026rsquo;est ICMPv6.\nJe ne vais pas faire un rappel de ce pourquoi existe ce protocole, ni du fait que mal utilisé, il peut-être dangereux ; et, bien sûr, malheureusement, il y aura toujours des gens pour mal l\u0026rsquo;utiliser !\nGérer ICMPv6 Les codes ICMPv6 à refuser Par prudence, il est recommandable de filtrer tous les codes expérimentaux, tels que 100, 101, 200, et 201, ainsi que les codes réservés pour le futur, à savoir les codes 127 et 255.\nIl est recommandé de bloquer les codes suivants :\n5 à 99 : ces codes sont non alloués ! 100, 101 : codes expérimentaux 102 à 126 : codes non alloués 137 - Redirect Message - sauf en cas de nécessité 138 - Router Renumbering 139 - ICMP Node Information Query 140 - ICMP Node Information Response 144 - Home Agent Address Discovery Request Message 145 - Home Agent Address Discovery Reply Message 146 - Mobile Prefix Solicitation 147 - Mobile Prefix Advertisement 150 - Seamoby Experimental - sauf en cas de nécessité 154 à 199 : codes non alloués 200, 201 : codes expérimentaux 202 à 254 : codes non alloués Les codes ICMPv6 à limiter Les recommandations sont de limiter, en entrée et en sortie de machine, tous les codes de type :\n1 - Destination Unreachable 4 - Parameter Problem Message Les recommandations suivantes sont de limiter en entrée seulement, tous les codes suivants :\n2/0 - Packet Too Big Message 3 - Time Exceeded Message et tous les autres codes existants, dont particulièrement : le code 128/0 - Echo Request message (le ping) - et le code 129/0 - Echo reply message (le pong). Précisions utiles Concernant les codes suivants, il est précisé, dans leur RFC correspondante, leur format de message :\ntous les codes dits MLD (Multicast Listener Discovery) donc 130, 131, 132 et 143 - et MLDv2 doivent être envoyés depuis une adresse dont la source est un lien local IPv6, avec un hop limit à 1\nselon la RFC 2710 ; le type 143 étant défini par la RFC 3810. tous les codes dits ND (Neighbor Discovery) de 133 à 137 doivent être envoyés avec un hop-limit à 255 - définis par la RFC 4861. Quelques précisions concernant ces codes :\nle code 133 - Router Solicitation - doit être envoyé par une source ayant forcément une adresse IP assignée, ou depuis une adresse non spécifiée si l\u0026rsquo;interface réseau n\u0026rsquo;a pas encore d\u0026rsquo;adresse IP assignée, vers tout routeur.\nle code 134 - Router Advertisement - doit ABSOLUMENT être envoyé par un routeur, émettant un avis de routeur périodique, ou une réponse à une sollicitation de routeur, à destination de tout nœud multicast ou à l\u0026rsquo;adresse source invoquant le routeur.\nle code 135 - Neighbor Solicitation - doit être envoyé par une source ayant forcément une adresse IP assignée, ou depuis une adresse non spécifiée si l\u0026rsquo;interface réseau n\u0026rsquo;a pas encore d\u0026rsquo;adresse IP assignée, vers tout nœud multicast.\nle code 136 - Neighbor Advertisement - doit ABSOLUMENT être envoyé par une adresse IP assignée, vers l\u0026rsquo;adresse source invoquant le code 135, ou vers tout nœud multicast, s\u0026rsquo;il n\u0026rsquo;y a pas d\u0026rsquo;adresse assignée.\nle code 137 - Redirect Message - doit ABSOLUMENT être envoyé par une adresse IP assignée, lien local IPv6, d\u0026rsquo;un routeur vers l\u0026rsquo;adresse source qui a demandé la redirection du message.\nles codes dits NIQ (Node Information Queries) - donc 139 - ICMP Node Information Query - et 140 - ICMP Node Information Response - doivent refuser toutes requêtes venant d\u0026rsquo;adresses IPv6 dites globales et devraient appliquer l\u0026rsquo;emploi de l\u0026rsquo;option limit. À savoir qu\u0026rsquo;il y a d\u0026rsquo;autres mesures de sécurité, plus complexes… RFC 4620\nles codes dits ND ID (Neighbor Discovery Inverse Discovery) - donc 141 - Inverse Neighbor Discovery Solicitation Message - et 142 - Inverse Neighbor Discovery Advertisement Message -, tous deux doivent avoir pour source une adresse IP assignée - codes définis par la RFC 3122 :\nle code 141 doit être envoyé à destination de tout noeud multicast, dont le format est de type FF02::1 le code 142 doit répondre seulement à une requête de type 141. les codes dits SEND (SEcure Neighbor Discovery) - donc 148 - Certification Path Solicitation Message - et 149 - Certification Path Advertisement Message - doivent être envoyés avec un hop-limit à 255 - c\u0026rsquo;est la RFC 3971 qui définit ces codes.\nles codes dits MRD (Multicast Router Discovery) - donc 151 à 153, définis par la RFC 4286, doivent être envoyés depuis une addresse assignée, lien local IPv6, et avoir un hop-limit à 255.\nExemples ICMPv6 en mode parano En mode paranoïaque, cela donne ce genre de règles :\n##ip6tables -A INPUT -p icmpv6 -m conntrack --ctstate INVALID -j DROP ip6tables -A INPUT -p icmpv6 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT ip6tables -A INPUT -p icmpv6 -m limit --limit 3/s --limit-burst 7 -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -m conntrack --ctstate NEW -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -m conntrack --ctstate NEW -j ACCEPT ip6tables -A INPUT -s fe80::/64 -p icmpv6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT # Type: 134 ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m hl --hl-eq 255 -j ACCEPT # Type: 135 ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m hl --hl-eq 255 -j ACCEPT # Type: 136 ip6tables -A INPUT -p icmpv6 -j DROP ##ip6tables -A OUTPUT -p icmpv6 -m conntrack --ctstate INVALID -j DROP ip6tables -A OUTPUT -p icmpv6 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT ip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-request -m conntrack --ctstate NEW -j ACCEPT ip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-reply -m conntrack --ctstate NEW -j ACCEPT ip6tables -A OUTPUT -d ff02::/16 -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT # Type: 133 ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT # Type: 135 ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT # Type: 136 ip6tables -A OUTPUT -d ff02::/16 -p icmpv6 --icmpv6-type 143/0 -j ACCEPT # Type: 143/0 ip6tables -A OUTPUT -p icmpv6 -j DROP ICMP filtré, limité Voici, pour l\u0026rsquo;exemple, basé sur la compréhension des recommandations IETF, des règles ICMP filtrées, limitées ; puis de rejeter tous les autres codes, avec le message icmp6-adm-prohibited.\n# INPUT RULES ip6tables -N INPUT_ICMPV6 ##ip6tables -A INPUT_ICMPV6 -p icmpv6 -m conntrack --ctstate INVALID -j DROP ip6tables -A INPUT_ICMPV6 -p icmpv6 -m limit --limit 3/s --limit-burst 7 -j ACCEPT ip6tables -A INPUT_ICMPV6 -p icmpv6 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 1 -m conntrack --ctstate NEW -j ACCEPT # destination-unreachable; Must Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 2/0 -m conntrack --ctstate NEW -j ACCEPT # packet too big; Must Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 3/0 -m conntrack --ctstate NEW -j ACCEPT # time exceeded; Must Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 3/1 -m conntrack --ctstate NEW -j ACCEPT # time exceeded; Should Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/0 -m conntrack --ctstate NEW -j ACCEPT # parameter pb: Erroneous header field encountered; Should Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/1 -m conntrack --ctstate NEW -j ACCEPT # parameter pb: Unrecognized Next Header Type encountered; Must Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/2 -m conntrack --ctstate NEW -j ACCEPT # parameter pb: Unrecognized IPv6 option encountered; Must Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 100 -j DROP # private experimentation ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 101 -j DROP # private experimentation ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 127 -j DROP # error messages ICMPv6 ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 128/0 -m conntrack --ctstate NEW -j ACCEPT # ping tool: echo request message; Must Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 129/0 -m conntrack --ctstate NEW -j ACCEPT # ping tool: echo reply message; Must Not Be Dropped # link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1) ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 130/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 131/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 132/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped # address configuration and routeur selection mssg (received with hop limit = 255) ##ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 133/0 -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED) ip6tables -A INPUT_ICMPV6 -s fe80::/64 -p icmpv6 --icmpv6-type 134/0 -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED) ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 135/0 -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED) ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 136/0 -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED) ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 137/0 -j DROP # Will Be Dropped Anyway ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 138/0 -j DROP # Will Be Dropped Anyway ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 139/0 -j DROP # Should Be Dropped Unless a Good Case Can Be Made ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 140/0 -j DROP # Should Be Dropped Unless a Good Case Can Be Made ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 141/0 -d ff02::1 -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED) ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 142/0 -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED) # link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1) ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 143 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped # needed for mobylity ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 144/0 -j DROP # Will Be Dropped Anyway ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 145/0 -j DROP # Will Be Dropped Anyway ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 146/0 -j DROP # Will Be Dropped Anyway ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 147 -j DROP # Will Be Dropped Anyway # SEND certificate path notification mssg (received with hop limit = 255) ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 148 -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED) ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 149 -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED) # multicast routeur discovery mssg (need link-local src address and hop limit = 1) ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 151 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 152 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 153 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped # ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 200 -j DROP # private experimentation ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 201 -j DROP # private experimentation ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 255 -j DROP # error messages ICMPv6 # all others are dropped #ip6tables -A INPUT_ICMPV6 -p icmpv6 ! --icmpv6-type -j DROP or -j REJECT --reject-with icmp6-adm-prohibited ⇐ this type seems not correctly supported! ip6tables -A INPUT_ICMPV6 -p icmpv6 -j REJECT --reject-with no-route # OUTPUT RULES ip6tables -N OUTPUT_ICMPV6 ##ip6tables -A OUTPUT_ICMPV6 -p icmpv6 -m conntrack --ctstate INVALID -j DROP ip6tables -A OUTPUT_ICMPV6 -p icmpv6 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 1 -m conntrack --ctstate NEW -m limit --limit 3/s --limit-burst 7 -j ACCEPT # destination-unreachable; Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 2/0 -m conntrack --ctstate NEW -j ACCEPT # packet too big; Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 3/0 -m conntrack --ctstate NEW -j ACCEPT # time exceeded; Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 3/1 -m conntrack --ctstate NEW -j ACCEPT # time exceeded; Should Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/0 -m conntrack --ctstate NEW -m limit --limit 3/s --limit-burst 7 -j ACCEPT # parameter pb: Erroneous header field encountered; Should Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/1 -m conntrack --ctstate NEW -m limit --limit 3/s --limit-burst 7 -j ACCEPT # parameter pb: Unrecognized Next Header Type encountered; Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/2 -m conntrack --ctstate NEW -m limit --limit 3/s --limit-burst 7 -j ACCEPT # parameter pb: Unrecognized IPv6 option encountered; Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 100 -j DROP # private experimentation ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 101 -j DROP # private experimentation ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 127 -j DROP # error messages ICMPv6 ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 128/0 -m conntrack --ctstate NEW -j ACCEPT # ping tool: echo request message; Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 129/0 -m conntrack --ctstate NEW -j ACCEPT # ping tool: echo reply message; Must Not Be Dropped # link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1) ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 130/0 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 131/0 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 132/0 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped # address configuration and routeur selection mssg (received with hop limit = 255) ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 133/0 -d ff02::/16 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped ##ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 134/0 -d fe80::/64 -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 135/0 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 136/0 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 137/0 -j DROP # Will Be Dropped Anyway ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 138/0 -j DROP # Will Be Dropped Anyway ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 139/0 -j DROP # Should Be Dropped Unless a Good Case Can Be Made ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 140/0 -j DROP # Should Be Dropped Unless a Good Case Can Be Made ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 141/0 -d ff02::1 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 142/0 -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped # link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1) ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 143 -d ff02::/16 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped # needed for mobylity: except if the context requires it, then it will be necessary to limit them ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 144/0 -j DROP # Will Be Dropped Anyway ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 145/0 -j DROP # Will Be Dropped Anyway ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 146/0 -j DROP # Will Be Dropped Anyway ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 147 -j DROP # Will Be Dropped Anyway # SEND certificate path notification mssg (received with hop limit = 255) ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 148 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 149 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT # Must Not Be Dropped # multicast routeur discovery mssg (need link-local src address and hop limit = 1) ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 151 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 152 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 153 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT # Must Not Be Dropped # ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 200 -j DROP # private experimentation ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 201 -j DROP # private experimentation ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 255 -j DROP # error messages ICMPv6 # all others are dropped #ip6tables -A OUTPUT_ICMPV6 -p icmpv6 ! --icmpv6-type -j DROP or -j REJECT --reject-with icmp6-adm-prohibited # ⇐ this type seems not correctly supported! ip6tables -A OUTPUT_ICMPV6 -p icmpv6 -j REJECT --reject-with no-route Documentations Je ne vais pas reprendre le petit laïus sur IETF , ou IANA, mais simplement rappeler de bonnes lectures à faire.\nSi jamais, vous avez d\u0026rsquo;autres \u0026ldquo;tuyaux\u0026rdquo; du même acabit, n\u0026rsquo;hésitez pas m\u0026rsquo;envoyer un commentaire par mail.\nles différents paramètres ICMPv6\nla RFC 4890\nla RFC 5927\nle draft ICMP filtering\nle draft ICMPv6 filtering\nGNU Linux Magazine : Netfilter et le filtrage du protocole IPv6\nRFC 2710 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 3122 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 3810 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 3971 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 4286 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 4620 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 4861 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 4890 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 5927 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOu cette fois-ci, comment titrer : \u003cstrong\u003eFiltrer le protocole ICMPv6 sous Linux\u003c/strong\u003e -\n\u003cem\u003el\u0026rsquo;équivalent du protocole ICMP mais pour IPv6\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eIl y a quelques heures, j\u0026rsquo;ai écrit cet autre\n\n\u003ca class=\"inside\" href=\"/fr/sec/firewall/linux-firewall-icmp/\" title=\"Lien interne vers l\u0026#39;article : 'Linux : firewall ICMP'\"\u003emémo\u003c/a\u003e\n… \u003cbr\u003e\nmaintenant, je retranscris à-propos des mesures de filtrage à mettre en\nplace autour de ce protocole qu\u0026rsquo;est ICMPv6.\u003c/p\u003e\n\u003cp\u003eJe ne vais pas faire un rappel de ce pourquoi existe ce protocole, ni du\nfait que mal utilisé, il peut-être dangereux ; et, bien sûr, malheureusement,\nil y aura toujours des gens pour mal l\u0026rsquo;utiliser !\u003c/p\u003e\n\u003ch2 id=\"gérer-icmpv6\"\u003eGérer ICMPv6\u003c/h2\u003e\n\u003ch3 id=\"les-codes-icmpv6-à-refuser\"\u003eLes codes ICMPv6 à refuser\u003c/h3\u003e\n\u003cp\u003ePar prudence, il est recommandable de filtrer tous les codes expérimentaux,\ntels que 100, 101, 200, et 201, ainsi que les codes réservés pour le futur,\nà savoir les codes 127 et 255.\u003c/p\u003e\n\u003cp\u003eIl est recommandé de bloquer les codes suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e5\u003c/strong\u003e à \u003cstrong\u003e99\u003c/strong\u003e : ces codes sont non alloués !\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e100\u003c/strong\u003e, \u003cstrong\u003e101\u003c/strong\u003e : codes expérimentaux\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e102\u003c/strong\u003e à \u003cstrong\u003e126\u003c/strong\u003e : codes non alloués\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e137\u003c/strong\u003e - Redirect Message - sauf en cas de nécessité\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e138\u003c/strong\u003e - Router Renumbering\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e139\u003c/strong\u003e - ICMP Node Information Query\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e140\u003c/strong\u003e - ICMP Node Information Response\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e144\u003c/strong\u003e - Home Agent Address Discovery Request Message\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e145\u003c/strong\u003e - Home Agent Address Discovery Reply Message\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e146\u003c/strong\u003e - Mobile Prefix Solicitation\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e147\u003c/strong\u003e - Mobile Prefix Advertisement\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e150\u003c/strong\u003e - Seamoby Experimental - sauf en cas de nécessité\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e154\u003c/strong\u003e à \u003cstrong\u003e199\u003c/strong\u003e : codes non alloués\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e200\u003c/strong\u003e, \u003cstrong\u003e201\u003c/strong\u003e : codes expérimentaux\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e202\u003c/strong\u003e à \u003cstrong\u003e254\u003c/strong\u003e : codes non alloués\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"les-codes-icmpv6-à-limiter\"\u003eLes codes ICMPv6 à limiter\u003c/h3\u003e\n\u003cp\u003eLes recommandations sont de limiter, en entrée et en sortie de machine,\ntous les codes de type :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e1\u003c/strong\u003e - Destination Unreachable\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e4\u003c/strong\u003e - Parameter Problem Message\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes recommandations suivantes sont de limiter en entrée seulement, tous\nles codes suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e2/0\u003c/strong\u003e - Packet Too Big Message\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e3\u003c/strong\u003e - Time Exceeded Message\u003c/li\u003e\n\u003cli\u003eet tous les autres codes existants, dont particulièrement :\n\u003cul\u003e\n\u003cli\u003ele code \u003cstrong\u003e128/0\u003c/strong\u003e - Echo Request message \u003cem\u003e(le ping)\u003c/em\u003e -\u003c/li\u003e\n\u003cli\u003eet le code \u003cstrong\u003e129/0\u003c/strong\u003e - Echo reply message \u003cem\u003e(le pong)\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"précisions-utiles\"\u003ePrécisions utiles\u003c/h3\u003e\n\u003cp\u003eConcernant les codes suivants, il est précisé, dans leur RFC correspondante,\nleur format de message :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003etous les codes dits \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\u003cspan lang=\"en\"\u003eMLD \u003cem\u003e(Multicast Listener Discovery)\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\u003c/strong\u003e\ndonc \u003cstrong\u003e130\u003c/strong\u003e, \u003cstrong\u003e131\u003c/strong\u003e, \u003cstrong\u003e132\u003c/strong\u003e et \u003cstrong\u003e143\u003c/strong\u003e - et \u003cstrong\u003eMLDv2\u003c/strong\u003e doivent être\nenvoyés depuis une adresse dont la source est un lien local IPv6,\navec un \u003ccode\u003ehop limit\u003c/code\u003e à \u003ccode\u003e1\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eselon la \u003ca href=\"/fr/sec/firewall/linux-firewall-icmpv6/#rfc-2710\"\u003eRFC 2710\u003c/a\u003e\u003c/em\u003e ;\n\u003cem\u003ele type 143 étant défini par la \u003ca href=\"/fr/sec/firewall/linux-firewall-icmpv6/#rfc-3810\"\u003eRFC 3810\u003c/a\u003e\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003etous les codes dits \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\u003cspan lang=\"en\"\u003eND \u003cem\u003e(Neighbor Discovery)\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\u003c/strong\u003e de \u003cstrong\u003e133\u003c/strong\u003e\nà \u003cstrong\u003e137\u003c/strong\u003e doivent être envoyés avec un \u003ccode\u003ehop-limit\u003c/code\u003e à \u003ccode\u003e255\u003c/code\u003e -\n\u003cem\u003edéfinis par la \u003ca href=\"/fr/sec/firewall/linux-firewall-icmpv6/#rfc-4861\"\u003eRFC 4861\u003c/a\u003e\u003c/em\u003e. \u003cbr\u003e\nQuelques précisions concernant ces codes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ele code \u003cstrong\u003e133\u003c/strong\u003e - \u003cstrong\u003eRouter Solicitation\u003c/strong\u003e - doit être envoyé par une\nsource ayant forcément une adresse IP assignée, ou depuis une adresse\nnon spécifiée si l\u0026rsquo;interface réseau n\u0026rsquo;a pas encore d\u0026rsquo;adresse IP\nassignée, vers tout routeur.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele code \u003cstrong\u003e134\u003c/strong\u003e - \u003cstrong\u003eRouter Advertisement\u003c/strong\u003e - doit ABSOLUMENT être\nenvoyé par un routeur, émettant un avis de routeur périodique, ou\nune réponse à une sollicitation de routeur, à destination de tout\nnœud multicast ou à l\u0026rsquo;adresse source invoquant le routeur.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele code \u003cstrong\u003e135\u003c/strong\u003e - \u003cstrong\u003eNeighbor Solicitation\u003c/strong\u003e - doit être envoyé par\nune source ayant forcément une adresse IP assignée, ou depuis une\nadresse non spécifiée si l\u0026rsquo;interface réseau n\u0026rsquo;a pas encore d\u0026rsquo;adresse\nIP assignée, vers tout nœud multicast.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele code \u003cstrong\u003e136\u003c/strong\u003e - \u003cstrong\u003eNeighbor Advertisement\u003c/strong\u003e - doit ABSOLUMENT être\nenvoyé par une adresse IP assignée, vers l\u0026rsquo;adresse source invoquant\nle code 135, ou vers tout nœud multicast, s\u0026rsquo;il n\u0026rsquo;y a pas d\u0026rsquo;adresse\nassignée.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele code \u003cstrong\u003e137\u003c/strong\u003e - \u003cstrong\u003eRedirect Message\u003c/strong\u003e - doit ABSOLUMENT être envoyé\npar une adresse IP assignée, lien local IPv6, d\u0026rsquo;un routeur vers\nl\u0026rsquo;adresse source qui a demandé la redirection du message.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eles codes dits \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\u003cspan lang=\"en\"\u003eNIQ \u003cem\u003e(Node Information Queries)\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\u003c/strong\u003e - donc\n\u003cstrong\u003e139\u003c/strong\u003e - \u003cstrong\u003eICMP Node Information Query\u003c/strong\u003e - et \u003cstrong\u003e140\u003c/strong\u003e -\n\u003cstrong\u003eICMP Node Information Response\u003c/strong\u003e -\ndoivent refuser toutes requêtes venant d\u0026rsquo;adresses IPv6 dites globales\net devraient appliquer l\u0026rsquo;emploi de l\u0026rsquo;option \u003ccode\u003elimit\u003c/code\u003e. \u003cbr\u003e\nÀ savoir qu\u0026rsquo;il y a d\u0026rsquo;autres mesures de sécurité, plus complexes…\n\u003cem\u003e\u003ca href=\"/fr/sec/firewall/linux-firewall-icmpv6/#rfc-4620\"\u003eRFC 4620\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eles codes dits \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\u003cspan lang=\"en\"\u003eND ID \u003cem\u003e(Neighbor Discovery Inverse Discovery)\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\u003c/strong\u003e -\ndonc \u003cstrong\u003e141\u003c/strong\u003e - \u003cstrong\u003eInverse Neighbor Discovery Solicitation Message\u003c/strong\u003e -\net \u003cstrong\u003e142\u003c/strong\u003e - \u003cstrong\u003eInverse Neighbor Discovery Advertisement Message\u003c/strong\u003e -,\ntous deux doivent avoir pour source une adresse IP assignée - \u003cem\u003ecodes\ndéfinis par la \u003ca href=\"/fr/sec/firewall/linux-firewall-icmpv6/#rfc-3122\"\u003eRFC 3122\u003c/a\u003e\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele code \u003cstrong\u003e141\u003c/strong\u003e doit être envoyé à destination de tout noeud multicast,\ndont le format est de type \u003cstrong\u003eFF02::1\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ele code \u003cstrong\u003e142\u003c/strong\u003e doit répondre seulement à une requête de type 141.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eles codes dits \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\u003cspan lang=\"en\"\u003eSEND \u003cem\u003e(SEcure Neighbor Discovery)\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\u003c/strong\u003e - donc\n\u003cstrong\u003e148\u003c/strong\u003e - \u003cstrong\u003eCertification Path Solicitation Message\u003c/strong\u003e - et \u003cstrong\u003e149\u003c/strong\u003e -\n\u003cstrong\u003eCertification Path Advertisement Message\u003c/strong\u003e - doivent être envoyés\navec un \u003ccode\u003ehop-limit\u003c/code\u003e à \u003ccode\u003e255\u003c/code\u003e - \u003cem\u003ec\u0026rsquo;est la \u003ca href=\"/fr/sec/firewall/linux-firewall-icmpv6/#rfc-3971\"\u003eRFC 3971\u003c/a\u003e\nqui définit ces codes\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eles codes dits \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\u003cspan lang=\"en\"\u003eMRD \u003cem\u003e(Multicast Router Discovery)\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\u003c/strong\u003e - donc\n\u003cstrong\u003e151\u003c/strong\u003e à \u003cstrong\u003e153\u003c/strong\u003e, \u003cem\u003edéfinis par la \u003ca href=\"/fr/sec/firewall/linux-firewall-icmpv6/#rfc-4286\"\u003eRFC 4286\u003c/a\u003e\u003c/em\u003e,\ndoivent être envoyés depuis une addresse assignée, lien local IPv6,\net avoir un \u003ccode\u003ehop-limit\u003c/code\u003e à \u003ccode\u003e255\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003ch3 id=\"icmpv6-en-mode-parano\"\u003eICMPv6 en mode parano\u003c/h3\u003e\n\u003cp\u003eEn mode paranoïaque, cela donne ce genre 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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##ip6tables -A INPUT -p icmpv6 -m conntrack --ctstate INVALID -j DROP\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT -p icmpv6 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT -p icmpv6 -m limit --limit 3/s --limit-burst 7 -j ACCEPT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -m conntrack --ctstate NEW -j ACCEPT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -m conntrack --ctstate NEW -j ACCEPT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT -s fe80::/64 -p icmpv6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT # Type: 134\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m hl --hl-eq 255 -j ACCEPT # Type: 135\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m hl --hl-eq 255 -j ACCEPT # Type: 136\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT -p icmpv6 -j DROP\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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##ip6tables -A OUTPUT -p icmpv6 -m conntrack --ctstate INVALID -j DROP\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT -p icmpv6 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-request -m conntrack --ctstate NEW -j ACCEPT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-reply -m conntrack --ctstate NEW -j ACCEPT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT -d ff02::/16 -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT # Type: 133\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT # Type: 135\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT # Type: 136\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT -d ff02::/16 -p icmpv6 --icmpv6-type 143/0 -j ACCEPT # Type: 143/0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT -p icmpv6 -j DROP\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"icmp-filtré-limité\"\u003eICMP filtré, limité\u003c/h3\u003e\n\u003cp\u003eVoici, pour l\u0026rsquo;exemple, basé sur la compréhension des recommandations IETF,\ndes règles ICMP filtrées, limitées ; puis de rejeter tous les autres codes,\navec le message \u003ccode\u003eicmp6-adm-prohibited\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# INPUT RULES\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -N INPUT_ICMPV6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##ip6tables -A INPUT_ICMPV6 -p icmpv6 -m conntrack --ctstate INVALID -j DROP\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 -m limit --limit 3/s --limit-burst 7 -j ACCEPT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 1 -m conntrack --ctstate NEW -j ACCEPT   # destination-unreachable; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 2/0 -m conntrack --ctstate NEW -j ACCEPT   # packet too big; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 3/0 -m conntrack --ctstate NEW -j ACCEPT # time exceeded; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 3/1 -m conntrack --ctstate NEW -j ACCEPT # time exceeded; Should Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/0 -m conntrack --ctstate NEW -j ACCEPT   # parameter pb: Erroneous header field encountered; Should Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/1 -m conntrack --ctstate NEW -j ACCEPT   # parameter pb: Unrecognized Next Header Type encountered; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/2 -m conntrack --ctstate NEW -j ACCEPT   # parameter pb: Unrecognized IPv6 option encountered; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 100 -j DROP   # private experimentation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 101 -j DROP   # private experimentation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 127 -j DROP   # error messages ICMPv6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 128/0 -m conntrack --ctstate NEW -j ACCEPT   # ping tool: echo request message; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 129/0 -m conntrack --ctstate NEW -j ACCEPT  # ping tool: echo reply message; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 130/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 131/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 132/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# address configuration and routeur selection mssg (received with hop limit = 255)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##ip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 133/0 -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -s fe80::/64 -p icmpv6 --icmpv6-type 134/0 -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 135/0 -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 136/0 -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 137/0 -j DROP   # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 138/0 -j DROP   # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 139/0 -j DROP   # Should Be Dropped Unless a Good Case Can Be Made\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 140/0 -j DROP   # Should Be Dropped Unless a Good Case Can Be Made\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 141/0 -d ff02::1 -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 142/0 -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 143 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# needed for mobylity\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 144/0 -j DROP  # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 145/0 -j DROP  # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 146/0 -j DROP  # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 147 -j DROP  # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# SEND certificate path notification mssg (received with hop limit = 255)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 148 -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 149 -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped (only RELATED,ESTABLISHED,UNTRACKED)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# multicast routeur discovery mssg (need link-local src address and hop limit = 1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 151 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 152 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 153 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\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\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 200 -j DROP   # private experimentation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 201 -j DROP   # private experimentation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 --icmpv6-type 255 -j DROP   # error messages ICMPv6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# all others are dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#ip6tables -A INPUT_ICMPV6 -p icmpv6 ! --icmpv6-type -j DROP or -j REJECT --reject-with icmp6-adm-prohibited ⇐ this type seems not correctly supported!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A INPUT_ICMPV6 -p icmpv6 -j REJECT --reject-with no-route\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# OUTPUT RULES\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -N OUTPUT_ICMPV6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##ip6tables -A OUTPUT_ICMPV6 -p icmpv6 -m conntrack --ctstate INVALID -j DROP\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 1 -m conntrack --ctstate NEW -m limit --limit 3/s --limit-burst 7 -j ACCEPT   # destination-unreachable; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 2/0 -m conntrack --ctstate NEW -j ACCEPT   # packet too big; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 3/0 -m conntrack --ctstate NEW -j ACCEPT # time exceeded; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 3/1 -m conntrack --ctstate NEW -j ACCEPT # time exceeded; Should Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/0 -m conntrack --ctstate NEW -m limit --limit 3/s --limit-burst 7 -j ACCEPT   # parameter pb: Erroneous header field encountered; Should Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/1 -m conntrack --ctstate NEW -m limit --limit 3/s --limit-burst 7 -j ACCEPT   # parameter pb: Unrecognized Next Header Type encountered; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 4/2 -m conntrack --ctstate NEW -m limit --limit 3/s --limit-burst 7 -j ACCEPT   # parameter pb: Unrecognized IPv6 option encountered; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 100 -j DROP   # private experimentation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 101 -j DROP   # private experimentation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 127 -j DROP   # error messages ICMPv6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 128/0 -m conntrack --ctstate NEW -j ACCEPT   # ping tool: echo request message; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 129/0 -m conntrack --ctstate NEW -j ACCEPT  # ping tool: echo reply message; Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 130/0 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 131/0 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 132/0 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# address configuration and routeur selection mssg (received with hop limit = 255)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 133/0 -d ff02::/16 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##ip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 134/0 -d fe80::/64 -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 135/0 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 136/0 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 137/0 -j DROP   # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 138/0 -j DROP   # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 139/0 -j DROP   # Should Be Dropped Unless a Good Case Can Be Made\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 140/0 -j DROP   # Should Be Dropped Unless a Good Case Can Be Made\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 141/0 -d ff02::1 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 142/0 -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 143 -d ff02::/16 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# needed for mobylity: except if the context requires it, then it will be necessary to limit them\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 144/0 -j DROP  # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 145/0 -j DROP  # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 146/0 -j DROP  # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 147 -j DROP  # Will Be Dropped Anyway\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# SEND certificate path notification mssg (received with hop limit = 255)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 148 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 149 -m conntrack --ctstate NEW -m hl --hl-eq 255 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# multicast routeur discovery mssg (need link-local src address and hop limit = 1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 151 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 152 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 153 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT   # Must Not Be Dropped\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\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 200 -j DROP   # private experimentation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 201 -j DROP   # private experimentation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 --icmpv6-type 255 -j DROP   # error messages ICMPv6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# all others are dropped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#ip6tables -A OUTPUT_ICMPV6 -p icmpv6 ! --icmpv6-type -j DROP or -j REJECT --reject-with icmp6-adm-prohibited # ⇐ this type seems not correctly supported!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eip6tables -A OUTPUT_ICMPV6 -p icmpv6 -j REJECT --reject-with no-route\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\u003cp\u003eJe ne vais pas reprendre le petit laïus sur IETF , ou IANA, mais simplement\nrappeler de bonnes lectures à faire.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eSi jamais, vous avez d\u0026rsquo;autres \u0026ldquo;tuyaux\u0026rdquo; du même acabit, n\u0026rsquo;hésitez pas m\u0026rsquo;envoyer\nun commentaire par mail.\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eles différents \u003ca href=\"https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml\" rel=\"external\"\u003eparamètres ICMPv6\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela \u003cstrong\u003e\u003ca href=\"/fr/sec/firewall/linux-firewall-icmpv6/#rfc-4890\"\u003eRFC 4890\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela \u003cstrong\u003e\u003ca href=\"/fr/sec/firewall/linux-firewall-icmpv6/#rfc-5927\"\u003eRFC 5927\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele \u003cspan lang=\"en\"\u003e\u003ca href=\"https://tools.ietf.org/html/draft-ietf-opsec-icmp-filtering-04\" rel=\"external\"\u003edraft ICMP filtering\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele \u003cspan lang=\"en\"\u003e\u003ca href=\"https://tools.ietf.org/id/draft-ietf-v6ops-icmpv6-filtering-recs-02.txt\" rel=\"external\"\u003edraft ICMPv6 filtering\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://connect.ed-diamond.com/GNU-Linux-Magazine/glmfhs-041/netfilter-et-le-filtrage-du-protocole-ipv6\" rel=\"external\"\u003eGNU Linux Magazine : Netfilter et le filtrage du protocole IPv6\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\n\u003ch3 id=\"rfc-2710\"\u003eRFC 2710\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/rfc2710\" title=\"RFC 2710 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc2710\" title=\"RFC 2710 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc2710.txt\" title=\"RFC 2710 : 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/rfc2710.html\" title=\"RFC 2710 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc2710.txt.pdf\" title=\"RFC 2710 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc2710.txt\" title=\"RFC 2710 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-3122\"\u003eRFC 3122\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/rfc3122\" title=\"RFC 3122 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc3122\" title=\"RFC 3122 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc3122.txt\" title=\"RFC 3122 : 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/rfc3122.html\" title=\"RFC 3122 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc3122.txt.pdf\" title=\"RFC 3122 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc3122.txt\" title=\"RFC 3122 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-3810\"\u003eRFC 3810\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/rfc3810\" title=\"RFC 3810 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc3810\" title=\"RFC 3810 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc3810.txt\" title=\"RFC 3810 : 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/rfc3810.html\" title=\"RFC 3810 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc3810.txt.pdf\" title=\"RFC 3810 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc3810.txt\" title=\"RFC 3810 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-3971\"\u003eRFC 3971\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/rfc3971\" title=\"RFC 3971 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc3971\" title=\"RFC 3971 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc3971.txt\" title=\"RFC 3971 : 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/rfc3971.html\" title=\"RFC 3971 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc3971.txt.pdf\" title=\"RFC 3971 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc3971.txt\" title=\"RFC 3971 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-4286\"\u003eRFC 4286\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/rfc4286\" title=\"RFC 4286 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc4286\" title=\"RFC 4286 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc4286.txt\" title=\"RFC 4286 : 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/rfc4286.html\" title=\"RFC 4286 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc4286.txt.pdf\" title=\"RFC 4286 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc4286.txt\" title=\"RFC 4286 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-4620\"\u003eRFC 4620\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/rfc4620\" title=\"RFC 4620 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc4620\" title=\"RFC 4620 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc4620.txt\" title=\"RFC 4620 : 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/rfc4620.html\" title=\"RFC 4620 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc4620.txt.pdf\" title=\"RFC 4620 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc4620.txt\" title=\"RFC 4620 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-4861\"\u003eRFC 4861\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/rfc4861\" title=\"RFC 4861 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc4861\" title=\"RFC 4861 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc4861.txt\" title=\"RFC 4861 : 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/rfc4861.html\" title=\"RFC 4861 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc4861.txt.pdf\" title=\"RFC 4861 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc4861.txt\" title=\"RFC 4861 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-4890\"\u003eRFC 4890\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/rfc4890\" title=\"RFC 4890 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc4890\" title=\"RFC 4890 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc4890.txt\" title=\"RFC 4890 : 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/rfc4890.html\" title=\"RFC 4890 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc4890.txt.pdf\" title=\"RFC 4890 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc4890.txt\" title=\"RFC 4890 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-5927\"\u003eRFC 5927\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/rfc5927\" title=\"RFC 5927 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc5927\" title=\"RFC 5927 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc5927.txt\" title=\"RFC 5927 : 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/rfc5927.html\" title=\"RFC 5927 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc5927.txt.pdf\" title=\"RFC 5927 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc5927.txt\" title=\"RFC 5927 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\u003c/p\u003e\n\u003chr\u003e\n","summary":"Filtrer de manière sécurisé le protocole ICMPv6 sous Linux : exemples avec le parefeu Ip6tables","tags":["Linux","firewall","ICMPv6","Ip6tables"],"date_published":"2017-07-26T22:22:02+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-26:/fr/sec/firewall/linux-firewall-icmp#bb470121d25333c3b7d6b061c5970121093a291f48e505bf694704761235b33e","url":"https://it-log.fr.eu.org/fr/sec/firewall/linux-firewall-icmp/","title":"Linux : firewall ICMP","author":{"name":"Stéphane HUC"},"content_text":"Description Ou comment titrer : Filtrer le protocole ICMP sous Linux.\nCertains déclament qu\u0026rsquo;il faut absolument tout bloquer, terminer les commandes telles traceroute, ping… basta, et qu\u0026rsquo;on me fiche la paix !\nD\u0026rsquo;autres disent, oui, mais c\u0026rsquo;est quand même bien pratique d\u0026rsquo;utiliser de telles commandes, sauf que…\nLe but évident d\u0026rsquo;ICMP est de rapporter les messages d\u0026rsquo;erreurs, d\u0026rsquo;informations des états, de contrôle, liés à la communication IP d\u0026rsquo;un réseau, dont Internet, donc, relatifs à la délivrance des paquets IP.\nCe but intéressant a ses défauts : puisque par ce biais-là, toute personne qui utilise le protocole ICMP peut \u0026ldquo;cartographier\u0026rdquo; l\u0026rsquo;ensemble de votre réseau, un moindre mal en somme, voire à chercher à attaquer celui-là, par certaines attaques connues, telles que le déni de service Smurf, comme le fameux \u0026ldquo;Ping de la Mort\u0026rdquo; ou tout autre DOS (Deni de Service) existant. Certaines attaques permettent aussi de s\u0026rsquo;attaquer au protocole TCP, tel que le service HTTP (attaque SlowLoris), et d\u0026rsquo;autres…\nFroid dans le dos ? Y\u0026rsquo;a de quoi…\nDans cet article, nous allons apprendre à gérer correctement ICMP, tout en tenant compte des recommandations faite par des organismes reconnus, tel l\u0026rsquo;IETF, l\u0026rsquo;IANA, au-travers de différentes RFC, qui seront toutes nommées.\nGérer ICMP Les codes ICMP à refuser Les codes ci-dessous sont reconnus pour être dépréciés, dangereux, et donc à ne plus utiliser :\n3/6 - Destination Network Unknown 3/8 - Source Host Isolated 4/0 - Source Quench 15/0 - Information Request Message 16/0 - Information Reply Message AttentionAttention: l\u0026rsquo;IANA, autre organisme mondialement reconnu, fait référence à la RFC 6633, à-propos de la dépréciation de Source Quench, et recommande de loguer de tels paquets et de les supprimer, sans avertissements (DROP). N\u0026rsquo;hésitons même pas, les messages correspondant doivent ABSOLUMENT être refusés !\nL\u0026rsquo;IANA, dans sa référence à la RFC 6918 considère que les codes suivants sont dépréciés et donc à filtrer - toute discrétion est laissé libre à l\u0026rsquo;administrateur de choisir son mode de filtrage - :\n6/0 - Alternate Host Address\n15 - Information Request\n16 - Information Reply\n17 - Address Mask Request\n18 - Address Mask Reply\n30 - Traceroute\n31 - Datagram Conversion Error\n32 - Mobile Host Redirect\n33 - IPv6 Where-Are-You\n34 - IPv6 I-Am-Here\n35 - Mobile Registration Request\n36 - Mobile Registration Reply\n37 - Domain Name Request\n38 - Domain Name Reply\n39 - SKIP\nÀ vous de choisir, si vous les détruisez… alors, mode parano ?!\nQuoiqu\u0026rsquo;il en soit, si vous décidez de filtrer le code 30, n\u0026rsquo;oubliez pas que l\u0026rsquo;utilitaire traceroute est capable de fonctionner sur les protocoles UDP:53, TCP:80, voire d\u0026rsquo;imiter le code ICMP:8/0 !\nLes codes ICMP à limiter Les recommandations sont de limiter, en entrée et en sortie de machine :\nle code 0/0 - Echo Reply Message - (la fameuse réponse au Ping : le Pong) tous les autres codes de type 3 - Destination Unreachable - sauf un traitement légèrement particulier pour le 3/7 - Destination Host Unknown - à limiter en sortie et ignorer en entrée. tous les codes 5 - Redirect le code 8/0 - Echo Message - (la fameuse commande Ping) le code 9/0 - Router Advertisement Message le code 10/0 - Router Solicitation Message tous les codes 11 - Time Exceeded - (Utile pour la commande traceroute, ainsi que le code 30/0 d\u0026rsquo;ailleurs) tous les codes 12 - Parameter Problem le code 13/0 - Timestamp Message le code 14/0 - Timestamp Reply Message le code 17/0 - Address Mask Request le code 18/0 - Address Mask Reply Pour limiter, dans le contexte d\u0026rsquo;une machine Linux, on utilisera l\u0026rsquo;option match limit avec iptables, tout simplement…\nExemples ICMP en mode parano En mode parano, vous pouvez très bien ouvrir :\nen sortie le code 8/0, et en entrée le code 0/0 relatif à la sortie, pour que vous vous puissiez pinguer… et empêcher les autres d\u0026rsquo;en faire autant ! Puis de supprimer tous les autres codes… iptables -A INPUT -p icmp --icmp-type echo-reply -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -m limit --limit 3/s --limit-burst 7 -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-request -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -m limit --limit 3/s --limit-burst 7 -j ACCEPT iptables -A INPUT -p icmp -j DROP iptables -A OUTPUT -p icmp -j DROP ICMP filtré, limité Voici, pour l\u0026rsquo;exemple, basé sur la compréhension des recommandations IETF, des règles ICMP filtrées, limitées ; puis de rejeter tous les autres codes, avec le message icmp-host-prohibited.\n/sbin/iptables -A INPUT -i ethX -p icmp -m limit --limit 3/s --limit-burst 7 -j icmp4in /sbin/iptables -A icmp4in -p icmp -m conntrack --ctstate INVALID -j DROP /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Echo reply\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Destination Net Unreachable\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/1 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Destination Host Unreachable\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/3 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Destination Port Unreachable\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/4 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP PathMTU Discovery\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/6 -j DROP /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/8 -j DROP /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 4 -j DROP /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 5 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Redirect mssg\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 8/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Echo mssg\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 9/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Router Advertisement Message\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 10/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Router Solicitation Message\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 11 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Time exceeded\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 12 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Param pb\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 13/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Timestamp Message\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 14/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Timestamp Reply Message\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 15 -j DROP /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 16 -j DROP /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 17/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Address Mask Request\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 18/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Address Mask Reply\u0026#34; /sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 30 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u0026#34;ICMP Traceroute\u0026#34; # REJECT Others /sbin/iptables -A icmp4in -p icmp -j REJECT --reject-with icmp-host-prohibited /sbin/iptables -A OUTPUT -o ethX -p icmp -m limit --limit 3/s --limit-burst 7 -j icmp4out /sbin/iptables -A icmp4out -p icmp -m conntrack --ctstate INVALID -j DROP /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/1 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/3 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/4 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/6 -j DROP /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/7 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/8 -j DROP /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 4/0 -j DROP /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 5 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 8/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 9/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 10/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 11 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 12 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 13/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 14/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 15 -j DROP /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 16 -j DROP /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 17/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 18/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 30 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT /sbin/iptables -A icmp4out -p icmp -j REJECT --reject-with icmp-host-prohibited Documentation IETF L\u0026rsquo;IETF est un organisme connu, reconnu qui écrit beaucoup de documents techniques, dont le propos est d\u0026rsquo;améliorer la technicité, la sécurité des usages liés à Internet.\nEt, bien-sûr certains documents existants insistent sur le fait de filtrer ICMP, voire ICMPv6 - relatif à IPv6, tels que :\nla RFC 4890 la RFC 5927 le draft ICMP filtering le draft ICMPv6 filtering Ces documents tous intéressants, certains sont vieux, d\u0026rsquo;autres récents, ont pour propos de réfléchir sérieusement à la sécurité à mettre en place autour du protocole ICMP.\nLe document de travail relatif au filtrage d\u0026rsquo;ICMP aborde l\u0026rsquo;ensemble des protocoles IPv4 et IPv6 et explique quelles sont les attaques possibles, et donnent des recommandations utiles, qui vont du refus du paquet à la limitation des autres.\nClairement certains codes de messages qui sont absolument à bloquer, refuser, tels que le code ICMP 4/0 alias \u0026ldquo;Source Quench\u0026rdquo; qui est explicitement déprécié, à ne plus utiliser, mais ce n\u0026rsquo;est pas le seul !\nRFC 4890 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 5927 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 6633 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 6918 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT Wikipedia Attaque_par_déni_de_service#Smurfing WP Ping_de_la_mort WP Slowloris WP ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOu comment titrer : \u003cstrong\u003eFiltrer le protocole ICMP sous Linux\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eCertains déclament qu\u0026rsquo;il faut absolument tout bloquer, terminer les commandes\ntelles \u003ccode\u003etraceroute\u003c/code\u003e, \u003ccode\u003eping\u003c/code\u003e… \u003cbr\u003e\n\u003cq\u003ebasta, et qu\u0026rsquo;on me fiche la paix !\u003c/q\u003e\u003c/p\u003e\n\u003cp\u003eD\u0026rsquo;autres disent, oui, mais c\u0026rsquo;est quand même bien pratique d\u0026rsquo;utiliser de\ntelles commandes, sauf que…\u003c/p\u003e\n\u003cp\u003eLe but évident d\u0026rsquo;ICMP est de rapporter les messages d\u0026rsquo;erreurs, d\u0026rsquo;informations\ndes états, de contrôle, liés à la communication IP d\u0026rsquo;un réseau, dont Internet,\ndonc, relatifs à la délivrance des paquets IP.\u003c/p\u003e\n\u003cp\u003eCe but intéressant a ses défauts : puisque par ce biais-là, toute personne\nqui utilise le protocole ICMP peut \u0026ldquo;cartographier\u0026rdquo; l\u0026rsquo;ensemble de votre réseau,\n\u003cem\u003eun moindre mal en somme\u003c/em\u003e, voire à chercher à attaquer celui-là, par certaines\nattaques connues, telles que le déni de service \u003cstrong\u003eSmurf\u003c/strong\u003e, comme le fameux\n\u0026ldquo;\u003cstrong\u003ePing de la Mort\u003c/strong\u003e\u0026rdquo; ou tout autre \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"fr\"\u003eDOS \u003cem\u003e(Deni de 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 existant. \u003cbr\u003e\nCertaines attaques permettent aussi de s\u0026rsquo;attaquer au protocole TCP, tel\nque le service HTTP (attaque \u003cstrong\u003eSlowLoris\u003c/strong\u003e), et d\u0026rsquo;autres…\u003c/p\u003e\n\u003cp\u003e\u003cq\u003eFroid dans le dos ? \u003cbr\u003e Y\u0026rsquo;a de quoi…\u003c/q\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eDans cet article, nous allons apprendre à gérer correctement ICMP, tout\nen tenant compte des recommandations faite par des organismes reconnus,\ntel l\u0026rsquo;IETF, l\u0026rsquo;IANA, au-travers de différentes RFC, qui seront toutes\nnommées.\u003c/p\u003e\n\u003ch2 id=\"gérer-icmp\"\u003eGérer ICMP\u003c/h2\u003e\n\u003ch3 id=\"les-codes-icmp-à-refuser\"\u003eLes codes ICMP à refuser\u003c/h3\u003e\n\u003cp\u003eLes codes ci-dessous sont reconnus pour être dépréciés, dangereux, et\ndonc \u003cstrong\u003eà ne plus utiliser\u003c/strong\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e3/6\u003c/strong\u003e - Destination Network Unknown\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e3/8\u003c/strong\u003e - Source Host Isolated\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e4/0\u003c/strong\u003e - Source Quench\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e15/0\u003c/strong\u003e - Information Request Message\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e16/0\u003c/strong\u003e - Information Reply Message\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: l\u0026rsquo;IANA, autre organisme mondialement reconnu, fait \u003ca href=\"https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml\" rel=\"external\"\u003eréférence\u003c/a\u003e\nà la \u003ca href=\"/fr/sec/firewall/linux-firewall-icmp/#rfc-6633\"\u003eRFC 6633\u003c/a\u003e, à-propos de la \u003cstrong\u003edépréciation de Source Quench\u003c/strong\u003e,\net \u003cstrong\u003erecommande de loguer de tels paquets et de les supprimer, sans\navertissements (DROP)\u003c/strong\u003e.\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003eN\u0026rsquo;hésitons même pas, les messages correspondant doivent ABSOLUMENT être\nrefusés !\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;IANA, dans sa \u003ca href=\"https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml\" rel=\"external\"\u003eréférence\u003c/a\u003e à la \u003cstrong\u003e\u003ca href=\"/fr/sec/firewall/linux-firewall-icmp/#rfc-6918\"\u003eRFC 6918\u003c/a\u003e\u003c/strong\u003e considère que les\ncodes suivants sont dépréciés et donc à filtrer - \u003cem\u003etoute discrétion est laissé\nlibre à l\u0026rsquo;administrateur de choisir son mode de filtrage\u003c/em\u003e - :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e6/0\u003c/strong\u003e - Alternate Host Address\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e15\u003c/strong\u003e - Information Request\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e16\u003c/strong\u003e - Information Reply\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e17\u003c/strong\u003e - Address Mask Request\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e18\u003c/strong\u003e - Address Mask Reply\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e30\u003c/strong\u003e - Traceroute\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e31\u003c/strong\u003e - Datagram Conversion Error\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e32\u003c/strong\u003e - Mobile Host Redirect\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e33\u003c/strong\u003e - IPv6 Where-Are-You\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e34\u003c/strong\u003e - IPv6 I-Am-Here\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e35\u003c/strong\u003e - Mobile Registration Request\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e36\u003c/strong\u003e - Mobile Registration Reply\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e37\u003c/strong\u003e - Domain Name Request\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e38\u003c/strong\u003e - Domain Name Reply\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e39\u003c/strong\u003e - SKIP\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eÀ vous de choisir, si vous les détruisez… \u003cem\u003ealors, mode parano ?!\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eQuoiqu\u0026rsquo;il en soit, si vous décidez de filtrer le code 30, n\u0026rsquo;oubliez pas\nque l\u0026rsquo;utilitaire \u003cstrong\u003etraceroute\u003c/strong\u003e est capable de fonctionner sur les protocoles\nUDP:53, TCP:80, voire d\u0026rsquo;imiter le code ICMP:8/0 !\u003c/p\u003e\n\u003ch3 id=\"les-codes-icmp-à-limiter\"\u003eLes codes ICMP à limiter\u003c/h3\u003e\n\u003cp\u003eLes recommandations sont de limiter, en entrée et en sortie de machine :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele code \u003cstrong\u003e0/0\u003c/strong\u003e - Echo Reply Message - \u003cem\u003e(la fameuse réponse au Ping : le Pong)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003etous les autres codes de \u003cstrong\u003etype 3\u003c/strong\u003e - Destination Unreachable -\n\u003cul\u003e\n\u003cli\u003esauf un traitement légèrement particulier pour le \u003cstrong\u003e3/7\u003c/strong\u003e - Destination\nHost Unknown - à limiter en sortie et ignorer en entrée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003etous les codes \u003cstrong\u003e5\u003c/strong\u003e - Redirect\u003c/li\u003e\n\u003cli\u003ele code \u003cstrong\u003e8/0\u003c/strong\u003e - Echo Message - \u003cem\u003e(la fameuse commande Ping)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003ele code \u003cstrong\u003e9/0\u003c/strong\u003e - Router Advertisement Message\u003c/li\u003e\n\u003cli\u003ele code \u003cstrong\u003e10/0\u003c/strong\u003e - Router Solicitation Message\u003c/li\u003e\n\u003cli\u003etous les codes \u003cstrong\u003e11\u003c/strong\u003e - Time Exceeded - \u003cem\u003e(Utile pour la commande \u003ccode\u003etraceroute\u003c/code\u003e,\nainsi que le code \u003cstrong\u003e30/0\u003c/strong\u003e d\u0026rsquo;ailleurs)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003etous les codes \u003cstrong\u003e12\u003c/strong\u003e - Parameter Problem\u003c/li\u003e\n\u003cli\u003ele code \u003cstrong\u003e13/0\u003c/strong\u003e - Timestamp Message\u003c/li\u003e\n\u003cli\u003ele code \u003cstrong\u003e14/0\u003c/strong\u003e - Timestamp Reply Message\u003c/li\u003e\n\u003cli\u003ele code \u003cstrong\u003e17/0\u003c/strong\u003e - Address Mask Request\u003c/li\u003e\n\u003cli\u003ele code \u003cstrong\u003e18/0\u003c/strong\u003e - Address Mask Reply\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour limiter, dans le contexte d\u0026rsquo;une machine Linux, on utilisera l\u0026rsquo;option\n\u003ccode\u003ematch limit\u003c/code\u003e avec \u003cstrong\u003eiptables\u003c/strong\u003e, tout simplement…\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003ch3 id=\"icmp-en-mode-parano\"\u003eICMP en mode parano\u003c/h3\u003e\n\u003cp\u003eEn mode parano, vous pouvez très bien ouvrir :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003een sortie le code 8/0,\u003c/li\u003e\n\u003cli\u003eet en entrée le code 0/0 relatif à la sortie, pour que vous vous puissiez\npinguer…\u003c/li\u003e\n\u003cli\u003eet empêcher les autres d\u0026rsquo;en faire autant !\u003c/li\u003e\n\u003cli\u003ePuis de supprimer tous les autres codes…\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\u003eiptables -A INPUT -p icmp --icmp-type echo-reply -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -m limit --limit 3/s --limit-burst \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -p icmp --icmp-type echo-request -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -m limit --limit 3/s --limit-burst \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A INPUT -p icmp -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiptables -A OUTPUT -p icmp -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"icmp-filtré-limité\"\u003eICMP filtré, limité\u003c/h3\u003e\n\u003cp\u003eVoici, pour l\u0026rsquo;exemple, basé sur la compréhension des recommandations IETF,\ndes règles ICMP filtrées, limitées ; puis de rejeter tous les autres codes,\navec le message \u003ccode\u003eicmp-host-prohibited\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/sbin/iptables -A INPUT -i ethX -p icmp -m limit --limit 3/s --limit-burst \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e -j icmp4in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m conntrack --ctstate INVALID -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Echo reply\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Destination Net Unreachable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/1 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Destination Host Unreachable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/3 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Destination Port Unreachable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/4 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP PathMTU Discovery\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/6 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 3/8 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Redirect mssg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 8/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Echo mssg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 9/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Router Advertisement Message\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 10/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Router Solicitation Message\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Time exceeded\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Param pb\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 13/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Timestamp Message\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 14/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Timestamp Reply Message\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 17/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Address Mask Request\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type 18/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Address Mask Reply\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e30\u003c/span\u003e -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT -m comment --comment \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ICMP Traceroute\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# REJECT Others\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4in -p icmp -j REJECT --reject-with icmp-host-prohibited\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A OUTPUT -o ethX -p icmp -m limit --limit 3/s --limit-burst \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e -j icmp4out\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m conntrack --ctstate INVALID -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/1 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/3 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/4 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/6 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/7 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 3/8 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 4/0 -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 8/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 9/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 10/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 13/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 14/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e -j DROP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 17/0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type 18/0 -m conntrack --ctstate RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -m icmp --icmp-type \u003cspan style=\"color:#f99b15\"\u003e30\u003c/span\u003e -m conntrack --ctstate NEW,RELATED,ESTABLISHED,UNTRACKED -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/sbin/iptables -A icmp4out -p icmp -j REJECT --reject-with icmp-host-prohibited\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003ch3 id=\"ietf\"\u003eIETF\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;IETF est un organisme connu, reconnu qui écrit beaucoup de documents techniques,\ndont le propos est d\u0026rsquo;améliorer la technicité, la sécurité des usages liés à Internet.\u003c/p\u003e\n\u003cp\u003eEt, bien-sûr certains documents existants insistent sur le fait de filtrer\nICMP, voire ICMPv6 - relatif à IPv6, tels que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela \u003cstrong\u003e\u003ca href=\"/fr/sec/firewall/linux-firewall-icmp/#rfc-4890\"\u003eRFC 4890\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ela \u003cstrong\u003e\u003ca href=\"/fr/sec/firewall/linux-firewall-icmp/#rfc-5927\"\u003eRFC 5927\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ele \u003cspan lang=\"en\"\u003e\u003ca href=\"https://tools.ietf.org/html/draft-ietf-opsec-icmp-filtering-04\" rel=\"external\"\u003edraft ICMP filtering\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n\u003cli\u003ele \u003cspan lang=\"en\"\u003e\u003ca href=\"https://tools.ietf.org/id/draft-ietf-v6ops-icmpv6-filtering-recs-02.txt\" rel=\"external\"\u003edraft ICMPv6 filtering\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCes documents tous intéressants, certains sont vieux, d\u0026rsquo;autres récents,\nont pour propos de réfléchir sérieusement à la sécurité à mettre en place\nautour du protocole ICMP.\u003c/p\u003e\n\u003cp\u003eLe document de travail relatif au filtrage d\u0026rsquo;ICMP aborde l\u0026rsquo;ensemble des\nprotocoles IPv4 et IPv6 et explique quelles sont les attaques possibles,\net donnent des recommandations utiles, qui vont du refus du paquet à la\nlimitation des autres.\u003c/p\u003e\n\u003cp\u003eClairement certains codes de messages qui sont absolument à bloquer,\nrefuser, tels que le code ICMP 4/0 alias \u0026ldquo;\u003cstrong\u003eSource Quench\u003c/strong\u003e\u0026rdquo; qui est\nexplicitement déprécié, à ne plus utiliser, mais ce n\u0026rsquo;est pas le seul !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\n\u003ch3 id=\"rfc-4890\"\u003eRFC 4890\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/rfc4890\" title=\"RFC 4890 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc4890\" title=\"RFC 4890 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc4890.txt\" title=\"RFC 4890 : 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/rfc4890.html\" title=\"RFC 4890 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc4890.txt.pdf\" title=\"RFC 4890 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc4890.txt\" title=\"RFC 4890 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-5927\"\u003eRFC 5927\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/rfc5927\" title=\"RFC 5927 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc5927\" title=\"RFC 5927 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc5927.txt\" title=\"RFC 5927 : 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/rfc5927.html\" title=\"RFC 5927 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc5927.txt.pdf\" title=\"RFC 5927 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc5927.txt\" title=\"RFC 5927 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-6633\"\u003eRFC 6633\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/rfc6633\" title=\"RFC 6633 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc6633\" title=\"RFC 6633 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc6633.txt\" title=\"RFC 6633 : 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/rfc6633.html\" title=\"RFC 6633 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc6633.txt.pdf\" title=\"RFC 6633 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc6633.txt\" title=\"RFC 6633 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-6918\"\u003eRFC 6918\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/rfc6918\" title=\"RFC 6918 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc6918\" title=\"RFC 6918 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc6918.txt\" title=\"RFC 6918 : 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/rfc6918.html\" title=\"RFC 6918 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc6918.txt.pdf\" title=\"RFC 6918 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc6918.txt\" title=\"RFC 6918 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\u003c/p\u003e\n\u003ch3 id=\"wikipedia\"\u003eWikipedia\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Attaque_par_d%c3%a9ni_de_service#Smurfing\" title=\"Article Wikipédia : Attaque_par_déni_de_service#Smurfing\"\u003e\n    Attaque_par_déni_de_service#Smurfing\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Ping_de_la_mort\" title=\"Article Wikipédia : Ping_de_la_mort\"\u003e\n    Ping_de_la_mort\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Slowloris\" title=\"Article Wikipédia : Slowloris\"\u003e\n    Slowloris\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Filtrer de manière sécurisé le protocole ICMP sous Linux : exemples avec le parefeu Iptables","tags":["Linux","firewall","ICMP","Iptables"],"date_published":"2017-07-26T21:03:54+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-24:/fr/sec/scan/chkrootkit-suckit-rootkit-sbin-init-infected#c0f2cb3ccf567986b0d236ac4a21401d0c131a5c72bc9e3579d31e708cfbf6ed","url":"https://it-log.fr.eu.org/fr/sec/scan/chkrootkit-suckit-rootkit-sbin-init-infected/","title":"Chkrootkit : Suckit Rootkit Sbin Init Infected","author":{"name":"Stéphane HUC"},"content_text":"Description Chkrootkit émet cette alerte : Searching for Suckit rootkit\u0026hellip; Warning: /sbin/init INFECTED !\nDéjà, si votre installation est fraîche, ne paniquez pas ; de toute façon, cela ne sert jamais à rien !\nAnalyse Déjà, si j\u0026rsquo;ai bien compris, il y a de grandes probabilités pour que ce soit un faux positif, qui traîne depuis longtemps - cf : le bogue #454566 -, et qui semble être résolu avec la version 0.50.\nMais avant de courir pour mettre-à-jour votre version, analysons ce qui peut l\u0026rsquo;être !\nEnsuite, si j\u0026rsquo;ai bien compris quand la machine est infectée par ce rootkit Suckit, elle place la chaîne HOME dans le répertoire /sbin/init.\n⇒ Une première analyse commence avec la commande suivante : $ ls -li /sbin/init /sbin/telinit 130357 -rwxr-xr-x 1 root root 265848 juil. 18 2014 /sbin/init 130426 -rwxr-xr-x 1 root root 104728 juil. 18 2014 /sbin/telinit Si vous ressortez le même résultat, c\u0026rsquo;est déjà bon signe…\n⇒ Continuons l\u0026rsquo;analyse et vérifions la présence de chaîne HOME : $ strings /sbin/init | grep -E HOME\nNormalement, il ne devrait RIEN avoir dans ce répertoire !\nMais dans le cas de distribution récente, telle que depuis Ubuntu (et assimilée) Trusty, vous aurez exactement cette sortie, qui semble tout autant normale : $ strings /sbin/init | egrep HOME XDG_CACHE_HOME XDG_CONFIG_HOME Pas de panique : apparemment, ce sont des spécifications liées au standard FreeDesktop…\n⇒ Continuons l\u0026rsquo;analyse, avec la commande : # cat /proc/1/maps | grep -E \u0026quot;init.\u0026quot;\nNormalement, aucun retour ne devrait être fait !\n⇒ Vérifions la somme md5 du binaire init, puis comparons-la avec l\u0026rsquo;officielle : $ md5sum /sbin/init 249b19aaa268143c3a0b3d6aa9faa070 /sbin/init $ grep \u0026quot;sbin/init$\u0026quot; /var/lib/dpkg/info/upstart.md5sums 249b19aaa268143c3a0b3d6aa9faa070 sbin/init Si les sommes sont similaires, c\u0026rsquo;est un autre bon signe…\nL\u0026rsquo;autre moyen - à préférer - est de :\ntélécharger le packet upstart de votre distribution - vérifier que vous télécharger bien l\u0026rsquo;exacte version correspondante ! -, l\u0026rsquo;extraire, et faire une comparaison des sommes ; le mieux étant de la faire avec sha256sum, voire sha512sum ! ⇒ Histoire d\u0026rsquo;être ABSOLUMENT sûr que vous avez bien à faire à ce fameux faux positif, exécutez la suite de commande, ci-dessous : $ cd /sbin $ ls -l init -rwxr-xr-x 1 root root 265848 juil. 18 2014 init Si vous voyez bien 1, c\u0026rsquo;est bon !\n⇒ finissons-en avec : $ ln /sbin/init /sbin/init2 $ ls -l init -rwxr-xr-x 2 root root 265848 juil. 18 2014 init Si vous lisez bien 2, et non pas 1, c\u0026rsquo;est que vous êtes bon ! Félicitations !!!\nPensez à supprimer le lien init2.\nrkhunter Une autre manière de vérifier est d\u0026rsquo;exécuter rkhunter : rkhunter --checkall --report-warnings-only\nSi, à la fin de l\u0026rsquo;analyse, vous n\u0026rsquo;avez rien - ce qui devrait être le cas, après avoir vérifié comme précédemment - c\u0026rsquo;est que c\u0026rsquo;est vraiment tout bon !\nMise à jour Si c\u0026rsquo;est possible, mettez-à-jour la version de chkrootkit vers la v0.50, minimum !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eChkrootkit émet cette alerte :\n\u003cq\u003eSearching for Suckit rootkit\u0026hellip; Warning: /sbin/init INFECTED\u003c/q\u003e !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDéjà, si votre installation est fraîche, ne paniquez pas ; de toute façon,\ncela ne sert jamais à rien !\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"analyse\"\u003eAnalyse\u003c/h2\u003e\n\u003cp\u003eDéjà, si j\u0026rsquo;ai bien compris, il y a de grandes probabilités pour que ce soit\nun faux positif, qui traîne depuis longtemps - cf : le bogue #\u003ca href=\"https://bugs.launchpad.net/cyborg/+bug/454566\" rel=\"external\"\u003e454566\u003c/a\u003e -,\net qui semble être résolu avec la version 0.50.\u003c/p\u003e\n\u003cp\u003eMais avant de courir pour mettre-à-jour votre version, analysons ce qui peut l\u0026rsquo;être !\u003c/p\u003e\n\u003cp\u003eEnsuite, si j\u0026rsquo;ai bien compris quand la machine est infectée par ce rootkit\nSuckit, elle place la chaîne \u003cstrong\u003eHOME\u003c/strong\u003e dans le répertoire \u003ccode\u003e/sbin/init\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e⇒ Une première analyse commence avec la commande suivante : \u003cbr\u003e\n\u003ccode\u003e$ ls -li /sbin/init /sbin/telinit\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e130357 -rwxr-xr-x 1 root root 265848 juil. 18  2014 /sbin/init\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e130426 -rwxr-xr-x 1 root root 104728 juil. 18  2014 /sbin/telinit\u003c/code\u003e \u003cbr\u003e\u003c/p\u003e\n\u003cp\u003eSi vous ressortez le même résultat, c\u0026rsquo;est déjà bon signe…\u003c/p\u003e\n\u003cp\u003e⇒ Continuons l\u0026rsquo;analyse et vérifions la présence de chaîne \u003cstrong\u003eHOME\u003c/strong\u003e : \u003cbr\u003e\n\u003ccode\u003e$ strings /sbin/init | grep -E HOME\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eNormalement, il ne devrait RIEN avoir dans ce répertoire !\u003c/p\u003e\n\u003cp\u003eMais dans le cas de distribution récente, telle que depuis Ubuntu (et assimilée) Trusty,\nvous aurez exactement cette sortie, qui semble tout autant normale : \u003cbr\u003e\n\u003ccode\u003e$ strings /sbin/init | egrep HOME\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003eXDG_CACHE_HOME\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003eXDG_CONFIG_HOME\u003c/code\u003e \u003cbr\u003e\u003c/p\u003e\n\u003cp\u003ePas de panique : apparemment, ce sont des \u003ca href=\"http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html\" rel=\"external\"\u003espécifications liées au standard FreeDesktop\u003c/a\u003e…\u003c/p\u003e\n\u003cp\u003e⇒ Continuons l\u0026rsquo;analyse, avec la commande : \u003cbr\u003e\n\u003ccode\u003e# cat /proc/1/maps | grep -E \u0026quot;init.\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNormalement, aucun retour ne devrait être fait !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Vérifions la somme md5 du binaire \u003cstrong\u003einit\u003c/strong\u003e, puis comparons-la avec l\u0026rsquo;officielle : \u003cbr\u003e\n\u003ccode\u003e$ md5sum /sbin/init\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e249b19aaa268143c3a0b3d6aa9faa070  /sbin/init\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e$ grep \u0026quot;sbin/init$\u0026quot; /var/lib/dpkg/info/upstart.md5sums\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e249b19aaa268143c3a0b3d6aa9faa070  sbin/init\u003c/code\u003e \u003cbr\u003e\u003c/p\u003e\n\u003cp\u003eSi les sommes sont similaires, c\u0026rsquo;est un autre bon signe…\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;autre moyen - \u003cstrong\u003eà préférer\u003c/strong\u003e - est de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003etélécharger le packet \u003cstrong\u003eupstart\u003c/strong\u003e de votre distribution - \u003cem\u003evérifier que\nvous télécharger bien l\u0026rsquo;exacte version correspondante !\u003c/em\u003e -,\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;extraire,\u003c/li\u003e\n\u003cli\u003eet faire une comparaison des sommes ; \u003cstrong\u003ele mieux étant de la faire avec \u003ccode\u003esha256sum\u003c/code\u003e, voire \u003ccode\u003esha512sum\u003c/code\u003e\u003c/strong\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Histoire d\u0026rsquo;être ABSOLUMENT sûr que vous avez bien à faire à\nce fameux faux positif, exécutez la suite de commande, ci-dessous :\n\u003ccode\u003e$ cd /sbin\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e$ ls -l init\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e-rwxr-xr-x 1 root root 265848 juil. 18  2014 init\u003c/code\u003e \u003cbr\u003e\u003c/p\u003e\n\u003cp\u003eSi vous voyez bien \u003ccode\u003e1\u003c/code\u003e, c\u0026rsquo;est bon !\u003c/p\u003e\n\u003cp\u003e⇒ finissons-en avec :\n\u003ccode\u003e$ ln /sbin/init /sbin/init2\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e$ ls -l init\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e-rwxr-xr-x 2 root root 265848 juil. 18  2014 init\u003c/code\u003e \u003cbr\u003e\u003c/p\u003e\n\u003cp\u003eSi vous lisez bien \u003ccode\u003e2\u003c/code\u003e, et non pas \u003ccode\u003e1\u003c/code\u003e, c\u0026rsquo;est que vous êtes bon ! \u003cbr\u003e\nFélicitations !!!\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ePensez à supprimer le lien \u003ccode\u003einit2\u003c/code\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"rkhunter\"\u003erkhunter\u003c/h3\u003e\n\u003cp\u003eUne autre manière de vérifier est d\u0026rsquo;exécuter \u003cstrong\u003erkhunter\u003c/strong\u003e : \u003cbr\u003e\n\u003ccode\u003erkhunter --checkall --report-warnings-only\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi, à la fin de l\u0026rsquo;analyse, vous n\u0026rsquo;avez rien - \u003cem\u003ece qui devrait être le cas,\naprès avoir vérifié comme précédemment\u003c/em\u003e - c\u0026rsquo;est que c\u0026rsquo;est vraiment tout bon !\u003c/p\u003e\n\u003ch2 id=\"mise-à-jour\"\u003eMise à jour\u003c/h2\u003e\n\u003cp\u003eSi c\u0026rsquo;est possible, mettez-à-jour la version de \u003cstrong\u003echkrootkit\u003c/strong\u003e vers la v0.50, minimum !\u003c/p\u003e\n\u003chr\u003e\n","summary":"Que faire en cas de message de chkrootkit : Suckit rootkit... Warning: /sbin/init INFECTED ?","tags":["chkrootkit","suckit","init","detection","intrusion"],"date_published":"2017-07-24T21:11:35+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-24:/fr/sec/scan/rkhunter-warning-unhide-rb#7f680aa9a82a715df183cda6e9d42e9370009644894239b3ba5def0f6445067b","url":"https://it-log.fr.eu.org/fr/sec/scan/rkhunter-warning-unhide-rb/","title":"Rkhunter : Warning: /usr/bin/unhide.rb","author":{"name":"Stéphane HUC"},"content_text":"Description rkhunter peut parfois poser problème avec ce message d\u0026rsquo;alerte suivant : Warning: The command \u0026lsquo;/usr/bin/unhide.rb\u0026rsquo; has been replaced by a script: /usr/bin/unhide.rb: Ruby script, ASCII text\nAnalyse ⇒ La première chose à s\u0026rsquo;assurer que le binaire en question n\u0026rsquo;a pas été trafiqué, pour cela, utilisons le binaire debsums, tel que : Bien-sûr, si vous ne l\u0026rsquo;avez pas installé, faites-le… mais c\u0026rsquo;est dommage.\n# debsums unhide.rb /usr/bin/unhide.rb OK /usr/share/doc/unhide.rb/changelog.Debian.gz OK /usr/share/doc/unhide.rb/copyright OK /usr/share/lintian/overrides/unhide.rb OK /usr/share/man/man8/unhide.rb.8.gz OK ⇒ Maintenant, par acquis de conscience, faites ceci :\n$ cp /usr/bin/unhide.rb $HOME # apt purge unhide.rb # apt install unhide.rb $ diff /usr/sbin/unhide.rb ~/unhide.rb Si diff ne retourne aucune information, c\u0026rsquo;est que les deux fichiers en question sont identiques ! (à moins d\u0026rsquo;avoir eu la malchance d\u0026rsquo;avoir eu le binaire diff lui même modifié…)\nSi tout semble \u0026lsquo;OK\u0026rsquo;, c\u0026rsquo;est que l\u0026rsquo;on a faire face au fameux faux positif de rkhunter concernant ce binaire ! ce qui devrait être le cas dans une installation fraîchement exécutée !\n⇒ Contrôlons les sommes de contrôle différemment :\n$ md5sum /usr/bin/unhide.rb b1642389370e283c580de371b61ec3cb /usr/bin/unhide.rb $ grep \u0026quot;usr/bin/unhide.rb\u0026quot; /var/lib/dpkg/info/unhide.rb.md5sums b1642389370e283c580de371b61ec3cb usr/bin/unhide.rb ⇒ L\u0026rsquo;autre manière est de :\ntélécharger le binaire unhide.rb, depuis le dépôt officiel, le décompresser et comparer les sommes avec sha256sum, voire sha512sum ! - c\u0026rsquo;est même préférable Si les sommes sont identiques, c\u0026rsquo;est tout bon !\nPensez à supprimer le fichier ~/unhide.rb que vous avez créé lors de la copie, précédemment !\nConfiguration Puisque tout semble bon, modifions le fichier /etc/rkhunter.conf, pour modifier cette variable : PKGMGR=DPKG\nRecharger la base de donnée de rkhunter, avec l\u0026rsquo;option --propupd, et lancez à nouveau le test.\nNormalement, l\u0026rsquo;utilitaire unhide.rb devrait correctement être pris en charge…\nSi jamais, ce n\u0026rsquo;était pas le cas :\nvous pouvez décommenter la ligne suivante du fichier rkhunter.conf : #SCRIPTWHITELIST=/usr/bin/unhide.rb - mais gardez à l\u0026rsquo;esprit que ce n\u0026rsquo;est pas préférable/recommandable. Si malgré tout, cela n\u0026rsquo;est pas bon, envisager sérieusement une réinstallation de votre Linux !!!\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003erkhunter\u003c/strong\u003e peut parfois poser problème avec ce message d\u0026rsquo;alerte suivant : \u003cbr\u003e\n\u003cq\u003eWarning: The command \u0026lsquo;/usr/bin/unhide.rb\u0026rsquo; has been replaced by a script: /usr/bin/unhide.rb: Ruby script, ASCII text\u003c/q\u003e\u003c/p\u003e\n\u003ch2 id=\"analyse\"\u003eAnalyse\u003c/h2\u003e\n\u003cp\u003e⇒ La première chose à s\u0026rsquo;assurer que le binaire en question n\u0026rsquo;a pas été trafiqué,\npour cela, utilisons le binaire \u003cstrong\u003edebsums\u003c/strong\u003e, tel que : \u003cbr\u003e\n\u003cem\u003eBien-sûr, si vous ne l\u0026rsquo;avez pas installé, faites-le… mais c\u0026rsquo;est dommage.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# debsums unhide.rb\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e/usr/bin/unhide.rb                                                            OK\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e/usr/share/doc/unhide.rb/changelog.Debian.gz                                  OK\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e/usr/share/doc/unhide.rb/copyright                                            OK\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e/usr/share/lintian/overrides/unhide.rb                                        OK\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e/usr/share/man/man8/unhide.rb.8.gz                                            OK\u003c/code\u003e \u003cbr\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Maintenant, par acquis de conscience, faites ceci :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ cp /usr/bin/unhide.rb $HOME\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e# apt purge unhide.rb\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e# apt install unhide.rb\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e$ diff /usr/sbin/unhide.rb ~/unhide.rb\u003c/code\u003e \u003cbr\u003e\u003c/p\u003e\n\u003cp\u003eSi \u003cstrong\u003ediff\u003c/strong\u003e ne retourne aucune information, c\u0026rsquo;est que les deux fichiers\nen question sont identiques ! \u003cbr\u003e\n\u003cem\u003e(à moins d\u0026rsquo;avoir eu la malchance d\u0026rsquo;avoir eu le binaire \u003cstrong\u003ediff\u003c/strong\u003e lui même modifié…)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eSi tout semble \u0026lsquo;OK\u0026rsquo;, c\u0026rsquo;est que l\u0026rsquo;on a faire face au fameux faux positif\nde rkhunter concernant ce binaire ! \u003cbr\u003e\n\u003cem\u003ece qui devrait être le cas dans une installation fraîchement exécutée !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Contrôlons les sommes de contrôle différemment :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ md5sum /usr/bin/unhide.rb\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003eb1642389370e283c580de371b61ec3cb  /usr/bin/unhide.rb\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e$ grep \u0026quot;usr/bin/unhide.rb\u0026quot; /var/lib/dpkg/info/unhide.rb.md5sums\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003eb1642389370e283c580de371b61ec3cb  usr/bin/unhide.rb\u003c/code\u003e \u003cbr\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ L\u0026rsquo;autre manière est de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003etélécharger le binaire \u003cstrong\u003eunhide.rb\u003c/strong\u003e, depuis le dépôt officiel,\u003c/li\u003e\n\u003cli\u003ele décompresser et\u003c/li\u003e\n\u003cli\u003ecomparer les sommes avec \u003ccode\u003esha256sum\u003c/code\u003e, voire \u003ccode\u003esha512sum\u003c/code\u003e ! - \u003cstrong\u003ec\u0026rsquo;est même préférable\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi les sommes sont identiques, c\u0026rsquo;est tout bon !\u003c/p\u003e\n\u003cp\u003ePensez à supprimer le fichier \u003ccode\u003e~/unhide.rb\u003c/code\u003e que vous avez créé lors de la\ncopie, précédemment !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePuisque tout semble bon, modifions le fichier \u003ccode\u003e/etc/rkhunter.conf\u003c/code\u003e, pour\nmodifier cette variable : \u003ccode\u003ePKGMGR=DPKG\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eRecharger la base de donnée de rkhunter, avec l\u0026rsquo;option \u003ccode\u003e--propupd\u003c/code\u003e, et\nlancez à nouveau le test.\u003c/p\u003e\n\u003cp\u003eNormalement, l\u0026rsquo;utilitaire \u003ccode\u003eunhide.rb\u003c/code\u003e devrait correctement être pris en charge…\u003c/p\u003e\n\u003cp\u003eSi jamais, ce n\u0026rsquo;était pas le cas :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003evous pouvez décommenter la ligne suivante du fichier rkhunter.conf : \u003cbr\u003e\n\u003ccode\u003e#SCRIPTWHITELIST=/usr/bin/unhide.rb\u003c/code\u003e - mais gardez à l\u0026rsquo;esprit que \u003cstrong\u003ece n\u0026rsquo;est pas préférable/recommandable\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi malgré tout, cela n\u0026rsquo;est pas bon, envisager sérieusement une réinstallation\nde votre Linux !!!\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment résoudre l'avis de détection par rkhunter : Warning: /usr/bin/unhide.rb","tags":["rkhunter","detection","unhide.rb"],"date_published":"2017-07-24T20:42:46+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-24:/fr/dev/bash/script-convert-optimize-image#ff10ca941df5dcca3ded4483bfac987ab0ab491b42432e17a02e592bdb5ec1a0","url":"https://it-log.fr.eu.org/fr/dev/bash/script-convert-optimize-image/","title":"Bash : Convertir et optimiser image jpeg et/ou png","author":{"name":"Stéphane HUC"},"content_text":"Description Ce script a pour but d\u0026rsquo;aider très simplement à convertir, mais surtout d\u0026rsquo;optimiser des images jpg, des images png, afin de gagner en poids de l\u0026rsquo;image, pour l\u0026rsquo;intégration de celles-ci dans les sites web. Et donc de réduire le coût de la bande passante !\nCe script bash de conversion et d\u0026rsquo;optimisation d\u0026rsquo;images jpeg et png, fonctionne très simplement. Il y a trois options possibles :\nl\u0026rsquo;option jpg2jpg dont le but est d\u0026rsquo;optimiser une image jpeg après une conversion à une qualité, ayant le ratio 70%. Le gain est conséquent, de l\u0026rsquo;ordre du facteur 3 ! l\u0026rsquo;option jpg2png permet de convertir l\u0026rsquo;image jpeg en image png, puis d\u0026rsquo;optimiser ladite image png. Attention, explosion du poids ! l\u0026rsquo;option png2png génère l\u0026rsquo;optimisation d\u0026rsquo;image png. Pour se servir de ce script de conversion et d\u0026rsquo;optimisation d\u0026rsquo;image jpeg et/ou d\u0026rsquo;image png, vous devez veillez à avoir les outils suivants :\nles outils d\u0026rsquo;ImageMagick qui fournissent l\u0026rsquo;outil de conversion : mogrify. la librairie jpeg libjpeg qui fournit l\u0026rsquo;outil d\u0026rsquo;optimisation jpeg : jpegtran. l\u0026rsquo;outil d\u0026rsquo;optimisation png : pngnq le système de fichier virtuel gvfs-bin qui fournit l\u0026rsquo;outil gvfs-info. Bien évidemment, vous devez veiller à ce que vos images à traiter soient de qualité originale, des images \u0026lsquo;sources\u0026rsquo; !\nLe script : convert_image() #!/bin/bash # ./convert_image /name_dir/ options # options are: \u0026#39;jpg2jpg\u0026#39;, \u0026#39;jpg2png\u0026#39;, \u0026#39;png2png\u0026#39; # you need ImageMagick tools, libjpeg (jpegtran), gvfs-bin # Convert image jpg # 1/ jpg to jpg, quality 70 and optimize : option jpg2jpg # 2/ jpg to png : option jp2png # 3/ png to optimize png : option png2png clear # define variables needed declare -a EXTS=( jpg JPG ) # extension accepted declare -i ARGS=2 # number of arguments accepted declare -i mssg=1 # to display message declare -i cmptr=0 # compteur declare -a MIME[1]=\u0026#34;image/jpeg\u0026#34; # mime type jpg declare -a MIME[2]=\u0026#34;image/png\u0026#34; # mime type png declare -a option=( jpg2jpg jpg2png png2png ) IFS=$\u0026#39;n\u0026#39; # functions needed ! function convert_image () { verify_args $1 $2 verify_bin create_vars_dir $1 $2 #empty_dir $dir_out empty_dir $dir_out2 create_dir $dir_out create_dir $dir_out2 for f in find $1 -type f; do create_vars_image case $mime in \u0026#34;${MIME[1]}\u0026#34;) case $2 in \u0026#34;${option[0]}\u0026#34;) increment jpg2jpg optimize_jpg empty_img_converted $dir_out $ff ;; \u0026#34;${option[1]}\u0026#34;) increment jpg2png optimize_png ;; *) exit ;; esac ;; \u0026#34;${MIME[2]}\u0026#34;) case $2 in \u0026#34;${option[2]}\u0026#34;) optimize_png ;; *) exit ;; esac ;; *) exit ;; esac done } function create_dir () { if [! -d $1](!_-d_$1); then if (( mssg == 1 )); then echo \u0026#34;*** Create directory $1 ***\u0026#34;; fi mkdir $1; fi } function create_vars_dir () { dir_out=$1\u0026#34;converted/\u0026#34; if (( mssg == 1 )); then echo \u0026#34;*** Create variables needed for $2 : dir_out ***\u0026#34;; fi dir_out2=$1\u0026#34;optim_jpg/\u0026#34; if (( mssg == 1 )); then echo \u0026#34;*** Create variables needed for $2 : dir_out2 ***\u0026#34;; fi } function create_vars_image () { dir=dirname $f ff=basename $f ext=${ff:(-3)}; name=basename $f .$ext #length=${#ff} #name=${ff:0:$length-4}; mime=gvfs-info --attributes=\u0026#34;standard::content-type\u0026#34; $f | grep \u0026#34;standard::content-type\u0026#34; | cut -c27- } function empty_dir () { if [ $1 ]; then if [-d $1](-d_$1); then cd $1 rm * if (( mssg == 1 )); then echo \u0026#34;~~~ Dir $1 empty! ~~~\u0026#34;; fi cd .. fi fi } function empty_img_converted () { if [ $1 ]; then if [-d $1](-d_$1); then if [$2]($2); then unlink $1$2; if (( mssg == 1 )); then echo \u0026#34;=\u0026gt; 3/ Img $ff deleted in dir $1 !\u0026#34;; fi fi fi fi } function increment () { (( cptr++ )) if (( mssg == 1 )); then echo \u0026#34;$cptr :: Image $ff { Mime Type: $mime } to convert\u0026#34;; fi } function jpg2jpg () { cp $f $dir_out cd $dir_out if (( mssg == 1 )); then echo \u0026#34;=\u0026gt; 1/ Convert image $ff to quality 70 ...\u0026#34;; fi mogrify -quality 70 $ff cd \u0026#34;..\u0026#34; } function jpg2png () { if (( mssg == 1 )); then echo \u0026#34;=\u0026gt; Convert image $ff to PNG ...\u0026#34;; fi mogrify -format png $f } function optimize_jpg () { if (( mssg == 1 )); then echo \u0026#34;=\u0026gt; 2/ Optimize image $ff with jpegtran ...\u0026#34;; fi jpegtran -optimize -progressive -perfect -copy all $dir_out$ff \u0026gt; $dir_out2$ff } function optimize_png () { if (( mssg == 1 )); then echo \u0026#34;=\u0026gt; Deplace image $name.png to optimize-it! ...\u0026#34;; fi case $mime in \u0026#34;${MIME[1]}\u0026#34;) mv $1$name\u0026#34;.png\u0026#34; $dir_out ;; \u0026#34;${MIME[2]}\u0026#34;) cp $1$name\u0026#34;.png\u0026#34; $dir_out ;; *) exit ;; esac cd $dir_out if (( mssg == 1 )); then echo \u0026#34;=\u0026gt; Optimize image $name.png with pngnq ...\u0026#34;; fi pngnq -vf -s1 \u0026#34;$name.png\u0026#34; if (( mssg == 1 )); then echo \u0026#34;=\u0026gt; delete $name.png ...\u0026#34;; fi unlink \u0026#34;$name.png\u0026#34; if (( mssg == 1 )); then echo \u0026#34;=\u0026gt; Rename image PNG temporary in name $name.png ...\u0026#34;; fi mv \u0026#34;$name-nq8.png\u0026#34; \u0026#34;$name.png\u0026#34; #echo \u0026#34;=\u0026gt; Optimize image PNG {$name.png} with optipng ...\u0026#34; #optipng -o7 \u0026#34;$name.png\u0026#34; cd \u0026#34;..\u0026#34; } function status () { case $1 in 0) txt=\u0026#34;*** More argument; just call the script as: ./convert_image /name_dir/ \u0026#39;jpg2jpg|jpg2png|png2png\u0026#39; ***\u0026#34; ;; 1) txt=\u0026#34;*** Directory needed! ***\u0026#34; ;; 2) txt=\u0026#34;*** argument \u0026#39;jpg2jpg\u0026#39;, \u0026#39;jpg2png\u0026#39; or \u0026#39;png2png\u0026#39; needed! ***\u0026#34; ;; 3) txt=\u0026#34;*** bad argument: argument is \u0026#39;jpg2jpg\u0026#39;, \u0026#39;jpg2png\u0026#39; or \u0026#39;png2png\u0026#39;! ***\u0026#34; ;; 4) txt=\u0026#34;*** ERROR: Script stop here because the bin ***$2*** is not installed; in $3... ***\u0026#34; ;; esac if test -n \u0026#34;$txt\u0026#34;; then echo \u0026#34;$txt\u0026#34;; fi exit } function verify_args () { if test -z \u0026#34;$1\u0026#34;; then status 1; fi if [! -d $1](!_-d_$1); then exit; fi if test -z \u0026#34;$2\u0026#34;; then status 2; fi if (( $2 != \u0026#34;jpg2jpg\u0026#34; || $2 != \u0026#34;jpg2png\u0026#34; || $2 != \u0026#34;png2png\u0026#34; )); then status 3; fi } function verify_bin () { bin[1]=\u0026#34;jpegtran\u0026#34; bin[2]=\u0026#34;mogrify\u0026#34; bin[3]=\u0026#34;gvfs-info\u0026#34; get[1]=\u0026#34;libjpeg\u0026#34; get[2]=\u0026#34;ImageMagick Tools\u0026#34; get[3]=\u0026#34;gvfs-bin\u0026#34; for (( i=1 ; i\u0026lt;=3 ; i++ )) do if [[ ! -e \u0026#34;/usr/bin/${bin[$i]}\u0026#34; ]]; then status 4 \u0026#34;${bin[$i]}\u0026#34; \u0026#34;${get[$i]}\u0026#34;; fi done } # appel to the function convert_image if [ $# -ne \u0026#34;$ARGS\u0026#34; ]; then status 0 else convert_image $1 $2 fi Utilisation Il ne reste plus qu\u0026rsquo;à l\u0026rsquo;utiliser ainsi :\n$ chmod 0700 convert_image $ ./convert_image /name_dir/ option\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eCe script a pour but d\u0026rsquo;aider très simplement à convertir, mais surtout\nd\u0026rsquo;optimiser des images jpg, des images png, afin de gagner en poids de\nl\u0026rsquo;image, pour l\u0026rsquo;intégration de celles-ci dans les sites web. Et donc\nde réduire le coût de la bande passante !\u003c/p\u003e\n\u003cp\u003eCe script bash de conversion et d\u0026rsquo;optimisation d\u0026rsquo;images jpeg et png,\nfonctionne très simplement. Il y a trois options possibles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003ejpg2jpg\u003c/code\u003e dont le but est d\u0026rsquo;optimiser une image jpeg après une conversion \nà une qualité, ayant le ratio 70%. \u003cbr\u003e\n   Le gain est conséquent, de l\u0026rsquo;ordre du facteur 3 !\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003ejpg2png\u003c/code\u003e permet de convertir l\u0026rsquo;image jpeg en image png, puis d\u0026rsquo;optimiser \nladite image png. \u003cbr\u003e\n   \u003cspan class=\"attention\"\u003eAttention, explosion du poids !\u003c/span\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003epng2png\u003c/code\u003e génère l\u0026rsquo;optimisation d\u0026rsquo;image png.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour se servir de ce script de conversion et d\u0026rsquo;optimisation d\u0026rsquo;image\njpeg et/ou d\u0026rsquo;image png, vous devez veillez à avoir les outils suivants\n:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles outils d\u0026rsquo;ImageMagick qui fournissent l\u0026rsquo;outil de conversion : \u003ccode\u003emogrify\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ela librairie jpeg \u003ccode\u003elibjpeg\u003c/code\u003e qui fournit l\u0026rsquo;outil d\u0026rsquo;optimisation jpeg : \u003ccode\u003ejpegtran\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;outil d\u0026rsquo;optimisation png : \u003ccode\u003epngnq\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ele système de fichier virtuel \u003ccode\u003egvfs-bin\u003c/code\u003e qui fournit l\u0026rsquo;outil \u003ccode\u003egvfs-info\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cspan class=\"IMP\"\u003eBien évidemment, vous devez veiller à ce que vos images à\ntraiter soient de qualité originale, des images \u0026lsquo;sources\u0026rsquo; !\u003c/span\u003e\u003c/p\u003e\n\u003ch2 id=\"le-script--convert_image\"\u003eLe script : convert_image()\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-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# ./convert_image /name_dir/ options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# options are: \u0026#39;jpg2jpg\u0026#39;, \u0026#39;jpg2png\u0026#39;, \u0026#39;png2png\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# you need ImageMagick tools, libjpeg (jpegtran), gvfs-bin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#  Convert image jpg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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#  1/ jpg to jpg, quality 70 and optimize : option jpg2jpg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#  2/ jpg to png : option jp2png\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#  3/ png to optimize png : option png2png\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#  define variables needed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeclare -a \u003cspan style=\"color:#ef6155\"\u003eEXTS\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=(\u003c/span\u003e jpg JPG \u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e# extension accepted\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edeclare -i \u003cspan style=\"color:#ef6155\"\u003eARGS\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e# number of arguments accepted declare -i mssg=1 #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eto display message declare -i \u003cspan style=\"color:#ef6155\"\u003ecmptr\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e# compteur declare -a\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMIME\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;image/jpeg\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e# mime type jpg declare -a\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMIME\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e2\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;image/png\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e# mime type png declare -a option=( jpg2jpg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ejpg2png png2png \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\"\u003eIFS\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$\u0026#39;n\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#  functions needed !\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003efunction\u003c/span\u003e convert_image \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    verify_args \u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    verify_bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    create_vars_dir \u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\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:#776e71\"\u003e#empty_dir $dir_out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    empty_dir \u003cspan style=\"color:#ef6155\"\u003e$dir_out2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    create_dir \u003cspan style=\"color:#ef6155\"\u003e$dir_out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    create_dir \u003cspan style=\"color:#ef6155\"\u003e$dir_out2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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 f in find \u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e -type f;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         create_vars_image\n\u003c/span\u003e\u003c/span\u003e\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:#ef6155\"\u003e$mime\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;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eMIME\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\n\u003c/span\u003e\u003c/span\u003e\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:#ef6155\"\u003e$2\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;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoption\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             increment\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             jpg2jpg\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             optimize_jpg\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             empty_img_converted \u003cspan style=\"color:#ef6155\"\u003e$dir_out\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$ff\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eoption\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             increment\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             jpg2png\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             optimize_png\n\u003c/span\u003e\u003c/span\u003e\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                             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                   \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              ;;\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eMIME\u003c/span\u003e[2]\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\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:#ef6155\"\u003e$2\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;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoption\u003c/span\u003e[2]\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             optimize_png\n\u003c/span\u003e\u003c/span\u003e\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                             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                   \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\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                   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         \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:#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\n\u003c/span\u003e\u003c/span\u003e\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\"\u003efunction\u003c/span\u003e create_dir \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! -d \u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e](\u003c/span\u003e!_-d_\u003cspan style=\"color:#ef6155\"\u003e$1\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 \u003cspan style=\"color:#5bc4bf\"\u003e((\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*** Create directory \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:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         mkdir \u003cspan style=\"color:#ef6155\"\u003e$1\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\u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e create_vars_dir \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\"\u003edir_out\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;converted/\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 \u003cspan style=\"color:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*** Create variables needed for \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$2\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e : dir_out ***\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\"\u003edir_out2\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;optim_jpg/\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 \u003cspan style=\"color:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*** Create variables needed for \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$2\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e : dir_out2 ***\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\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:#815ba4\"\u003efunction\u003c/span\u003e create_vars_image \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\"\u003edir\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003edirname \u003cspan style=\"color:#ef6155\"\u003e$f\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     \u003cspan style=\"color:#ef6155\"\u003eff\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ebasename \u003cspan style=\"color:#ef6155\"\u003e$f\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003eext\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eff\u003c/span\u003e:(-3)\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\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ebasename \u003cspan style=\"color:#ef6155\"\u003e$f\u003c/span\u003e .\u003cspan style=\"color:#ef6155\"\u003e$ext\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#length=${#ff}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#name=${ff:0:$length-4};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     \u003cspan style=\"color:#ef6155\"\u003emime\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003egvfs-info --attributes\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;standard::content-type\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$f\u003c/span\u003e | grep \u003cspan style=\"color:#48b685\"\u003e\u0026#34;standard::content-type\u0026#34;\u003c/span\u003e | cut -c27-\n\u003c/span\u003e\u003c/span\u003e\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:#815ba4\"\u003efunction\u003c/span\u003e empty_dir \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:#ef6155\"\u003e$1\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 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e-d \u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e](\u003c/span\u003e-d_\u003cspan style=\"color:#ef6155\"\u003e$1\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              cd \u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              rm *\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\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;~~~ Dir \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e empty! ~~~\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              cd ..\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\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\"\u003efunction\u003c/span\u003e empty_img_converted \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:#ef6155\"\u003e$1\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 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e-d \u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e](\u003c/span\u003e-d_\u003cspan style=\"color:#ef6155\"\u003e$1\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 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$2\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e](\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$2\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                   unlink \u003cspan style=\"color:#ef6155\"\u003e$1$2\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:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; 3/ Img \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$ff\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e deleted in dir \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:#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         \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:#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\"\u003efunction\u003c/span\u003e increment \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:#5bc4bf\"\u003e((\u003c/span\u003e cptr++ \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 \u003cspan style=\"color:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$cptr\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e :: Image \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$ff\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e { Mime Type: \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$mime\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e } to convert\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\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:#815ba4\"\u003efunction\u003c/span\u003e jpg2jpg \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    cp \u003cspan style=\"color:#ef6155\"\u003e$f\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$dir_out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    cd \u003cspan style=\"color:#ef6155\"\u003e$dir_out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; 1/ Convert image \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$ff\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e to quality 70 ...\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    mogrify -quality 70 \u003cspan style=\"color:#ef6155\"\u003e$ff\u003c/span\u003e\n\u003c/span\u003e\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;..\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:#815ba4\"\u003efunction\u003c/span\u003e jpg2png \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:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; Convert image \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$ff\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e to PNG ...\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    mogrify -format png \u003cspan style=\"color:#ef6155\"\u003e$f\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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:#815ba4\"\u003efunction\u003c/span\u003e optimize_jpg \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:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; 2/ Optimize image \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$ff\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e with jpegtran ...\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    jpegtran -optimize -progressive -perfect -copy all \u003cspan style=\"color:#ef6155\"\u003e$dir_out$ff\u003c/span\u003e \u0026gt; \u003cspan style=\"color:#ef6155\"\u003e$dir_out2$ff\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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:#815ba4\"\u003efunction\u003c/span\u003e optimize_png \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:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; Deplace image \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.png to optimize-it! ...\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:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$mime\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;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eMIME\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              mv \u003cspan style=\"color:#ef6155\"\u003e$1$name\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;.png\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$dir_out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eMIME\u003c/span\u003e[2]\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              cp \u003cspan style=\"color:#ef6155\"\u003e$1$name\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;.png\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$dir_out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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              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    \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    cd \u003cspan style=\"color:#ef6155\"\u003e$dir_out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; Optimize image \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.png with pngnq ...\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    pngnq -vf -s1 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.png\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 \u003cspan style=\"color:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; delete \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.png ...\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    unlink \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.png\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 \u003cspan style=\"color:#ef6155\"\u003emssg\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e 1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; Rename image PNG temporary in name \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.png ...\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    mv \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e-nq8.png\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$name\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#echo \u0026#34;=\u0026gt; Optimize image PNG {$name.png} with optipng ...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#optipng -o7 \u0026#34;$name.png\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    cd \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:#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\"\u003efunction\u003c/span\u003e status \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:#ef6155\"\u003e$1\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etxt\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;*** More argument; just call the script as: ./convert_image /name_dir/ \u0026#39;jpg2jpg|jpg2png|png2png\u0026#39; ***\u0026#34;\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etxt\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;*** Directory needed! ***\u0026#34;\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etxt\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;*** argument \u0026#39;jpg2jpg\u0026#39;, \u0026#39;jpg2png\u0026#39; or \u0026#39;png2png\u0026#39; needed! ***\u0026#34;\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etxt\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;*** bad argument: argument is \u0026#39;jpg2jpg\u0026#39;, \u0026#39;jpg2png\u0026#39; or \u0026#39;png2png\u0026#39;! ***\u0026#34;\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etxt\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;*** ERROR: Script stop here because the bin ***\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$2\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e*** is not installed; in \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$3\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\"\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:#815ba4\"\u003eif\u003c/span\u003e test -n \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$txt\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$txt\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\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\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\"\u003efunction\u003c/span\u003e verify_args \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 test -z \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:#815ba4\"\u003ethen\u003c/span\u003e status 1; \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\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e! -d \u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e](\u003c/span\u003e!_-d_\u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\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    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e test -z \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; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e status 2; \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\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e((\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$2\u003c/span\u003e !\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;jpg2jpg\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e||\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$2\u003c/span\u003e !\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;jpg2png\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e||\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$2\u003c/span\u003e !\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;png2png\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e status 3; \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\u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e verify_bin \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    bin\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;jpegtran\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    bin\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e2\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;mogrify\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    bin\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;gvfs-info\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    get\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;libjpeg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    get\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e2\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;ImageMagick Tools\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    get\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;gvfs-bin\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\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e((\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ei\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1 ; i\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3 ; i++ \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 ! -e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/usr/bin/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ebin\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:#815ba4\"\u003ethen\u003c/span\u003e status 4 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ebin\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:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eget\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:#815ba4\"\u003efi\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\n\u003c/span\u003e\u003c/span\u003e\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# appel to the function convert_image\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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:#ef6155\"\u003e$#\u003c/span\u003e -ne \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$ARGS\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    status \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:#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    convert_image \u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\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\"\u003efi\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\u003cp\u003eIl ne reste plus qu\u0026rsquo;à l\u0026rsquo;utiliser ainsi :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ chmod 0700 convert_image $ ./convert_image /name_dir/ option\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Script Bash de conversion d'image jpeg ou png afin de les optimiser voire les minimiser","tags":["Bash","convert","optimize","image"],"date_published":"2017-07-24T16:56:42+01:00","date_modified":"2017-07-28T12:34:17+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-24:/fr/sec/scan/rkhunter-warning-file-immutable-bit-set#d4b62c5825a99cf289c4e1ce85b3e60f32a2394258850d62a9b7c7e6ba72db8a","url":"https://it-log.fr.eu.org/fr/sec/scan/rkhunter-warning-file-immutable-bit-set/","title":"Rkhunter : Warning: File has the immutable-bit set","author":{"name":"Stéphane HUC"},"content_text":"Description Rkhunter émet cet avis : Warning: File \u0026lsquo;/sbin/xyz\u0026rsquo; has the immutable-bit set. et, il le fait sur plusieurs fichiers !\nAhahhh, petit malin, je vous y prend, vous avez utilisez l\u0026rsquo; outil chattr avec l\u0026#39;option `-I` , n\u0026rsquo;est-ce pas ?! Tant mieux… sinon, vous avez peut-être un petit problème !\nConfiguration Le fichier de configuration /etc/rkhunter.conf renferme une option à-priori utile : IMMUTABLE_SET=0 !\nSauf qu\u0026rsquo;une fois activée, lors d\u0026rsquo;une vérification, ce sont les quelques binaires qui ne peuvent avoir l\u0026rsquo;option immutable, qui vont recevoir ladite complainte.\nC\u0026rsquo;est un peu l\u0026rsquo;histoire du serpent qui se mort la queue, n\u0026rsquo;est-ce pas !\nPuisque vous utilisez l\u0026rsquo;option I du binaire chattr, modifiez le fichier crontab relatif à rkhunter…\nLe fichier /etc/default/rkhunter nous informe de ceci :\n:$ cat /etc/default/rkhunter # Defaults for rkhunter automatic tasks # sourced by /etc/cron.*/rkhunter and /etc/apt/apt.conf.d/90rkhunter # # This is a POSIX shell fragment # (…) Nous savons que lors de l\u0026rsquo;installation, il se crée un fichier de cron, dans /etc/crond.daily/rkhunter - vérifiez votre cas - ouvrons-le pour le modifier ainsi :\n#!/bin/sh RKHUNTER=/usr/bin/rkhunter test -x $RKHUNTER || exit 0 #add by me /repertoire/chattr_sys false # source our config . /etc/default/rkhunter if [ -z \u0026#34;$NICE\u0026#34; ]; then NICE=0 fi if [ -z \u0026#34;$RUN_CHECK_ON_BATTERY\u0026#34; ]; then RUN_CHECK_ON_BATTERY=\u0026#34;false\u0026#34; fi # Do not run daily check if running on battery except if explicitely allowed if [ -x /usr/bin/on_ac_power \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 ]; then on_ac_power \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 [ $? -eq 1 -a \u0026#34;$RUN_CHECK_ON_BATTERY\u0026#34; != \u0026#34;true\u0026#34; ] \u0026amp;\u0026amp; exit 0 fi case \u0026#34;$CRON_DAILY_RUN\u0026#34; in [YyTt]*) OUTFILE=`mktemp` || exit 1 /usr/bin/nice -n $NICE $RKHUNTER --cronjob --report-warnings-only --appendlog \u0026gt; $OUTFILE if [ -s \u0026#34;$OUTFILE\u0026#34; -a -n \u0026#34;$REPORT_EMAIL\u0026#34; ]; then ( echo \u0026#34;Subject: [rkhunter] $(hostname -f) - Daily report\u0026#34; echo \u0026#34;To: $REPORT_EMAIL\u0026#34; echo \u0026#34;\u0026#34; cat $OUTFILE ) | /usr/sbin/sendmail $REPORT_EMAIL fi rm -f $OUTFILE ;; *) exit 0 ;; esac #add by me : /repertoire/chattr_sys true Résultat, lors de la future vérification planifiée de l\u0026rsquo;outil rkhunter, il exécutera votre script lié à l\u0026rsquo;usage de chattr… en désactivant d\u0026rsquo;abord, l\u0026rsquo;option immutable, puis fera son boulot, et pour finir réactivera l\u0026rsquo;option.\nSi c\u0026rsquo;est vous qui l\u0026rsquo;exécutez, pensez d\u0026rsquo;abord à désactiver… puis à réactiver votre protection !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eRkhunter émet cet avis : \u003cbr\u003e\n\u003cq\u003eWarning: File \u0026lsquo;/sbin/xyz\u0026rsquo; has the immutable-bit set.\u003c/q\u003e\net, il le fait sur plusieurs fichiers !\u003c/p\u003e\n\u003cp\u003eAhahhh, petit malin, je vous y prend, vous avez utilisez l\u0026rsquo;\n\n\u003ca class=\"inside\" href=\"/fr/sec/linux/chattr/\" title=\"Lien interne vers l\u0026#39;article : 'Durcir Linux : Utiliser chattr'\"\u003eoutil chattr avec l\u0026#39;option `-I`\u003c/a\u003e\n,\nn\u0026rsquo;est-ce pas ?! \u003cbr\u003e\nTant mieux… sinon, vous avez peut-être un petit problème !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLe fichier de configuration \u003ccode\u003e/etc/rkhunter.conf\u003c/code\u003e renferme une option\nà-priori utile : \u003ccode\u003eIMMUTABLE_SET=0\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003eSauf qu\u0026rsquo;une fois activée, lors d\u0026rsquo;une vérification, ce sont les quelques binaires\nqui ne peuvent avoir l\u0026rsquo;option \u003ccode\u003eimmutable\u003c/code\u003e, qui vont recevoir ladite complainte.\u003c/p\u003e\n\u003cp\u003e\u003cq\u003eC\u0026rsquo;est un peu l\u0026rsquo;histoire du serpent qui se mort la queue\u003c/q\u003e, n\u0026rsquo;est-ce pas !\u003c/p\u003e\n\u003cp\u003ePuisque vous utilisez l\u0026rsquo;option \u003ccode\u003eI\u003c/code\u003e du binaire \u003ccode\u003echattr\u003c/code\u003e, modifiez le fichier\n\u003ccode\u003ecrontab\u003c/code\u003e relatif à rkhunter…\u003c/p\u003e\n\u003cp\u003eLe fichier \u003ccode\u003e/etc/default/rkhunter\u003c/code\u003e nous informe de ceci :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ cat /etc/default/rkhunter\n# Defaults for rkhunter automatic tasks\n# sourced by /etc/cron.*/rkhunter and /etc/apt/apt.conf.d/90rkhunter\n#\n# This is a POSIX shell fragment\n#\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNous savons que lors de l\u0026rsquo;installation, il se crée un fichier de cron,\ndans \u003ccode\u003e/etc/crond.daily/rkhunter\u003c/code\u003e - \u003cem\u003evérifiez votre cas\u003c/em\u003e - ouvrons-le pour\nle modifier 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\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\"\u003eRKHUNTER\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/usr/bin/rkhunter\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etest -x \u003cspan style=\"color:#ef6155\"\u003e$RKHUNTER\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e||\u003c/span\u003e exit \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:#776e71\"\u003e#add by me\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/repertoire/chattr_sys false\n\u003c/span\u003e\u003c/span\u003e\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# source our config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e. /etc/default/rkhunter\n\u003c/span\u003e\u003c/span\u003e\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:#ef6155\"\u003e$NICE\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:#ef6155\"\u003eNICE\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\"\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 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -z \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$RUN_CHECK_ON_BATTERY\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:#ef6155\"\u003eRUN_CHECK_ON_BATTERY\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;false\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:#776e71\"\u003e# Do not run daily check if running on battery except if explicitely allowed\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 -x /usr/bin/on_ac_power \u0026gt;/dev/null 2\u0026gt;\u0026amp;\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    on_ac_power \u0026gt;/dev/null 2\u0026gt;\u0026amp;\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:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$?\u003c/span\u003e -eq \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e -a \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$RUN_CHECK_ON_BATTERY\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;true\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e exit \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\"\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\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$CRON_DAILY_RUN\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:#5bc4bf\"\u003e[\u003c/span\u003eYyTt\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\"\u003eOUTFILE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003emktemp\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e||\u003c/span\u003e exit \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        /usr/bin/nice -n \u003cspan style=\"color:#ef6155\"\u003e$NICE\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$RKHUNTER\u003c/span\u003e --cronjob --report-warnings-only --appendlog \u0026gt; \u003cspan style=\"color:#ef6155\"\u003e$OUTFILE\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 -s \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$OUTFILE\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -a -n \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$REPORT_EMAIL\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:#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;Subject: [rkhunter] \u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname -f\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e - Daily report\u0026#34;\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;To: \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$REPORT_EMAIL\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            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            cat \u003cspan style=\"color:#ef6155\"\u003e$OUTFILE\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 | /usr/sbin/sendmail \u003cspan style=\"color:#ef6155\"\u003e$REPORT_EMAIL\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        rm -f \u003cspan style=\"color:#ef6155\"\u003e$OUTFILE\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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       exit \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:#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:#776e71\"\u003e#add by me :\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/repertoire/chattr_sys true\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRésultat, lors de la future vérification planifiée de l\u0026rsquo;outil rkhunter,\nil exécutera votre script lié à l\u0026rsquo;usage de chattr… en désactivant d\u0026rsquo;abord,\nl\u0026rsquo;option \u003ccode\u003eimmutable\u003c/code\u003e, puis fera son boulot, et pour finir réactivera l\u0026rsquo;option.\u003c/p\u003e\n\u003cp\u003eSi c\u0026rsquo;est vous qui l\u0026rsquo;exécutez, pensez d\u0026rsquo;abord à désactiver… puis à réactiver\nvotre protection !\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment résoudre l'avis de détection par rkhunter : Warning: File has the immutable-bit set","tags":["rkhunter","detection","immutable"],"date_published":"2017-07-24T17:21:10+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/sys/debian/apt-errors#0f73cd14124975e8a4e9181709e4a67dde275a0c80d370ed54088ce9bb6c0f89","url":"https://it-log.fr.eu.org/fr/sys/debian/apt-errors/","title":"APT: E:","author":{"name":"Stéphane HUC"},"content_text":"Description Votre outil apt(-get) vous restitue le message suivant, lors d\u0026rsquo;une mise-à-jour :\nE: Malformed Description-md5 line; doesn\u0026#39;t have the required length ! L\u0026rsquo;astuce est la suivante - à faire en mode console, avec vos droits admins, bien sûr - :\n:# apt-get clean :# cd /var/lib/apt :# mv lists lists.old :# mkdir -p lists/partial :# apt-get clean :# apt-get update ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVotre outil apt(-get) vous restitue le message suivant, lors d\u0026rsquo;une 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-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eE: Malformed Description-md5 line; doesn\u003cspan style=\"color:#ef6155\"\u003e\u0026#39;\u003c/span\u003et have the required length !\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;astuce est la suivante - \u003cem\u003eà faire en mode console, avec vos droits\nadmins, bien sûr\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-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# apt-get clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# cd /var/lib/apt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mv lists lists.old\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mkdir -p lists/partial\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# apt-get clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# apt-get update\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n","summary":"Debian : Résoudre l'erreur 'Malformed MD5 line' pour l'outil apt","tags":["Debian","apt","erreur"],"date_published":"2017-07-23T23:24:04+01:00","date_modified":"2018-10-11T21:33:04+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/sec/gpg/gpg-usage-securise#b39852f11349e079a6cd06d6dae6fe5462a142c02eb8036905e3ee59f636be99","url":"https://it-log.fr.eu.org/fr/sec/gpg/gpg-usage-securise/","title":"GPG : Du bon usage sécurisé","author":{"name":"Stéphane HUC"},"content_text":"Description Ou, comment titrer autrement que : De meilleures pratiques GPG/PGP !\nJe ne parlerais pas de comment créer une clé GPG pour communiquer de manière chiffrée ; il existe de très bons guides/tutoriels qui le font très bien, et vraiment mieux que ce que je ne pourrais le faire :\nLe guide de l\u0026rsquo;Autodéfense courriel - par la FSF… Le tutoriel \u0026ldquo;Signature numérique et chiffrement des messages - Assistance de Thunderbird\u0026rdquo; - par Mozilla. Le guide des bonnes pratiques pour l\u0026rsquo;utilisation d\u0026rsquo;OpenPGP - par RiseUp Installation Pour pouvoir utiliser correctement gpg, il faut installer non seulement cet outil, mais vous avez besoin d\u0026rsquo;autres outils, tels que : gnupg gnupg-curl hopenpgp-tools parcimonie openssl\nAttentionCertains de ces outils ne sont disponibles que sous Linux… tels hopenpgp-tools, parcimonie. Vous ne les trouverez pas nativement sous OpenBSD, ni en package, ni en ports !\nDu fait d\u0026rsquo;installer l\u0026rsquo;outil parcimonie, il est IMPÉRATIF de ne plus utiliser l\u0026rsquo;option --refresh-keys de GPG… parcimonie le fera de la manière convenable et surtout sécurisé !\nCertificat SKS DangerIl n\u0026rsquo;est plus recommandé d\u0026rsquo;utiliser le certificat des serveurs SKS ; mais de se fier qu\u0026rsquo;au seul serveur vraiment sécurisé du projet openpgp, à savoir : keys.openpgp.org. Configuration DangerHormis le fait d\u0026rsquo;avoir IMPÉRATIVEMENT son outil GPG/PGP à jour, afin d\u0026rsquo;éviter les failles de sécurité, il est recommandé de ne plus utiliser dans aucun fichier toutes les options keyserver-*.\nLa seule option keyserver à utiliser, doit l\u0026rsquo;être dans le fichier ~/.gnupg/dirmngr.conf, tel que : keyserver hkps://keys.openpgp.org\nLa configuration sous Unix/Linux se fait dans votre dossier personnel : ~/.gnupg/gpg.conf\nAjouter ces options :\nkeyid-format 0xlong with-fingerprint La première impose l\u0026rsquo;usage du format long - sur 64 bits - de l\u0026rsquo;identifiant de la clé GPG la deuxième demande à afficher l\u0026rsquo;empreinte, lors de la sortie… Pour améliorer la qualité des clés GPG, il nous faut rajouter les options suivantes :\ncert-digest-algo SHA512 default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed personal-digest-preferences SHA512 La première demande l\u0026rsquo;usage de l\u0026rsquo;algorithme SHA512 la deuxième annonce la liste des algorithmes préférées, ; il sera utilisé du plus fort au plus faible, le premier trouvé étant utilisé ! la dernière annonce la préférence personnelle. Pour finir, voici d\u0026rsquo;autres options à utiliser, elles aussi, nécessaires :\nkeyserver-options include-revoked keyserver-options no-try-dns-srv list-options show-uid-validity verify-options show-uid-validity use-agent auto-key-locate local auto-key-locate keyserver fixed-list-mode utf8-strings Je vous renvoie à la documentation du manpage pour que vous compreniez la raison de chacune.\nLes Recommandations Autrement-dit, les IMPÉRATIFS à ABSOLUMENT tenir compte sont :\nNE PLUS utiliser toutes les options `keyserver` dans le fichier de configuration principal NE PLUS utiliser l'option `--refresh-keys` de gpg, sauf si vous n\u0026rsquo;avez pas l\u0026rsquo;outil parcimonie. NE PAS avoir confiance dans l'identifiant d\u0026rsquo;une clé GPG, qu\u0026rsquo;il soit de format court ou long - le format court est faillible ; le format long pose son lot de problèmes ! Utilisez l\u0026rsquo;empreinte de clé GPG… NE PAS avoir une confiance aveugle dans les clés fournies, même celles sur un serveur SKS - efforcez-vous d\u0026rsquo;être en contact régulier avec votre contact, par téléphone, voire mieux physiquement, pour vous assurer de la validité de celles-ci ! Demandez l\u0026rsquo;empreinte de la clé GPG de votre interlocuteur… et signer la clé dans votre ordinateur. NE PAS utiliser l'algorithme DSA , préférez RSA ! NE PAS utiliser de longueur de clé inférieure à 4096 bits - de toute façon, dans l\u0026rsquo;immédiat, il n\u0026rsquo;est pas supporté de plus fort ! NE PAS utiliser MD5, SHA1 ; utilisez un chiffrement fort tel que SHA256, voire mieux SHA512 - et paramétrez votre configuration personnelle dans ce sens, ce que nous avons vu plus haut. Créer vos clés, avec une date d'expiration maximale à deux ans - et, utilisez un calendrier pour vous le rappeler ! Éditer vos clés pour ajouter : une sous-clé de signature, une photo, et paramétrer les préférences de hash… Créer ABSOLUMENT un certificat de révocation. Du bon usage de GPG : les empreintes Donc, nous l\u0026rsquo;avons compris, il est nécessaire/préférable d\u0026rsquo;utiliser l\u0026rsquo;outil GPG avec les empreintes de clés.\nCe sont les mêmes commandes optionnelles à gpg, mais au lieu de renseigner l\u0026rsquo;email, l\u0026rsquo;identifiant de clé, on utilisera l\u0026rsquo;empreinte d\u0026rsquo;une clé …\nPour télécharger l\u0026rsquo;empreinte d\u0026rsquo;une clé depuis le serveur : gpg --recv-key 'fingerprint' - simple ou double quotes, c\u0026rsquo;est pareil Pour vérifier l\u0026rsquo;empreinte d\u0026rsquo;une clé GPG : gpg --fingerprint 'fingerprint' Pour signer une empreinte de clé GPG : gpg --sign-key 'fingerprint' Pour signer localement une empreinte de clé GPG : gpg --lsign-key 'fingerprint' - ATTENTION : si vous signez localement, vous ne pourrez plus exporter votre signature ! Pour gérer un fichier : gpg --with-fingerprint keyfile Pour créer un certificat de révocation à partir de l\u0026rsquo;empreinte : gpg --output email@domain.tld.rev.asc --gen-revoke 'fingerprint' Etc. Du bon outil GPG Obsolète Cette documentation 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 ! Ok, nous avons vu comment utiliser openssl, parcimonie, les outils gpg pour nous assurer de faire les choses proprement, mais tu n\u0026rsquo;as pas parlé du paquet hopenpgp-tools ! En effet ;-)\nEn fait, dans ce paquet-là, il est fourni au moins deux outils que sont hkt et hokey… assemblés, ils permettent en mode console d\u0026rsquo;avoir la pertinence qu\u0026rsquo;une clé GPG est bonne à partir de son empreinte - et ils sont très facile à utiliser, tel que :\nhkt export-pubkeys 'fingerprint' | hokey lint\nLes tests corrects sont affichés en vert . Tout problème avec la clé vérifiée est affiché en rouge ! Il faut alors IMPÉRATIVEMENT se méfier d\u0026rsquo;une telle clé, voire la régénérer si c\u0026rsquo;est la vôtre, après avoir configuré votre fichier de configuration personnelle, avec les recommandations ci-dessus !\nAttentionhkt n\u0026rsquo;est pas compatible avec GPG version \u0026gt;= 2.1, et générera des erreurs, rendant impossible le traitement ! Des logiciels graphiques Enigmail - plugin à Thunderbird, ou dédié - GPA, … Rainloop, Roundcube, … Serveurs de clés consultables Le seul sécurisé est celui du projet OpenGPG : keys.openpgp.org Et, vous avez bien compris, tout comme moi d\u0026rsquo;ailleurs… on fait une recherche par … mail, ID, empreinte !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOu, comment titrer autrement que : \u003cstrong\u003eDe meilleures pratiques GPG/PGP\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003eJe ne parlerais pas de comment créer une clé GPG pour communiquer de\nmanière chiffrée ; il existe de très bons guides/tutoriels qui le\nfont très bien, et vraiment mieux que ce que je ne pourrais le faire :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLe guide de l\u0026rsquo;\u003cstrong\u003e\u003ca href=\"https://emailselfdefense.fsf.org/fr/index.html\" rel=\"external\"\u003eAutodéfense courriel\u003c/a\u003e\u003c/strong\u003e -\npar la FSF…\u003c/li\u003e\n\u003cli\u003eLe tutoriel \u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://support.mozilla.org/fr/kb/signature-numerique-et-chiffrement-des-messages\" rel=\"external\"\u003eSignature numérique et chiffrement des messages\u003c/a\u003e\u003c/strong\u003e - Assistance de Thunderbird\u0026rdquo; - par Mozilla.\u003c/li\u003e\n\u003cli\u003eLe guide des \u003cstrong\u003e\u003ca href=\"https://help.riseup.net/fr/security/message-security/openpgp/best-practices\" rel=\"external\"\u003ebonnes pratiques pour l\u0026rsquo;utilisation d\u0026rsquo;OpenPGP\u003c/a\u003e\u003c/strong\u003e -\npar RiseUp\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003ePour pouvoir utiliser correctement gpg, il faut installer non seulement\ncet outil, mais vous avez besoin d\u0026rsquo;autres outils, tels que :\n\u003ccode\u003egnupg gnupg-curl hopenpgp-tools parcimonie openssl\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\u003cp\u003eCertains de ces outils ne sont disponibles que sous Linux… tels \u003ccode\u003ehopenpgp-tools\u003c/code\u003e,\n\u003ccode\u003eparcimonie\u003c/code\u003e. \u003cbr\u003e\nVous ne les trouverez pas nativement sous OpenBSD, ni en package, ni en ports !\u003c/p\u003e\n\u003cp\u003eDu fait d\u0026rsquo;installer l\u0026rsquo;outil \u003ccode\u003eparcimonie\u003c/code\u003e, il est \u003cstrong\u003eIMPÉRATIF\u003c/strong\u003e de ne plus utiliser l\u0026rsquo;option\n\u003ccode\u003e--refresh-keys\u003c/code\u003e de GPG… \u003cbr\u003e\n\u003cstrong\u003eparcimonie\u003c/strong\u003e le fera de la manière convenable et surtout sécurisé !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"certificat-sks\"\u003eCertificat SKS\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003eIl n\u0026rsquo;est plus recommandé d\u0026rsquo;utiliser le certificat des serveurs SKS ;\nmais de se fier qu\u0026rsquo;au seul serveur vraiment sécurisé du projet openpgp,\nà savoir : \u003ccode\u003ekeys.openpgp.org\u003c/code\u003e.\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cp\u003eHormis le fait d\u0026rsquo;avoir IMPÉRATIVEMENT son outil GPG/PGP à jour, afin d\u0026rsquo;éviter\nles failles de sécurité, il est recommandé de ne plus utiliser dans aucun\nfichier toutes les options \u003ccode\u003ekeyserver-*\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLa seule option \u003ccode\u003ekeyserver\u003c/code\u003e à utiliser, doit l\u0026rsquo;être dans le fichier\n\u003ccode\u003e~/.gnupg/dirmngr.conf\u003c/code\u003e,  tel que : \u003cbr\u003e\n\u003ccode\u003ekeyserver hkps://keys.openpgp.org\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eLa configuration sous Unix/Linux se fait dans votre dossier personnel :\n\u003ccode\u003e~/.gnupg/gpg.conf\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAjouter ces options :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003ekeyid-format 0xlong\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ewith-fingerprint\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 impose l\u0026rsquo;usage du format long - \u003cem\u003esur 64 bits\u003c/em\u003e - de l\u0026rsquo;identifiant\nde la clé GPG\u003c/li\u003e\n\u003cli\u003ela deuxième demande à afficher l\u0026rsquo;empreinte, lors de la sortie…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour améliorer la qualité des clés GPG, il nous faut rajouter les options\nsuivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003ecert-digest-algo SHA512\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefault-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epersonal-digest-preferences SHA512\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 demande l\u0026rsquo;usage de l\u0026rsquo;algorithme SHA512\u003c/li\u003e\n\u003cli\u003ela deuxième annonce la liste des algorithmes préférées, ; il sera utilisé du\nplus fort au plus faible, le premier trouvé étant utilisé !\u003c/li\u003e\n\u003cli\u003ela dernière annonce la préférence personnelle.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour finir, voici d\u0026rsquo;autres options à utiliser, elles aussi, né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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ekeyserver-options include-revoked\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ekeyserver-options no-try-dns-srv\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003elist-options show-uid-validity\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003everify-options show-uid-validity\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003euse-agent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eauto-key-locate local\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eauto-key-locate keyserver\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003efixed-list-mode\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eutf8-strings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eJe vous renvoie à la documentation du\n\u003ca href=\"http://www.delafond.org/traducmanfr/man/man1/gpg.1.html\" rel=\"external\"\u003emanpage\u003c/a\u003e\npour que vous compreniez la raison de chacune.\u003c/p\u003e\n\u003ch2 id=\"les-recommandations\"\u003eLes Recommandations\u003c/h2\u003e\n\u003cp\u003eAutrement-dit, les IMPÉRATIFS à ABSOLUMENT tenir compte sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan class=\"red\"\u003eNE PLUS utiliser toutes les options `keyserver`\u003c/span\u003e\n\ndans le fichier de configuration principal\u003c/li\u003e\n\u003cli\u003e\u003cspan class=\"red\"\u003eNE PLUS utiliser l'option `--refresh-keys`\u003c/span\u003e\n de\ngpg, sauf si vous n\u0026rsquo;avez pas l\u0026rsquo;outil \u003cstrong\u003eparcimonie\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cspan class=\"red\"\u003eNE PAS avoir confiance dans l'identifiant\u003c/span\u003e\n d\u0026rsquo;une\nclé GPG, qu\u0026rsquo;il soit de format court ou long - \u003cem\u003ele format court est \u003ca href=\"http://www.asheesh.org/note/debian/short-key-ids-are-bad-news.html\" rel=\"external\"\u003efaillible\u003c/a\u003e ;\nle format long pose son lot de \u003ca href=\"https://www.debian-administration.org/users/dkg/weblog/105\" rel=\"external\"\u003eproblèmes\u003c/a\u003e !\u003c/em\u003e \u003cbr\u003e\n\u003cstrong\u003eUtilisez l\u0026rsquo;empreinte de clé GPG\u003c/strong\u003e…\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNE PAS avoir une confiance aveugle dans les clés fournies\u003c/strong\u003e, même celles\nsur un serveur SKS - efforcez-vous d\u0026rsquo;être en contact régulier avec votre\ncontact, par téléphone, voire mieux physiquement, pour vous assurer de la\nvalidité de celles-ci ! \u003cbr\u003e\nDemandez l\u0026rsquo;empreinte de la clé GPG de votre interlocuteur… et signer la clé\ndans votre ordinateur.\u003c/li\u003e\n\u003cli\u003e\u003cspan class=\"red\"\u003eNE PAS utiliser l'algorithme DSA\u003c/span\u003e\n, préférez RSA !\u003c/li\u003e\n\u003cli\u003e\u003cspan class=\"red\"\u003eNE PAS utiliser de longueur de clé inférieure à 4096 bits\u003c/span\u003e\n -\n\u003cem\u003ede toute façon, dans l\u0026rsquo;immédiat, il n\u0026rsquo;est pas supporté de plus fort !\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cspan class=\"red\"\u003eNE PAS utiliser MD5, SHA1\u003c/span\u003e\n ; utilisez un chiffrement\nfort tel que SHA256, voire mieux SHA512 - \u003cem\u003eet paramétrez votre configuration\npersonnelle dans ce sens, ce que nous avons vu plus haut\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCréer vos clés, avec une \u003cspan class=\"red\"\u003edate d'expiration maximale\u003c/span\u003e\n\nà deux ans\u003c/strong\u003e - et, utilisez un calendrier pour vous le rappeler !\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eÉditer vos clés pour ajouter\u003c/strong\u003e :\n\u003cul\u003e\n\u003cli\u003eune sous-clé de signature,\u003c/li\u003e\n\u003cli\u003eune photo,\u003c/li\u003e\n\u003cli\u003eet paramétrer les préférences de hash…\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCréer ABSOLUMENT un certificat de révocation\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"du-bon-usage-de-gpg--les-empreintes\"\u003eDu bon usage de GPG : les empreintes\u003c/h2\u003e\n\u003cp\u003eDonc, nous l\u0026rsquo;avons compris, il est nécessaire/préférable d\u0026rsquo;utiliser l\u0026rsquo;outil GPG\navec les empreintes de clés.\u003c/p\u003e\n\u003cp\u003eCe sont les mêmes commandes optionnelles à gpg, mais au lieu de renseigner l\u0026rsquo;email,\nl\u0026rsquo;identifiant de clé, on utilisera l\u0026rsquo;empreinte d\u0026rsquo;une clé …\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour télécharger l\u0026rsquo;empreinte d\u0026rsquo;une clé depuis le serveur : \u003cbr\u003e\n\u003ccode\u003egpg --recv-key 'fingerprint'\u003c/code\u003e - \u003cem\u003esimple ou double quotes, c\u0026rsquo;est pareil\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003ePour vérifier l\u0026rsquo;empreinte d\u0026rsquo;une clé GPG : \u003cbr\u003e\n\u003ccode\u003egpg --fingerprint 'fingerprint'\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour signer une empreinte de clé GPG : \u003cbr\u003e\n\u003ccode\u003egpg --sign-key 'fingerprint'\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour signer localement une empreinte de clé GPG : \u003cbr\u003e\n\u003ccode\u003egpg --lsign-key 'fingerprint'\u003c/code\u003e - \u003cbr\u003e\n\u003cstrong\u003eATTENTION : si vous signez localement, vous ne pourrez plus exporter\nvotre signature !\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ePour gérer un fichier : \u003cbr\u003e\n\u003ccode\u003egpg --with-fingerprint keyfile\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour créer un certificat de révocation à partir de l\u0026rsquo;empreinte : \u003cbr\u003e\n\u003ccode\u003egpg --output email@domain.tld.rev.asc --gen-revoke 'fingerprint'\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eEtc.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"du-bon-outil-gpg\"\u003eDu bon outil GPG\u003c/h2\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\u003eCette documentation 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\u003eOk, nous avons vu comment utiliser openssl, parcimonie, les outils gpg pour nous\nassurer de faire les choses proprement, mais tu n\u0026rsquo;as pas parlé du paquet\n\u003ccode\u003ehopenpgp-tools\u003c/code\u003e ! \u003cbr\u003e\nEn effet ;-)\u003c/p\u003e\n\u003cp\u003eEn fait, dans ce paquet-là, il est fourni au moins deux outils que sont \u003ccode\u003ehkt\u003c/code\u003e et\n\u003ccode\u003ehokey\u003c/code\u003e… assemblés, ils permettent en mode console d\u0026rsquo;avoir la pertinence qu\u0026rsquo;une\nclé GPG est bonne à partir de son empreinte - et ils sont très facile à utiliser,\ntel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ehkt export-pubkeys 'fingerprint' | hokey lint\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLes tests corrects sont affichés en \u003cspan class=\"green\"\u003evert\u003c/span\u003e\n. \u003cbr\u003e\nTout problème avec la clé vérifiée est affiché en \u003cspan class=\"red\"\u003erouge\u003c/span\u003e\n ! \u003cbr\u003e\nIl faut alors IMPÉRATIVEMENT se méfier d\u0026rsquo;une telle clé, voire la régénérer si\nc\u0026rsquo;est la vôtre, après avoir configuré votre fichier de configuration personnelle,\navec les recommandations ci-dessus !\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cstrong\u003ehkt\u003c/strong\u003e n\u0026rsquo;est pas compatible avec GPG version \u0026gt;= 2.1, et générera des erreurs,\nrendant impossible le traitement !\u003c/div\u003e\n\n\u003chr\u003e\n\u003ch3 id=\"des-logiciels-graphiques\"\u003eDes logiciels graphiques\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.enigmail.net\" rel=\"external\"\u003eEnigmail\u003c/a\u003e - \u003cem\u003eplugin à Thunderbird, ou dédié\u003c/em\u003e -\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.gnupg.org/related_software/gpa/index.html\" rel=\"external\"\u003eGPA\u003c/a\u003e, …\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.rainloop.net\" rel=\"external\"\u003eRainloop\u003c/a\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://roundcube.net\" rel=\"external\"\u003eRoundcube\u003c/a\u003e, …\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"serveurs-de-clés-consultables\"\u003eServeurs de clés consultables\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLe seul sécurisé est celui du projet OpenGPG : \u003cstrong\u003ekeys.openpgp.org\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEt, vous avez bien compris, tout comme moi d\u0026rsquo;ailleurs… on fait une\nrecherche par … \u003cdel\u003email, ID\u003c/del\u003e, empreinte !\u003c/p\u003e\n\u003chr\u003e\n","summary":"Apprendre à utiliser de manière sécurisée GPG !","tags":["GPG"],"date_published":"2017-07-23T23:15:46+01:00","date_modified":"2020-01-08T19:23:46+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/sec/ssh/write-failed-broken-pipe#85a27855131e33009b4e9878724348d330951a50096f16c01258b346e1b0d9d6","url":"https://it-log.fr.eu.org/fr/sec/ssh/write-failed-broken-pipe/","title":"SSH : Write Failed: broken pipe","author":{"name":"Stéphane HUC"},"content_text":"Description Ahhh, les joies de SSH, n\u0026rsquo;est-ce pas ?!\nCe matin, vous vous levez, vous cherchez à vous connecter à votre serveur… et très rapidement, vous vous faites déconnecter avec ce, pas joli du tout, message : Write Failed: broken pipe. Vous vous reconnectez, et rebelote !!! Informations Il y a plusieurs raisons possibles à ce genre de déconnexions intempestives, et fortement désagréables, et aucunes de particulières.\nConfiguration De fait, il existe trois options SSH à configurer qui permettent d\u0026rsquo;améliorer sensiblement la tenue de la connexion, dont une TCPKeepAlive yes qui peut être paramétrée côté serveur et côté client !\nCôté serveur Ouvrez votre fichier /etc/ssh/sshd_config, et rajoutez ces deux options :\nClientAliveInterval : est le nombre de secondes pendant lequel le serveur va attendre avant d\u0026rsquo;envoyer un paquet null au client - le but étant de garder la connexion vivante. ClientAliveCountMax : est la limite donnée à un client pendant lequel il est autorisé à ne pas donner de réponse, sans se faire déconnecter - sa valeur par défaut est : 3 Côté client Ouvrez votre fichier ~/.ssh/config, et ajoutez ces deux options correspondantes :\nServerAliveInterval : est le nombre de secondes pendant lequel le client va attendre avant d\u0026rsquo;envoyer un paquet null au serveur - le but étant toujours de garder vivante la connexion. ServerAliveCountMax : valeur par défaut est de : 3 Explications Ces options ont pour propos de maintenir la connexion en vie ; le processus est le suivant :\nQuand le timing relatif aux options ClientAliveInterval et ServerAliveInterval est arrivé à son terme, un signal \u0026ldquo;\u0026lt;span lang=\u0026quot;en\u0026quot;\u0026gt;hello-are-you-there\u0026lt;/span\u0026gt;\u0026rdquo; est envoyé… le paramétrage des options ClientAliveCountMax et ServerAliveCountMax est le nombre de fois où ce signal \u0026ldquo;hello\u0026rdquo; va être envoyé. S\u0026rsquo;il n\u0026rsquo;y a pas de réponse de l\u0026rsquo;un ou de l\u0026rsquo;autre au final, la connexion se fermera. Le calcul est très simple : ClientAliveInterval x ClientAliveCountMax secondes, côté serveur, et réciproquement pour les options \u0026ldquo;Server\u0026rdquo;, côté client.\nAttentionATTENTION** : Mettre à 0 ses options les désactivent ! Cela devrait améliorer la situation, mais ne la résout pas forcément !\nTrès utile avec l\u0026rsquo;usage du fameux projet SSLH - le multiplexeur de connexion HTTPS/SS(H|L)/VPN, etc…\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eAhhh, les joies de SSH, n\u0026rsquo;est-ce pas ?!\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCe matin, vous vous levez, vous cherchez à vous connecter à votre serveur… \u003cbr\u003e\net très rapidement, vous vous faites déconnecter avec ce, \u003cem\u003epas joli du tout\u003c/em\u003e,\nmessage : \u003ccode\u003eWrite Failed: broken pipe\u003c/code\u003e. \u003cbr\u003e\nVous vous reconnectez, et rebelote !!!\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"informations\"\u003eInformations\u003c/h2\u003e\n\u003cp\u003eIl y a plusieurs raisons possibles à ce genre de déconnexions\nintempestives, et fortement désagréables, et aucunes de particulières.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eDe fait, il existe trois options SSH à configurer qui permettent\nd\u0026rsquo;améliorer sensiblement la tenue de la connexion, dont une\n\u003ccode\u003eTCPKeepAlive yes\u003c/code\u003e qui peut être paramétrée côté serveur et\ncôté client !\u003c/p\u003e\n\u003ch3 id=\"côté-serveur\"\u003eCôté serveur\u003c/h3\u003e\n\u003cp\u003eOuvrez votre fichier \u003ccode\u003e/etc/ssh/sshd_config\u003c/code\u003e, et rajoutez ces deux options :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eClientAliveInterval\u003c/code\u003e : est le nombre de secondes pendant lequel le serveur\nva attendre avant d\u0026rsquo;envoyer un paquet null au client - le but étant de\ngarder la connexion vivante.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eClientAliveCountMax\u003c/code\u003e : est la limite donnée à un client pendant lequel il\nest autorisé à ne pas donner de réponse, sans se faire déconnecter - sa\nvaleur par défaut est : \u003ccode\u003e3\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"côté-client\"\u003eCôté client\u003c/h3\u003e\n\u003cp\u003eOuvrez votre fichier \u003ccode\u003e~/.ssh/config\u003c/code\u003e, et ajoutez ces deux options\ncorrespondantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eServerAliveInterval\u003c/code\u003e : est le nombre de secondes pendant lequel le client va\nattendre avant d\u0026rsquo;envoyer un paquet null au serveur - le but étant toujours\nde garder vivante la connexion.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eServerAliveCountMax\u003c/code\u003e : valeur par défaut est de : \u003ccode\u003e3\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"explications\"\u003eExplications\u003c/h3\u003e\n\u003cp\u003eCes options ont pour propos de \u003cstrong\u003emaintenir la connexion en vie\u003c/strong\u003e ;\nle processus est le suivant :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eQuand le timing relatif aux options \u003ccode\u003eClientAliveInterval\u003c/code\u003e et \u003ccode\u003eServerAliveInterval\u003c/code\u003e\nest arrivé à son terme, un signal \u0026ldquo;\u003ccode\u003e\u0026lt;span lang=\u0026quot;en\u0026quot;\u0026gt;\u003c/code\u003ehello-are-you-there\u003ccode\u003e\u0026lt;/span\u0026gt;\u003c/code\u003e\u0026rdquo;\nest envoyé…\u003c/li\u003e\n\u003cli\u003ele paramétrage des options \u003ccode\u003eClientAliveCountMax\u003c/code\u003e et \u003ccode\u003eServerAliveCountMax\u003c/code\u003e est\nle nombre de fois où ce signal \u0026ldquo;hello\u0026rdquo; va être envoyé.\u003c/li\u003e\n\u003cli\u003eS\u0026rsquo;il n\u0026rsquo;y a pas de réponse de l\u0026rsquo;un ou de l\u0026rsquo;autre au final, la connexion se\nfermera.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLe calcul est très simple : \u003ccode\u003eClientAliveInterval\u003c/code\u003e x \u003ccode\u003eClientAliveCountMax\u003c/code\u003e secondes,\ncôté serveur, et réciproquement pour les options \u0026ldquo;Server\u0026rdquo;, côté client.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eATTENTION** : Mettre à \u003ccode\u003e0\u003c/code\u003e ses options les désactivent !\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003eCela devrait améliorer la situation, mais ne la résout pas forcément !\u003c/p\u003e\n\u003cp\u003eTrès utile avec l\u0026rsquo;usage du fameux projet \u003ca href=\"http:*www.rutschle.net/tech/sslh.shtml\" rel=\"external\"\u003eSSLH\u003c/a\u003e -\nle multiplexeur de connexion HTTPS/SS(H|L)/VPN, etc…\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment remédier à l'erreur SSH nommée 'Write Failed: broken pipe' !","tags":["SSH","erreur"],"date_published":"2017-07-23T22:30:06+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/sec/ssh/chroot-directory-fatal#898ca8c4946ab9c3ab7fb85e240bf6b182437be356b1f9c9ccba350d2c545de8","url":"https://it-log.fr.eu.org/fr/sec/ssh/chroot-directory-fatal/","title":"SSH : ChrootDirectory fatal: bad ownership or modes for chroot directory","author":{"name":"Stéphane HUC"},"content_text":"Description S\u0026rsquo;il y a bien un mode qui en fait baver, c\u0026rsquo;est l\u0026rsquo;option ChrootDirectory pour le serveur SSH !\nEn effet, vous avez défini des utilisateurs qui ont le droit d\u0026rsquo;utiliser\ncàd de se connecter - à votre serveur SSH, et mieux, vous gérez cela finement par des accès de groupe, mais vous tenez absolument à emprisonner les utilisateurs dans leur répertoire privé, et c\u0026rsquo;est très bien ! Une règle, telle que la suivante devrait permettre d\u0026rsquo;agir ainsi, dans le fichier de config /etc/ssh/sshd_config :\nMatch group sshusers ForceCommand internal-sftp ChrootDirectory /chroot/%u AstuceBien-sûr, votre prison peut-être définie ailleurs, tel que dans le répertoire $HOME, par exemple ; dans ces cas, adaptez, adaptez, adaptez… et vérifiez que votre utilisateur fasse bien partie du groupe ssh dédié, que vous aurez précédemment créé - il se nommera certainement autrement que celui nommé dans cet exemple sshusers :) Mais, voilà, à chaque tentative de connexions, le serveur SSH vous jette et vous avertit de l\u0026rsquo;erreur suivante :\nCitation :\nFeb 12 19:56:30 server sshd[64689]: Accepted password for user from 192.168.xxx.yyy port 40829 ssh2 Feb 12 19:56:30 server sshd[64691]: fatal: bad ownership or modes for chroot directory \u0026ldquo;/chroot/user\u0026rdquo; Ce qui bloque, ce sont les droits d\u0026rsquo;accès, vers le répertoire prison !\nIl faut impérativement que les droits soient attribués à `root`, et en accès `0755` …\nPuis ensuite créer le répertoire utilisateur, et attribuer les droits à l\u0026rsquo;utilisateur en question\n# avec les droits administrateurs: chmod 0755 /chroot chown root:root /chroot mkdir /chroot/user_id chmod 0705 /chroot/user_id chown user_id:user_id /chroot/user_id Si vous aviez déjà créé les répertoires en question, vérifiez les droits d\u0026rsquo;accès et d\u0026rsquo;appartenances utilisateurs !\nVoilà, à partir de ce moment-là, vous devriez pouvoir réussir enfin la connexion ssh.\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eS\u0026rsquo;il y a bien un mode qui en fait baver, c\u0026rsquo;est l\u0026rsquo;option\n\u003cstrong\u003eChrootDirectory\u003c/strong\u003e pour le serveur SSH !\u003c/p\u003e\n\u003cp\u003eEn effet, vous avez défini des utilisateurs qui ont le droit d\u0026rsquo;utiliser\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003e\u003cabbr title=\"c'est-à-dire\"\u003ecàd\u003c/abbr\u003e\n de se connecter\u003c/em\u003e - à votre serveur SSH, et\nmieux, vous gérez cela finement par des accès de groupe, mais vous tenez\nabsolument à emprisonner les utilisateurs dans leur répertoire privé, et c\u0026rsquo;est\ntrès bien !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne règle, telle que la suivante devrait permettre d\u0026rsquo;agir ainsi, dans\nle fichier de config \u003ccode\u003e/etc/ssh/sshd_config\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ssh\" data-lang=\"ssh\"\u003eMatch group sshusers\n    ForceCommand internal-sftp\n    ChrootDirectory /chroot/%u\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\"\u003eBien-sûr, votre prison peut-être définie ailleurs, tel que dans le répertoire\n\u003ccode\u003e$HOME\u003c/code\u003e, par exemple ; dans ces cas, adaptez, adaptez, adaptez… \u003cbr\u003e\net vérifiez que votre utilisateur fasse bien partie du groupe ssh dédié, que\nvous aurez précédemment créé - \u003cem\u003eil se nommera certainement autrement que celui\nnommé dans cet exemple \u003ccode\u003esshusers\u003c/code\u003e\u003c/em\u003e :)\u003c/div\u003e\n\n\u003cp\u003eMais, voilà, à chaque tentative de connexions, le serveur SSH vous jette\net vous avertit de l\u0026rsquo;erreur suivante :\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            Feb 12 19:56:30 server sshd[64689]: Accepted password for user from 192.168.xxx.yyy port 40829 ssh2\nFeb 12 19:56:30 server sshd[64691]: fatal: bad ownership or modes for chroot directory \u0026ldquo;/chroot/user\u0026rdquo;\n        \u003c/blockquote\u003e\n    \u003c/figure\u003e\n\u003c/div\u003e\n\n\u003cp\u003eCe qui bloque, ce sont les droits d\u0026rsquo;accès, vers le répertoire prison !\u003c/p\u003e\n\u003cp\u003eIl faut \u003cspan class=\"red\"\u003eimpérativement que les droits soient attribués à `root`,\net en accès `0755`\u003c/span\u003e\n…\u003c/p\u003e\n\u003cp\u003ePuis ensuite créer le répertoire utilisateur, et attribuer les droits à l\u0026rsquo;utilisateur en question\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ssh\" data-lang=\"ssh\"\u003e# avec les droits administrateurs:\nchmod 0755 /chroot\nchown root:root /chroot\nmkdir /chroot/user_id\nchmod 0705 /chroot/user_id\nchown user_id:user_id /chroot/user_id\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eSi vous aviez déjà créé les répertoires en question, \u003cspan em\u003evérifiez les\ndroits d\u0026rsquo;accès et d\u0026rsquo;appartenances utilisateurs\u003c/span\u003e !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eVoilà, à partir de ce moment-là, vous devriez pouvoir réussir enfin la\nconnexion ssh.\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment emprisonner correctement les utilisateurs SSH !","tags":["SSH","ChrootDirectory","Erreur"],"date_published":"2017-07-23T22:17:44+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/web/nginx/nginx-error-502-gateway#93009093c61aa7cd0f06ad395b3f3576f3bcb195c95d2fefd8a49774a41bc29d","url":"https://it-log.fr.eu.org/fr/web/nginx/nginx-error-502-gateway/","title":"Nginx : Erreur 502 (Bad Gateway)","author":{"name":"Stéphane HUC"},"content_text":"Description Le serveur web nginx affiche une \u0026ldquo;belle page blanche\u0026rdquo; avec la mention Error 502: Bad Gateway !\nVérifiez :\nque le service php-fpm soit démarré !\nC\u0026rsquo;est idiot, en soit, mais si le service n\u0026rsquo;est pas démarré, la connexion avec le serveur ne se fera pas, et provoquera l\u0026rsquo;erreur 502. vos écritures dans vos fichiers de configuration nginx, celles liées à php, voire php-fpm… qu\u0026rsquo;elles soient exactement pareilles ! Configuration nginx Les fichiers de configuration sont :\n/etc/nginx/nginx.conf\nou /etc/nginx/sites-available/*votre_domaine*.conf\nvérifiez votre déclaration liée à la configuration des fichiers PHP :\nlocation ~ \\.php$ { (…) fastcgi_pass unix:/var/run/votre_domaine.sock; (…) } vérifier aussi votre déclaration liée à la configuration status, si nécessaire… location /status { (…) fastcgi_pass unix:/var/run/votre_domaine.sock; (…) } PHP(-FPM) /etc/php5/fpm/pool.d/*www*.conf,\nou /etc/php5/fpm/pool.d/*votre_domaine*.conf\nvérifier la correspondance avec votre socket PHP :\nlisten = /var/run/votre_domaine.sock Il peut être utile de vérifier les déclarations suivantes, aussi : listen.owner = www-data listen.group = www-data listen.mode = 0660 Les déclarations listen.owner et listen.group sont impérativement liées à l\u0026rsquo;utilisateur et au groupe du service nginx, généralement www-data.\nÀ changer, selon votre configuration…\nPuis, redémarrez vos serveurs nginx, et php(x?)-fpm… les deux !\n","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 502: Bad Gateway\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003eVérifiez :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eque le service php-fpm soit démarré !\u003cbr\u003e\n\u003cem\u003eC\u0026rsquo;est idiot, en soit, mais si le service n\u0026rsquo;est pas démarré, la connexion\navec le serveur ne se fera pas, et provoquera l\u0026rsquo;erreur 502\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003evos écritures dans vos fichiers de configuration nginx, celles liées à php,\nvoire php-fpm… qu\u0026rsquo;elles soient exactement pareilles !\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"nginx\"\u003enginx\u003c/h3\u003e\n\u003cp\u003eLes fichiers de configuration sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e/etc/nginx/nginx.conf\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eou \u003ccode\u003e/etc/nginx/sites-available/*votre_domaine*.conf\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003evérifiez votre déclaration liée à la configuration des fichiers PHP :\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-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\\.php$\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        \u003cspan style=\"color:#48b685\"\u003efastcgi_pass\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eunix:/var/run/votre_domaine.sock\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\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003evérifier aussi votre déclaration liée à la configuration \u003ccode\u003estatus\u003c/code\u003e, si nécessaire…\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-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/status\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        \u003cspan style=\"color:#48b685\"\u003efastcgi_pass\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eunix:/var/run/votre_domaine.sock\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\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=\"php-fpm\"\u003ePHP(-FPM)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e/etc/php5/fpm/pool.d/*www*.conf\u003c/code\u003e,\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eou \u003ccode\u003e/etc/php5/fpm/pool.d/*votre_domaine*.conf\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003evérifier la correspondance avec votre socket PHP :\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:#06b6ef\"\u003elisten\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/var/run/votre_domaine.sock\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eIl peut être utile de vérifier les déclarations suivantes, aussi :\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\"\u003elisten.owner\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ewww-data\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elisten.group\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ewww-data\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elisten.mode\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e0660\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes déclarations \u003ccode\u003elisten.owner\u003c/code\u003e et \u003ccode\u003elisten.group\u003c/code\u003e sont impérativement liées\nà l\u0026rsquo;utilisateur et au groupe du service nginx, généralement \u003ccode\u003ewww-data\u003c/code\u003e.\u003cbr\u003e\nÀ changer, selon votre configuration…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePuis, redémarrez vos serveurs nginx, et php(x?)-fpm… les deux !\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment résoudre cette erreur - Error 502: Bad Gateway - de passerelle sous nginx","tags":["nginx","Erreur","502","astuce"],"date_published":"2017-07-23T22:39:58+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/sec/gpg/gpg-guide-bonnes-pratiques#a78ab1ec7c053083a43b803320058b3b5137d2907b213213fa6c54bdcfb0160e","url":"https://it-log.fr.eu.org/fr/sec/gpg/gpg-guide-bonnes-pratiques/","title":"GPG : Guide bonnes pratiques (RSA)","author":{"name":"Stéphane HUC"},"content_text":"Description Suite à mes précédentes réflexions à-propos du Bon usage sécurisé de GPG , finalement je me décide pour un article de ce genre : Guide des bonnes pratiques pour la création de clés GPG.\nDe fait, il ne suffit pas de se dire, \u0026ldquo;je vais créer ma clé à coup de --gen-key, et puis zou…\u0026rdquo;, ou d\u0026rsquo;utiliser une interface graphique pour le faire, telle qu\u0026rsquo;Enigmail ou GPA, c\u0026rsquo;est un processus un peu plus long, d\u0026rsquo;autant si l\u0026rsquo;on veut le faire correctement !\nCe guide s\u0026rsquo;inspire très fortement de celui d\u0026rsquo;Alex Cabal…\nCréation parfaite de clés GPG Informations importantes Ne pas utiliser le paramétrage par défaut de GPG, à savoir : 2048 - et, encore moins, inférieur ! La seule taille forte de clé, valide, à ce jour est : 4096 ! Le seul chiffrement à utiliser est : RSA ! Création Création : Clients Graphiques ⇒ Pour Enigmail, il faut ouvrir la fenêtre de gestion de clés, puis cliquer sur le menu \u0026lsquo;Générer \u0026gt; Nouvelle clé\u0026rsquo;…\nIl ne reste plus qu\u0026rsquo;à choisir le courriel concerné, de créer une passphrase, et de la répéter ; dans l\u0026rsquo;onglet \u0026lsquo;Expiration\u0026rsquo;, veillez à la durée : pas plus de 2 ans !\nPuis dans l\u0026rsquo;onglet \u0026lsquo;Avancé\u0026rsquo;, vérifier la taille de la clé : 4096, le type de la clé \u0026lsquo;RSA\u0026rsquo;… vous n\u0026rsquo;avez plus qu\u0026rsquo;à cliquer sur le bouton [ Générer la clef ], et à laisser faire le temps de la génération…\n⇒ Avec GPA, c\u0026rsquo;est sensiblement pareil, à la différence que c\u0026rsquo;est le menu \u0026lsquo;Clefs\u0026rsquo; \u0026gt; \u0026lsquo;Nouvelle clef\u0026rsquo; qui permet de le faire…\nChoisissez l\u0026rsquo;algorithme de chiffrement : RSA - (RSA (sign only) nous servira plus tard…) -, la taille de clé - il est très probable qu\u0026rsquo;il ne soit pas possible de chiffrer avec une clé plus forte que 3072 - puis remplissez les champs \u0026lsquo;Nom\u0026rsquo;, et \u0026lsquo;Courriel\u0026rsquo; seulement, et finissez par cliquez dans la case à cocher \u0026lsquo;Expires\u0026rsquo;, pour choisir une date de 2 ans, maximum.\nCréation : Mode Console Il y a deux options pour créer une clé, l\u0026rsquo;une permettant de faire plus finement en demandant plus de choses que l\u0026rsquo;autre, à savoir :\nl\u0026rsquo;option --gen-key, version abrégée de l\u0026rsquo;option --generate-key, l\u0026rsquo;option --full-gen-key, version abrégée de l\u0026rsquo;option --full-generate-key. Utilisons l\u0026rsquo;option --gen-key :\n:$ gpg --gen-key gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? **1** RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) **4096** Requested keysize is 4096 bits Please specify how long the key should be valid. 0 = key does not expire \u0026lt;n\u0026gt; = key expires in n days \u0026lt;n\u0026gt;w = key expires in n weeks \u0026lt;n\u0026gt;m = key expires in n months \u0026lt;n\u0026gt;y = key expires in n years Key is valid for? (0) **2y** Is this correct? (y/N) **y** You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and E-mail Address in this form: \u0026#34;Heinrich Heine (Der Dichter) \u0026lt;heinrichh@duesseldorf.de\u0026gt;\u0026#34; Real name: **Nom Prenom** E-mail address: **email@domain.tld** Comment: You selected this USER-ID: \u0026#34;Nom Prenom \u0026lt;email@domain.tld\u0026gt;\u0026#34; Change (N)ame, (C)omment, (E)-mail or (O)kay/(Q)uit? **O** You need a Passphrase to protect your secret key. **demande votre passphrase** gpg: key ******** marked as ultimately trusted public and secret key created and signed. gpg: checking the trustdb gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u pub 4096R/******* 2013-03-13 Key fingerprint = **** **** **** **** **** **** **** **** **** **** uid Nom Prenom \u0026lt;email@domain.tld\u0026gt; sub 4096R/******** 2013-03-13 Ajout d\u0026rsquo;une photo Veillez à utiliser une photo qui soit de taille légère !\naddphoto : Clients Graphiques ⇒ Enigmail : il faut ouvrir la fenêtre de gestion de clés, menu \u0026ldquo;Édition\u0026rdquo; \u0026gt; \u0026ldquo;Ajouter une photo\u0026rdquo; après avoir sélectionné la clé.\n2ème possibilité : clic droit sur la clé, menu contextuel \u0026lsquo;Ajouter une photo\u0026quot;… et choisissez le fichier en question. 3ème possibilité : clic droit sur la clé, menu contextuel \u0026ldquo;Propriété de la clé\u0026rdquo;, puis dans la fenêtre de propriété, cliquez sur le bouton [ Sélectionnez une action … ] et choisissez \u0026lsquo;Ajouter une photo\u0026rsquo;. ⇒ GPA semble ne pas en être capable !\naddphoto : Mode Console C\u0026rsquo;est l\u0026rsquo;option --edit-key qui sera utilisée puis l\u0026rsquo;option addphoto, telles que :\n:$ gpg --edit-key email@domain.tld gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Secret key is available. pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate sub 4096R/******** created: 2013-03-13 expires: never usage: E [ultimate] (1). Nom Prenom \u0026lt;email@domain.tld\u0026gt; gpg\u0026gt; addphoto Pick an image to use for your photo ID. The image must be a JPEG file. Remember that the image is stored within your public key. If you use a very large picture, your key will become very large as well! Keeping the image close to 240x288 is a good size to use. Enter JPEG filename for photo ID: /repertoire_vers_photo/photo.jpg Is this photo correct (y/N/q)? y You need a passphrase to unlock the secret key for user: \u0026#34;Nom Prenom \u0026lt;email@domain.tld\u0026gt;\u0026#34; 4096-bit RSA key, ID ********, created 2013-03-13 **demande votre passphrase** pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate sub 4096R/******** created: 2013-03-13 expires: never usage: E [ultimate] (1). Nom Prenom \u0026lt;email@domain.tld\u0026gt; [ unknown] (2) [jpeg image of size 5324] gpg\u0026gt; save Préférences Hash Paramétrer les hash préférés sont de bon aloi !\nsetpref : Clients Graphiques ⇒ Enigmail semble ne pas en être capable !\n⇒ GPA semble ne pas en être capable !\nsetpref : Mode Console C\u0026rsquo;est encore l\u0026rsquo;option --edit-key qui sera utilisée mais avec l\u0026rsquo;option setpref, telles que :\n:$ gpg --edit-key email@domain.tld gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Secret key is available. pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate sub 4096R/******** created: 2013-03-13 expires: never usage: E [ultimate] (1). Nom Prenom \u0026lt;email@domain.tld\u0026gt; [ultimate] (2) [jpeg image of size 5324] gpg\u0026gt; setpref SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed Set preference list to: Cypher: AES256, AES192, AES, CAST5, 3DES Digest: SHA512, SHA384, SHA256, SHA224, SHA1 Compression: ZLIB, BZIP2, ZIP, Uncompressed Features: MDC, Keyserver no-modify Really update the preferences? (y/N) y You need a passphrase to unlock the secret key for user: \u0026#34;Nom Prenom \u0026lt;email@domain.tld\u0026gt;\u0026#34; 4096-bit RSA key, ID ********, created 2013-03-13 **demande votre passphrase** pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate sub 4096R/******** created: 2013-03-13 expires: never usage: E [ultimate] (1). Nom Prenom \u0026lt;email@domain.tld\u0026gt; [ unknown] (2) [jpeg image of size 5324] gpg\u0026gt; save Une nouvelle sous-clé de signature Cette étape est vraiment importante ; elle sert à créer une sous-clé qui ne servira qu\u0026rsquo;à signer de nouveaux messages et autres documents…\nSi vous vous passez des deux étapes précédentes, ne vous passez pas de celle-ci ; vous comprendrez plus bas le pourquoi !\nLes recommandations de création de cette sous-clé sont ABSOLUMENT les mêmes que pour la création de la clé principale !\nQuoi ? vous avez déjà oublié : RSA + 4096 bits - avec la différence qu\u0026rsquo;on utilisera le choix \u0026lsquo;RSA (sign only)\u0026rsquo;, et pas besoin de paramétrer une période de validité…\naddkey : Clients Graphiques ⇒ Enigmail semble ne pas en être capable !\n⇒ GPA semble ne pas être capable de générer de clés dont la taille soit de 4096 bits, sinon, c\u0026rsquo;est menu \u0026ldquo;Clefs\u0026rdquo; \u0026gt; \u0026ldquo;Nouvelle clé\u0026rdquo; ; choisir l\u0026rsquo;algorithme \u0026lsquo;RSA (sign only)\u0026rsquo;, remplir les champs \u0026lsquo;Nom\u0026rsquo;, \u0026lsquo;Courriel\u0026rsquo; - sur ce dernier, remplir l\u0026rsquo;adresse mail correspondante, et ne pas cochez la case \u0026lsquo;Expirer\u0026rsquo; puis validez !\naddkey: Mode Console C\u0026rsquo;est toujours l\u0026rsquo;option --edit-key qui sera utilisée mais cette fois-ci avec l\u0026rsquo;option addkey, telles que :\n:$ gpg --edit-key email@domain.tld gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Secret key is available. pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate sub 4096R/******** created: 2013-03-13 expires: never usage: E [ultimate] (1). Nom Prenom \u0026lt;email@domain.tld\u0026gt; [ultimate] (2) [jpeg image of size 5324] gpg\u0026gt; addkey Key is protected. You need a passphrase to unlock the secret key for user: \u0026#34;Nom Prenom \u0026lt;email@domain.tld\u0026gt;\u0026#34; 4096-bit RSA key, ID ********, created 2013-03-13 **demande votre passphrase** Please select what kind of key you want: (3) DSA (sign only) (4) RSA (sign only) (5) Elgamal (encrypt only) (6) RSA (encrypt only) Your selection? 4 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096 Requested keysize is 4096 bits Please specify how long the key should be valid. 0 = key does not expire \u0026lt;n\u0026gt; = key expires in n days \u0026lt;n\u0026gt;w = key expires in n weeks \u0026lt;n\u0026gt;m = key expires in n months \u0026lt;n\u0026gt;y = key expires in n years Key is valid for? (0) 0 Key does not expire at all Is this correct? (y/N) y Really create? (y/N) y pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate sub 4096R/******** created: 2013-03-13 expires: never usage: E sub 4096R/******** created: 2013-03-13 expires: never [ultimate] (1). Nom Prenom \u0026lt;email@domain.tld\u0026gt; [ unknown] (2) [jpeg image of size 5324] gpg\u0026gt; save Création du certificat de révocation La création du certificat de révocation est une étape à faire ABSOLUMENT !\nEn effet, celui-ci vous sera nécessaire pour révoquer votre clé GPG, ou la sous-clé de signature, si jamais vous avez perdu celle-ci, et/ou qu\u0026rsquo;elle soit volée, et/ou qu\u0026rsquo;elle soit compromise !\nIl vous importe de placer ce certificat de révocation dans un endroit sûr !\nrevoke : Clients graphiques ⇒ Enigmail : Clic droit sur la clé, menu contextuel \u0026ldquo;Créer et enregistrer un certificat de révocation\u0026rdquo;.\n2ème possibilité : clic droit sur la clé, menu contextuel \u0026ldquo;Propriétés de la clé\u0026rdquo;, puis dans la fenêtre \u0026ldquo;Propriété\u0026rdquo;, cliquez sur le bouton [ Sélectionnez l\u0026rsquo;action …], puis \u0026ldquo;Créer et enregistrer un certificat de révocation\u0026rdquo;. ⇒ GPA semble ne pas en être capable !\nrevoke : mode console C\u0026rsquo;est assez simple, pour une fois :\n$ gpg --output email@domain.tld.rev.asc --gen-revoke email@domain.tld\nExportez vos clés L\u0026rsquo;export de vos clés fait partie du processus nécessaire. Bien entendu, il vous incombe de mettre en lieu sûr ces fichiers, IMPÉRATIVEMENT la clé privée qui en résulte !\nexport : Clients graphiques ⇒ Enigmail : clic droit sur la clé, menu contextuel \u0026ldquo;Exporter les clés vers un fichier\u0026rdquo;\n⇒ GPA : Menu \u0026lsquo;Clefs\u0026rsquo; \u0026gt; \u0026lsquo;Exporter des clefs\u0026rsquo;\n2ème possibilité : clic droit sur la clé en question, puis dans le menu contextuel, choisir \u0026lsquo;Exporter des clefs\u0026rsquo;…\nexport : mode console : $ gpg --export-secret-keys --armor email@domain.tld \u0026gt; email@domain.tld.private_key.asc $ gpg --export --armor email@domain.tld \u0026gt; email@domain.tld.public_key.asc Transformons les clés Transformez les clés que nous avons créées, dites clés primaires en clés portables ou mode \u0026ldquo;protégé\u0026rdquo;, est un autre processus IMPORTANT !\nCe processus est un peu long, non-prévu dans le fonctionnement interne de GPG, peut faire peur - et donner des suées,…\nIl a pour propos d\u0026rsquo;extraire les sous-clés, de les détruire du porte-clé, de les importer correctement !\nAttentionATTENTION : Une fois, en mode \u0026ldquo;protégé\u0026rdquo;, les clés ne sont plus éditables, ni modifiables… vous aurez le droit au final à l\u0026rsquo;erreur \u0026ldquo;gpg: des parties de la clef secrète ne sont pas disponibles \u0026ldquo;, et rien de ce que vous aurez pu faire, demandé, exécuté dans la modification de la clé ne sera acté, validé !\nDe même, vous ne pourrez pas signer une autre clé avec !\ntransformation : Clients Graphiques Ne cherchez pas ; ce processus n\u0026rsquo;est pas du tout géré !\ntransformation : Mode Console Tout d\u0026rsquo;abord un aperçu de la clé, pour comparaison :\ncelui-ci n\u0026rsquo;est absolument pas nécessaire - juste pour aider à remarquer la légère différence, avant ce processus et après !\n:$ gpg --list-secret-keys /home/$USER/.gnupg/secring.gpg ----------------------------- sec 4096R/******** 2013-03-13 uid Nom Prenom \u0026lt;email@domain.tld\u0026gt; ssb 4096R/******** 2013-03-13 ssb 4096R/******** 2013-03-13 Maintenant, le processus de transformation - que vous devez exécutez :\n:$ gpg --export-secret-subkeys email@domain.tld \u0026gt; ~/.gnupg/email@domain.tld.subkeys :$ gpg --delete-secret-keys email@domain.tld :$ gpg --import ~/.gnupg/email@domain.tld.subkeys :$ shred --remove ~/.gnupg/email@domain.tld.subkeys Comparons :\n:$ gpg --list-secret-keys /home/$USER/.gnupg/secring.gpg ----------------------------- sec# 4096R/******** 2013-03-13 uid Nom Prenom \u0026lt;email@domain.tld\u0026gt; ssb 4096R/******** 2013-03-13 ssb 4096R/******** 2013-03-13 En fait la différence visible/visuelle est très légère : sur la ligne commençant par le mot sec, celui-ci est suivi du symbole #…\nLa présence du symbole dièze signifie que la sous-clé de signature ne fait pas partie du trousseau de clé !\nSi le symbole dièze n'est pas présent, c'est qu'il y a eu un problème dans la phase de ce processus… refaites-le ! Voilà, vous avez suivi toutes ces étapes - c\u0026rsquo;est très bien. Elles vous garantissent d\u0026rsquo;avoir fait correctement les choses ;-)\nPartagez votre clé publique ! Allez n\u0026rsquo;hésitez pas à partagez, publiez votre clé publique - informez de l\u0026rsquo;empreinte relative à votre clé publique - privilégiez le contact réel, physique lors de cet échange…\nEn mode graphique : ⇒ Enigmail : Menu \u0026ldquo;Serveur de clefs\u0026rdquo; \u0026gt; \u0026ldquo;Envoyer les clés publiques\u0026rdquo;.\n2ème possibilité : clic droit sur la clé, menu contextuel \u0026ldquo;Envoyer les clés publiques vers un serveur de clefs\u0026rdquo;\n⇒ GPA : Menu \u0026lsquo;Serveur\u0026rsquo; \u0026gt; \u0026lsquo;Envoyer des clefs\u0026rsquo;.\n2ème possibilité : clic droit sur la clé, puis dans le menu contextuel, choisissez \u0026lsquo;Envoyer des clefs\u0026rsquo; ; confirmez votre choix, si cela vous est demandé en cliquant sur le bouton [Oui].\nEn mode console : Utilisez donc l\u0026rsquo;option --send-keys \u0026quot;fingerprint, tel que : $ gpg --send-keys \u0026quot;fingerprint\u0026quot;\nAstuceSi vous avez paramétré correctement votre fichier personnel ~/.gnupg/gpg.conf comme je vous l\u0026rsquo;ai démontré dans mon\nGPG : Du bon usage sécurisé\n, alors vous n\u0026rsquo;aurez même pas besoin de spécifier le serveur, et en plus, cela se fera de manière sécurisée !\nDe bonnes lectures Je renvoie très fortement vers les bonnes lectures en question :\nle Mini-Guide Howto- par GnuPG… le Guide Autodéfense Courriel- par la FSF… le guide autodéfense numérique - tome 2 : Comment créer et maintenir une clé GPG- ou, les bonnes pratiques pour l\u0026rsquo;utilisation d\u0026rsquo;OpenPGP… Du bon outil GPG Mon script shell POSIX Vous retrouverez mon script de gestion de clé GPG sur mon espace git Du moins, j\u0026rsquo;espère bien qu\u0026rsquo;il soit POSIX\nPour afficher l\u0026rsquo;aide : ./mng_gpg help Pour génèrer une clé : ./mng_gpg create Pour information, cet outil a aussi besoin de l\u0026rsquo;outil shred…\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eSuite à mes précédentes réflexions à-propos du\n\n\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-usage-securise/\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Du bon usage sécurisé'\"\u003eBon usage sécurisé de GPG\u003c/a\u003e\n,\nfinalement je me décide pour un article de ce genre : \u003cstrong\u003eGuide des bonnes pratiques\npour la création de clés GPG\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eDe fait, il ne suffit pas de se dire, \u0026ldquo;je vais créer ma clé à coup de\n\u003ccode\u003e--gen-key\u003c/code\u003e, et puis zou…\u0026rdquo;, ou d\u0026rsquo;utiliser une interface graphique\npour le faire, telle qu\u0026rsquo;Enigmail ou GPA, c\u0026rsquo;est un processus un peu\nplus long, d\u0026rsquo;autant si l\u0026rsquo;on veut le faire correctement !\u003c/p\u003e\n\u003cp\u003eCe guide s\u0026rsquo;inspire très fortement de celui d\u0026rsquo;\u003ca href=\"https://alexcabal.com/creating-the-perfect-gpg-keypair/\" rel=\"external\"\u003eAlex Cabal\u003c/a\u003e…\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"création-parfaite-de-clés-gpg\"\u003eCréation parfaite de clés GPG\u003c/h2\u003e\n\u003ch3 id=\"informations-importantes\"\u003eInformations importantes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNe pas utiliser le paramétrage par défaut de GPG, à savoir : 2048 - et,\nencore moins, inférieur !\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLa seule taille forte de clé, valide, à ce jour est : 4096 !\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLe seul chiffrement à utiliser est : RSA !\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"création\"\u003eCréation\u003c/h3\u003e\n\u003ch4 id=\"création--clients-graphiques\"\u003eCréation : Clients Graphiques\u003c/h4\u003e\n\u003cp\u003e⇒ Pour \u003cstrong\u003eEnigmail\u003c/strong\u003e, il faut ouvrir la fenêtre de gestion de clés,\npuis cliquer sur le menu \u0026lsquo;\u003cstrong\u003eGénérer \u0026gt; Nouvelle clé\u003c/strong\u003e\u0026rsquo;…\u003c/p\u003e\n\u003cp\u003eIl ne reste plus qu\u0026rsquo;à choisir le courriel concerné, de créer une\npassphrase, et de la répéter ; dans l\u0026rsquo;onglet \u0026lsquo;Expiration\u0026rsquo;, veillez à\nla durée : \u003cspan class=\"red\"\u003epas plus de 2 ans\u003c/span\u003e\n !\u003c/p\u003e\n\u003cp\u003ePuis dans l\u0026rsquo;onglet \u0026lsquo;Avancé\u0026rsquo;, vérifier la taille de la clé : 4096, le type de la\nclé \u0026lsquo;RSA\u0026rsquo;…\nvous n\u0026rsquo;avez plus qu\u0026rsquo;à cliquer sur le bouton [ Générer la clef ], et à\nlaisser faire le temps de la génération…\u003c/p\u003e\n\u003cp\u003e⇒ Avec \u003cstrong\u003eGPA\u003c/strong\u003e, c\u0026rsquo;est sensiblement pareil, à la différence que c\u0026rsquo;est\nle menu \u003cstrong\u003e\u0026lsquo;Clefs\u0026rsquo; \u0026gt; \u0026lsquo;Nouvelle clef\u0026rsquo;\u003c/strong\u003e qui permet de le\nfaire…\u003c/p\u003e\n\u003cp\u003eChoisissez l\u0026rsquo;algorithme de chiffrement : RSA - \u003cem\u003e(RSA\n(sign only) nous servira plus tard…)\u003c/em\u003e -, la taille de clé - \u003cem\u003eil\nest très probable qu\u0026rsquo;il ne soit pas possible de chiffrer avec une clé\nplus forte que 3072\u003c/em\u003e - puis remplissez les champs \u0026lsquo;Nom\u0026rsquo;, et\n\u0026lsquo;Courriel\u0026rsquo; seulement, et finissez par cliquez dans la case à cocher\n\u0026lsquo;Expires\u0026rsquo;, pour choisir une date de 2 ans, maximum.\u003c/p\u003e\n\u003ch4 id=\"création--mode-console\"\u003eCréation : Mode Console\u003c/h4\u003e\n\u003cp\u003eIl y a deux options pour créer une clé, l\u0026rsquo;une permettant de faire plus\nfinement en demandant plus de choses que l\u0026rsquo;autre, à savoir :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e--gen-key\u003c/code\u003e, version abrégée de l\u0026rsquo;option \u003ccode\u003e--generate-key\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e--full-gen-key\u003c/code\u003e, version abrégée de l\u0026rsquo;option \u003ccode\u003e--full-generate-key\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eUtilisons l\u0026rsquo;option \u003ccode\u003e--gen-key\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:$ gpg --gen-key\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGnuPG\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 1.4.11; Copyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2010\u003c/span\u003e Free Software Foundation, Inc.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThis is free software: you are free to change and  redistribute it.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThere is NO WARRANTY, to the extent permitted by law.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePlease \u003cspan style=\"color:#815ba4\"\u003eselect\u003c/span\u003e what kind of key you want:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RSA and RSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003edefault\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\u003e2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e DSA and Elgamal\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e DSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esign only\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\u003e4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esign only\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eYour selection? **1**\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRSA keys may be between \u003cspan style=\"color:#f99b15\"\u003e1024\u003c/span\u003e and \u003cspan style=\"color:#f99b15\"\u003e4096\u003c/span\u003e bits long.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWhat keysize \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e you want? \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2048\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e **4096**\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRequested keysize is \u003cspan style=\"color:#f99b15\"\u003e4096\u003c/span\u003e bits\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePlease specify how long the key should be valid.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e key does not expire\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;n\u0026gt;  \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e key expires in n days\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;n\u0026gt;w \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e key expires in n weeks\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;n\u0026gt;m \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e key expires in n months\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;n\u0026gt;y \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e key expires in n years\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eKey is valid \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e? \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e **2y**\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIs this correct? \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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eYou need a user ID to identify your key; the software constructs the user ID\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efrom the Real Name, Comment and E-mail Address in this form:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Heinrich Heine (Der Dichter) \u0026lt;heinrichh@duesseldorf.de\u0026gt;\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\u003eReal name: **Nom Prenom**\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eE-mail address: **email@domain.tld**\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eComment:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eYou selected this USER-ID:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Nom Prenom \u0026lt;email@domain.tld\u0026gt;\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\u003eChange \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eN\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003eame, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003eomment, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eE\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e-mail or \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eO\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003ekay/\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eQ\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003euit? **O**\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eYou need a Passphrase to protect your secret key.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e**demande votre passphrase**\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg: key ******** marked as ultimately trusted\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epublic and secret key created and signed.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg: checking the trustdb\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg: \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e marginal\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003es\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e needed, \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e complete\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003es\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e needed, PGP trust model\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg: depth: \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  valid:   \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e  signed:   \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  trust: 0-, 0q, 0n, 0m, 0f, 1u\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epub   4096R/******* 2013-03-13\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      Key \u003cspan style=\"color:#ef6155\"\u003efingerprint\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e **** **** **** **** ****  **** **** **** **** ****\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euid                  Nom Prenom \u0026lt;email@domain.tld\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esub   4096R/******** 2013-03-13\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"ajout-dune-photo\"\u003eAjout d\u0026rsquo;une photo\u003c/h3\u003e\n\u003cp\u003eVeillez à utiliser une photo qui soit de taille légère !\u003c/p\u003e\n\u003ch4 id=\"addphoto--clients-graphiques\"\u003eaddphoto : Clients Graphiques\u003c/h4\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEnigmail\u003c/strong\u003e : il faut ouvrir la fenêtre de gestion de clés,\nmenu \u0026ldquo;Édition\u0026rdquo; \u0026gt; \u0026ldquo;Ajouter une photo\u0026rdquo; après avoir sélectionné la clé.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003e2ème possibilité\u003c/em\u003e : clic droit sur la clé, menu contextuel \u0026lsquo;Ajouter\nune photo\u0026quot;… et choisissez le fichier en question.\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e3ème possibilité\u003c/em\u003e : clic droit sur la clé, menu contextuel \u0026ldquo;Propriété de la clé\u0026rdquo;,\npuis dans la fenêtre de propriété, cliquez sur le bouton [ Sélectionnez une action … ]\net choisissez \u0026lsquo;Ajouter une photo\u0026rsquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eGPA\u003c/strong\u003e semble ne pas en être capable !\u003c/p\u003e\n\u003ch4 id=\"addphoto--mode-console\"\u003eaddphoto : Mode Console\u003c/h4\u003e\n\u003cp\u003eC\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003e--edit-key\u003c/code\u003e qui sera utilisée puis l\u0026rsquo;option \u003ccode\u003eaddphoto\u003c/code\u003e, telles 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:$ gpg --edit-key email@domain.tld\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGnuPG\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 1.4.11; Copyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2010\u003c/span\u003e Free Software Foundation, Inc.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThis is free software: you are free to change and redistribute it.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThere is NO WARRANTY, to the extent permitted by law.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSecret key is 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\u003epub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                     trust: ultimate      validity: ultimate\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esub  4096R/********  created: 2013-03-13  expires: never       usage: E\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eultimate\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e. Nom Prenom \u0026lt;email@domain.tld\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\u003egpg\u0026gt; addphoto\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePick an image to use \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e your photo ID.  The image must be a JPEG file.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRemember that the image is stored within your public key.  If you use a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003every large picture, your key will become very large as well!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eKeeping the image close to 240x288 is a good size to use.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter JPEG filename \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e photo ID: /repertoire_vers_photo/photo.jpg\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIs this photo correct \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ey/N/q\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e? y\n\u003c/span\u003e\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\u003eYou need a passphrase to unlock the secret key \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euser: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Nom Prenom \u0026lt;email@domain.tld\u0026gt;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e4096-bit RSA key, ID ********, created 2013-03-13\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e**demande votre passphrase**\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                     trust: ultimate      validity: ultimate\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esub  4096R/********  created: 2013-03-13  expires: never       usage: E\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eultimate\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e. Nom Prenom \u0026lt;email@domain.tld\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e unknown\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ejpeg image of size 5324\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\u003egpg\u0026gt; save\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"préférences-hash\"\u003ePréférences Hash\u003c/h3\u003e\n\u003cp\u003eParamétrer les hash préférés sont de bon aloi !\u003c/p\u003e\n\u003ch4 id=\"setpref--clients-graphiques\"\u003esetpref : Clients Graphiques\u003c/h4\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEnigmail\u003c/strong\u003e semble ne pas en être capable !\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eGPA\u003c/strong\u003e semble ne pas en être capable !\u003c/p\u003e\n\u003ch4 id=\"setpref--mode-console\"\u003esetpref : Mode Console\u003c/h4\u003e\n\u003cp\u003eC\u0026rsquo;est encore l\u0026rsquo;option \u003ccode\u003e--edit-key\u003c/code\u003e qui sera utilisée mais avec\nl\u0026rsquo;option \u003ccode\u003esetpref\u003c/code\u003e, telles 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:$ gpg --edit-key email@domain.tld\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGnuPG\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 1.4.11; Copyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2010\u003c/span\u003e Free Software Foundation, Inc.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThis is free software: you are free to change and redistribute it.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThere is NO WARRANTY, to the extent permitted by law.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSecret key is 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\u003epub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                     trust: ultimate      validity: ultimate\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esub  4096R/********  created: 2013-03-13  expires: never       usage: E\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eultimate\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e. Nom Prenom \u0026lt;email@domain.tld\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eultimate\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ejpeg image of size 5324\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\u003egpg\u0026gt; setpref SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed\n\u003c/span\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 preference list to:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     Cypher: AES256, AES192, AES, CAST5, 3DES\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     Digest: SHA512, SHA384, SHA256, SHA224, SHA1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     Compression: ZLIB, BZIP2, ZIP, Uncompressed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     Features: MDC, Keyserver no-modify\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReally update the preferences? \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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eYou need a passphrase to unlock the secret key \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euser: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Nom Prenom \u0026lt;email@domain.tld\u0026gt;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e4096-bit RSA key, ID ********, created 2013-03-13\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e**demande votre passphrase**\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                     trust: ultimate      validity: ultimate\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esub  4096R/********  created: 2013-03-13  expires: never       usage: E\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eultimate\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e. Nom Prenom \u0026lt;email@domain.tld\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e unknown\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ejpeg image of size 5324\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\u003egpg\u0026gt; save\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"une-nouvelle-sous-clé-de-signature\"\u003eUne nouvelle sous-clé de signature\u003c/h3\u003e\n\u003cp\u003eCette étape est vraiment importante ; elle sert à créer une sous-clé qui\nne servira qu\u0026rsquo;à signer de nouveaux messages et autres documents…\u003c/p\u003e\n\u003cp\u003eSi vous vous passez des deux étapes précédentes, ne vous passez pas de\ncelle-ci ; vous comprendrez plus bas le pourquoi !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLes recommandations de création de cette sous-clé sont ABSOLUMENT les mêmes\nque pour la création de la clé principale !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eQuoi ?\u003c/em\u003e \u003cbr\u003e\nvous avez déjà oublié : RSA + 4096 bits - avec la différence qu\u0026rsquo;on utilisera le\nchoix \u0026lsquo;RSA (sign only)\u0026rsquo;, et pas besoin de paramétrer une période de validité…\u003c/p\u003e\n\u003ch4 id=\"addkey--clients-graphiques\"\u003eaddkey : Clients Graphiques\u003c/h4\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEnigmail\u003c/strong\u003e semble ne pas en être capable !\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eGPA\u003c/strong\u003e semble ne pas être capable de générer de clés dont la taille soit de\n4096 bits, sinon, c\u0026rsquo;est menu \u0026ldquo;Clefs\u0026rdquo; \u0026gt; \u0026ldquo;Nouvelle clé\u0026rdquo; ; choisir l\u0026rsquo;algorithme \u0026lsquo;RSA (sign only)\u0026rsquo;,\nremplir les champs \u0026lsquo;Nom\u0026rsquo;, \u0026lsquo;Courriel\u0026rsquo; - sur ce dernier, remplir l\u0026rsquo;adresse mail\ncorrespondante, et ne pas cochez la case \u0026lsquo;Expirer\u0026rsquo; puis validez !\u003c/p\u003e\n\u003ch4 id=\"addkey-mode-console\"\u003eaddkey: Mode Console\u003c/h4\u003e\n\u003cp\u003eC\u0026rsquo;est toujours l\u0026rsquo;option \u003ccode\u003e--edit-key\u003c/code\u003e qui sera utilisée mais cette fois-ci avec\nl\u0026rsquo;option \u003ccode\u003eaddkey\u003c/code\u003e, telles 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:$ gpg --edit-key email@domain.tld\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGnuPG\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 1.4.11; Copyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2010\u003c/span\u003e Free Software Foundation, Inc.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThis is free software: you are free to change and redistribute it.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThere is NO WARRANTY, to the extent permitted by law.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSecret key is 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\u003epub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                     trust: ultimate      validity: ultimate\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esub  4096R/********  created: 2013-03-13  expires: never       usage: E\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eultimate\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e. Nom Prenom \u0026lt;email@domain.tld\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eultimate\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ejpeg image of size 5324\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\u003egpg\u0026gt; addkey\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eKey is protected.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eYou need a passphrase to unlock the secret key \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euser: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Nom Prenom \u0026lt;email@domain.tld\u0026gt;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e4096-bit RSA key, ID ********, created 2013-03-13\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e**demande votre passphrase**\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePlease \u003cspan style=\"color:#815ba4\"\u003eselect\u003c/span\u003e what kind of key you want:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e DSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esign only\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\u003e4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esign only\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\u003e5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Elgamal \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eencrypt only\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\u003e6\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RSA \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eencrypt only\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eYour selection? \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRSA keys may be between \u003cspan style=\"color:#f99b15\"\u003e1024\u003c/span\u003e and \u003cspan style=\"color:#f99b15\"\u003e4096\u003c/span\u003e bits long.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWhat keysize \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e you want? \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2048\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4096\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRequested keysize is \u003cspan style=\"color:#f99b15\"\u003e4096\u003c/span\u003e bits\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePlease specify how long the key should be valid.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e key does not expire\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;n\u0026gt;  \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e key expires in n days\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;n\u0026gt;w \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e key expires in n weeks\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;n\u0026gt;m \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e key expires in n months\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;n\u0026gt;y \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e key expires in n years\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eKey is valid \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e? \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eKey does not expire at all\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIs this correct? \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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReally create? \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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                     trust: ultimate      validity: ultimate\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esub  4096R/********  created: 2013-03-13  expires: never       usage: E\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esub  4096R/********  created: 2013-03-13  expires: never\n\u003c/span\u003e\u003c/span\u003e\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\u003eultimate\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e. Nom Prenom \u0026lt;email@domain.tld\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e unknown\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ejpeg image of size 5324\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\u003egpg\u0026gt; save\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"création-du-certificat-de-révocation\"\u003eCréation du certificat de révocation\u003c/h3\u003e\n\u003cp\u003eLa création du certificat de révocation est une étape à faire ABSOLUMENT !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eEn effet, celui-ci vous sera nécessaire pour révoquer votre clé GPG, ou la\nsous-clé de signature, si jamais vous avez perdu celle-ci, et/ou qu\u0026rsquo;elle soit\nvolée, et/ou qu\u0026rsquo;elle soit compromise !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eIl vous importe de placer ce certificat de révocation dans un endroit sûr !\u003c/strong\u003e\u003c/p\u003e\n\u003ch4 id=\"revoke--clients-graphiques\"\u003erevoke : Clients graphiques\u003c/h4\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEnigmail\u003c/strong\u003e : Clic droit sur la clé, menu contextuel\n\u0026ldquo;Créer et enregistrer un certificat de révocation\u0026rdquo;.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003e2ème possibilité\u003c/em\u003e : clic droit sur la clé, menu contextuel \u0026ldquo;Propriétés de la clé\u0026rdquo;,\npuis dans la fenêtre \u0026ldquo;Propriété\u0026rdquo;, cliquez sur le bouton [ Sélectionnez l\u0026rsquo;action …],\npuis \u0026ldquo;Créer et enregistrer un certificat de révocation\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eGPA\u003c/strong\u003e semble ne pas en être capable !\u003c/p\u003e\n\u003ch4 id=\"revoke--mode-console\"\u003erevoke : mode console\u003c/h4\u003e\n\u003cp\u003eC\u0026rsquo;est assez simple, pour une fois :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ gpg --output email@domain.tld.rev.asc --gen-revoke email@domain.tld\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"exportez-vos-clés\"\u003eExportez vos clés\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;export de vos clés fait partie du processus nécessaire. \u003cbr\u003e\n\u003cstrong\u003eBien entendu, il vous incombe de mettre en lieu sûr ces fichiers, IMPÉRATIVEMENT\nla clé privée qui en résulte !\u003c/strong\u003e\u003c/p\u003e\n\u003ch4 id=\"export--clients-graphiques\"\u003eexport : Clients graphiques\u003c/h4\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEnigmail\u003c/strong\u003e : clic droit sur la clé, menu contextuel \u0026ldquo;Exporter les clés vers un fichier\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eGPA\u003c/strong\u003e : Menu \u0026lsquo;Clefs\u0026rsquo; \u0026gt; \u0026lsquo;Exporter des clefs\u0026rsquo;\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e2ème possibilité\u003c/em\u003e : clic droit sur la clé en question, puis dans le menu contextuel,\nchoisir \u0026lsquo;Exporter des clefs\u0026rsquo;…\u003c/p\u003e\n\u003ch4 id=\"export--mode-console-\"\u003eexport : mode console :\u003c/h4\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ gpg --export-secret-keys --armor email@domain.tld \u0026gt; email@domain.tld.private_key.asc\n$ gpg --export --armor email@domain.tld \u0026gt; email@domain.tld.public_key.asc\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"transformons-les-clés\"\u003eTransformons les clés\u003c/h3\u003e\n\u003cp\u003eTransformez les clés que nous avons créées, dites clés primaires en clés\nportables ou mode \u0026ldquo;protégé\u0026rdquo;, est un autre processus IMPORTANT !\u003c/p\u003e\n\u003cp\u003eCe processus est un peu long, non-prévu dans le fonctionnement interne\nde GPG, \u003cem\u003epeut faire peur - et donner des suées\u003c/em\u003e,…\u003c/p\u003e\n\u003cp\u003eIl a pour propos d\u0026rsquo;extraire les sous-clés, de les détruire du porte-clé, de les\nimporter correctement !\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 : Une fois, en mode \u0026ldquo;protégé\u0026rdquo;, les clés ne sont plus éditables,\nni modifiables… \u003cbr\u003e\nvous aurez le droit au final  à l\u0026rsquo;erreur \u0026ldquo;\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-erreurs/#gpg-des-parties-de-la-clef-secr%c3%a8te-ne-sont-pas-disponibles\" title=\"Lien interne vers l\u0026#39;article : 'GPG : les messages d\u0026#39;erreurs'\"\u003egpg: des parties de la clef secrète ne sont pas disponibles\u003c/a\u003e\n\u0026ldquo;, et rien de\nce que vous aurez pu faire, demandé, exécuté dans la  modification de la clé ne\nsera acté, validé !\u003c/p\u003e\n\u003cp\u003eDe même, vous ne pourrez pas signer une autre clé avec !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"transformation--clients-graphiques\"\u003etransformation : Clients Graphiques\u003c/h4\u003e\n\u003cp\u003eNe cherchez pas ; ce processus n\u0026rsquo;est pas du tout géré !\u003c/p\u003e\n\u003ch4 id=\"transformation--mode-console\"\u003etransformation : Mode Console\u003c/h4\u003e\n\u003cp\u003eTout d\u0026rsquo;abord un aperçu de la clé, pour comparaison :\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ecelui-ci n\u0026rsquo;est absolument pas nécessaire - juste pour aider à remarquer la légère\ndifférence, avant ce processus et après !\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:$ gpg --list-secret-keys\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/home/\u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e/.gnupg/secring.gpg\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-----------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esec  4096R/******** 2013-03-13\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euid                  Nom Prenom \u0026lt;email@domain.tld\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essb   4096R/******** 2013-03-13\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essb   4096R/******** 2013-03-13\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMaintenant, le processus de transformation - que vous devez 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\u003e:$ gpg --export-secret-subkeys email@domain.tld \u0026gt; ~/.gnupg/email@domain.tld.subkeys\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ gpg --delete-secret-keys email@domain.tld\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ gpg --import ~/.gnupg/email@domain.tld.subkeys\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ shred --remove ~/.gnupg/email@domain.tld.subkeys\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eComparons :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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:$ gpg --list-secret-keys\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/home/\u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e/.gnupg/secring.gpg\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-----------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esec#  4096R/******** 2013-03-13\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euid                  Nom Prenom \u0026lt;email@domain.tld\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essb   4096R/******** 2013-03-13\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003essb   4096R/******** 2013-03-13\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEn fait la différence visible/visuelle est très légère : sur la ligne\ncommençant par le mot \u003ccode\u003esec\u003c/code\u003e, celui-ci est suivi du symbole \u003ccode\u003e#\u003c/code\u003e…\u003c/p\u003e\n\u003cp\u003eLa présence du symbole dièze signifie que la sous-clé de\nsignature ne fait pas partie du trousseau de clé !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cspan class=\"red\"\u003eSi le symbole dièze n'est pas présent, c'est qu'il y a eu un\nproblème dans la phase de ce processus… refaites-le !\u003c/span\u003e\n\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà, vous avez suivi toutes ces étapes - c\u0026rsquo;est très bien. Elles vous\ngarantissent d\u0026rsquo;avoir fait correctement les choses ;-)\u003c/p\u003e\n\u003ch2 id=\"partagez-votre-clé-publique-\"\u003ePartagez votre clé publique !\u003c/h2\u003e\n\u003cp\u003eAllez n\u0026rsquo;hésitez pas à partagez, publiez votre clé publique - informez\nde l\u0026rsquo;empreinte relative à votre clé publique - privilégiez le contact\nréel, physique lors de cet échange…\u003c/p\u003e\n\u003ch3 id=\"en-mode-graphique-\"\u003eEn mode graphique :\u003c/h3\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eEnigmail\u003c/strong\u003e : Menu \u0026ldquo;Serveur de clefs\u0026rdquo; \u0026gt; \u0026ldquo;Envoyer les clés publiques\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e2ème possibilité\u003c/em\u003e : clic droit sur la clé, menu contextuel \u0026ldquo;Envoyer\nles clés publiques vers un serveur de clefs\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eGPA\u003c/strong\u003e : Menu \u0026lsquo;Serveur\u0026rsquo; \u0026gt; \u0026lsquo;Envoyer des clefs\u0026rsquo;.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e2ème possibilité\u003c/em\u003e : clic droit sur la clé, puis dans le menu contextuel,\nchoisissez \u0026lsquo;Envoyer des clefs\u0026rsquo; ; confirmez votre choix, si cela vous est demandé\nen cliquant sur le bouton [Oui].\u003c/p\u003e\n\u003ch3 id=\"en-mode-console-\"\u003eEn mode console :\u003c/h3\u003e\n\u003cp\u003eUtilisez donc l\u0026rsquo;option \u003ccode\u003e--send-keys \u0026quot;fingerprint\u003c/code\u003e, tel que : \u003cbr\u003e\n\u003ccode\u003e$ gpg --send-keys \u0026quot;fingerprint\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\"\u003e\u003cp\u003eSi vous avez paramétré correctement votre fichier personnel \u003ccode\u003e~/.gnupg/gpg.conf\u003c/code\u003e\ncomme je vous l\u0026rsquo;ai démontré dans mon\u003c/p\u003e\n\u003cp\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/p\u003e\n\u003cp\u003e,\nalors vous n\u0026rsquo;aurez même pas besoin de spécifier le serveur, et en plus,\ncela se fera de manière sécurisée !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"de-bonnes-lectures\"\u003eDe bonnes lectures\u003c/h2\u003e\n\u003cp\u003eJe renvoie très fortement vers les bonnes lectures en question :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele \u003ca href=\"https://www.gnupg.org/howtos/fr/GPGMiniHowto.html\" rel=\"external\"\u003eMini-Guide Howto\u003c/a\u003e- par GnuPG…\u003c/li\u003e\n\u003cli\u003ele \u003ca href=\"https://emailselfdefense.fsf.org/fr/index.html\" rel=\"external\"\u003eGuide Autodéfense Courriel\u003c/a\u003e- par la FSF…\u003c/li\u003e\n\u003cli\u003ele guide autodéfense numérique - tome 2 : \u003ca href=\"https://guide.boum.org/tomes/2_en_ligne/3_outils/07_utiliser_openpgp/04_creer_et_maintenir_une_paire_de_cles/\" rel=\"external\"\u003eComment créer et maintenir une clé GPG\u003c/a\u003e-\u003c/li\u003e\n\u003cli\u003eou, les \u003ca href=\"https://help.riseup.net/fr/security/message-security/openpgp/best-practices\" rel=\"external\"\u003ebonnes pratiques pour l\u0026rsquo;utilisation d\u0026rsquo;OpenPGP\u003c/a\u003e…\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"du-bon-outil-gpg\"\u003eDu bon outil GPG\u003c/h2\u003e\n\u003ch3 id=\"mon-script-shell-posix\"\u003eMon script shell POSIX\u003c/h3\u003e\n\u003cp\u003eVous retrouverez mon \u003ca href=\"https://framagit.org/hucste/tools/blob/master/mng_gpg\" rel=\"external\"\u003escript de gestion de clé GPG\u003c/a\u003e\nsur mon espace git \u003cbr\u003e\n\u003cem\u003eDu moins, j\u0026rsquo;espère bien qu\u0026rsquo;il soit POSIX\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour afficher l\u0026rsquo;aide : \u003ccode\u003e./mng_gpg help\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour génèrer une clé : \u003ccode\u003e./mng_gpg create\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour information, cet outil a aussi besoin de l\u0026rsquo;outil \u003ccode\u003eshred\u003c/code\u003e…\u003c/p\u003e\n\u003chr\u003e\n","summary":"Guide des bonnes pratiques pour créer et utiliser correctement des clés GPG en utilisant l'algorithme RSA.","tags":["GPG","Guide","RSA"],"date_published":"2017-07-23T21:15:37+01:00","date_modified":"2017-07-28T12:18:37+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/web/nginx/perishablepress-blackhole#3232f12f4fd72e0ee8de19e63d9df6d4d56bc3114307afca199161960b4b6162","url":"https://it-log.fr.eu.org/fr/web/nginx/perishablepress-blackhole/","title":"PerishablePress : Blackhole pour les mauvais robots","author":{"name":"Stéphane HUC"},"content_text":"Description Jeff Starr de PersishablePress vient de publier son plugin de sécurité pour WP, nommé Blackhole for BadBots.\nL\u0026rsquo;idée de départ intéressante est, dû au fait que les robots scrutateurs du web ne respectent pas tous la déclaration du fichier robots.txt…\nC\u0026rsquo;est d\u0026rsquo;ailleurs pour cette raison qu\u0026rsquo;ils sont appelés \u0026ldquo;BadBots\u0026rdquo; ou \u0026ldquo;mauvais robots\u0026rdquo;.\nPuisque ces mauvais robots ne respectent rien, on va les piéger, puis bloquer leurs adresses IP !\nInstallation Commençons par télécharger la dernière mouture des scripts PHP :\nhttps://perishablepress.com/blackhole-bad-bots/#blackhole-download\nUne fois l\u0026rsquo;archive décompressée, ouvrez le script index.php, et modifiez correctement les valeurs des variables $from, $recip…\nenregistrez la modification.\nPensez à modifiez l\u0026rsquo;url de contact, en lignes 206 et 229 ; et, idem pour le script blackhole.php en ligne 56.\nDans votre site, créez un répertoire blackhole, dans lequel vous déposerez les fichiers blackhole, précédemment téléchargés - bien sûr, pas besoin du fichier .htaccess\nMettez des droits 0600 sur le fichier blackhole.dat, si votre serveur permet cette gestion fine…\nConfiguration Ensuite, modifiez vos scripts PHP de cette manière - oui, là, c\u0026rsquo;est un peu la contrainte ! :\nDans votre code source PHP, rajoutez cette déclaration suivante - si possible, avant tout code html… voire tout autre code PHP :\ninclude(realpath(getenv('DOCUMENT_ROOT')) .'/blackhole/blackhole.php'); Toujours dans le code source PHP, rajoutez la suivante, où vous voulez, mais le plus probablement dans ce qu\u0026rsquo;on appelle le \u0026lsquo;footer\u0026rsquo; :\n\u0026lt;a rel=\u0026quot;nofollow\u0026quot; style=\u0026quot;display:none;\u0026quot; href=\u0026quot;http://votre-ndd.tld/blackhole/\u0026quot;\u0026gt;NE PAS Suivre ce lien où vous serez bannis - interdits d'accès - à ce site !\u0026lt;/a\u0026gt; Puis, terminez par rajouter cette déclaration dans votre fichier robots.txt :\nDisallow: /blackhole/ Maintenant, modifions le fichier de configuration de votre serveur nginx pour ajouter cette déclaration location :\nlocation /blackhole/blackhole.dat { satisfy any; deny all; } Puis, pensez à tester votre configuration nginx, et redémarrez votre serveur !\nVous obtiendrez ainsi une belle erreur 404, si le fichier est appelé…\nÀ partir de maintenant, quand un mauvais robot, ou quelqu\u0026rsquo;un cherchera à pointer sur le répertoire blackhole, et/ou un de ses fichiers, il sera blacklisté, puis quand il reviendra, il ne lui sera pas permis d\u0026rsquo;avoir accès au site web…\nLe script vous enverra un mail ; si vous ne voulez pas en recevoir, éditez le script index.php, et mettez en commentaire PHP la ligne 226, commençant ainsi :\n//mail($recip, $subject, $message, 'From: '. $from);\nIl existe d\u0026rsquo;autres options modifiables ; là, je vous renvoie au site PerishablePress !\nVersion modifiée\nRetrouvez la version modifiée sur mon espace git, ainsi que l\u0026rsquo;archive ZIP correspondante !\nL\u0026rsquo;auteur est informé ; j\u0026rsquo;espère qu\u0026rsquo;il intégrera mes modifications ;-)\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eJeff Starr de PersishablePress vient de publier son \u003ca href=\"https://perishablepress.com/new-plugin-blackhole-bad-bots/\" rel=\"external\"\u003eplugin de sécurité pour WP\u003c/a\u003e,\nnommé \u003cspan lang=\"en\"\u003e\u003ca href=\"https://perishablepress.com/blackhole-bad-bots/\" rel=\"external\"\u003eBlackhole for BadBots\u003c/a\u003e\u003c/span\u003e.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;idée de départ intéressante est, dû au fait que les robots scrutateurs\ndu web ne respectent pas tous la déclaration du fichier \u003ccode\u003erobots.txt\u003c/code\u003e…\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est d\u0026rsquo;ailleurs pour cette raison qu\u0026rsquo;ils sont appelés \u0026ldquo;\u003cspan lang=\"en\"\u003eBadBots\u003c/span\u003e\u0026rdquo;\nou \u0026ldquo;mauvais robots\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003ePuisque ces mauvais robots ne respectent rien, on va les piéger, puis bloquer\nleurs adresses IP !\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eCommençons par télécharger la dernière mouture des scripts PHP :\u003cbr\u003e\n\u003ca href=\"https://perishablepress.com/blackhole-bad-bots/#blackhole-download\" rel=\"external\"\u003ehttps://perishablepress.com/blackhole-bad-bots/#blackhole-download\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eUne fois l\u0026rsquo;archive décompressée, ouvrez le script \u003ccode\u003eindex.php\u003c/code\u003e, et modifiez\ncorrectement les valeurs des variables \u003ccode\u003e$from\u003c/code\u003e, \u003ccode\u003e$recip\u003c/code\u003e…\u003cbr\u003e\nenregistrez la modification.\u003c/p\u003e\n\u003cp\u003ePensez à modifiez l\u0026rsquo;url de contact, en lignes 206 et 229 ; et, idem pour\nle script \u003ccode\u003eblackhole.php\u003c/code\u003e en ligne 56.\u003c/p\u003e\n\u003cp\u003eDans votre site, créez un répertoire \u003ccode\u003eblackhole\u003c/code\u003e, dans lequel vous déposerez\nles fichiers blackhole, précédemment téléchargés - \u003cbr\u003e\n\u003cem\u003ebien sûr, pas besoin du fichier \u003ccode\u003e.htaccess\u003c/code\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eMettez des droits 0600 sur le fichier \u003ccode\u003eblackhole.dat\u003c/code\u003e, si votre serveur\npermet cette gestion fine…\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eEnsuite, modifiez vos scripts PHP de cette manière - \u003cem\u003eoui, là, c\u0026rsquo;est un peu la contrainte !\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDans votre code source PHP, rajoutez cette déclaration suivante - \u003cem\u003esi possible,\navant tout code html… voire tout autre code PHP\u003c/em\u003e :\u003cbr\u003e\n\u003ccode\u003einclude(realpath(getenv('DOCUMENT_ROOT')) .'/blackhole/blackhole.php');\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eToujours dans le code source PHP, rajoutez la suivante, où vous voulez,\nmais le plus probablement dans ce qu\u0026rsquo;on appelle le \u0026lsquo;footer\u0026rsquo; :\u003cbr\u003e\n\u003ccode\u003e\u0026lt;a rel=\u0026quot;nofollow\u0026quot; style=\u0026quot;display:none;\u0026quot; href=\u0026quot;http://votre-ndd.tld/blackhole/\u0026quot;\u0026gt;NE PAS Suivre ce lien où vous serez bannis - interdits d'accès - à ce site !\u0026lt;/a\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePuis, terminez par rajouter cette déclaration dans votre fichier \u003ccode\u003erobots.txt\u003c/code\u003e :\u003cbr\u003e\n\u003ccode\u003eDisallow: /blackhole/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMaintenant, modifions le fichier de configuration de votre serveur nginx\npour ajouter cette déclaration \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/blackhole/blackhole.dat\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003esatisfy\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eany\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis, pensez à tester votre configuration nginx, et redémarrez votre serveur !\u003c/p\u003e\n\u003cp\u003eVous obtiendrez ainsi une belle erreur 404, si le fichier est appelé…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eÀ partir de maintenant, quand un mauvais robot, ou quelqu\u0026rsquo;un cherchera à\npointer sur le répertoire \u003ccode\u003eblackhole\u003c/code\u003e, et/ou un de ses fichiers, il sera\nblacklisté, puis quand il reviendra, il ne lui sera pas permis d\u0026rsquo;avoir\naccès au site web…\u003c/p\u003e\n\u003cp\u003eLe script vous enverra un mail ; si vous ne voulez pas en recevoir, éditez\nle script \u003ccode\u003eindex.php\u003c/code\u003e, et mettez en commentaire PHP la ligne 226, commençant ainsi :\u003cbr\u003e\n\u003ccode\u003e//mail($recip, $subject, $message, 'From: '. $from);\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl existe d\u0026rsquo;autres options modifiables ; là, je vous renvoie au site \u003ca href=\"https://perishablepress.com/blackhole-bad-bots/\" rel=\"external\"\u003ePerishablePress\u003c/a\u003e !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eVersion modifiée\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eRetrouvez la \u003ca href=\"https://framagit.org/hucste/tools/tree/master/blackhole\" rel=\"external\"\u003eversion modifiée sur mon espace git\u003c/a\u003e, ainsi que l\u0026rsquo;\u003ca href=\"https://framagit.org/hucste/tools/raw/master/blackhole/blackhole.modified.zip\" rel=\"external\"\u003earchive ZIP correspondante\u003c/a\u003e !\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;auteur est informé ; j\u0026rsquo;espère qu\u0026rsquo;il intégrera mes modifications ;-)\u003c/p\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"PerishablePress : ajouter des règles de sécurité à nginx pour bloquer les mauvais robots","tags":["nginx","PerishablePress","Blackhole","block"],"date_published":"2017-07-23T21:42:02+02:00","date_modified":"2017-07-29T22:17:58+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/sec/gpg/gpg-renew#bd3eb421030f8060760b720f39117a4fef1a73aed490915277ace1285c0cbf96","url":"https://it-log.fr.eu.org/fr/sec/gpg/gpg-renew/","title":"GPG : renouvellement de ma clé","author":{"name":"Stéphane HUC"},"content_text":"Description Enfin, cela fait presque deux ans, à une ou deux semaines près, que j\u0026rsquo;ai créé ma précédente clé GPG … il va falloir la renouveler, n\u0026rsquo;est-ce pas !\nIl y a deux manières de faire cela :\nsi et seulement si votre clé est toujours conforme aux recommandations actuelles de choix d’algorithmes, de taille de celle-ci - à savoir RSA 4096 - alors il est possible d\u0026rsquo;envisager de modifier la date d\u0026rsquo;expiration si vous préférez recréer une clé, pour quelle que raison que ce soit, alors il suffit de créer une nouvelle clé, relative toujours à la même adresse mail… Modifier la date d\u0026rsquo;expiration Repousser la date d\u0026rsquo;expiration est très simple, il faut éditer la clé en utilisant son empreinte, bien-sûr : Et oui, pour rappel, on édite sa clé à partir de son empreinte gpg, et non pas sa clé gpg ou l\u0026rsquo;email correspondant !\n:$ gpg --edit-key \u0026#34;CBC8 A5AB C6A6 2F2C C414 E869 DA43 05B9 BE07 311F\u0026#34; gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. La clef secrète est disponible. sec ed25519/0xDA4305B9BE07311F créé : 2020-01-30 expirée : 2022-01-29 utilisation : SC confiance : ultime validité : expirée ssb cv25519/0x9BA14C4E01678087 créé : 2020-01-30 expirée : 2022-01-29 utilisation : E ssb ed25519/0xBA82BCDF5858BA77 créé : 2020-01-30 expirée : jamais utilisation : S [ expirée ] (1). Stéphane HUC \u0026lt;consult@huc.fr.eu.org\u0026gt; [ expirée ] (2) Stéphane HUC \u0026lt;consult@stephane-huc.net\u0026gt; gpg\u0026gt; Utilisons l\u0026rsquo;option expire, tel que :\ngpg\u0026gt; expire Modification de la date d\u0026#39;expiration de la clef principale. Veuillez indiquer le temps pendant lequel cette clef devrait être valable. 0 = la clef n\u0026#39;expire pas \u0026lt;n\u0026gt; = la clef expire dans n jours \u0026lt;n\u0026gt;w = la clef expire dans n semaines \u0026lt;n\u0026gt;m = la clef expire dans n mois \u0026lt;n\u0026gt;y = la clef expire dans n ans Pendant combien de temps la clef est-elle valable ? (0) 1y La clef expire le jeu. 23 mars 2023 09:56:03 CET Est-ce correct ? (o/N) o sec ed25519/0xDA4305B9BE07311F créé : 2020-01-30 expire : 2023-03-23 utilisation : SC confiance : ultime validité : ultime ssb cv25519/0x9BA14C4E01678087 créé : 2020-01-30 expirée : 2022-01-29 utilisation : E ssb ed25519/0xBA82BCDF5858BA77 créé : 2020-01-30 expire : jamais utilisation : S [ ultime ] (1). Stéphane HUC \u0026lt;consult@huc.fr.eu.org\u0026gt; [ ultime ] (2) Stéphane HUC \u0026lt;consult@stephane-huc.net\u0026gt; gpg: Attention : votre sous-clef de chiffrement expire bientôt. gpg: Vous pourriez modifier aussi sa date d’expiration. gpg\u0026gt; Ainsi que l\u0026rsquo;affiche l\u0026rsquo;avertissement, il est nécessaire de modifier aussi les dates d\u0026rsquo;expirations de vos sous-clés, si vous en avez, en utilisant l\u0026rsquo;option key, tel que :\ngpg\u0026gt; key 0xBA82BCDF5858BA77 sec ed25519/0xDA4305B9BE07311F créé : 2020-01-30 expire : 2023-03-23 utilisation : SC confiance : ultime validité : ultime ssb* cv25519/0x9BA14C4E01678087 créé : 2020-01-30 expire : 2023-03-23 utilisation : E ssb* ed25519/0xBA82BCDF5858BA77 créé : 2020-01-30 expire : jamais utilisation : S [ ultime ] (1). Stéphane HUC \u0026lt;consult@huc.fr.eu.org\u0026gt; [ ultime ] (2) Stéphane HUC \u0026lt;consult@stephane-huc.net\u0026gt; gpg\u0026gt; expire Are you sure you want to change the expiration time for multiple subkeys? (y/N) y Veuillez indiquer le temps pendant lequel cette clef devrait être valable. 0 = la clef n\u0026#39;expire pas \u0026lt;n\u0026gt; = la clef expire dans n jours \u0026lt;n\u0026gt;w = la clef expire dans n semaines \u0026lt;n\u0026gt;m = la clef expire dans n mois \u0026lt;n\u0026gt;y = la clef expire dans n ans Pendant combien de temps la clef est-elle valable ? (0) 1y La clef expire le jeu. 23 mars 2023 09:57:39 CET Est-ce correct ? (o/N) o sec ed25519/0xDA4305B9BE07311F créé : 2020-01-30 expire : 2023-03-23 utilisation : SC confiance : ultime validité : ultime ssb* cv25519/0x9BA14C4E01678087 créé : 2020-01-30 expire : 2023-03-23 utilisation : E ssb* ed25519/0xBA82BCDF5858BA77 créé : 2020-01-30 expire : 2023-03-23 utilisation : S [ ultime ] (1). Stéphane HUC \u0026lt;consult@huc.fr.eu.org\u0026gt; [ ultime ] (2) Stéphane HUC \u0026lt;consult@stephane-huc.net\u0026gt; gpg\u0026gt; Faire de même pour tout autre sous-clé…\nN\u0026rsquo;oubliez surtout pas d\u0026rsquo;enregister vos modifications grâce à l\u0026rsquo;option save :\ngpg\u0026gt; save $ ce qui vous renverra sous votre invite shell.\nEnvoi au serveur de clé GPG cas normal de serveur de clé Pour finir, n\u0026rsquo;oubliez pas de l\u0026rsquo;envoyer au serveur : $ gpg --send-key \u0026quot;fingerprint\u0026quot;.\nserveur keys.openpgp.org Sauf si votre serveur est keys.OpenPGP.org, faites alors :\n$ gpg --export \u0026#34;fingerprint\u0026#34; | curl -T - https://keys.openpgp.org Normallement, vous aurez un message de réussite, tel que :\nKey successfully uploaded. Proceed with verification here: https://keys.openpgp.org/upload/*** Cliquez sur le lien ou copiez-le dans votre navigateur, et confirmez l\u0026rsquo;ajout comme il vous sera demandé par le biais du site.\nPour finir InfoPensez à créer vos fichiers d\u0026rsquo;export de clé privée, publique, voire de créer votre fichier de révocation ! Et, bien-sûr à les sécuriser… Création d\u0026rsquo;une nouvelle clé Comme j\u0026rsquo;aime bien faire les choses, qu\u0026rsquo;il s\u0026rsquo;est passé près de deux ans, entre temps - voire plus -, je me penche à nouveau sur la lecture de cet article : \u0026ldquo;Guide bonnes pratiques de création GPG \u0026rdquo;.\nUne fois que vous avez créé la nouvelle, suivez ces étapes très simples :\nSignez publiquement la nouvelle clé, avec votre ancienne clé - cela montrera que vous lui faites confiance… $ gpg --default-key \u0026quot;fingerprint clé qui sert à signer\u0026quot; --sign-key \u0026quot;fingerprint clé à signer\u0026quot; Exportez votre nouvelle clé, en la publiant sur un des serveurs SKS… $ gpg --send-key \u0026quot;fingerprint\u0026quot; Arrivé à expiration, il va falloir révoquer votre ancienne clé, et publiez le fait que l\u0026rsquo;ancienne clé soit révoquée - et là, je vous renvoie au mon mémo \u0026ldquo; GPG Révocation de clé \u0026rdquo;. ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eEnfin, cela fait presque deux ans, à une ou deux semaines près, que j\u0026rsquo;ai créé\nma précédente clé GPG … il va falloir la renouveler, n\u0026rsquo;est-ce pas !\u003c/p\u003e\n\u003cp\u003eIl y a deux manières de faire cela :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003esi et seulement si\u003c/strong\u003e votre clé est toujours conforme aux recommandations\nactuelles de choix d’algorithmes, de taille de celle-ci - à savoir RSA 4096 -\nalors il est possible d\u0026rsquo;envisager de\n\u003ca href=\"/fr/sec/gpg/gpg-renew/#modifier-la-date-d-expiration\"\u003emodifier la date d\u0026rsquo;expiration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003esi vous préférez recréer une clé, pour quelle que raison que ce soit, alors\nil suffit de \u003ca href=\"/fr/sec/gpg/gpg-renew/#création_d_une_nouvelle_clé\"\u003ecréer une nouvelle clé\u003c/a\u003e,\nrelative toujours à la même adresse mail…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"modifier-la-date-dexpiration\"\u003eModifier la date d\u0026rsquo;expiration\u003c/h2\u003e\n\u003cp\u003eRepousser la date d\u0026rsquo;expiration est très simple, il faut éditer la clé en utilisant\nson empreinte, bien-sûr : \u003cbr\u003e\n\u003cem\u003eEt oui, pour rappel, on édite sa clé à partir de son empreinte gpg, et non pas\nsa clé gpg ou l\u0026rsquo;email correspondant !\u003c/em\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-gpg\" data-lang=\"gpg\"\u003e:$ gpg --edit-key \u0026#34;CBC8 A5AB C6A6 2F2C C414  E869 DA43 05B9 BE07 311F\u0026#34;\ngpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\nLa clef secrète est disponible.\n\nsec  ed25519/0xDA4305B9BE07311F\n     créé : 2020-01-30  expirée : 2022-01-29  utilisation : SC\n     confiance : ultime        validité : expirée\nssb  cv25519/0x9BA14C4E01678087\n     créé : 2020-01-30  expirée : 2022-01-29  utilisation : E\nssb  ed25519/0xBA82BCDF5858BA77\n     créé : 2020-01-30  expirée : jamais      utilisation : S\n[ expirée ] (1). Stéphane HUC \u0026lt;consult@huc.fr.eu.org\u0026gt;\n[ expirée ] (2)  Stéphane HUC \u0026lt;consult@stephane-huc.net\u0026gt;\n\ngpg\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUtilisons l\u0026rsquo;option \u003ccode\u003eexpire\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-gpg\" data-lang=\"gpg\"\u003egpg\u0026gt; expire\nModification de la date d\u0026#39;expiration de la clef principale.\nVeuillez indiquer le temps pendant lequel cette clef devrait être valable.\n         0 = la clef n\u0026#39;expire pas\n      \u0026lt;n\u0026gt;  = la clef expire dans n jours\n      \u0026lt;n\u0026gt;w = la clef expire dans n semaines\n      \u0026lt;n\u0026gt;m = la clef expire dans n mois\n      \u0026lt;n\u0026gt;y = la clef expire dans n ans\nPendant combien de temps la clef est-elle valable ? (0) 1y\nLa clef expire le jeu. 23 mars 2023 09:56:03 CET\nEst-ce correct ? (o/N) o\n\nsec  ed25519/0xDA4305B9BE07311F\n     créé : 2020-01-30  expire : 2023-03-23  utilisation : SC\n     confiance : ultime        validité : ultime\nssb  cv25519/0x9BA14C4E01678087\n     créé : 2020-01-30  expirée : 2022-01-29  utilisation : E\nssb  ed25519/0xBA82BCDF5858BA77\n     créé : 2020-01-30  expire : jamais      utilisation : S\n[  ultime ] (1). Stéphane HUC \u0026lt;consult@huc.fr.eu.org\u0026gt;\n[  ultime ] (2)  Stéphane HUC \u0026lt;consult@stephane-huc.net\u0026gt;\n\ngpg: Attention : votre sous-clef de chiffrement expire bientôt.\ngpg: Vous pourriez modifier aussi sa date d’expiration.\ngpg\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAinsi que l\u0026rsquo;affiche l\u0026rsquo;avertissement, il est nécessaire de modifier aussi\nles dates d\u0026rsquo;expirations de vos sous-clés, si vous en avez, en utilisant\nl\u0026rsquo;option \u003ccode\u003ekey\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-gpg\" data-lang=\"gpg\"\u003egpg\u0026gt; key 0xBA82BCDF5858BA77\n\nsec  ed25519/0xDA4305B9BE07311F\n     créé : 2020-01-30  expire : 2023-03-23  utilisation : SC\n     confiance : ultime        validité : ultime\nssb* cv25519/0x9BA14C4E01678087\n     créé : 2020-01-30  expire : 2023-03-23  utilisation : E\nssb* ed25519/0xBA82BCDF5858BA77\n     créé : 2020-01-30  expire : jamais      utilisation : S\n[  ultime ] (1). Stéphane HUC \u0026lt;consult@huc.fr.eu.org\u0026gt;\n[  ultime ] (2)  Stéphane HUC \u0026lt;consult@stephane-huc.net\u0026gt;\n\ngpg\u0026gt; expire\nAre you sure you want to change the expiration time for multiple subkeys? (y/N) y\nVeuillez indiquer le temps pendant lequel cette clef devrait être valable.\n         0 = la clef n\u0026#39;expire pas\n      \u0026lt;n\u0026gt;  = la clef expire dans n jours\n      \u0026lt;n\u0026gt;w = la clef expire dans n semaines\n      \u0026lt;n\u0026gt;m = la clef expire dans n mois\n      \u0026lt;n\u0026gt;y = la clef expire dans n ans\nPendant combien de temps la clef est-elle valable ? (0) 1y\nLa clef expire le jeu. 23 mars 2023 09:57:39 CET\nEst-ce correct ? (o/N) o\n\nsec  ed25519/0xDA4305B9BE07311F\n     créé : 2020-01-30  expire : 2023-03-23  utilisation : SC\n     confiance : ultime        validité : ultime\nssb* cv25519/0x9BA14C4E01678087\n     créé : 2020-01-30  expire : 2023-03-23  utilisation : E\nssb* ed25519/0xBA82BCDF5858BA77\n     créé : 2020-01-30  expire : 2023-03-23  utilisation : S\n[  ultime ] (1). Stéphane HUC \u0026lt;consult@huc.fr.eu.org\u0026gt;\n[  ultime ] (2)  Stéphane HUC \u0026lt;consult@stephane-huc.net\u0026gt;\n\ngpg\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFaire de même pour tout autre sous-clé…\u003c/p\u003e\n\u003cp\u003eN\u0026rsquo;oubliez surtout pas d\u0026rsquo;enregister vos modifications grâce à l\u0026rsquo;option \u003ccode\u003esave\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-gpg\" data-lang=\"gpg\"\u003egpg\u0026gt; save\n$\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ece qui vous renverra sous votre invite shell.\u003c/p\u003e\n\u003ch3 id=\"envoi-au-serveur-de-clé-gpg\"\u003eEnvoi au serveur de clé GPG\u003c/h3\u003e\n\u003ch4 id=\"cas-normal-de-serveur-de-clé\"\u003ecas normal de serveur de clé\u003c/h4\u003e\n\u003cp\u003ePour finir, n\u0026rsquo;oubliez pas de l\u0026rsquo;envoyer au serveur : \u003cbr\u003e\n\u003ccode\u003e$ gpg --send-key \u0026quot;fingerprint\u0026quot;\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"serveur-keysopenpgporg\"\u003eserveur keys.openpgp.org\u003c/h4\u003e\n\u003cp\u003eSauf si votre serveur est \u003cstrong\u003ekeys.OpenPGP.org\u003c/strong\u003e, faites alors :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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$ gpg --export \u003cspan style=\"color:#48b685\"\u003e\u0026#34;fingerprint\u0026#34;\u003c/span\u003e | curl -T - https://keys.openpgp.org\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNormallement, vous aurez un message de réussite, 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\u003eKey successfully uploaded. Proceed with verification here:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehttps://keys.openpgp.org/upload/***\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCliquez sur le lien ou copiez-le dans votre navigateur, et confirmez l\u0026rsquo;ajout\ncomme il vous sera demandé par le biais du site.\u003c/p\u003e\n\u003ch3 id=\"pour-finir\"\u003ePour finir\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePensez à créer vos fichiers d\u0026rsquo;export de clé privée, publique, voire de créer\nvotre fichier de révocation ! \u003cbr\u003e\nEt, bien-sûr à les sécuriser…\u003c/div\u003e\n\n\u003ch2 id=\"création-dune-nouvelle-clé\"\u003eCréation d\u0026rsquo;une nouvelle clé\u003c/h2\u003e\n\u003cp\u003eComme j\u0026rsquo;aime bien faire les choses, qu\u0026rsquo;il s\u0026rsquo;est passé près de deux ans, entre\ntemps - \u003cem\u003evoire plus\u003c/em\u003e -, je me penche à nouveau sur la lecture de cet article :\n\u0026ldquo;\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-guide-bonnes-pratiques/\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Guide bonnes pratiques (RSA)'\"\u003eGuide bonnes pratiques de création GPG\u003c/a\u003e\n\u003c/strong\u003e\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eUne fois que vous avez créé la nouvelle, suivez ces étapes très simples :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSignez publiquement la nouvelle clé, avec votre ancienne clé - cela montrera\nque vous lui faites confiance… \u003cbr\u003e\n\u003ccode\u003e$ gpg --default-key \u0026quot;fingerprint clé qui sert à signer\u0026quot; --sign-key \u0026quot;fingerprint clé à signer\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eExportez votre nouvelle clé, en la publiant sur un des serveurs SKS… \u003cbr\u003e\n\u003ccode\u003e$ gpg --send-key \u0026quot;fingerprint\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eArrivé à expiration, il va falloir révoquer votre ancienne clé, et publiez le\nfait que l\u0026rsquo;ancienne clé soit révoquée - et là, je vous renvoie au mon mémo\n\u0026ldquo;\u003cstrong\u003e\n\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-revoque/\" title=\"Lien interne vers l\u0026#39;article : 'GPG : révoquer une clé'\"\u003eGPG Révocation de clé\u003c/a\u003e\n\u003c/strong\u003e\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Tutoriel pour comprendre comment renouveller une clé GPG","tags":["GPG","Renouvellement"],"date_published":"2017-07-23T19:43:38+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/sec/gpg/gpg-revoque#1b464c0de6e600070904e38e7c787a09245d7fa94d8bc03fbf49937825562f9a","url":"https://it-log.fr.eu.org/fr/sec/gpg/gpg-revoque/","title":"GPG : révoquer une clé","author":{"name":"Stéphane HUC"},"content_text":"Description Pour une raison ou l\u0026rsquo;autre, il vous est impératif de révoquer votre clé… alors révoquons !\nLes raisons :\nUne clé qui arrive à expiration… Une clé qui est perdue, volée… Une clé, malheureusement, compromise… Révocation L\u0026rsquo;acte de révocation est un acte simple, à partir du moment où vous avez bel et bien votre fichier de révocation relatif à la clé en question !\nDans le cas où votre clé arrive à expiration, il est toujours temps de (re?)générer un certificat de révocation… je vous renvoie à la lecture de mon article : \u0026ldquo;Guide bonnes pratiques de création GPG \u0026rdquo; au chapitre \u0026ldquo;Création du certificat de révocation\u0026rdquo; ! ;-)\nPour importer le certificat de révocation, on s\u0026rsquo;y prend ainsi :\n$ gpg --import ~/.gnupg/email@domain.tld.rev.asc\nMaintenant il faut l\u0026rsquo;éditer, puis utiliser l\u0026rsquo;option revkey :\nSi vous révoquez votre clé parce que :\nelle a été compromise, volée, perdue ; indiquez le choix \u0026lsquo;Key has been compromised\u0026rsquo; elle est arrivée à expiration ; indiquez le choix \u0026lsquo;Key is no longer used\u0026rsquo;. elle est remplacée pour utiliser de meilleurs algorithmes, pour la rendre plus \u0026ldquo;forte\u0026rdquo;, etc… : indiquez le choix \u0026lsquo;Key is superseded\u0026rsquo;. si vous ne voulez pas donner de raisons, indiquez le choix \u0026lsquo;No reason specified\u0026rsquo;. :$ gpg --edit-key email@domain.tld gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Secret key is available. pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate sub 4096R/******** created: 2013-03-13 expires: never usage: E sub 4096R/******** created: 2013-03-13 expires: never usage: S [ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt; [ultimate] (2) [jpeg image of size 5324] gpg\u0026gt; revkey Do you really want to revoke the selected subkeys? (y/N) **y** Please select the reason for the revocation: 0 = No reason specified 1 = Key has been compromised 2 = Key is superseded 3 = Key is no longer used Q = Cancel Your decision? **votre choix** Enter an optional description; end it with an empty line: \u0026gt; Reason for revocation: Key is no longer used (No description given) Is this okay? (y/N) y You need a passphrase to unlock the secret key for user: \u0026#34;Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\u0026#34; 4096-bit RSA key, ID ********, created 2013-03-13 **demande votre passhphrase** pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate This key was revoked on 2013-03-13 by RSA key ******** Nom Prenom sub 4096R/******** created: 2013-03-13 expires: never usage: E This key was revoked on 2013-03-13 by RSA key ******** Nom Prenom sub 4096R/********* created: 2013-03-13 expires: never usage: S [ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt; [ultimate] (2) [jpeg image of size 5324] gpg\u0026gt; save Cas particulier des sous-clés Dans mon mémoriel \u0026ldquo;Guide bonnes pratiques de création GPG \u0026rdquo; (cf : le chapitre \u0026ldquo;Transformons nos clés\u0026rdquo;), nous avons abordé le point de la transformation des clés \u0026ldquo;primaires\u0026rdquo;… juste avant j\u0026rsquo;avais rappelé la nécessité d\u0026rsquo;exporter vos clés. J\u0026rsquo;espère que vous l\u0026rsquo;avez bel et bien fait !\nNous allons utiliser les fichiers exportés des clés publiques et privés, afin de révoquer les sous-clés relatives…\n$ gpg --import ~/.gnupg/email@domain.tld.public_key.asc ~/.gnupg/email@domain.tld.private_key.asc\nBien-sûr, si ces fichiers de clés sont dans un autre chemin, indiquez le bon répertoire, et le bon nom de fichier. ;-)\nMaintenant, nous révoquons nos sous-clés :\n:$ gpg --edit-key email@domain.tld gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Secret key is available. pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate sub 4096R/******** created: 2013-03-13 expires: never usage: E sub 4096R/******** created: 2013-03-13 expires: never usage: S [ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt; [ultimate] (2) [jpeg image of size 5324] gpg\u0026gt; key1 pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate sub 4096R/******** created: 2013-03-13 expires: never usage: E sub 4096R/******** created: 2013-03-13 expires: never usage: S [ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt; [ultimate] (2) [jpeg image of size 5324] gpg\u0026gt; key2 pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate sub 4096R/******** created: 2013-03-13 expires: never usage: E sub 4096R/******** created: 2013-03-13 expires: never usage: S [ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt; [ultimate] (2) [jpeg image of size 5324] gpg\u0026gt; revkey Do you really want to revoke the selected subkeys? (y/N) y Please select the reason for the revocation: 0 = No reason specified 1 = Key has been compromised 2 = Key is superseded 3 = Key is no longer used Q = Cancel Your decision? 1 Enter an optional description; end it with an empty line: \u0026gt; Reason for revocation: Key is no longer used (No description given) Is this okay? (y/N) y You need a passphrase to unlock the secret key for user: \u0026#34;Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\u0026#34; 4096-bit RSA key, ID ********, created 2013-03-13 **demande votre passhphrase** You need a passphrase to unlock the secret key for user: \u0026#34;Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\u0026#34; 4096-bit RSA key, ID ********, created 2013-03-13 **demande votre passhphrase une deuxième fois** pub 4096R/******** created: 2013-03-13 expires: never usage: SC trust: ultimate validity: ultimate This key was revoked on 2013-03-13 by RSA key ******** Nom Prenom sub 4096R/******** created: 2013-03-13 expires: never usage: E This key was revoked on 2013-03-13 by RSA key ******** Nom Prenom sub 4096R/********* created: 2013-03-13 expires: never usage: S [ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt; [ultimate] (2) [jpeg image of size 5324] gpg\u0026gt; save Publier Ne pas oublier la phase importante qu\u0026rsquo;est celle d\u0026rsquo;annoncer au monde entier que votre clé ou vos sous-clés sont révoquées, en la publiant sur un des serveurs SKS.\nLà, je vous renvoie à la lecture de mon Guide bonnes pratiques de création GPG , sus-nommé, au chapitre \u0026ldquo;Partagez votre clé publique !\u0026rdquo;\nDe bonnes lectures Je rappelle de bonnes lectures, qui m\u0026rsquo;ont inspiré, bien-sûr ce mémo :\nl\u0026rsquo;article d\u0026rsquo;Alex Cabal : \u0026ldquo;Creating the perfect GPG keypair\u0026rdquo; le guide \u0026ldquo;Créer et maintenir une paire de clés - tome 2 du Guide d\u0026rsquo;autodéfense numérique\u0026rdquo; ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePour une raison ou l\u0026rsquo;autre, il vous est impératif de révoquer votre clé… \u003cbr\u003e\nalors révoquons !\u003c/p\u003e\n\u003cp\u003eLes raisons :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUne clé qui arrive à expiration…\u003c/li\u003e\n\u003cli\u003eUne clé qui est perdue, volée…\u003c/li\u003e\n\u003cli\u003eUne clé, malheureusement, compromise…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"révocation\"\u003eRévocation\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;acte de révocation est un acte simple, à partir du moment où vous avez bel et\nbien votre fichier de révocation relatif à la clé en question !\u003c/p\u003e\n\u003cp\u003eDans le cas où votre clé arrive à expiration, il est toujours temps de (re?)générer\nun certificat de révocation… \u003cbr\u003e\n\u003cem\u003eje vous renvoie à la lecture de mon article :\n\u0026ldquo;\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-guide-bonnes-pratiques/#cr%c3%a9ation-du-certificat-de-r%c3%a9vocation\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Guide bonnes pratiques (RSA)'\"\u003eGuide bonnes pratiques de création GPG\u003c/a\u003e\n\u0026rdquo;\nau chapitre \u0026ldquo;Création du certificat de révocation\u0026rdquo; !\u003c/em\u003e ;-)\u003c/p\u003e\n\u003cp\u003ePour importer le certificat de révocation, on s\u0026rsquo;y prend ainsi :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ gpg --import ~/.gnupg/email@domain.tld.rev.asc\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMaintenant il faut l\u0026rsquo;éditer, puis utiliser l\u0026rsquo;option \u003ccode\u003erevkey\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003eSi vous révoquez votre clé parce que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eelle a été compromise, volée, perdue ; indiquez le choix\n\u0026lsquo;\u003cspan lang=\"en\"\u003e\u003ccode\u003eKey has been compromised\u003c/code\u003e\u003c/span\u003e\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eelle est arrivée à expiration ; indiquez le choix\n\u0026lsquo;\u003cspan lang=\"en\"\u003e\u003ccode\u003eKey is no longer used\u003c/code\u003e\u003c/span\u003e\u0026rsquo;.\u003c/li\u003e\n\u003cli\u003eelle est remplacée pour utiliser de meilleurs algorithmes, pour la rendre\nplus \u0026ldquo;forte\u0026rdquo;, etc… : \u003cbr\u003e\nindiquez le choix \u0026lsquo;\u003cspan lang=\"en\"\u003e\u003ccode\u003eKey is superseded\u003c/code\u003e\u003c/span\u003e\u0026rsquo;.\u003c/li\u003e\n\u003cli\u003esi vous ne voulez pas donner de raisons, indiquez le choix\n\u0026lsquo;\u003cspan lang=\"en\"\u003e\u003ccode\u003eNo reason specified\u003c/code\u003e\u003c/span\u003e\u0026rsquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ gpg --edit-key email@domain.tld\ngpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc.\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\nSecret key is available.\n\npub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n                     trust: ultimate      validity: ultimate\nsub  4096R/********  created: 2013-03-13  expires: never       usage: E\nsub  4096R/********  created: 2013-03-13  expires: never       usage: S\n[ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\n[ultimate] (2)  [jpeg image of size 5324]\n\ngpg\u0026gt; revkey\n\n\nDo you really want to revoke the selected subkeys? (y/N) **y**\n\nPlease select the reason for the revocation:\n  0 = No reason specified\n  1 = Key has been compromised\n  2 = Key is superseded\n  3 = Key is no longer used\n  Q = Cancel\nYour decision? **votre choix**\n\nEnter an optional description; end it with an empty line:\n\u0026gt;\nReason for revocation: Key is no longer used\n(No description given)\nIs this okay? (y/N) y\n\n\nYou need a passphrase to unlock the secret key for\nuser: \u0026#34;Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\u0026#34;\n4096-bit RSA key, ID ********, created 2013-03-13\n\n**demande votre passhphrase**\n\npub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n                     trust: ultimate      validity: ultimate\nThis key was revoked on 2013-03-13 by RSA key ******** Nom Prenom\nsub  4096R/********  created: 2013-03-13  expires: never       usage: E\nThis key was revoked on 2013-03-13 by RSA key ******** Nom Prenom\nsub  4096R/*********  created: 2013-03-13  expires: never       usage: S\n[ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\n[ultimate] (2)  [jpeg image of size 5324]\n\ngpg\u0026gt; save\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"cas-particulier-des-sous-clés\"\u003eCas particulier des sous-clés\u003c/h3\u003e\n\u003cp\u003eDans mon mémoriel \u0026ldquo;\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-guide-bonnes-pratiques/#transformons-les-cl%c3%a9s\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Guide bonnes pratiques (RSA)'\"\u003eGuide bonnes pratiques de création GPG\u003c/a\u003e\n\u0026rdquo; \u003cem\u003e(cf : le chapitre  \u0026ldquo;Transformons nos clés\u0026rdquo;)\u003c/em\u003e,\nnous avons abordé le point de la transformation des clés \u0026ldquo;primaires\u0026rdquo;… juste avant\nj\u0026rsquo;avais rappelé la nécessité d\u0026rsquo;exporter vos clés. \u003cbr\u003e\n\u003cem\u003eJ\u0026rsquo;espère que vous l\u0026rsquo;avez bel et bien fait !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eNous allons utiliser les fichiers exportés des clés publiques et privés, afin de\nrévoquer les sous-clés relatives…\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ gpg --import ~/.gnupg/email@domain.tld.public_key.asc ~/.gnupg/email@domain.tld.private_key.asc\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eBien-sûr, si ces fichiers de clés sont dans un autre chemin, indiquez le bon\nrépertoire, et le bon nom de fichier.\u003c/em\u003e ;-)\u003c/p\u003e\n\u003cp\u003eMaintenant, nous révoquons nos sous-clés :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ gpg --edit-key email@domain.tld\ngpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc.\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\nSecret key is available.\n\npub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n                     trust: ultimate      validity: ultimate\nsub  4096R/********  created: 2013-03-13  expires: never       usage: E\nsub  4096R/********  created: 2013-03-13  expires: never       usage: S\n[ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\n[ultimate] (2)  [jpeg image of size 5324]\n\ngpg\u0026gt; key1\n\n\npub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n                     trust: ultimate      validity: ultimate\nsub  4096R/********  created: 2013-03-13  expires: never       usage: E\nsub  4096R/********  created: 2013-03-13  expires: never       usage: S\n[ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\n[ultimate] (2)  [jpeg image of size 5324]\n\ngpg\u0026gt; key2\n\n\npub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n                     trust: ultimate      validity: ultimate\nsub  4096R/********  created: 2013-03-13  expires: never       usage: E\nsub  4096R/********  created: 2013-03-13  expires: never       usage: S\n[ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\n[ultimate] (2)  [jpeg image of size 5324]\n\ngpg\u0026gt; revkey\n\n\nDo you really want to revoke the selected subkeys? (y/N) y\n\nPlease select the reason for the revocation:\n  0 = No reason specified\n  1 = Key has been compromised\n  2 = Key is superseded\n  3 = Key is no longer used\n  Q = Cancel\nYour decision? 1\n\nEnter an optional description; end it with an empty line:\n\u0026gt;\nReason for revocation: Key is no longer used\n(No description given)\nIs this okay? (y/N) y\n\n\nYou need a passphrase to unlock the secret key for\nuser: \u0026#34;Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\u0026#34;\n4096-bit RSA key, ID ********, created 2013-03-13\n\n**demande votre passhphrase**\n\n\nYou need a passphrase to unlock the secret key for\nuser: \u0026#34;Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\u0026#34;\n4096-bit RSA key, ID ********, created 2013-03-13\n\n**demande votre passhphrase une deuxième fois**\n\n\npub  4096R/********  created: 2013-03-13  expires: never       usage: SC\n                     trust: ultimate      validity: ultimate\nThis key was revoked on 2013-03-13 by RSA key ******** Nom Prenom\nsub  4096R/********  created: 2013-03-13  expires: never       usage: E\nThis key was revoked on 2013-03-13 by RSA key ******** Nom Prenom\nsub  4096R/*********  created: 2013-03-13  expires: never       usage: S\n[ultimate] (1). Nom Prenom \u0026amp;lt;email@domain.tld\u0026gt;\n[ultimate] (2)  [jpeg image of size 5324]\n\ngpg\u0026gt; save\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"publier\"\u003ePublier\u003c/h2\u003e\n\u003cp\u003eNe pas oublier la phase importante qu\u0026rsquo;est celle d\u0026rsquo;annoncer au monde entier que\nvotre clé ou vos sous-clés sont révoquées, en la publiant sur un des serveurs SKS.\u003c/p\u003e\n\u003cp\u003eLà, je vous renvoie à la lecture de mon\n\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-guide-bonnes-pratiques/#partagez-votre-cl%c3%a9-publique\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Guide bonnes pratiques (RSA)'\"\u003eGuide bonnes pratiques de création GPG\u003c/a\u003e\n\u003c/strong\u003e, sus-nommé, au chapitre\n\u0026ldquo;\u003cstrong\u003ePartagez votre clé publique !\u003c/strong\u003e\u0026rdquo;\u003c/p\u003e\n\u003ch2 id=\"de-bonnes-lectures\"\u003eDe bonnes lectures\u003c/h2\u003e\n\u003cp\u003eJe rappelle de bonnes lectures, qui m\u0026rsquo;ont inspiré, bien-sûr ce mémo :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;article d\u0026rsquo;Alex Cabal : \u0026ldquo;\u003ca href=\"https://alexcabal.com/creating-the-perfect-gpg-keypair/%7C\" rel=\"external\"\u003eCreating the perfect GPG keypair\u003c/a\u003e\u0026rdquo;\u003c/li\u003e\n\u003cli\u003ele guide \u0026ldquo;\u003ca href=\"https://guide.boum.org/tomes/2_en_ligne/3_outils/07_utiliser_openpgp/04_creer_et_maintenir_une_paire_de_cles/\" rel=\"external\"\u003eCréer et maintenir une paire de clés\u003c/a\u003e - tome 2 du Guide d\u0026rsquo;autodéfense numérique\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Tutoriel pour révoquer une clé GPG","tags":["GPG"],"date_published":"2017-07-23T19:38:00+01:00","date_modified":"2018-03-04T23:59:06+01:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/web/ssl/letsmonitor#370f731a1a15870a07de63ed469b2564079a96a183e28ec1f1cef2dca27fe3a9","url":"https://it-log.fr.eu.org/fr/web/ssl/letsmonitor/","title":"LetsMonitor.org : monitorer ses certificats LetsEncrypt","author":{"name":"Stéphane HUC"},"content_text":"Description Dans le coin, nous avons plus ou moins entendu parler, et nous l\u0026rsquo;utilisons plus ou moins, comme service SSL, je veux bien sûr parler de LetsEncrypt et de ses certificats.\nMaintenant, il est possible de les \u0026ldquo;monitorer\u0026rdquo;, et pour cela, c\u0026rsquo;est LetsMonitor.org.\nLa première chose à faire est de s\u0026rsquo;enregistrer. Ensuite, lors de la première connexion, l\u0026rsquo;interface demande de créer un \u0026ldquo;contact\u0026rdquo;. Il est possible d\u0026rsquo;en créer plusieurs… Profitez-en pour tester si l\u0026rsquo;alerte fonctionne, en appuyant sur le bouton [ Test ] situé sur la même ligne, et dans la colonne \u0026ldquo;Action\u0026rdquo;.\nEnsuite, il faut créer son premier moniteur : cliquez sur le lien \u0026ldquo;Certificates\u0026rdquo;, et renseignez le nom du Moniteur, celui du domaine relatif, et n\u0026rsquo;oubliez pas de lui attribuer un des contacts précédemment créé.\nLe suivi se fait en cliquant sur le lien \u0026ldquo;Dashboard\u0026rdquo;. Et, profitez du verdict visuel… qui vous indique le nombre de jours restant, et par code couleurs :\nvert : on a le temps :D orange : il ne reste plus que quelques jours, voire quelques heures… avant que le site ne soit plus accessible. rouge : au secours, il est urgent de le changer où le site ne sera plus accessible Voilà, c\u0026rsquo;est très facile à configurer… et vous recevrez en temps opportun l\u0026rsquo;alerte nécessaire, selon le médium désiré, par courriel, ou SMS !\nJ\u0026rsquo;en profite pour rappeler que le robot de création s\u0026rsquo;appelle dorénavant certbot…\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eDans le coin, nous avons plus ou moins entendu parler, et nous l\u0026rsquo;utilisons\nplus ou moins, comme service SSL, je veux bien sûr parler de \u003ca href=\"https://letsencrypt.org\" rel=\"external\"\u003eLetsEncrypt\u003c/a\u003e\net de ses certificats.\u003c/p\u003e\n\u003cp\u003eMaintenant, il est possible de les \u0026ldquo;monitorer\u0026rdquo;, et pour cela, c\u0026rsquo;est \u003ca href=\"https://letsmonitor.org\" rel=\"external\"\u003eLetsMonitor.org\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eLa première chose à faire est de s\u0026rsquo;enregistrer. \u003cbr\u003e\nEnsuite, lors de la première connexion, l\u0026rsquo;interface demande de créer un \u0026ldquo;contact\u0026rdquo;.\nIl est possible d\u0026rsquo;en créer plusieurs… \u003cbr\u003e\nProfitez-en pour tester si l\u0026rsquo;alerte fonctionne, en appuyant sur le bouton\n[ Test ] situé sur la même ligne, et dans la colonne \u0026ldquo;Action\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eEnsuite, il faut créer son premier moniteur : cliquez sur le lien \u0026ldquo;Certificates\u0026rdquo;,\net renseignez le nom du Moniteur, celui du domaine relatif, et n\u0026rsquo;oubliez\npas de lui attribuer un des contacts précédemment créé.\u003c/p\u003e\n\u003cp\u003eLe suivi se fait en cliquant sur le lien \u0026ldquo;Dashboard\u0026rdquo;. \u003cbr\u003e\nEt, profitez du verdict visuel… qui vous indique le nombre de jours\nrestant, et par code couleurs :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003cspan class=\"green\"\u003evert\u003c/span\u003e\n\u003c/strong\u003e : on a le temps :D\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003cspan class=\"orange\"\u003eorange\u003c/span\u003e\n\u003c/strong\u003e : il ne reste plus que quelques\njours, voire quelques heures… avant que le site ne soit plus accessible.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003cspan class=\"red\"\u003erouge\u003c/span\u003e\n\u003c/strong\u003e : au secours, il est urgent de le\nchanger où le site ne sera plus accessible\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVoilà, c\u0026rsquo;est très facile à configurer… et vous recevrez en temps opportun\nl\u0026rsquo;alerte nécessaire, selon le médium désiré, par courriel, ou SMS !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eJ\u0026rsquo;en profite pour rappeler que le robot de création s\u0026rsquo;appelle dorénavant \u003ca href=\"https://certbot.org\" rel=\"external\"\u003ecertbot\u003c/a\u003e…\u003c/p\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Surveiller ses certificats SSL fait avec la CA LetsEncrypt avec le service web LetsMonitor.org","tags":["SSL","supervision","certificat"],"date_published":"2017-07-23T19:19:22+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/web/php/php-snmp-cannot-adopt-oid-in-snmp#13eee77a676923f650ba939554105993b6f4bb1867e54b73c003336c9a3655fc","url":"https://it-log.fr.eu.org/fr/web/php/php-snmp-cannot-adopt-oid-in-snmp/","title":"PHP SNMP Cannot adopt OID in *-SNMP-*","author":{"name":"Stéphane HUC"},"content_text":"Description Un très petit mémo pour ceux qui ont cette erreur PHP :\nphp-fpm7.1[24419]: Cannot adopt OID in NET-SNMP-AGENT-MIB: nsNotifyShutdown ::= { netSnmpNotifications 2 } php-fpm7.1[24419]: Cannot adopt OID in NET-SNMP-AGENT-MIB: nsNotifyRestart ::= { netSnmpNotifications 3 } php-fpm7.1[24419]: Cannot adopt OID in UCD-SNMP-MIB: laErrMessage ::= { laEntry 101 } php-fpm7.1[24419]: Cannot adopt OID in UCD-SNMP-MIB: laErrorFlag ::= { laEntry 100 } Soit vous enlevez les modules SNMP de PHP, ce qui pour Debian, ou Ubuntu donne :\napt purge $(dpkg -l | awk '/php(.*)-snmp/ { print $2 }')\nSoit vous installez le package relatif à SNMP :\napt install snmp\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUn très petit mémo pour ceux qui ont cette erreur PHP :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\u003ephp-fpm7.1\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e24419\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Cannot adopt OID in NET-SNMP-AGENT-MIB: nsNotifyShutdown ::\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e netSnmpNotifications \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ephp-fpm7.1\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e24419\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Cannot adopt OID in NET-SNMP-AGENT-MIB: nsNotifyRestart ::\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e netSnmpNotifications \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ephp-fpm7.1\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e24419\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Cannot adopt OID in UCD-SNMP-MIB: laErrMessage ::\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e laEntry \u003cspan style=\"color:#f99b15\"\u003e101\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ephp-fpm7.1\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e24419\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Cannot adopt OID in UCD-SNMP-MIB: laErrorFlag ::\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e laEntry \u003cspan style=\"color:#f99b15\"\u003e100\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\u003eSoit vous enlevez les modules SNMP de PHP, ce qui pour Debian, ou Ubuntu donne :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eapt purge $(dpkg -l | awk '/php(.*)-snmp/ { print $2 }')\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSoit vous installez le package relatif à SNMP :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eapt install snmp\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Un petit mémo - astuce - pour résoudre l'erreur SNMP 'Cannot adopt OID in' avec PHP","tags":["PHP","SNMP","Erreur","astuce"],"date_published":"2017-07-23T18:53:13+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/web/sql/mysql-mariadb-innodb-error-log-sequence-number-is-in-the-future#388c1c7320f74e1b6ddbefc212bd52d3b64327e7fbec49756c2a19f25aeb8a5f","url":"https://it-log.fr.eu.org/fr/web/sql/mysql-mariadb-innodb-error-log-sequence-number-is-in-the-future/","title":"MySQL/MariaDB : 'InnoDB: Error: log sequence number is in the future'","author":{"name":"Stéphane HUC"},"content_text":"Description Voici un petit truc et astuce, si dans vos log, vous avez le message d\u0026rsquo;erreur suivant :\nInnoDB: Error: page 3 log sequence number 43384293 is in the future! Your database may be corrupt or you may have copied the InnoDB tablespace but not the InnoDB log files\nCommencez par vérifier que vos bases sont dans un état correct avec l\u0026rsquo;outil myslqcheck.\nLe moyen le plus facile est :\nde purger les bases de données, vérifier la bonne destruction… puis de réinstaller une sauvegarde \u0026ldquo;propre\u0026rdquo; ! ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVoici un petit truc et astuce, si dans vos log, vous avez le message\nd\u0026rsquo;erreur suivant :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eInnoDB: Error: page 3 log sequence number 43384293 is in the future! Your database may be corrupt or you may have copied the InnoDB tablespace but not the InnoDB log files\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCommencez par vérifier que vos bases sont dans un état correct avec\nl\u0026rsquo;outil \u003ccode\u003emyslqcheck\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLe moyen le plus facile est :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ede purger les bases de données,\u003c/li\u003e\n\u003cli\u003evérifier la bonne destruction…\u003c/li\u003e\n\u003cli\u003epuis de réinstaller une sauvegarde \u0026ldquo;propre\u0026rdquo; !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Résoudre l'erreur 'InnoDB: Error: log sequence number is in the future' dans MySQL/MariaDB","tags":["SQL","Erreur","astuce"],"date_published":"2017-07-23T18:50:15+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/web/sql/mysql-mariadb-innodb-cannot-open-table#69bbb1bcbb43a89a751a1eee7b689f2355f10a1c61ec36c5732933078eb395fe","url":"https://it-log.fr.eu.org/fr/web/sql/mysql-mariadb-innodb-cannot-open-table/","title":"MySQL/MariaDB : 'InnoDB: Cannot open table'","author":{"name":"Stéphane HUC"},"content_text":"Description Voici un autre petit truc et astuce, si dans vos log, vous avez le message d\u0026rsquo;erreur suivant :\n[Warning] InnoDB: Cannot open table mysql/gtid_slave_pos from the internal data dictionary of InnoDB though the .frm file for the table exists. See http://dev.mysql.com/doc/refman/5.6/en/ ... oting.html for how you can resolve the problem.\nCe message d\u0026rsquo;erreur peut-être à-propos des tables :\nmysql/gtid_slave_pos mysql/innodb_index_stats mysql/innodb_table_stats D\u0026rsquo;autres tables peuvent être concernées !\nSachez que c\u0026rsquo;est une erreur qui arrive, généralement, après une mise-à-jour du serveur !\nDépannage La meilleure manière de le résoudre est :\nde supprimer les fichiers .frm et .idb relatifs à ces tables, non mises-à-jour correctement. d\u0026rsquo;arrêter le serveur, puis le démarrer - et non pas redémarrer le serveur ! d\u0026rsquo;exécuter, en suivant, l\u0026rsquo;outil mysql_upgrade avec l\u0026rsquo;option --force par le compte administrateur de MySQL/MariaDB, tel que : # mysql_upgrade --force -u admin_db -p AttentionIl est possible de trouver des scripts qui vous disent d\u0026rsquo;injecter le code SQL pour recréer les tables défectueuses de la base de données mysql - ne le faites pas ; privilégiez vraiment la méthode ci-dessus ! ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVoici un autre petit truc et astuce, si dans vos log, vous avez le message\nd\u0026rsquo;erreur suivant :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e[Warning] InnoDB: Cannot open table mysql/gtid_slave_pos from the internal data dictionary of InnoDB though the .frm file for the table exists. See http://dev.mysql.com/doc/refman/5.6/en/ ... oting.html for how you can resolve the problem.\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCe message d\u0026rsquo;erreur peut-être à-propos des tables :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emysql/gtid_slave_pos\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emysql/innodb_index_stats\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emysql/innodb_table_stats\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eD\u0026rsquo;autres tables peuvent être concernées !\u003c/p\u003e\n\u003cp\u003eSachez que c\u0026rsquo;est une erreur qui arrive, généralement, après une mise-à-jour du\nserveur !\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003cp\u003eLa meilleure manière de le résoudre est :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ede \u003cstrong\u003esupprimer les fichiers .frm et .idb relatifs à ces tables\u003c/strong\u003e, non\nmises-à-jour correctement.\u003c/li\u003e\n\u003cli\u003ed\u0026rsquo;\u003cstrong\u003earrêter le serveur, puis le démarrer\u003c/strong\u003e - et \u003cem\u003enon pas redémarrer\u003c/em\u003e le serveur !\u003c/li\u003e\n\u003cli\u003ed\u0026rsquo;exécuter, en suivant, l\u0026rsquo;outil \u003ccode\u003emysql_upgrade\u003c/code\u003e avec l\u0026rsquo;option \u003ccode\u003e--force\u003c/code\u003e\npar le compte administrateur de MySQL/MariaDB, tel que : \u003cbr\u003e\n\u003ccode\u003e# mysql_upgrade --force -u admin_db -p\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\"\u003eIl est possible de trouver des scripts qui vous disent d\u0026rsquo;injecter le code\nSQL pour recréer les tables défectueuses de la base de données mysql -\n\u003cstrong\u003ene le faites pas ; privilégiez vraiment la méthode ci-dessus\u003c/strong\u003e !\u003c/div\u003e\n\n\u003chr\u003e\n","summary":"Résoudre l'erreur 'InnoDB: Cannot open table' pour MySQL/MariaDB","tags":["SQL","InnoDB","Erreur","astuce"],"date_published":"2017-07-23T18:49:10+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/sec/linux/durcir-iommu#afc5f89297fedbd3ef5b25f82c05eb67a04bf9b1a5765fbe1f5924d34c621059","url":"https://it-log.fr.eu.org/fr/sec/linux/durcir-iommu/","title":"Durcir Linux : Forcer l'IOMMU","author":{"name":"Stéphane HUC"},"content_text":"Description Mais qu\u0026rsquo;est donc l\u0026rsquo;IOMMU ? Input/Output Memory Management Unit en français, Unité de Gestion des Entrées/Sorties en Mémoire\nC\u0026rsquo;est une sorte de pare-feu matériel, pour les ports PCI, et VGA.\nArchitectures concernées Intel - dont l\u0026rsquo;option VT-d doit être activée dans le BIOS, ainsi que sa prise-en-charge dans le kernel. AMD a aussi son propre mode AMD-V pour I/O Virtualization Technology, ou SVM , ainsi que GART pour gérer les cartes AGP, et fonctionnels avec les CPU AMD Opteron, AMD Athlon 64, AMD Turion 64… IBM a la sienne : Calgary PCI-X ARM a sa propre unité appelée SSMU XenServer a sa propre fonction \u0026ldquo;PCI passthrough\u0026rdquo; ou l\u0026rsquo;équivalent pour les cartes VGA, à savoir \u0026ldquo;VGA passthrough\u0026rdquo; \u0026hellip; Configuration AttentionL\u0026rsquo;activation de l\u0026rsquo;IOMMU peut engendrer des instabilités matérielles. À surveiller et à désactiver si c\u0026rsquo;est le cas ! Hormis le fait de posséder l\u0026rsquo;une des architectures sus-nommées, il vous faut avoir à minima un kernel Linux 2.6…\nactivez l\u0026rsquo;option dans le BIOS de votre machine !\nVous pouvez forcer son usage, ce qui est recommandé, en éditant votre fichier :\n/etc/defaut/grub /boot/grub/menu.lst et en ajoutant l\u0026rsquo;option iommu=force sur la ligne GRUB_CMDLINE_LINUX… Mettez à jour grub !\nDocumentation ⇒ Un très bon document a été écrit pour le SSTIC en 2010, à ce propos en disant de celle-ci :\nIl s'agit d'un composant matériel qui agit comme un pare-feu et filtre les accès en provenance des périphériques vers la mémoire principale. \\ (…) est un composant matériel permettant à un système d'exploitation de contrôler l'accès des périphériques à la mémoire principale. Ce document nommé \u0026ldquo;Analyse de l\u0026rsquo;efficacité du service fourni par une IOMMU\u0026rdquo; décrit comment cette unité de gestion matérielle interagit avec le système GNU/Linux, et comment malheureusement il est possible de la \u0026ldquo;leurrer\u0026rdquo; pour mener des attaques réseaux, par exemple, à partir d\u0026rsquo;une interface Firewire, mais aussi mène à réfléchir sur son bon usage.\n⇒ Un autre document démontrant une attaque possible par le biais d\u0026rsquo;une interface FPGA sur PCI-E.\n⇒ Une troisième source d\u0026rsquo;informations intéressantes : Le \u0026ldquo;NP Linux Configuration\u0026rdquo; !\nWikipedia List_of_IOMMU-supporting_hardware WP : liste de matériels gérant IOMMU. ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eMais qu\u0026rsquo;est donc l\u0026rsquo;IOMMU ? \u003cstrong\u003eInput/Output Memory Management Unit\u003c/strong\u003e \u003cbr\u003e\n\u003cem\u003een français, \u003cstrong\u003eUnité de Gestion des Entrées/Sorties en Mémoire\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est une sorte de pare-feu matériel, pour les ports PCI, et VGA.\u003c/p\u003e\n\u003ch3 id=\"architectures-concernées\"\u003eArchitectures concernées\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://www.kernel.org/doc/Documentation/Intel-IOMMU.txt\" rel=\"external\"\u003eIntel\u003c/a\u003e\u003c/strong\u003e - dont l\u0026rsquo;option \u003cstrong\u003e\u003cabbr title=\"Virtualization Technology for Directed Input/Output\"\u003eVT-d\u003c/abbr\u003e\n\u003c/strong\u003e\ndoit être activée dans le BIOS, ainsi que sa prise-en-charge dans le kernel.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"http://developer.amd.com/wordpress/media/2012/10/IOMMU-ben-yehuda.pdf\" rel=\"external\"\u003eAMD\u003c/a\u003e\u003c/strong\u003e a aussi son propre mode \u003cstrong\u003eAMD-V\u003c/strong\u003e pour \u003cem\u003e\u003cstrong\u003eI/O Virtualization Technology\u003c/strong\u003e\u003c/em\u003e,\nou \u003cstrong\u003e\u003cabbr title=\"Secure Virtual Machine\"\u003eSVM\u003c/abbr\u003e\n\u003c/strong\u003e, ainsi que \u003cstrong\u003e\u003cabbr title=\"Graphical Aperture Remapping Table\"\u003eGART\u003c/abbr\u003e\n\u003c/strong\u003e\npour gérer les cartes AGP, et fonctionnels avec les CPU AMD Opteron,\nAMD Athlon 64, AMD Turion 64…\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIBM\u003c/strong\u003e a la sienne : \u003cstrong\u003eCalgary PCI-X\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"http://www.arm.com/products/system-ip/controllers/system-mmu.php\" rel=\"external\"\u003eARM\u003c/a\u003e\u003c/strong\u003e a sa propre unité appelée \u003cstrong\u003e\u003cabbr title=\"System Memory Management Unit\"\u003eSSMU\u003c/abbr\u003e\n\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eXenServer a sa propre fonction \u0026ldquo;\u003cstrong\u003ePCI passthrough\u003c/strong\u003e\u0026rdquo; ou l\u0026rsquo;équivalent\npour les cartes VGA, à savoir \u0026ldquo;\u003cstrong\u003eVGA passthrough\u003c/strong\u003e\u0026rdquo; \u0026hellip;\u003c/li\u003e\n\u003c/ul\u003e\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\"\u003eL\u0026rsquo;activation de l\u0026rsquo;IOMMU peut engendrer des instabilités matérielles. \u003cbr\u003e\nÀ surveiller et à désactiver si c\u0026rsquo;est le cas !\u003c/div\u003e\n\n\u003cp\u003eHormis le fait de posséder l\u0026rsquo;une des architectures sus-nommées, il vous\nfaut avoir à minima un kernel \u003cstrong\u003eLinux 2.6\u003c/strong\u003e…\u003c/p\u003e\n\u003cp\u003eactivez l\u0026rsquo;option dans le BIOS de votre machine !\u003c/p\u003e\n\u003cp\u003eVous pouvez forcer son usage, ce qui est recommandé, en éditant votre fichier :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/etc/defaut/grub\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/boot/grub/menu.lst\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet en ajoutant l\u0026rsquo;option \u003ccode\u003eiommu=force\u003c/code\u003e sur la ligne \u003ccode\u003eGRUB_CMDLINE_LINUX\u003c/code\u003e…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMettez à jour \u003ccode\u003egrub\u003c/code\u003e !\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003e⇒ Un très bon \u003ca href=\"https://www.sstic.org/media/SSTIC2010/SSTIC-actes/Analyse_de_l_efficacite_du_service_fourni_par_une_/SSTIC2010-Article-Analyse_de_l_efficacite_du_service_fourni_par_une_IOMMU-lacombe_lone-sang_nicomette_deswarte.pdf\" rel=\"external\"\u003edocument\u003c/a\u003e a été écrit pour le \u003cabbr title=\"Symposium sur la sécurité des technologies de l'information et des communications\"\u003eSSTIC\u003c/abbr\u003e\n\nen 2010, à ce propos en disant de celle-ci :\u003c/p\u003e\n\u003cblockquote\u003e\nIl s'agit d'un composant matériel qui agit comme un pare-feu et filtre\nles accès en provenance des périphériques vers la mémoire principale. \\\n(…) est un composant matériel permettant à un système d'exploitation de\ncontrôler l'accès des périphériques à la mémoire principale.\n\u003c/blockquote\u003e\n\u003cp\u003eCe document nommé \u0026ldquo;\u003cstrong\u003eAnalyse de l\u0026rsquo;efficacité du service fourni par une IOMMU\u003c/strong\u003e\u0026rdquo;\ndécrit comment cette unité de gestion matérielle interagit avec le système\nGNU/Linux, et comment malheureusement il est possible de la \u0026ldquo;leurrer\u0026rdquo; pour\nmener des attaques réseaux, par exemple, à partir d\u0026rsquo;une interface Firewire,\nmais aussi mène à réfléchir sur son bon usage.\u003c/p\u003e\n\u003cp\u003e⇒ Un autre \u003ca href=\"https://www.sstic.org/media/SSTIC2016/SSTIC-actes/dma_bypass_with_dma/SSTIC2016-Article-dma_bypass_with_dma-morgan_alata_averlant_nicomette.pdf\" rel=\"external\"\u003edocument\u003c/a\u003e démontrant une attaque possible par le biais d\u0026rsquo;une\ninterface FPGA sur PCI-E.\u003c/p\u003e\n\u003cp\u003e⇒ Une troisième source d\u0026rsquo;informations intéressantes : Le \u0026ldquo;\u003cstrong\u003e\u003ca href=\"http://www.ssi.gouv.fr/uploads/2015/10/NP_Linux_Configuration.pdf\" rel=\"external\"\u003eNP Linux Configuration\u003c/a\u003e\u003c/strong\u003e\u0026rdquo; !\u003c/p\u003e\n\u003ch3 id=\"wikipedia\"\u003eWikipedia\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/List_of_IOMMU-supporting_hardware\" title=\"Article Wikipédia : List_of_IOMMU-supporting_hardware\"\u003e\n    List_of_IOMMU-supporting_hardware\n    \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\n\u003c/a\u003e\n : liste de matériels gérant IOMMU.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment sécuriser sa distribution GNU/Linux en modifiant l'IOMMU","tags":["Linux","Harden","IOMMU"],"date_published":"2017-07-23T17:41:36+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/sec/scan/chkrootkit-possible-linux-ebory-operation-windigo#2a819411171fdfd4b060d1001331327b754c8e5697c4ed186c0770fd67660b9c","url":"https://it-log.fr.eu.org/fr/sec/scan/chkrootkit-possible-linux-ebory-operation-windigo/","title":"Chkrootkit : Possible Linux Ebory Operation Windigo Installed","author":{"name":"Stéphane HUC"},"content_text":"Description Chkrootkit émet cette alerte : Searching for Linux/Ebury - Operation Windigo ssh\u0026hellip; Possible Linux/Ebury - Operation Windigo installetd\nDéjà, si votre installation est fraîche, ne paniquez pas ; de toute façon, cela ne sert jamais à rien !\nNe paniquez pas si vous venez de mettre-à-jour vers Ubuntu - cela touche les versions 15.10, 16.04 LTS - ( et toutes les distributions basées dessus, telle que Linux Mint) ; et, idem si vous avez eu la bêtise de passer de votre version stable de Debian à une Testing, ou si vous avez fait des màj sur votre Sid !\nEn effet ce rootkit Ebury, qui sévit depuis 2014, modifie la librairie \u0026ldquo;libkeyutils\u0026rdquo; pour ajouter une option -G au binaire SSH, et/ou remplace les binaires liés au projet OpenSSH, tels que ssh, ssh-add, etc… ce qui permet la prise de contrôle à distance et surtout le vol de données.\nSAUF que depuis la version 6.8 d\u0026rsquo;OpenSSH, l\u0026rsquo;option \u0026lsquo;-G\u0026rsquo; existe ! (c\u0026rsquo;est même un alias de l\u0026rsquo;option -T)\nssh(1): Add a -G option to ssh that causes it to parse its configuration and dump the result to stdout, similar to \"sshd -T\". Ce qui fausse le résultat de détection de chkrootkit !\nDe même la commande suivante fausse le résultat si vous avez une version supérieure ou égale à la 6.8 d\u0026rsquo;OpenSSH :\n$ ssh -G 2\u0026gt;\u0026amp;1 | grep -e illegal -e unknown \u0026gt; /dev/null \u0026amp;\u0026amp; echo “System clean” || echo “System infected”\nDe plus, sachez qu\u0026rsquo;il existe une déclaration de bogue de faux positif :\npour Debian, #796599, résolu à ce jour… corrigé dans la version 0.50-4 pour Ubuntu, #1508248… Alors comment savoir si c\u0026rsquo;est un faux positif ou non !?\nAnalyse Analyse de SHM Commençons par analysez votre mémoire partagée SHM, par le biais de la commande # ipcs -m… avec des droits admin.\nSi vous n\u0026rsquo;avez aucun retour, tant mieux… sinon, il faut chercher à comprendre ce qu\u0026rsquo;une telle sortie peut signifier : Si vous avez un processus \u0026lsquo;root\u0026rsquo;, avec un mode 0666 ou 0600, et une taille au moins égale à 3 Mo, vous avez une forte probabilité d\u0026rsquo;être concerné ! :# ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch (...) 0x000010e0 465272836 root 666 3282312 0 :# ipcs -m -p ------ Shared Memory Creator/Last-op PIDs -------- shmid owner cpid lpid (...) 465272836 root 15029 17377 Vérifier qu\u0026rsquo;un tel processus fonctionne - remplacez par le numéro de pid que vous avez trouvé - en interrogeant ps :\n:# ps aux | grep 15029 root 11531 0.0 0.0 103284 828 pts/0 S+ 16:40 0:00 grep 15029 root 15029 0.0 0.0 66300 1204 ? Ss Jan26 0:00 /usr/sbin/sshd Le processus en question étant identifié comme ssh, c\u0026rsquo;est un très bel indicateur de compromission !\nPas la peine d\u0026rsquo;aller plus loin, si c\u0026rsquo;est malheureusement votre cas… \u0026#x1f61f; \u0026#x1f627;\nAnalyse des fichiers Vérifions la taille de tous les fichiers dont le nom commence par libkeyutils.so dans le répertoire /lib : # find /lib* -type f -name libkeyutils.so* -exec ls -la {} \\; -rw-r--r-- 1 root root 14256 Dec 10 2015 /lib/x86_64-linux-gnu/libkeyutils.so.1.5 DangerSi la taille des fichiers est supèrieure à 25 kilobytes, votre système est corrompu ! Recherchons la présence non désirable d\u0026rsquo;une autre bibliothèque partagée, dans le répertoire /lib, appelée libns2.so : # find /lib* -type f -name libns2.so Sur un système sain, la commande ne retourne rien ! Analyse réseau L\u0026rsquo;usage du binaire netstat nous permet de nous assurer d\u0026rsquo;un flux non désiré : # netstat -nap | grep \u0026quot;@/proc/udevd\u0026quot; Sur un système sain, vous n\u0026rsquo;aurez absolument aucun retour !\nL\u0026rsquo;autre binaire qui permet de s\u0026rsquo;assurer d\u0026rsquo;un flux sain, est l\u0026rsquo;usage de la commande tcpdump -p… qui peut vous dévoiler des informations, telles que : \u0026ldquo;msg:”Linux/Ebury SSH backdoor data exfiltration…\u0026rdquo; néanmoins, cela n\u0026rsquo;est malheureusement pas probant, puisque les récentes versions du rootkit tendent à cacher ce genre d\u0026rsquo;informations !\nRésultat Si votre système est bel et bien sain, malgré le message de l\u0026rsquo;outil chkrootkit, tant mieux. Il va vous falloir attendre que le binaire soit corrigé, vous avez donc bel et bien affaire au faux positif. En attendant, continuez de vérifier…\nDans le cas contraire, la seule recommandation valable est la réinstallation complète du système. Profitez-en pour vérifiez que vos stations ne soient pas infectées !\nUne fois fait, ne réutilisez pas les mêmes mots-de-passe, changez toutes vos clés SSH, et profitez pour en créer correctement des clés SSH fortes …\nDocumentation Si vous avez besoin/voulez plus d\u0026rsquo;informations sur ce rootkit, il y a deux lectures très intéressantes, en anglais - les informations que je vous restitue en sont tirées - :\nEbury SSH Rootkit - Frequently Asked Questions du CERT Bund OPERATION WINDIGO où l\u0026rsquo;on découvre que plus d\u0026rsquo;un OS est affecté, de Linux à *BSD ! Pour information, à ce jour, les outils rkhunter et clamav ne seraient pas capables de le détecter…\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eChkrootkit émet cette alerte :\n\u003cq\u003eSearching for Linux/Ebury - Operation Windigo ssh\u0026hellip;\nPossible Linux/Ebury - Operation Windigo installetd\u003c/q\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDéjà, si votre installation est fraîche, ne paniquez pas ; de toute façon,\ncela ne sert jamais à rien !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eNe paniquez pas si vous venez de mettre-à-jour vers Ubuntu - \u003cem\u003ecela touche\nles versions 15.10, 16.04 LTS - ( et toutes les distributions basées dessus,\ntelle que Linux Mint)\u003c/em\u003e ;\net, idem si vous avez eu la bêtise de passer de votre version stable de Debian\nà une Testing, ou si vous avez fait des màj sur votre Sid !\u003c/p\u003e\n\u003cp\u003eEn effet ce rootkit Ebury, qui sévit depuis 2014, modifie la librairie \u0026ldquo;\u003cstrong\u003elibkeyutils\u003c/strong\u003e\u0026rdquo;\npour ajouter une option \u003ccode\u003e-G\u003c/code\u003e au binaire SSH, et/ou remplace les binaires\nliés au projet OpenSSH, tels que ssh, ssh-add, etc… \u003cbr\u003e\nce qui permet la prise de contrôle à distance et surtout le vol de données.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eSAUF que depuis la \u003ca href=\"http://www.openssh.com/txt/release-6.8\" rel=\"external\"\u003eversion 6.8 d\u0026rsquo;OpenSSH\u003c/a\u003e, l\u0026rsquo;option \u0026lsquo;-G\u0026rsquo; existe !\u003c/strong\u003e \u003cbr\u003e\n\u003cem\u003e(c\u0026rsquo;est même un alias de l\u0026rsquo;option \u003ccode\u003e-T\u003c/code\u003e)\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote cite=\"http://www.openssh.com/txt/release-6.8\"\u003e\nssh(1): Add a -G option to ssh that causes it to parse its configuration and dump the result to stdout, similar to \"sshd -T\".\n\u003c/blockquote\u003e\n\u003cp\u003eCe qui fausse le résultat de détection de chkrootkit !\u003c/p\u003e\n\u003cp\u003eDe même la commande suivante fausse le résultat si vous avez une version\nsupérieure ou égale à la 6.8 d\u0026rsquo;OpenSSH  :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ ssh -G 2\u0026gt;\u0026amp;1 | grep -e illegal -e unknown \u0026gt; /dev/null \u0026amp;\u0026amp; echo “System clean” || echo “System infected”\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eDe plus, sachez qu\u0026rsquo;il existe une déclaration de bogue de faux positif :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour Debian, #\u003ca href=\"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=796599\" rel=\"external\"\u003e796599\u003c/a\u003e, résolu à ce jour… corrigé dans la version 0.50-4\u003c/li\u003e\n\u003cli\u003epour Ubuntu, #\u003ca href=\"https://bugs.launchpad.net/ubuntu/+source/chkrootkit/+bug/1508248\" rel=\"external\"\u003e1508248\u003c/a\u003e…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAlors comment savoir si c\u0026rsquo;est un faux positif ou non !?\u003c/p\u003e\n\u003ch2 id=\"analyse\"\u003eAnalyse\u003c/h2\u003e\n\u003ch3 id=\"analyse-de-shm\"\u003eAnalyse de SHM\u003c/h3\u003e\n\u003cp\u003eCommençons par analysez votre mémoire partagée SHM, par le biais de la\ncommande \u003ccode\u003e# ipcs -m\u003c/code\u003e… avec des droits admin.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi vous n\u0026rsquo;avez aucun retour, tant mieux…\u003c/li\u003e\n\u003cli\u003esinon, il faut chercher à comprendre ce qu\u0026rsquo;une telle sortie peut signifier :\n\u003cul\u003e\n\u003cli\u003eSi vous avez un processus \u0026lsquo;root\u0026rsquo;, avec un mode 0666 ou 0600, et une\ntaille au moins égale à 3 Mo, vous avez une forte probabilité\nd\u0026rsquo;être concerné !\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-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# ipcs -m\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e------ Shared Memory Segments --------\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ekey  shmid owner perms bytes  nattch\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\u003e0x000010e0    \u003cspan style=\"color:#f99b15\"\u003e465272836\u003c/span\u003e   root   \u003cspan style=\"color:#f99b15\"\u003e666\u003c/span\u003e   \u003cspan style=\"color:#f99b15\"\u003e3282312\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\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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:# ipcs -m -p\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e------ Shared Memory Creator/Last-op PIDs --------\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eshmid    owner     cpid     lpid\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:#f99b15\"\u003e465272836\u003c/span\u003e    root    \u003cspan style=\"color:#f99b15\"\u003e15029\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e17377\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 tel processus fonctionne - \u003cem\u003eremplacez par le numéro de\n\u003cabbr title=\"processus identifiant\"\u003epid\u003c/abbr\u003e\n\nque vous avez trouvé\u003c/em\u003e - en interrogeant \u003ccode\u003eps\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:# ps aux | grep \u003cspan style=\"color:#f99b15\"\u003e15029\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eroot \u003cspan style=\"color:#f99b15\"\u003e11531\u003c/span\u003e 0.0 0.0 \u003cspan style=\"color:#f99b15\"\u003e103284\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e828\u003c/span\u003e pts/0 S+ 16:40 0:00 grep \u003cspan style=\"color:#f99b15\"\u003e15029\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eroot \u003cspan style=\"color:#f99b15\"\u003e15029\u003c/span\u003e 0.0 0.0 \u003cspan style=\"color:#f99b15\"\u003e66300\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1204\u003c/span\u003e ? Ss Jan26 0:00 /usr/sbin/sshd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe processus en question étant identifié comme \u003cstrong\u003essh\u003c/strong\u003e, c\u0026rsquo;est un très bel\nindicateur de compromission !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePas la peine d\u0026rsquo;aller plus loin, si c\u0026rsquo;est malheureusement votre cas\u003c/strong\u003e…  \u0026#x1f61f;  \u0026#x1f627;\u003c/p\u003e\n\u003ch3 id=\"analyse-des-fichiers\"\u003eAnalyse des fichiers\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eVérifions la taille de tous les fichiers dont le nom commence par\n\u003ccode\u003elibkeyutils.so\u003c/code\u003e dans le répertoire \u003ccode\u003e/lib\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003e# find /lib* -type f -name libkeyutils.so* -exec ls -la {} \\;\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e-rw-r--r-- 1 root root 14256 Dec 10  2015 /lib/x86_64-linux-gnu/libkeyutils.so.1.5\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003eSi la taille des fichiers est supèrieure à 25 kilobytes, votre système est\ncorrompu !\u003c/div\u003e\n\n\u003col start=\"2\"\u003e\n\u003cli\u003eRecherchons la présence non désirable d\u0026rsquo;une autre bibliothèque partagée,\ndans le répertoire \u003ccode\u003e/lib\u003c/code\u003e, appelée \u003ccode\u003elibns2.so\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003e# find /lib* -type f -name libns2.so\u003c/code\u003e \u003cbr\u003e\n\u003cstrong\u003eSur un système sain, la commande ne retourne rien !\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"analyse-réseau\"\u003eAnalyse réseau\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;usage du binaire \u003cstrong\u003enetstat\u003c/strong\u003e nous permet de nous assurer d\u0026rsquo;un flux non désiré : \u003cbr\u003e\n\u003ccode\u003e# netstat -nap | grep \u0026quot;@/proc/udevd\u0026quot;\u003c/code\u003e \u003cbr\u003e\n\u003cstrong\u003eSur un système sain, vous n\u0026rsquo;aurez absolument aucun retour !\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;autre binaire qui permet de s\u0026rsquo;assurer d\u0026rsquo;un flux sain, est l\u0026rsquo;usage de\nla commande \u003ccode\u003etcpdump -p\u003c/code\u003e… qui peut vous dévoiler des informations, telles que : \u003cbr\u003e\n\u0026ldquo;msg:”Linux/Ebury SSH backdoor data exfiltration…\u0026rdquo; \u003cbr\u003e\nnéanmoins, cela n\u0026rsquo;est malheureusement pas probant, puisque les récentes\nversions du rootkit tendent à cacher ce genre d\u0026rsquo;informations !\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"résultat\"\u003eRésultat\u003c/h3\u003e\n\u003cp\u003eSi votre système est bel et bien sain, malgré le message de l\u0026rsquo;outil chkrootkit,\ntant mieux. Il va vous falloir attendre que le binaire soit corrigé, vous\navez donc bel et bien affaire au faux positif. En attendant, continuez de vérifier…\u003c/p\u003e\n\u003cp\u003eDans le cas contraire, \u003cstrong\u003ela seule recommandation valable est la réinstallation\ncomplète du système\u003c/strong\u003e. Profitez-en pour vérifiez que vos stations ne soient pas\ninfectées !\u003c/p\u003e\n\u003cp\u003eUne fois fait, \u003cstrong\u003ene réutilisez pas les mêmes mots-de-passe\u003c/strong\u003e,\n\u003cstrong\u003echangez toutes vos clés SSH\u003c/strong\u003e, et profitez pour en\n\n\u003ca class=\"inside\" href=\"/fr/sec/ssh/configuration-securisee/\" title=\"Lien interne vers l\u0026#39;article : 'SSH : Configuration Sécurisée'\"\u003ecréer correctement des clés SSH fortes\u003c/a\u003e\n…\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eSi vous avez besoin/voulez plus d\u0026rsquo;informations sur ce rootkit, il y a deux\nlectures très intéressantes, en anglais - \u003cem\u003eles informations que je vous\nrestitue en sont tirées\u003c/em\u003e - :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEbury SSH Rootkit - \u003ca href=\"https://www.cert-bund.de/ebury-faq\" rel=\"external\"\u003eFrequently Asked Questions\u003c/a\u003e du CERT Bund\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.welivesecurity.com/wp-content/uploads/2014/03/operation_windigo.pdf\" rel=\"external\"\u003eOPERATION WINDIGO\u003c/a\u003e où l\u0026rsquo;on découvre que plus d\u0026rsquo;un OS est affecté, de Linux à *BSD !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour information, à ce jour, les outils \u003cstrong\u003erkhunter\u003c/strong\u003e et \u003cstrong\u003eclamav\u003c/strong\u003e ne seraient\npas capables de le détecter…\u003c/p\u003e\n\u003chr\u003e\n","summary":"Que faire en cas de message de chkrootkit : Possible Linux/Ebury - Operation Windigo installed ?","tags":["chkrootkit","Linux","Ebury","Windigo","SSH","detection","intrusion"],"date_published":"2017-07-23T17:23:16+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/sec/scan/lynis-pkgs-7346-purge-packages#3b86de1fb3cfebe7b80a3a4b1fa59d301935b30cbf4f5cedc8aecc71eccfcf9b","url":"https://it-log.fr.eu.org/fr/sec/scan/lynis-pkgs-7346-purge-packages/","title":"Lynis : Purge old/removed packages [PKGS-7346]","author":{"name":"Stéphane HUC"},"content_text":"Description Un petit mémo concernant la complainte de Lynis : Purge old/removed packages (x found) with aptitude purge or dpkg \u0026ndash;purge command. This will cleanup old configuration files, cron jobs and startup scripts. [ PKGS-7346 ]\nC\u0026rsquo;est sa manière de dire qu\u0026rsquo;il reste des traces de configurations de paquets/binaires qui ont été désinstallés.\nVérification Sur Debian, Ubuntu, et assimilées - cela vous permet de vous assurer des paquets qui ont été supprimés, dont il reste les fichiers de configuration - :\n$ dpkg --get-selections | awk '/deinstall/ { print $1 }'\nPurge Sur Debian, Ubuntu, et consorts :\n⇒ avec apt : # apt purge $(dpkg --get-selections | awk '/deinstall/ { print $1 }')\n⇒ avec dpkg : # dpkg --purge $(dpkg --get-selections | awk '/deinstall/ { print $1 }')\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUn petit mémo concernant la complainte de Lynis : \u003cbr\u003e\n\u003cq\u003ePurge old/removed packages (x found) with aptitude purge or dpkg \u0026ndash;purge command. This will cleanup old configuration files, cron jobs and startup scripts. [ \u003ca href=\"https://cisofy.com/controls/PKGS-7346/\" rel=\"external\"\u003ePKGS-7346\u003c/a\u003e ]\u003c/q\u003e\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est sa manière de dire qu\u0026rsquo;il reste des traces de configurations de paquets/binaires qui ont été désinstallés.\u003c/p\u003e\n\u003ch2 id=\"vérification\"\u003eVérification\u003c/h2\u003e\n\u003cp\u003eSur Debian, Ubuntu, et assimilées - \u003cem\u003ecela vous permet de vous assurer des paquets qui ont été supprimés, dont il reste les fichiers de configuration\u003c/em\u003e - :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ dpkg --get-selections | awk '/deinstall/ { print $1 }'\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"purge\"\u003ePurge\u003c/h2\u003e\n\u003cp\u003eSur Debian, Ubuntu, et consorts :\u003c/p\u003e\n\u003cp\u003e⇒ avec \u003cstrong\u003eapt\u003c/strong\u003e : \u003cbr\u003e\n\u003ccode\u003e# apt purge  $(dpkg --get-selections | awk '/deinstall/ { print $1 }')\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ avec \u003cstrong\u003edpkg\u003c/strong\u003e : \u003cbr\u003e\n\u003ccode\u003e# dpkg --purge $(dpkg --get-selections | awk '/deinstall/ { print $1 }')\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment résoudre la suggestion de l'outil de détection Lynis : Purge old/removed packages [PKGS-7346]","tags":["Lynis","packages","detection"],"date_published":"2017-07-23T17:05:44+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-23:/fr/sec/scan/lynis-auth-9328-default-umask-like-027#9b4b35f9ba52f7518c412f60bcb1a0e0b9b5c043dcda00826ac66adf8f603524","url":"https://it-log.fr.eu.org/fr/sec/scan/lynis-auth-9328-default-umask-like-027/","title":"Lynis : Default umask like 027 [AUTH-9328]","author":{"name":"Stéphane HUC"},"content_text":"Description Mémo à-propos de la suggestion de Lynis : Default umask in /etc/init.d/rc could be more strict like 027 [ AUTH-9328 ]\nEn effet le Guide de Recommandations d\u0026rsquo;un Système GNU/Linux de l\u0026rsquo;ANSSI, au chapitre 6.1.5 Umask, nous rappelle à juste titre que :\nla valeur 0022 est considérée très permissive, que le umask système régit par le fichier /etc/init.d/rc doit être positionné sur 0027, ce qui fige les droits permissifs, tels que lecture autorisée pour l\u0026rsquo;utilisateur et son groupe, et modifiable uniquement par son créateur. Il faut modérer le fait que pour toutes les distributions systemd, tels que sont maintenant la plupart des Debian, et Ubuntu, il faut modifier le masque système dans le propre fichier de configuration du service à configurer.\n# sed -i -e \u0026quot;s#umask 022#umask 027#\u0026quot; /etc/init.d/rc\nTant qu\u0026rsquo;à faire, profitons-en pour modifier la valeur du umask utilisateurs qui doit être paramétré à 077 !\nPour les distributions systemd, c\u0026rsquo;est le fichier /etc/profile. Pour les distributions non systemd, c\u0026rsquo;est le fichier /etc/login.defs. AttentionATTENTION : Il est impératif de vérifier à chaque mise-à-jour de version de distribution, car ces droits seront réinitialisés par défaut ! ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eMémo à-propos de la suggestion de Lynis : \u003cq\u003eDefault umask in /etc/init.d/rc could be more strict like 027 [ \u003ca href=\"https://cisofy.com/controls/AUTH-9328/\" rel=\"external\"\u003eAUTH-9328\u003c/a\u003e ]\u003c/q\u003e\u003c/p\u003e\n\u003cp\u003eEn effet le \u003cstrong\u003e\u003ca href=\"http://www.ssi.gouv.fr/uploads/2015/10/NP_Linux_Configuration.pdf\" rel=\"external\"\u003eGuide de Recommandations d\u0026rsquo;un Système GNU/Linux\u003c/a\u003e\u003c/strong\u003e de l\u0026rsquo;ANSSI, au chapitre 6.1.5 Umask, nous rappelle à juste titre que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela valeur \u003ccode\u003e0022\u003c/code\u003e est considérée très permissive,\u003c/li\u003e\n\u003cli\u003eque le \u003cstrong\u003e\u003ccode\u003eumask\u003c/code\u003e système\u003c/strong\u003e régit par le fichier \u003ccode\u003e/etc/init.d/rc\u003c/code\u003e doit\nêtre positionné sur \u003ccode\u003e0027\u003c/code\u003e, ce qui fige les droits permissifs, tels\nque lecture autorisée pour l\u0026rsquo;utilisateur et son groupe, et modifiable\nuniquement par son créateur.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl faut modérer le fait que pour toutes les distributions systemd, tels\nque sont maintenant la plupart des Debian, et Ubuntu, il faut modifier\nle masque système dans le propre fichier de configuration du service à\nconfigurer.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# sed -i -e \u0026quot;s#umask 022#umask 027#\u0026quot; /etc/init.d/rc\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eTant qu\u0026rsquo;à faire, profitons-en pour modifier la valeur du \u003cstrong\u003e\u003ccode\u003eumask\u003c/code\u003e utilisateurs\u003c/strong\u003e\nqui doit être paramétré à \u003ccode\u003e077\u003c/code\u003e !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour les distributions systemd, c\u0026rsquo;est le fichier \u003ccode\u003e/etc/profile\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ePour les distributions non systemd, c\u0026rsquo;est le fichier \u003ccode\u003e/etc/login.defs\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\u003cstrong\u003eATTENTION : Il est impératif de vérifier à chaque\nmise-à-jour de version de distribution, car ces droits seront réinitialisés\npar défaut !\u003c/strong\u003e\u003c/div\u003e\n\n\u003chr\u003e\n","summary":"Comment résoudre la suggestion de l'outil de détection Lynis : Default umask like 027 [AUTH-9328]","tags":["Lynis","auth","umask","detection"],"date_published":"2017-07-23T17:00:00+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-07-20:/fr/sec/scan/rkhunter#14acb1a90ac3ae0cb58f76ba977dfb5391f87d5ca6efb5764138410a4b027446","url":"https://it-log.fr.eu.org/fr/sec/scan/rkhunter/","title":"Rkhunter","author":{"name":"Stéphane HUC"},"content_text":"Description rkhunter: http://rkhunter.sourceforge.net Installation Sur une Debian, *Buntu (et assimilée), avec des droits administrateurs : # apt install rkhunter\nConfiguration /etc/rkhunter.conf Très classiquement, il faut éditer le fichier /etc/rkhunter.conf, toujours avec les droits administrateurs, pour changer quelques informations.\nSur Debian : MAIL-ON-WARNING=yourmail@yourdomain.com Sur Ubuntu : MAIL-ON-WARNING=\u0026quot;yourmail@yourdomain.com\u0026quot; Sur Ubuntu, pour une gestion liée à gestionnaire de paquets : PKGMGR=DPKG /etc/default/rkhunter L\u0026rsquo;autre fichier à éditer est le fichier /etc/default/rkhunter :\nCRON_DAILY_RUN=\u0026quot;true\u0026quot;, et REPORT_EMAIL=\u0026quot;yourmail@yourdomain.net\u0026quot;\nUtilisation Ceci étant fait, voici les différentes possibilités de l\u0026rsquo;utiliser :\nPour vérifier, avec l\u0026rsquo;option -c, --check ou --checkall - ces deux dernières options sont dépendantes de la version de rkhunter ! Pour mettre-à-jour rkhunter, utilisez l\u0026rsquo;option --update. Pour mettre-à-jour la base de donnée, après un changement dans la configuration du fichier /etc/rkhunter.conf, utilisez l\u0026rsquo;option --propupd. Documentation Manpage Pour en savoir plus, un coup de man rkhunter dans votre terminal console, vous en apprendra beaucoup plus… ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003erkhunter: \u003ca href=\"http://rkhunter.sourceforge.net\" rel=\"external\"\u003ehttp://rkhunter.sourceforge.net\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eSur une Debian, *Buntu \u003cem\u003e(et assimilée)\u003c/em\u003e, avec des droits administrateurs : \u003cbr\u003e\n\u003ccode\u003e# apt install rkhunter\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"etcrkhunterconf\"\u003e/etc/rkhunter.conf\u003c/h3\u003e\n\u003cp\u003eTrès classiquement, il faut \u003cstrong\u003eéditer le fichier\u003c/strong\u003e \u003ccode\u003e/etc/rkhunter.conf\u003c/code\u003e,\ntoujours \u003cstrong\u003eavec les droits administrateurs\u003c/strong\u003e, pour changer quelques informations.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSur Debian : \u003ccode\u003eMAIL-ON-WARNING=yourmail@yourdomain.com\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSur Ubuntu : \u003ccode\u003eMAIL-ON-WARNING=\u0026quot;yourmail@yourdomain.com\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSur Ubuntu, pour une gestion liée à gestionnaire de paquets : \u003ccode\u003ePKGMGR=DPKG\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"etcdefaultrkhunter\"\u003e/etc/default/rkhunter\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;autre fichier à éditer est le fichier \u003ccode\u003e/etc/default/rkhunter\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eCRON_DAILY_RUN=\u0026quot;true\u0026quot;\u003c/code\u003e, et \u003cbr\u003e\n\u003ccode\u003eREPORT_EMAIL=\u0026quot;yourmail@yourdomain.net\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eCeci étant fait, voici les différentes possibilités de l\u0026rsquo;utiliser :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePour vérifier\u003c/strong\u003e, avec l\u0026rsquo;option \u003ccode\u003e-c\u003c/code\u003e, \u003ccode\u003e--check\u003c/code\u003e ou \u003ccode\u003e--checkall\u003c/code\u003e - \u003cem\u003eces\ndeux dernières options sont dépendantes de la version de rkhunter !\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePour mettre-à-jour rkhunter\u003c/strong\u003e, utilisez l\u0026rsquo;option \u003ccode\u003e--update\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePour mettre-à-jour la base de donnée\u003c/strong\u003e, après un changement dans la\nconfiguration du fichier \u003ccode\u003e/etc/rkhunter.conf\u003c/code\u003e, utilisez l\u0026rsquo;option \u003ccode\u003e--propupd\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003ch3 id=\"manpage\"\u003eManpage\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ePour en savoir plus, un coup de \u003ccode\u003eman rkhunter\u003c/code\u003e dans votre terminal console,\nvous en apprendra beaucoup plus…\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Installation et configuration de l'outil de détection des rootkits rkhunter","tags":["rkhunter","detection"],"date_published":"2017-07-20T13:10:37+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2017-05-09:/fr/trad/openbsd-libreboot#07006674ad83cc639b64eb1f1f7606a7a15d3bccd7eff35747f45fe71186cb5c","url":"https://it-log.fr.eu.org/fr/trad/openbsd-libreboot/","title":"Installer LibertyBSD ou OpenBSD sur un système libreboot","author":{"name":"Stéphane HUC"},"content_text":"Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article dispary \u0026ldquo;How to install LibertyBSD or OpenBSD on a libreboot system\u0026rdquo;, écrit sur le site \u0026lsquo;Libreboot.org\u0026rsquo;.\nInstaller LibertyBSD ou OpenBSD sur un système libreboot NOTE : Ce guide a été écrit pour OpenBSD par la personne qui a contribué, mais le projet libreboot recommande LibertyBSD. LibertyBSD est une version d\u0026rsquo;OpenBSD sans logiciel propriétaire dans les dépôts ( OpenBSD distribue les micro-programmes blob pour les périphériques à l\u0026rsquo;intérieur du noyau ). Allez sur le site web de LibertyBSD\nÀ FAIRE : testez sur LibertyBSD en priorité dans ce guide.\nCette section relate la préparation, le démarrage et l\u0026rsquo;installation d\u0026rsquo;OpenBSD sur votre système libreboot, n\u0026rsquo;utilisant rien de plus qu\u0026rsquo;une clé USB (et dd). Cette procédure a été testée seulement sur un Lenovo ThinkPad x200.\nCette section est seulement en rapport avec GRUB. Pour depthcharge (utilisé sur les périphériques CrOS dans libreboot), les instructions doivent encore être écrites dans la documentation de libreboot.\ninstall60.fs est l\u0026rsquo;image d\u0026rsquo;installation d\u0026rsquo;OpenBSD 6.0. Adaptez le nom du fichier selon que vous utilisez une version différente d\u0026rsquo;OpenBSD ou LibertyBSD.\nPréparer le périphérique USB (dans LibertyBSD ou OpenBSD) Si vous avez téléchargé votre ISO d\u0026rsquo;un système LibertyBSD ou OpenBSD, voici comment créer un périphérique USB de LibertyBSD/OpenBSD démarrable :\nConnectez le périphérique USB. Vérifiez dmesg :\n$ dmesg | tail\nVérifiez pour confirmer quelle unité de disque est utilisée, par exemple, si vous pensez que cela est sd3 :\n$ disklabel sd3\nVérifiez qu\u0026rsquo;il n\u0026rsquo;a pas été monté automatiquement. Si cela était le cas, démontez-le. Par exemple :\n$ doas umount /dev/sd3i\ndmesg vous dit quel est le périphérique. Écrasez le lecteur, en écrivant l\u0026rsquo;installeur d\u0026rsquo;OpenBSD avec dd. Par exemple :\n$ doas dd if=install60.fs of=/dev/rsdXc bs=1M; sync\nVous devriez maintenant être capable de démarrer l\u0026rsquo;installeur depuis votre périphérique USB. Continuez la lecture, pour information afin de savoir comment faire.\nPréparer le périphérique USB (dans NetBSD) Cette page sur le site web de NetBSD montre comment créer un périphérique USB NetBSD démarrable depuis NetBSD lui-même. Vous devriez utiliser la méthode dd documentée ici. Ceci fonctionne aussi avec l\u0026rsquo;image d\u0026rsquo;OpenBSD.\nPréparer le périphérique USB (dans FreeBSD) Cette page sur le site web de FreeBSD montre comment créer un périphérique USB démarrable pour installer FreeBSD. Utilisez dd sur cette page. Vous pouvez aussi utiliser les mêmes instructions avec une image ISO d\u0026rsquo;OpenBSD.\nPréparer le périphérique USB (dans GNU/Linux) Si vous avez téléchargé votre ISO sur un système GNU/Linux, voici comment créer le périphérique USB démarrable d\u0026rsquo;OpenBSD :\nConnectez le périphérique USB. Vérifiez dmesg :\n$ dmesg\nVérifiez lsblk pour confirmer quel lecteur est utilisé :\n$ lsblk\nVérifiez qu\u0026rsquo;il n\u0026rsquo;a pas été monté automatiquement. Si cela était, démontez-le. Par exemple :\n$ sudo umount /dev/sdX\\* # umount /dev/sdX\\* dmesg vous dit quel est le périphérique. Écrasez le lecteur, en écrivant l\u0026rsquo;installeur d\u0026rsquo;OpenBSD avec dd. Par exemple :\n$ sudo dd if=install60.fs of=/dev/sdX bs=8M; sync # dd if=install60.fs of=/dev/sdX bs=8M; sync Vous devriez maintenant être capable de démarrer l\u0026rsquo;installeur depuis votre périphérique USB. Continuez la lecture, pour information afin de savoir comment faire.\nInstaller OpenBSD sans chiffrement du disque dur Pressez la touche \u0026lt;kbd\u0026gt;c\u0026lt;/kbd\u0026gt; dans GRUB pour accéder à la ligne de commande :\ngrub\u0026gt; kopenbsd (usb0,openbsd1)/6.0/amd64/bsd.rd grub\u0026gt; boot Cela démarrera l\u0026rsquo;installeur d\u0026rsquo;OpenBSD. Suivez le processus normal pour installer OpenBSD.\nInstaller OpenBSD avec le chiffrement de disque dur Cela ne fonctionne pas. Vous pouvez modifier la procédure ci-dessus (celle de l\u0026rsquo;installation sans chiffrement) pour installer OpenBSD en utilisant le chiffrement de disque dur, et cela semble fonctionner, excepté que démarrer une installation d\u0026rsquo;OpenBSD + FDE en utilisant libreboot+Grub2 n\u0026rsquo;est pas clair. Si pour vous cela fonctionne, veuillez nous le faire savoir.\nSi démarrer en mode texte (le mode framebuffer pourrait également fonctionner aussi), il est possible de charger le chargeur de démarrage d\u0026rsquo;OpenBSD ou de LibertyBSD depuis le secteur MBR sur le périphérique de stockage interne. De cette manière, il serait possible de démarrer avec une installation d\u0026rsquo;OpenBSD ou de LibertyBSD chiffrée. Veuillez nous faire savoir ( les détails de contact sont sur la page d\u0026rsquo;accueil de libreboot ) si vous arrivez à le faire fonctionner ainsi.\nAlternativement, ce serait une bonne chose de porter OpenBSD à ce qu\u0026rsquo;il prenne en charge nativement coreboot, ou de porter la libpayload (la bibliothèque de chargement dans coreboot ; c\u0026rsquo;est une bibliothèque C basique et quelques fonctions pour certaines opérations, tel que text/bitmap). Cela serait idéal, parce qu\u0026rsquo;il serait possible de démarrer vraiment une installation d\u0026rsquo;OpenBSD ou de LibertyBSD pleinement chiffrée, en mettant tout dans la puce flash.\nAlternativement, modifier GRUB pour supporter le démarrage d\u0026rsquo;installations d\u0026rsquo;OpenBSD pleinement chiffrées serait possible, mais probablement pas faisable ; c\u0026rsquo;est une base de code étrangère au projet OpenBSD, pas bien intégrée, d\u0026rsquo;autant que le chargeur de démarrage d\u0026rsquo;OpenBSD est déjà fonctionnel.\nDémarrer Pressez la touche c dans GRUB pour accéder à la ligne de commande :\ngrub\u0026gt; kopenbsd -r sd0a (ahci0,openbsd1)/bsd grub\u0026gt; boot OpenBSD devrait démarrer. Excellent !\nConfigurer Grub Si vous ne voulez pas utiliser la ligne de commande GRUB et de taper une commande au démarrage d\u0026rsquo;OpenBSD à chaque fois, vous pouvez créer une configuration GRUB qui tiendra compte de votre installation d\u0026rsquo;OpenBSD et qui sera utilisée automatiquement par libreboot.\nSur votre partition racine d\u0026rsquo;OpenBSD, créez le répertoire /grub et ajoutez-le au fichier libreboot_grub.cfg. Ajoutez ces lignes à l\u0026rsquo;intérieur de libreboot_grub.cfg :\ndefault=0 timeout=3 menuentry \u0026#34;OpenBSD\u0026#34; { kopenbsd -r sd0a (ahci0,openbsd1)/bsd } Lors de votre prochain démarrage, vous verrez le menu du vieux Grub pendant quelques secondes, puis vous verrez le nouveau menu avec seulement OpenBSD dans la liste. Après 3 secondes OpenBSD démarrera, ou vous pouvez le sélectionner en appuyant sur la touche ENTRÉE pour démarrer.\nDépannage La plupart de ces problèmes arrivent par l\u0026rsquo;usage de libreboot avec le mode texte de coreboot en lieu et place du mode framebuffer de coreboot. Ce mode est utile pour le démarrage de charge utile tel que memtest86+ qui ont besoin du mode texte, mais pour OpenBSD, cela est problématique lors de la bascule vers le mode framebuffer, car non supporté.\nDans la plupart des cas, vous devriez utiliser les images ROM vesafb. Exemple de nom de fichier : libreboot_ukdvorak_vesafb.rom.\nCela ne veut pas démarrer\u0026hellip; quelque chose à-propos d\u0026rsquo;un fichier non trouvé\nVos noms et numéros de périphériques (tels que usb0, usb1, sd0, sd1, wd0, ahci0, hd0, etc\u0026hellip;) peuvent différer. Utilisez la complétion TAB.\nCopyright Copyright © 2016 Scott Bonds scott@ggr.com Copyright © 2016 Leah Rowe info@minifree.org Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License Version 1.3 or any later version published by the Free Software Foundation with no Invariant Sections, no Front Cover Texts, and no Back Cover Texts. A copy of this license is found in ../fdl-1.3.html\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 dispary\n\u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://web.archive.org/web/20161014161119/https://libreboot.org/docs/bsd/openbsd.html\" rel=\"external\"\u003eHow to install LibertyBSD or OpenBSD on a libreboot system\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit sur le site \u0026lsquo;Libreboot.org\u0026rsquo;.\u003c/p\u003e\n\u003chr\u003e\n\u003ch1 id=\"installer-libertybsd-ou-openbsd-sur-un-système-libreboot\"\u003eInstaller LibertyBSD ou OpenBSD sur un système libreboot\u003c/h1\u003e\n\u003cp\u003eNOTE : Ce guide a été écrit pour OpenBSD par la personne qui a contribué,\nmais le projet libreboot recommande LibertyBSD. LibertyBSD est une\nversion d\u0026rsquo;OpenBSD sans logiciel propriétaire dans les dépôts ( OpenBSD\ndistribue les micro-programmes blob pour les périphériques à l\u0026rsquo;intérieur\ndu noyau ). Allez sur le \u003ca href=\"http://libertybsd.net/\" rel=\"external\"\u003esite web de LibertyBSD\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eÀ FAIRE : testez sur LibertyBSD en priorité dans ce guide.\u003c/p\u003e\n\u003cp\u003eCette section relate la préparation, le démarrage et l\u0026rsquo;installation\nd\u0026rsquo;OpenBSD sur votre système libreboot, n\u0026rsquo;utilisant rien de plus qu\u0026rsquo;une\nclé USB (et \u003ccode\u003edd\u003c/code\u003e). Cette procédure a été testée seulement sur un Lenovo\nThinkPad x200.\u003c/p\u003e\n\u003cp\u003eCette section est seulement en rapport avec GRUB. Pour\n\u003cdel\u003edepthcharge\u003c/del\u003e (utilisé sur les périphériques CrOS dans libreboot),\nles instructions doivent encore être écrites dans la documentation de\nlibreboot.\u003c/p\u003e\n\u003cp\u003einstall60.fs est l\u0026rsquo;image d\u0026rsquo;installation d\u0026rsquo;OpenBSD 6.0. Adaptez le nom du\nfichier selon que vous utilisez une version différente d\u0026rsquo;OpenBSD ou\nLibertyBSD.\u003c/p\u003e\n\u003ch2 id=\"préparer-le-périphérique-usb-dans-libertybsd-ou-openbsd\"\u003ePréparer le périphérique USB (dans LibertyBSD ou OpenBSD)\u003c/h2\u003e\n\u003cp\u003eSi vous avez téléchargé votre ISO d\u0026rsquo;un système LibertyBSD ou OpenBSD,\nvoici comment créer un périphérique USB de LibertyBSD/OpenBSD démarrable :\u003c/p\u003e\n\u003cp\u003eConnectez le périphérique USB. Vérifiez dmesg :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ dmesg | tail\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVérifiez pour confirmer quelle unité de disque est utilisée, par exemple,\nsi vous pensez que cela est \u003ccode\u003esd3\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ disklabel sd3\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVérifiez qu\u0026rsquo;il n\u0026rsquo;a pas été monté automatiquement. Si cela était le cas,\ndémontez-le. Par exemple :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ doas umount /dev/sd3i\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003edmesg\u003c/code\u003e vous dit quel est le périphérique. Écrasez le lecteur, en\nécrivant l\u0026rsquo;installeur d\u0026rsquo;OpenBSD avec \u003ccode\u003edd\u003c/code\u003e. Par exemple :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ doas dd if=install60.fs of=/dev/rsdXc bs=1M; sync\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVous devriez maintenant être capable de démarrer l\u0026rsquo;installeur depuis\nvotre périphérique USB. Continuez la lecture, pour information afin de\nsavoir comment faire.\u003c/p\u003e\n\u003ch2 id=\"préparer-le-périphérique-usb-dans-netbsd\"\u003ePréparer le périphérique USB (dans NetBSD)\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://wiki.netbsd.org/tutorials/how_to_install_netbsd_from_an_usb_memory_stick/\" rel=\"external\"\u003eCette page\u003c/a\u003e\nsur le site web de NetBSD montre comment créer un périphérique USB\nNetBSD démarrable depuis NetBSD lui-même. Vous devriez utiliser la\nméthode dd documentée ici. Ceci fonctionne aussi avec l\u0026rsquo;image d\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003ch2 id=\"préparer-le-périphérique-usb-dans-freebsd\"\u003ePréparer le périphérique USB (dans FreeBSD)\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://www.freebsd.org/doc/handbook/bsdinstall-pre.html\" rel=\"external\"\u003eCette page\u003c/a\u003e\nsur le site web de FreeBSD montre comment créer un périphérique USB\ndémarrable pour installer FreeBSD. Utilisez dd sur cette page. Vous\npouvez aussi utiliser les mêmes instructions avec une image ISO d\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003ch2 id=\"préparer-le-périphérique-usb-dans-gnulinux\"\u003ePréparer le périphérique USB (dans GNU/Linux)\u003c/h2\u003e\n\u003cp\u003eSi vous avez téléchargé votre ISO sur un système GNU/Linux, voici\ncomment créer le périphérique USB démarrable d\u0026rsquo;OpenBSD :\u003c/p\u003e\n\u003cp\u003eConnectez le périphérique USB. Vérifiez dmesg :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ dmesg\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVérifiez \u003ccode\u003elsblk\u003c/code\u003e pour confirmer quel lecteur est utilisé :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ lsblk\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVérifiez qu\u0026rsquo;il n\u0026rsquo;a pas été monté automatiquement. Si cela était,\ndémontez-le. 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$ sudo umount /dev/sdX\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:#776e71\"\u003e# umount /dev/sdX\\*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003edmesg\u003c/code\u003e vous dit quel est le périphérique. Écrasez le lecteur, en\nécrivant l\u0026rsquo;installeur d\u0026rsquo;OpenBSD avec \u003ccode\u003edd\u003c/code\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$ sudo dd \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003einstall60.fs \u003cspan style=\"color:#ef6155\"\u003eof\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/dev/sdX \u003cspan style=\"color:#ef6155\"\u003ebs\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e8M; sync\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# dd if=install60.fs of=/dev/sdX bs=8M; sync\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVous devriez maintenant être capable de démarrer l\u0026rsquo;installeur depuis\nvotre périphérique USB. Continuez la lecture, pour information afin de\nsavoir comment faire.\u003c/p\u003e\n\u003ch2 id=\"installer-openbsd-sans-chiffrement-du-disque-dur\"\u003eInstaller OpenBSD sans chiffrement du disque dur\u003c/h2\u003e\n\u003cp\u003ePressez la touche \u003ccode\u003e\u0026lt;kbd\u0026gt;c\u0026lt;/kbd\u0026gt;\u003c/code\u003e dans \u003ccode\u003eGRUB\u003c/code\u003e pour accéder à la ligne de\ncommande :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-grub\" data-lang=\"grub\"\u003egrub\u0026gt; kopenbsd (usb0,openbsd1)/6.0/amd64/bsd.rd\ngrub\u0026gt; boot\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCela démarrera l\u0026rsquo;installeur d\u0026rsquo;OpenBSD. Suivez le processus normal pour\ninstaller OpenBSD.\u003c/p\u003e\n\u003ch2 id=\"installer-openbsd-avec-le-chiffrement-de-disque-dur\"\u003eInstaller OpenBSD avec le chiffrement de disque dur\u003c/h2\u003e\n\u003cp\u003eCela ne fonctionne pas. Vous pouvez modifier la procédure ci-dessus\n(celle de l\u0026rsquo;installation sans chiffrement) pour installer OpenBSD en\nutilisant le chiffrement de disque dur, et cela semble fonctionner,\nexcepté que démarrer une installation d\u0026rsquo;OpenBSD + FDE en utilisant\nlibreboot+Grub2 n\u0026rsquo;est pas clair. Si pour vous cela fonctionne, veuillez\nnous le faire savoir.\u003c/p\u003e\n\u003cp\u003eSi démarrer en mode texte (le mode framebuffer pourrait également\nfonctionner aussi), il est possible de charger le chargeur de démarrage\nd\u0026rsquo;OpenBSD ou de LibertyBSD depuis le secteur MBR sur le périphérique de\nstockage interne. De cette manière, il serait possible de démarrer avec\nune installation d\u0026rsquo;OpenBSD ou de LibertyBSD chiffrée. Veuillez nous\nfaire savoir ( les détails de contact sont sur la page d\u0026rsquo;accueil de\nlibreboot ) si vous arrivez à le faire fonctionner ainsi.\u003c/p\u003e\n\u003cp\u003eAlternativement, ce serait une bonne chose de porter OpenBSD à ce qu\u0026rsquo;il\nprenne en charge nativement coreboot, ou de porter la libpayload (la\nbibliothèque de chargement dans coreboot ;  c\u0026rsquo;est une bibliothèque C\nbasique et quelques fonctions pour certaines opérations, tel que text/bitmap).\nCela serait idéal, parce qu\u0026rsquo;il serait possible de démarrer vraiment une\ninstallation d\u0026rsquo;OpenBSD ou de LibertyBSD pleinement chiffrée, en mettant\ntout dans la puce flash.\u003c/p\u003e\n\u003cp\u003eAlternativement, modifier GRUB pour supporter le démarrage\nd\u0026rsquo;installations d\u0026rsquo;OpenBSD pleinement chiffrées serait possible, mais\nprobablement pas faisable ; c\u0026rsquo;est une base de code étrangère au projet\nOpenBSD, pas bien intégrée, d\u0026rsquo;autant que le chargeur de démarrage\nd\u0026rsquo;OpenBSD est déjà fonctionnel.\u003c/p\u003e\n\u003ch2 id=\"démarrer\"\u003eDémarrer\u003c/h2\u003e\n\u003cp\u003ePressez la touche \u003ckbd\u003ec\u003c/kbd\u003e dans \u003ccode\u003eGRUB\u003c/code\u003e pour accéder à la ligne de\ncommande :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-grub\" data-lang=\"grub\"\u003egrub\u0026gt; kopenbsd -r sd0a (ahci0,openbsd1)/bsd\ngrub\u0026gt; boot\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOpenBSD devrait démarrer. Excellent !\u003c/p\u003e\n\u003ch2 id=\"configurer-grub\"\u003eConfigurer Grub\u003c/h2\u003e\n\u003cp\u003eSi vous ne voulez pas utiliser la ligne de commande GRUB et de taper une\ncommande au démarrage d\u0026rsquo;OpenBSD à chaque fois, vous pouvez créer une\nconfiguration GRUB qui tiendra compte de votre installation d\u0026rsquo;OpenBSD et\nqui sera utilisée automatiquement par libreboot.\u003c/p\u003e\n\u003cp\u003eSur votre partition racine d\u0026rsquo;OpenBSD, créez le répertoire \u003ccode\u003e/grub\u003c/code\u003e et\najoutez-le au fichier \u003ccode\u003elibreboot_grub.cfg\u003c/code\u003e. Ajoutez ces lignes à\nl\u0026rsquo;intérieur de \u003ccode\u003elibreboot_grub.cfg\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\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e0 timeout=3 menuentry \u0026#34;OpenBSD\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\"\u003ekopenbsd -r sd0a (ahci0,openbsd1)/bsd \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\u003eLors de votre prochain démarrage, vous verrez le menu du vieux Grub\npendant quelques secondes, puis vous verrez le nouveau menu avec\nseulement OpenBSD dans la liste. Après 3 secondes OpenBSD démarrera, ou\nvous pouvez le sélectionner en appuyant sur la touche \u003ckbd\u003eENTRÉE\u003c/kbd\u003e\npour démarrer.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003cp\u003eLa plupart de ces problèmes arrivent par l\u0026rsquo;usage de libreboot avec le\nmode texte de coreboot en lieu et place du mode framebuffer de coreboot.\nCe mode est utile pour le démarrage de charge utile tel que memtest86+\nqui ont besoin du mode texte, mais pour OpenBSD, cela est problématique\nlors de la bascule vers le mode framebuffer, car non supporté.\u003c/p\u003e\n\u003cp\u003eDans la plupart des cas, vous devriez utiliser les images ROM vesafb.\nExemple de nom de fichier : \u003ccode\u003elibreboot_ukdvorak_vesafb.rom\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"cela-ne-veut-pas-démarrer-quelque-chose-à-propos-dun-fichier-non\"\u003eCela ne veut pas démarrer\u0026hellip; quelque chose à-propos d\u0026rsquo;un fichier non\u003c/h3\u003e\n\u003cp\u003etrouvé\u003c/p\u003e\n\u003cp\u003eVos noms et numéros de périphériques (tels que usb0, usb1, sd0, sd1, wd0,\nahci0, hd0, etc\u0026hellip;) peuvent différer. Utilisez la complétion \u003ckbd\u003eTAB\u003c/kbd\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"copyright\"\u003eCopyright\u003c/h2\u003e\n\u003cp\u003eCopyright © 2016 Scott Bonds \u003ca href=\"mailto:scott@ggr.com\" rel=\"external\"\u003escott@ggr.com\u003c/a\u003e \u003cbr\u003e\nCopyright © 2016 Leah Rowe \u003ca href=\"mailto:info@minifree.org\" rel=\"external\"\u003einfo@minifree.org\u003c/a\u003e \u003cbr\u003e\nPermission is granted to copy, distribute and/or modify this document\nunder the terms of the GNU Free Documentation License Version 1.3 or any\nlater version published by the Free Software Foundation with no Invariant\nSections, no Front Cover Texts, and no Back Cover Texts. A copy of this\nlicense is found in \u003ca href=\"https://libreboot.org/docs/fdl-1.3.html\" rel=\"external\"\u003e../fdl-1.3.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 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 disparu 'How to install LibertyBSD or OpenBSD on a libreboot system' du site 'libreboot.org'","tags":["Traduction","OpenBSD","Libreboot"],"date_published":"2017-05-09T13:43:51+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/tip-tray-volume#50356cbbe341d7f763eebea5fca6525878de95952b94a1ec0e8b1c045f059d31","url":"https://it-log.fr.eu.org/fr/sys/openbsd/tip-tray-volume/","title":"Gestion de l'icône de volume dans la barre de notifications sous OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"Description Petit script pour avoir une icône dans la barre de notifications et régler le volume sonore. Il est destiné aux environnements minimalistes comme fluxbox, et ne dépend donc de rien en particulier sauf python et gi.\nIl est tout vilain, n\u0026rsquo;hésitez pas à l\u0026rsquo;améliorer ;)\n#!/usr/local/bin/python3 import os import sys from gi import require_version require_version(\u0026#34;Gtk\u0026#34;, \u0026#34;3.0\u0026#34;) from gi.repository import Gtk, Gdk name=\u0026#34;Volume\u0026#34; def get_lvl(): cmd = \u0026#34;mixerctl -n outputs.master\u0026#34; result = os.popen(cmd) result = result.readline().split(\u0026#34;,\u0026#34;)[0] lvl= int(int(result)/255*100) return lvl def get_mute(): cmd = \u0026#34;mixerctl -n outputs.master.mute\u0026#34; result = os.popen(cmd) result = result.readline().strip() return(result) class Menu: def destroy(self, widget, data=None): Gtk.main_quit() def set_icon(self): if get_mute() == \u0026#34;on\u0026#34;: self.tray.set_from_icon_name(\u0026#34;stock_volume-mute\u0026#34;) else: lvl = get_lvl() if lvl == 0: self.tray.set_from_icon_name(\u0026#34;stock_volume-0\u0026#34;) elif lvl \u0026lt; 20: self.tray.set_from_icon_name(\u0026#34;stock_volume-min\u0026#34;) elif lvl \u0026lt; 70: self.tray.set_from_icon_name(\u0026#34;stock_volume-med\u0026#34;) elif lvl \u0026gt; 70: self.tray.set_from_icon_name(\u0026#34;stock_volume-max\u0026#34;) def __init__(self): get_mute() self.tray = Gtk.StatusIcon() self.set_icon() self.tray.connect(\u0026#39;popup-menu\u0026#39;, self.on_right_click) self.tray.connect(\u0026#39;activate\u0026#39;, self.on_left_click) self.tray.connect(\u0026#39;scroll_event\u0026#39;, self.on_scroll) self.tray.set_tooltip_text(\u0026#39;Volume : {}%\u0026#39;.format(get_lvl())) def on_scroll(self, widget, event): if event.direction == Gdk.ScrollDirection.DOWN: os.system(\u0026#34;mixerctl outputs.master=-10\u0026#34;) elif event.direction == Gdk.ScrollDirection.UP: os.system(\u0026#34;mixerctl outputs.master=+10\u0026#34;) self.set_icon() def on_left_click(self, event): os.system(\u0026#34;mixerctl outputs.master.mute=toggle\u0026#34;) self.set_icon() def on_right_click(self, icon, button, time): # Quit-menu item self.menu = Gtk.Menu() box = Gtk.Box() box.set_spacing(10) img = Gtk.Image() img.set_from_stock(Gtk.STOCK_CANCEL, Gtk.IconSize.MENU) label = Gtk.Label(\u0026#34;Quit\u0026#34;) box.add(img) box.add(label) quit = Gtk.MenuItem() quit.add(box) quit.connect(\u0026#34;activate\u0026#34;, Gtk.main_quit) self.menu.append(quit) self.menu.show_all() self.menu.popup(None, None, None, self.tray, button, time) def main(self): Gtk.main() if __name__ == \u0026#34;__main__\u0026#34;: app = Menu() app.main() 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\u003ePetit script pour avoir une icône dans la barre de notifications et\nrégler le volume sonore. Il est destiné aux environnements minimalistes\ncomme \u003ca href=\"http://fluxbox.org/\" rel=\"external\"\u003efluxbox\u003c/a\u003e, et ne dépend donc de rien en\nparticulier sauf python et gi.\u003c/p\u003e\n\u003cp\u003eIl est tout vilain, n\u0026rsquo;hésitez pas à l\u0026rsquo;améliorer ;)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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#!/usr/local/bin/python3\u003c/span\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\"\u003eos\u003c/span\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\"\u003esys\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\"\u003egi\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e require_version\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erequire_version(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Gtk\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;3.0\u0026#34;\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\"\u003egi.repository\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e Gtk, Gdk\n\u003c/span\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\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Volume\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\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eget_lvl\u003c/span\u003e():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    cmd \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;mixerctl -n outputs.master\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    result \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e os\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epopen(cmd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    result \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e result\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ereadline()\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esplit(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;,\u0026#34;\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    lvl\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e int(int(result)\u003cspan style=\"color:#5bc4bf\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e255\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e100\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 lvl\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eget_mute\u003c/span\u003e():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    cmd \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;mixerctl -n outputs.master.mute\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    result \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e os\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epopen(cmd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    result \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e result\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ereadline()\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003estrip()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e(result)\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eMenu\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\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\"\u003edestroy\u003c/span\u003e(self, widget, data\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003eNone\u003c/span\u003e):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        Gtk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emain_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    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eset_icon\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e get_mute() \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;on\u0026#34;\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\u003etray\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eset_from_icon_name(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;stock_volume-mute\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            lvl \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e get_lvl()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e lvl \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                self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etray\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eset_from_icon_name(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;stock_volume-0\u0026#34;\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 lvl \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e20\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\u003etray\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eset_from_icon_name(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;stock_volume-min\u0026#34;\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 lvl \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e70\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\u003etray\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eset_from_icon_name(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;stock_volume-med\u0026#34;\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 lvl \u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e70\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\u003etray\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eset_from_icon_name(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;stock_volume-max\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\n\u003c/span\u003e\u003c/span\u003e\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):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        get_mute()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etray \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Gtk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eStatusIcon()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eset_icon()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etray\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003econnect(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;popup-menu\u0026#39;\u003c/span\u003e, self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eon_right_click)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etray\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003econnect(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;activate\u0026#39;\u003c/span\u003e, self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eon_left_click)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etray\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003econnect(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;scroll_event\u0026#39;\u003c/span\u003e, self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eon_scroll)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etray\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eset_tooltip_text(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Volume : \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(get_lvl()))\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eon_scroll\u003c/span\u003e(self, widget, event):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e event\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edirection \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e Gdk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eScrollDirection\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eDOWN:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            os\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esystem(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;mixerctl outputs.master=-10\u0026#34;\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 event\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003edirection \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e Gdk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eScrollDirection\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eUP:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            os\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esystem(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;mixerctl outputs.master=+10\u0026#34;\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\u003eset_icon()\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eon_left_click\u003c/span\u003e(self, event):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        os\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esystem(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;mixerctl outputs.master.mute=toggle\u0026#34;\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\u003eset_icon()\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eon_right_click\u003c/span\u003e(self, icon, button, time):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e# Quit-menu item\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\u003emenu \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Gtk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eMenu()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        box \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Gtk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eBox()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        box\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eset_spacing(\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        img \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Gtk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eImage()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        img\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eset_from_stock(Gtk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eSTOCK_CANCEL, Gtk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eIconSize\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eMENU)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        label \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Gtk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eLabel(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Quit\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        box\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eadd(img)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        box\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eadd(label)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        quit \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Gtk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eMenuItem()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        quit\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eadd(box)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        quit\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003econnect(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;activate\u0026#34;\u003c/span\u003e, Gtk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emain_quit)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emenu\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eappend(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        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emenu\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eshow_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        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emenu\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003epopup(\u003cspan style=\"color:#815ba4\"\u003eNone\u003c/span\u003e, \u003cspan style=\"color:#815ba4\"\u003eNone\u003c/span\u003e, \u003cspan style=\"color:#815ba4\"\u003eNone\u003c/span\u003e, self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etray, button, time)\n\u003c/span\u003e\u003c/span\u003e\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\"\u003emain\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        Gtk\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emain()\n\u003c/span\u003e\u003c/span\u003e\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:#ef6155\"\u003e__name__\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;__main__\u0026#34;\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     app \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e Menu()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     app\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emain()\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":"Une astuce pour gérer le volume audio sous OpenBSD","tags":["OpenBSD","Astuce","Audio"],"date_published":"2016-12-10T22:01:11+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/dell-alienware-13#3a2053300f4cfdbb8a453eb59a16fb4f163951806f6092d2ff0077655fe62a74","url":"https://it-log.fr.eu.org/fr/sys/openbsd/dell-alienware-13/","title":"Dell Alienware 13","author":{"name":"Stéphane HUC"},"content_text":"Description Je ne parlerais pas de l\u0026rsquo;installation d\u0026rsquo;OpenBSD en soit. Je fais fonctionner ce portable sous OpenBSD depuis mes débuts avec la 5.9 !\nCet Alienware AW13 est la première génération.\nNeofetch vue OpenBSD 6.6 Ce qui fonctionne Intel Audio Intel CPU - l\u0026rsquo;Hyper-Threading est désactivé par défaut par le système ; la virtualisation fonctionne (support VMX/EPT) ! Intel GPU La carte réseau \u0026ldquo;Attansic Technology E2200\u0026rdquo; AR8035 10/100/1000 PHY, rev. 9 : firmware alc depuis OpenBSD 6.6 le \u0026ldquo;touchpad\u0026rdquo; - gestion du pointeur : OK ; pas les \u0026ldquo;boutons\u0026rdquo;. USB EHCI, XHCI (2.x et 3) Webcam - depuis OpenBSD 6.4 InfoPour avoir du réseau, jusqu\u0026rsquo;à OpenBSD 6.6, j\u0026rsquo;étais obligé d\u0026rsquo;utiliser un adaptateur USB\u0026lt;-\u0026gt;Ethernet… pris en charge par le firmware axe , reconnu comme \u0026ldquo;ASIX Electronics AX88772\u0026rdquo; rev 2.00/0.01. Modifications systèmes nécessaires Certaines modifications systèmes sont nécessaires.\nFichier /etc/sysctl.conf InfoCe problème semble être réglé depuis OpenBSD 6.6 : en effet, une réinstallation de zéro fonctionne correctement (ce qui n\u0026rsquo;était pas le cas avec les versions précédentes) ! Sous OpenBSD 6.4 \u0026amp; 6.5, il y a un problème avec l\u0026rsquo;horloge matérielle, ce qui a pour conséquence que la saisie de caractères se retrouve démultiplier en session X.\nPour le régler, il faut ajouter au fichier /etc/sysctl.conf : kern.timecounter.hardware=acpihpet0\nFichier /etc/wsconsctl.conf display.vblank=on mouse.tp.tapping=1 La première option améliore l\u0026rsquo;affichage vblank. La deuxième améliore la saisie des boutons de souris. Fichier /etc/X11/xorg.conf Il y a un soucis de \u0026ldquo;tearing\u0026rdquo;, problème d\u0026rsquo;accélération graphique avec le GPU Intel, c-à-d des saccades.\nIl est donc nécessaire de créer le fichier /etc/X11/xorg.conf et de le remplir ainsi :\nSection \u0026#34;Device\u0026#34; Identifier \u0026#34;intel\u0026#34; Driver \u0026#34;intel\u0026#34; Option \u0026#34;HotPlug\u0026#34; \u0026#34;true\u0026#34; Option \u0026#34;TearFree\u0026#34; \u0026#34;true\u0026#34; #false by default (avoid tearing) EndSection C\u0026rsquo;est l\u0026rsquo;option TearFree qui règle le problème. L\u0026rsquo;option HotPlug prend en charge les périphériques qui se montent à chaud… Ce qui ne fonctionne pas Le Bluetooth - le support a été supprimé dans OpenBSD pour des raisons de sécurité depuis longtemps La puce Wifi, une \u0026ldquo;Atheros\u0026rdquo; : vendor \u0026ldquo;Atheros\u0026rdquo;, unknown product 0x003e (class network subclass miscellaneous, rev 0x20) Nvidia GPU, technologie Optimus - ne sera jamais pris en charge, tant que ladite société ne libérera pas les sources. dmesg OpenBSD 6.6 (GENERIC.MP) #372: Sat Oct 12 10:56:27 MDT 2019 deraadt@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP real mem = 8487260160 (8094MB) avail mem = 8217325568 (7836MB) mpath0 at root scsibus0 at mpath0: 256 targets mainbus0 at root bios0 at mainbus0: SMBIOS rev. 2.8 @ 0xec580 (74 entries) bios0: vendor Alienware version \u0026#34;A08\u0026#34; date 01/25/2018 bios0: Alienware Alienware 13 acpi0 at bios0: ACPI 5.0 acpi0: sleep states S0 S3 S4 S5 acpi0: tables DSDT FACP APIC FPDT FIDT MCFG HPET SSDT UEFI SSDT ASF! SLIC SSDT SSDT SSDT SSDT CSRT SSDT acpi0: wakeup devices PEG0(S4) PEGP(S4) PEG1(S4) PEGP(S4) PEG2(S4) PEGP(S4) RP01(S4) PXSX(S4) RP02(S4) PXSX(S4) RP03(S4) PXSX(S4) RP04(S4) PXSX(S4) RP05(S4) PEGP(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) Core(TM) i5-4210U CPU @ 1.70GHz, 799.46 MHz, 06-45-01 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,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,PERF,ITSC,FSGSBASE,TSC_ADJUST,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MD_CLEAR,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,MELTDOWN cpu0: 256KB 64b/line 8-way L2 cache cpu0: smt 0, core 0, package 0 mtrr: Pentium Pro MTRR support, 10 var ranges, 88 fixed ranges cpu0: apic clock running at 99MHz cpu0: mwait min=64, max=64, C-substates=0.2.1.2.4.1.1.1, IBE cpu1 at mainbus0: apid 2 (application processor) cpu1: Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz, 799.32 MHz, 06-45-01 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,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,PERF,ITSC,FSGSBASE,TSC_ADJUST,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MD_CLEAR,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,MELTDOWN cpu1: 256KB 64b/line 8-way L2 cache cpu1: smt 0, core 1, package 0 cpu2 at mainbus0: apid 1 (application processor) cpu2: Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz, 799.31 MHz, 06-45-01 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,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,PERF,ITSC,FSGSBASE,TSC_ADJUST,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MD_CLEAR,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,MELTDOWN cpu2: 256KB 64b/line 8-way L2 cache cpu2: smt 1, core 0, package 0 cpu3 at mainbus0: apid 3 (application processor) cpu3: Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz, 799.31 MHz, 06-45-01 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,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,PERF,ITSC,FSGSBASE,TSC_ADJUST,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MD_CLEAR,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,MELTDOWN cpu3: 256KB 64b/line 8-way L2 cache cpu3: smt 1, core 1, package 0 ioapic0 at mainbus0: apid 2 pa 0xfec00000, version 20, 40 pins acpimadt0: bogus nmi for apid 0 acpimadt0: bogus nmi for apid 2 acpimadt0: bogus nmi for apid 1 acpimadt0: bogus nmi for apid 3 acpimcfg0 at acpi0 acpimcfg0: addr 0xf8000000, bus 0-63 acpihpet0 at acpi0: 14318179 Hz acpiprt0 at acpi0: bus 0 (PCI0) acpiprt1 at acpi0: bus -1 (PEG0) acpiprt2 at acpi0: bus -1 (PEG1) acpiprt3 at acpi0: bus -1 (PEG2) acpiprt4 at acpi0: bus -1 (RP01) acpiprt5 at acpi0: bus -1 (RP02) acpiprt6 at acpi0: bus 1 (RP03) acpiprt7 at acpi0: bus 2 (RP04) acpiprt8 at acpi0: bus 3 (RP05) acpiprt9 at acpi0: bus -1 (RP06) acpiprt10 at acpi0: bus -1 (RP07) acpiprt11 at acpi0: bus -1 (RP08) acpiec0 at acpi0: not present acpiec1 at acpi0 acpicpu0 at acpi0: C2(200@148 mwait.1@0x33), C1(1000@1 mwait.1) acpicpu1 at acpi0: C2(200@148 mwait.1@0x33), C1(1000@1 mwait.1) acpicpu2 at acpi0: C2(200@148 mwait.1@0x33), C1(1000@1 mwait.1) acpicpu3 at acpi0: C2(200@148 mwait.1@0x33), C1(1000@1 mwait.1) acpipwrres0 at acpi0: PG00, resource for PEG0 acpipwrres1 at acpi0: PG01, resource for PEG1 acpipwrres2 at acpi0: PG02, resource for PEG2 acpipwrres3 at acpi0: PC05, resource for RP05 acpitz0 at acpi0: critical temperature is 105 degC acpitz1 at acpi0: critical temperature is 105 degC acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001 acpicmos0 at acpi0 \u0026#34;INT3403\u0026#34; at acpi0 not configured acpibat0 at acpi0: BAT1 model \u0026#34;PABAS0241231\u0026#34; serial 0x75d1 type Li-Ion oem \u0026#34;TOSHIBA\u0026#34; acpiac0 at acpi0: AC unit online acpibtn0 at acpi0: LID0 \u0026#34;INT33C7\u0026#34; at acpi0 not configured \u0026#34;INTL9C60\u0026#34; at acpi0 not configured dwiic0 at acpi0 I2C1 addr 0xfe105000/0x1000 irq 7 iic0 at dwiic0 ihidev0 at iic0 addr 0x2cdwiic0: timed out reading remaining 29 , failed fetching initial HID descriptor \u0026#34;SMO8810\u0026#34; at acpi0 not configured \u0026#34;INT3402\u0026#34; at acpi0 not configured \u0026#34;PNP0C14\u0026#34; at acpi0 not configured acpibtn1 at acpi0: PWRB \u0026#34;PNP0C14\u0026#34; at acpi0 not configured \u0026#34;DELLABCE\u0026#34; at acpi0 not configured \u0026#34;PNP0C32\u0026#34; at acpi0 not configured \u0026#34;PNP0C32\u0026#34; at acpi0 not configured \u0026#34;PNP0C32\u0026#34; at acpi0 not configured \u0026#34;CPL0002\u0026#34; at acpi0 not configured \u0026#34;INT3400\u0026#34; at acpi0 not configured acpivideo0 at acpi0: GFX0 acpivout0 at acpivideo0: DD1F cpu0: using VERW MDS workaround (except on vmm entry) pci0 at mainbus0 bus 0 pchb0 at pci0 dev 0 function 0 \u0026#34;Intel Core 4G Host\u0026#34; rev 0x0b inteldrm0 at pci0 dev 2 function 0 \u0026#34;Intel HD Graphics\u0026#34; rev 0x0b drm0 at inteldrm0 inteldrm0: msi azalia0 at pci0 dev 3 function 0 \u0026#34;Intel Core 4G HD Audio\u0026#34; rev 0x0b: msi azalia0: No codecs found \u0026#34;Intel Core 4G Thermal\u0026#34; rev 0x0b at pci0 dev 4 function 0 not configured xhci0 at pci0 dev 20 function 0 \u0026#34;Intel 8 Series xHCI\u0026#34; rev 0x04: 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 8 Series MEI\u0026#34; rev 0x04 at pci0 dev 22 function 0 not configured azalia1 at pci0 dev 27 function 0 \u0026#34;Intel 8 Series HD Audio\u0026#34; rev 0x04: msi azalia1: codecs: Realtek/0x0255 audio0 at azalia1 ppb0 at pci0 dev 28 function 0 \u0026#34;Intel 8 Series PCIE\u0026#34; rev 0xe4: msi pci1 at ppb0 bus 1 vendor \u0026#34;Atheros\u0026#34;, unknown product 0x003e (class network subclass miscellaneous, rev 0x20) at pci1 dev 0 function 0 not configured ppb1 at pci0 dev 28 function 3 \u0026#34;Intel 8 Series PCIE\u0026#34; rev 0xe4: msi pci2 at ppb1 bus 2 alc0 at pci2 dev 0 function 0 \u0026#34;Attansic Technology E2200\u0026#34; rev 0x10: msi, address 34:e6:d7:1b:7f:14 atphy0 at alc0 phy 0: AR8035 10/100/1000 PHY, rev. 9 ppb2 at pci0 dev 28 function 4 \u0026#34;Intel 8 Series PCIE\u0026#34; rev 0xe4: msi pci3 at ppb2 bus 3 vendor \u0026#34;NVIDIA\u0026#34;, unknown product 0x1392 (class display subclass 3D, rev 0xa2) at pci3 dev 0 function 0 not configured ehci0 at pci0 dev 29 function 0 \u0026#34;Intel 8 Series USB\u0026#34; rev 0x04: apic 2 int 23 usb1 at ehci0: USB revision 2.0 uhub1 at usb1 configuration 1 interface 0 \u0026#34;Intel EHCI root hub\u0026#34; rev 2.00/1.00 addr 1 pcib0 at pci0 dev 31 function 0 \u0026#34;Intel 8 Series LPC\u0026#34; rev 0x04 ahci0 at pci0 dev 31 function 2 \u0026#34;Intel 8 Series AHCI\u0026#34; rev 0x04: msi, AHCI 1.3 ahci0: port 0: 6.0Gb/s scsibus1 at ahci0: 32 targets sd0 at scsibus1 targ 0 lun 0: \u0026lt;ATA, ST500LT012-1DG14, 0001\u0026gt; naa.5000c5009d2436d7 sd0: 476940MB, 512 bytes/sector, 976773168 sectors ichiic0 at pci0 dev 31 function 3 \u0026#34;Intel 8 Series SMBus\u0026#34; rev 0x04: apic 2 int 18 iic1 at ichiic0 iic1: addr 0x29 07=ff 0f=33 10=08 11=05 12=8f 13=54 14=a0 15=31 16=28 17=1f 18=22 19=b9 1a=60 1b=65 1c=c0 1e=20 20=7f 22=40 25=40 27=ff 29=f3 2b=ff 2d=45 2f=20 30=95 31=26 32=0e 33=10 87=ff 8f=33 90=08 91=05 92=8f 93=54 94=a0 95=31 96=28 97=1f 98=22 99=b9 9a=60 9b=65 9c=c0 9e=20 a0=7f a2=40 a5=40 a7=df a9=f1 ab=fc ad=3e af=20 b0=95 b1=25 b2=0e b3=10 words 00=0000 01=0000 02=0000 03=0000 04=0000 05=0000 06=0000 07=ffff spdmem0 at iic1 addr 0x50: 4GB DDR3 SDRAM PC3-12800 SO-DIMM spdmem1 at iic1 addr 0x52: 4GB DDR3 SDRAM PC3-12800 SO-DIMM isa0 at pcib0 isadma0 at isa0 pckbc0 at isa0 port 0x60/5 irq 1 irq 12 pckbd0 at pckbc0 (kbd slot) wskbd0 at pckbd0: console keyboard pms0 at pckbc0 (aux slot) wsmouse0 at pms0 mux 0 pms0: Synaptics clickpad, firmware 8.1, 0x1e2b1 0x840300 pcppi0 at isa0 port 0x61 spkr0 at pcppi0 vmm0 at mainbus0: VMX/EPT uhidev0 at uhub0 port 1 configuration 1 interface 0 \u0026#34;E-Signal USB Gaming Mouse\u0026#34; rev 2.00/1.42 addr 2 uhidev0: iclass 3/1 ums0 at uhidev0: 5 buttons, Z and W dir wsmouse1 at ums0 mux 0 uhidev1 at uhub0 port 1 configuration 1 interface 1 \u0026#34;E-Signal USB Gaming Mouse\u0026#34; rev 2.00/1.42 addr 2 uhidev1: iclass 3/0, 6 report ids ukbd0 at uhidev1 reportid 1: 8 variable keys, 6 key codes wskbd1 at ukbd0 mux 1 uhid0 at uhidev1 reportid 2: input=1, output=0, feature=0 uhid1 at uhidev1 reportid 3: input=2, output=0, feature=0 uhid2 at uhidev1 reportid 6: input=3, output=0, feature=0 uhidev2 at uhub0 port 1 configuration 1 interface 2 \u0026#34;E-Signal USB Gaming Mouse\u0026#34; rev 2.00/1.42 addr 2 uhidev2: iclass 3/0 uhid3 at uhidev2: input=32, output=32, feature=8 uvideo0 at uhub0 port 6 configuration 1 interface 0 \u0026#34;CN036P597248751HABEMA00 Integrated_Webcam_FHD\u0026#34; rev 2.00/47.18 addr 3 video0 at uvideo0 uhidev3 at uhub0 port 7 configuration 1 interface 0 \u0026#34;Alienware AW13\u0026#34; rev 0.02/0.00 addr 4 uhidev3: iclass 3/0, 2 report ids uhid4 at uhidev3 reportid 1: input=8, output=0, feature=0 uhid5 at uhidev3 reportid 2: input=0, output=8, feature=0 uhub2 at uhub1 port 1 configuration 1 interface 0 \u0026#34;Intel Rate Matching Hub\u0026#34; rev 2.00/0.04 addr 2 vscsi0 at root scsibus2 at vscsi0: 256 targets softraid0 at root scsibus3 at softraid0: 256 targets root on sd0a (25417e6d803941c6.a) swap on sd0b dump on sd0b [drm] ACPI BIOS requests an excessive sleep of 2000 ms, using 1500 ms instead inteldrm0: 1920x1080, 32bpp wsdisplay0 at inteldrm0 mux 1: console (std, vt100 emulation), using wskbd0 wskbd1: connecting to wsdisplay0 wsdisplay0: screen 1-5 added (std, vt100 emulation) hw.sensors $ sysctl hw.sensors hw.sensors.cpu0.temp0=48.00 degC hw.sensors.acpitz0.temp0=27.80 degC (zone temperature) hw.sensors.acpitz1.temp0=29.80 degC (zone temperature) hw.sensors.acpibat0.volt0=14.80 VDC (voltage) hw.sensors.acpibat0.volt1=17.02 VDC (current voltage) hw.sensors.acpibat0.current0=65.53 A (rate) hw.sensors.acpibat0.amphour0=3.06 Ah (last full capacity) hw.sensors.acpibat0.amphour1=0.30 Ah (warning capacity) hw.sensors.acpibat0.amphour2=0.09 Ah (low capacity) hw.sensors.acpibat0.amphour3=3.06 Ah (remaining capacity), OK hw.sensors.acpibat0.amphour4=3.54 Ah (design capacity) hw.sensors.acpibat0.raw0=0 (battery full), OK hw.sensors.acpibat0.raw1=0 (discharge cycles) hw.sensors.acpiac0.indicator0=On (power supply) hw.sensors.acpibtn0.indicator0=On (lid open) ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eJe ne parlerais pas de l\u0026rsquo;installation d\u0026rsquo;OpenBSD en soit. Je fais\nfonctionner ce portable sous OpenBSD depuis mes débuts avec la 5.9 !\u003c/p\u003e\n\u003cp\u003eCet Alienware AW13 est la première génération.\u003c/p\u003e\n\u003cdiv class=\"row justify-content-center align-items-center\"\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openbsd/neofetch-6.6.png\" title=\"Neofetch vue OpenBSD 6.6\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openbsd/neofetch-6.6_hu_3627baa90bf98ae9.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Neofetch vue OpenBSD 6.6\" height=\"116\" loading=\"lazy\" src=\"/images/openbsd/neofetch-6.6_hu_926bc58187c3aab1.png\" type=\"image/png\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eNeofetch vue OpenBSD 6.6\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003c/div\u003e\n\u003ch2 id=\"ce-qui-fonctionne\"\u003eCe qui fonctionne\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eIntel Audio\u003c/li\u003e\n\u003cli\u003eIntel CPU - l\u0026rsquo;Hyper-Threading est désactivé par défaut par le système ; \nla virtualisation fonctionne (support VMX/EPT) !\u003c/li\u003e\n\u003cli\u003eIntel GPU\u003c/li\u003e\n\u003cli\u003eLa carte réseau \u0026ldquo;Attansic Technology E2200\u0026rdquo; \u003cem\u003eAR8035 10/100/1000 PHY, \nrev. 9\u003c/em\u003e : firmware \n\u003ca class=\"man\" href=\"https://man.openbsd.org/alc\" title=\"Page du Manuel OpenBSD pour : alc\"\u003ealc\u003c/a\u003e\n \n\u003cul\u003e\n\u003cli\u003e\u003cem\u003edepuis OpenBSD 6.6\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ele \u0026ldquo;touchpad\u0026rdquo; - gestion du pointeur : OK ; pas les \u0026ldquo;boutons\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eUSB EHCI, XHCI (2.x et 3)\u003c/li\u003e\n\u003cli\u003eWebcam - \u003cem\u003edepuis OpenBSD 6.4\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePour avoir du réseau, jusqu\u0026rsquo;à OpenBSD 6.6, j\u0026rsquo;étais obligé d\u0026rsquo;utiliser un\nadaptateur USB\u0026lt;-\u0026gt;Ethernet… pris en charge par le firmware\n\u003ca class=\"man\" href=\"https://man.openbsd.org/axe\" title=\"Page du Manuel OpenBSD pour : axe\"\u003eaxe\u003c/a\u003e\n,\nreconnu comme \u0026ldquo;ASIX Electronics AX88772\u0026rdquo; rev 2.00/0.01.\u003c/div\u003e\n\u003ch3 id=\"modifications-systèmes-nécessaires\"\u003eModifications systèmes nécessaires\u003c/h3\u003e\n\u003cp\u003eCertaines modifications systèmes sont nécessaires.\u003c/p\u003e\n\u003ch4 id=\"fichier-etcsysctlconf\"\u003eFichier \u003ccode\u003e/etc/sysctl.conf \u003c/code\u003e\u003c/h4\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCe problème semble être réglé depuis OpenBSD 6.6 : en effet, une\nréinstallation de zéro fonctionne correctement \u003cem\u003e(ce qui n\u0026rsquo;était pas le\ncas avec les versions précédentes)\u003c/em\u003e !\u003c/div\u003e\n\u003cp\u003eSous OpenBSD 6.4 \u0026amp; 6.5, il y a un problème avec l\u0026rsquo;horloge matérielle, ce\nqui a pour conséquence que la saisie de caractères se retrouve\ndémultiplier en session X.\u003c/p\u003e\n\u003cp\u003ePour le régler, il faut ajouter au fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003ekern.timecounter.hardware=acpihpet0\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"fichier-etcwsconsctlconf\"\u003eFichier \u003ccode\u003e/etc/wsconsctl.conf\u003c/code\u003e\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\"\u003edisplay.vblank\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eon\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003emouse.tp.tapping\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\u003cul\u003e\n\u003cli\u003eLa première option améliore l\u0026rsquo;affichage \u003ccode\u003evblank\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eLa deuxième améliore la saisie des boutons de souris.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"fichier-etcx11xorgconf\"\u003eFichier \u003ccode\u003e/etc/X11/xorg.conf\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eIl y a un soucis de \u0026ldquo;tearing\u0026rdquo;, problème d\u0026rsquo;accélération graphique avec le\nGPU Intel, \u003cabbr title=\"c'est-à-dire\"\u003ec-à-d\u003c/abbr\u003e\ndes saccades.\u003c/p\u003e\n\u003cp\u003eIl est donc nécessaire de créer le fichier \u003ccode\u003e/etc/X11/xorg.conf\u003c/code\u003e et de le\nremplir 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\"\u003eSection \u0026#34;Device\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;intel\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eDriver  \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\"\u003eOption  \u0026#34;HotPlug\u0026#34;       \u0026#34;true\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;TearFree\u0026#34;      \u0026#34;true\u0026#34;  #false by default   (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\u003cul\u003e\n\u003cli\u003eC\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003eTearFree\u003c/code\u003e qui règle le problème.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;option \u003ccode\u003eHotPlug\u003c/code\u003e prend en charge les périphériques qui se montent à \nchaud…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ce-qui-ne-fonctionne-pas\"\u003eCe qui ne fonctionne pas\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe Bluetooth - le support a été supprimé dans OpenBSD pour des raisons \nde sécurité depuis longtemps\u003c/li\u003e\n\u003cli\u003eLa puce Wifi, une \u0026ldquo;Atheros\u0026rdquo; : vendor \u0026ldquo;Atheros\u0026rdquo;, unknown product 0x003e \n(class network subclass miscellaneous, rev 0x20)\u003c/li\u003e\n\u003cli\u003eNvidia GPU, technologie Optimus - ne sera jamais pris en charge, tant \nque ladite société ne libérera pas les sources.\u003c/li\u003e\n\u003c/ul\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.6 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGENERIC.MP\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e#372: Sat Oct 12 10:56:27 MDT 2019\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\"\u003e8487260160\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8094MB\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\"\u003e8217325568\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e7836MB\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\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.8 @ 0xec580 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e74\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 Alienware version \u003cspan style=\"color:#48b685\"\u003e\u0026#34;A08\u0026#34;\u003c/span\u003e date 01/25/2018\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebios0: Alienware Alienware \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e\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 S3 S4 S5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpi0: tables DSDT FACP APIC FPDT FIDT MCFG HPET SSDT UEFI SSDT ASF! SLIC SSDT SSDT SSDT SSDT CSRT SSDT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpi0: wakeup devices PEG0\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e PEGP\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e PEG1\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e PEGP\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e PEG2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e PEGP\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RP01\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e PXSX\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RP02\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e PXSX\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RP03\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e PXSX\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RP04\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e PXSX\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RP05\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e PEGP\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\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\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 Core\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eTM\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e i5-4210U CPU @ 1.70GHz, 799.46 MHz, 06-45-01\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,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,PERF,ITSC,FSGSBASE,TSC_ADJUST,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MD_CLEAR,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,MELTDOWN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: 256KB 64b/line 8-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\"\u003e10\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 99MHz\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.1.2.4.1.1.1, 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 Core\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eTM\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e i5-4210U CPU @ 1.70GHz, 799.32 MHz, 06-45-01\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,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,PERF,ITSC,FSGSBASE,TSC_ADJUST,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MD_CLEAR,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,MELTDOWN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu1: 256KB 64b/line 8-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\"\u003e1\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 Core\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eTM\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e i5-4210U CPU @ 1.70GHz, 799.31 MHz, 06-45-01\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,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,PERF,ITSC,FSGSBASE,TSC_ADJUST,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MD_CLEAR,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,MELTDOWN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu2: 256KB 64b/line 8-way L2 cache\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu2: smt 1, core 0, 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\"\u003e3\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 Core\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eTM\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e i5-4210U CPU @ 1.70GHz, 799.31 MHz, 06-45-01\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,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,PERF,ITSC,FSGSBASE,TSC_ADJUST,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MD_CLEAR,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,MELTDOWN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu3: 256KB 64b/line 8-way L2 cache\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu3: smt 1, core 1, 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\"\u003e2\u003c/span\u003e pa 0xfec00000, version 20, \u003cspan style=\"color:#f99b15\"\u003e40\u003c/span\u003e pins\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpimadt0: bogus nmi \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e apid \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpimadt0: bogus nmi \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e apid \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpimadt0: bogus nmi \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e apid \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpimadt0: bogus nmi \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e apid \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\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 0xf8000000, bus 0-63\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 -1 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ePEG0\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\u003ePEG1\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\u003ePEG2\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\u003eRP01\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt5 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\u003eacpiprt6 at acpi0: bus \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \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\u003eacpiprt7 at acpi0: bus \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \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\u003eacpiprt8 at acpi0: bus \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRP05\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt9 at acpi0: bus -1 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRP06\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt10 at acpi0: bus -1 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRP07\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt11 at acpi0: bus -1 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRP08\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiec0 at acpi0: not present\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiec1 at acpi0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpicpu0 at acpi0: C2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e200@148 mwait.1@0x33\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpicpu1 at acpi0: C2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e200@148 mwait.1@0x33\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpicpu2 at acpi0: C2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e200@148 mwait.1@0x33\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpicpu3 at acpi0: C2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e200@148 mwait.1@0x33\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres0 at acpi0: PG00, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e PEG0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres1 at acpi0: PG01, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e PEG1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres2 at acpi0: PG02, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e PEG2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres3 at acpi0: PC05, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e RP05\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpitz0 at acpi0: critical temperature is \u003cspan style=\"color:#f99b15\"\u003e105\u003c/span\u003e degC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpitz1 at acpi0: critical temperature is \u003cspan style=\"color:#f99b15\"\u003e105\u003c/span\u003e degC\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\u003eacpicmos0 at acpi0\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\u003eacpibat0 at acpi0: BAT1 model \u003cspan style=\"color:#48b685\"\u003e\u0026#34;PABAS0241231\u0026#34;\u003c/span\u003e serial 0x75d1 type Li-Ion oem \u003cspan style=\"color:#48b685\"\u003e\u0026#34;TOSHIBA\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiac0 at acpi0: AC unit online\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpibtn0 at acpi0: LID0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INT33C7\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;INTL9C60\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edwiic0 at acpi0 I2C1 addr 0xfe105000/0x1000 irq \u003cspan style=\"color:#f99b15\"\u003e7\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\u003eihidev0 at iic0 addr 0x2cdwiic0: timed out reading remaining \u003cspan style=\"color:#f99b15\"\u003e29\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e, failed fetching initial HID descriptor\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;SMO8810\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;INT3402\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;PNP0C14\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpibtn1 at acpi0: PWRB\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;PNP0C14\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;DELLABCE\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;PNP0C32\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;PNP0C32\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;PNP0C32\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;CPL0002\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\u003eacpivideo0 at acpi0: GFX0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivout0 at acpivideo0: DD1F\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: using VERW MDS workaround \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eexcept on vmm entry\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\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 Core 4G Host\u0026#34;\u003c/span\u003e rev 0x0b\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 0x0b\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eazalia0 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;Intel Core 4G HD Audio\u0026#34;\u003c/span\u003e rev 0x0b: msi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eazalia0: No codecs found\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel Core 4G Thermal\u0026#34;\u003c/span\u003e rev 0x0b 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 not configured\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 8 Series xHCI\u0026#34;\u003c/span\u003e rev 0x04: 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 8 Series MEI\u0026#34;\u003c/span\u003e rev 0x04 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\u003eazalia1 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e27\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 8 Series HD Audio\u0026#34;\u003c/span\u003e rev 0x04: msi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eazalia1: codecs: Realtek/0x0255\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eaudio0 at azalia1\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 8 Series PCIE\u0026#34;\u003c/span\u003e rev 0xe4: 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\u003evendor \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Atheros\u0026#34;\u003c/span\u003e, unknown product 0x003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eclass network subclass miscellaneous, rev 0x20\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 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 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eppb1 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e28\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 8 Series PCIE\u0026#34;\u003c/span\u003e rev 0xe4: msi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epci2 at ppb1 bus \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ealc0 at pci2 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;Attansic Technology E2200\u0026#34;\u003c/span\u003e rev 0x10: msi, address 34:e6:d7:1b:7f:14\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eatphy0 at alc0 phy 0: AR8035 10/100/1000 PHY, rev. \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eppb2 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e28\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 8 Series PCIE\u0026#34;\u003c/span\u003e rev 0xe4: msi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epci3 at ppb2 bus \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evendor \u003cspan style=\"color:#48b685\"\u003e\u0026#34;NVIDIA\u0026#34;\u003c/span\u003e, unknown product 0x1392 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eclass display subclass 3D, rev 0xa2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e at pci3 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 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eehci0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e29\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 8 Series USB\u0026#34;\u003c/span\u003e rev 0x04: apic \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e23\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eusb1 at ehci0: USB revision 2.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhub1 at usb1 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 EHCI root hub\u0026#34;\u003c/span\u003e rev 2.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\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 8 Series LPC\u0026#34;\u003c/span\u003e rev 0x04\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eahci0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e31\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 8 Series AHCI\u0026#34;\u003c/span\u003e rev 0x04: msi, AHCI 1.3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eahci0: port 0: 6.0Gb/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus1 at ahci0: \u003cspan style=\"color:#f99b15\"\u003e32\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;ATA, ST500LT012-1DG14, 0001\u0026gt; naa.5000c5009d2436d7\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd0: 476940MB, \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e bytes/sector, \u003cspan style=\"color:#f99b15\"\u003e976773168\u003c/span\u003e sectors\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eichiic0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e31\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 8 Series SMBus\u0026#34;\u003c/span\u003e rev 0x04: apic \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e18\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiic1 at ichiic0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiic1: addr 0x29 \u003cspan style=\"color:#ef6155\"\u003e07\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eff \u003cspan style=\"color:#ef6155\"\u003e0f\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e33\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e10\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e08\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e11\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e05\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e12\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e8f \u003cspan style=\"color:#ef6155\"\u003e13\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e54\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e14\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ea0 \u003cspan style=\"color:#ef6155\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e31\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e16\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e28\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e17\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1f \u003cspan style=\"color:#ef6155\"\u003e18\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e19\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eb9 \u003cspan style=\"color:#ef6155\"\u003e1a\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e60\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e1b\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e65\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e1c\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ec0 \u003cspan style=\"color:#ef6155\"\u003e1e\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e20\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e7f \u003cspan style=\"color:#ef6155\"\u003e22\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e40\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e25\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e40\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e27\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eff \u003cspan style=\"color:#ef6155\"\u003e29\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ef3 \u003cspan style=\"color:#ef6155\"\u003e2b\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eff \u003cspan style=\"color:#ef6155\"\u003e2d\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e45\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e2f\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e30\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e95\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e31\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e26\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e32\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0e \u003cspan style=\"color:#ef6155\"\u003e33\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e87\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eff \u003cspan style=\"color:#ef6155\"\u003e8f\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e33\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e90\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e08\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e91\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e05\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e92\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e8f \u003cspan style=\"color:#ef6155\"\u003e93\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e54\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e94\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ea0 \u003cspan style=\"color:#ef6155\"\u003e95\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e31\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e96\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e28\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e97\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1f \u003cspan style=\"color:#ef6155\"\u003e98\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e99\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eb9 \u003cspan style=\"color:#ef6155\"\u003e9a\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e60\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e9b\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e65\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e9c\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ec0 \u003cspan style=\"color:#ef6155\"\u003e9e\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ea0\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e7f \u003cspan style=\"color:#ef6155\"\u003ea2\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e40\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ea5\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e40\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ea7\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003edf \u003cspan style=\"color:#ef6155\"\u003ea9\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ef1 \u003cspan style=\"color:#ef6155\"\u003eab\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003efc \u003cspan style=\"color:#ef6155\"\u003ead\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3e \u003cspan style=\"color:#ef6155\"\u003eaf\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eb0\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e95\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eb1\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e25\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eb2\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0e \u003cspan style=\"color:#ef6155\"\u003eb3\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e words \u003cspan style=\"color:#ef6155\"\u003e00\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0000\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e01\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0000\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e02\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0000\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e03\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0000\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e04\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0000\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e05\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0000\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e06\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0000\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e07\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003effff\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003espdmem0 at iic1 addr 0x50: 4GB DDR3 SDRAM PC3-12800 SO-DIMM\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003espdmem1 at iic1 addr 0x52: 4GB DDR3 SDRAM PC3-12800 SO-DIMM\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\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\u003epms0 at pckbc0 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eaux slot\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsmouse0 at pms0 mux \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epms0: Synaptics clickpad, firmware 8.1, 0x1e2b1 0x840300\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhidev0 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\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;E-Signal USB Gaming Mouse\u0026#34;\u003c/span\u003e rev 2.00/1.42 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/1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eums0 at uhidev0: \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e buttons, Z and W dir\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsmouse1 at ums0 mux \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhidev1 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;E-Signal USB Gaming Mouse\u0026#34;\u003c/span\u003e rev 2.00/1.42 addr \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhidev1: iclass 3/0, \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e report ids\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eukbd0 at uhidev1 reportid 1: \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e variable keys, \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e key codes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewskbd1 at ukbd0 mux \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhid0 at uhidev1 reportid 2: \u003cspan style=\"color:#ef6155\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1, \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 uhidev1 reportid 3: \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\u003euhid2 at uhidev1 reportid 6: \u003cspan style=\"color:#ef6155\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3, \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\u003euhidev2 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\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;E-Signal USB Gaming Mouse\u0026#34;\u003c/span\u003e rev 2.00/1.42 addr \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhidev2: iclass 3/0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhid3 at uhidev2: \u003cspan style=\"color:#ef6155\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e32, \u003cspan style=\"color:#ef6155\"\u003eoutput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e32, \u003cspan style=\"color:#ef6155\"\u003efeature\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euvideo0 at uhub0 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;CN036P597248751HABEMA00 Integrated_Webcam_FHD\u0026#34;\u003c/span\u003e rev 2.00/47.18 addr \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evideo0 at uvideo0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhidev3 at uhub0 port \u003cspan style=\"color:#f99b15\"\u003e7\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;Alienware AW13\u0026#34;\u003c/span\u003e rev 0.02/0.00 addr \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhidev3: iclass 3/0, \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e report ids\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhid4 at uhidev3 reportid 1: \u003cspan style=\"color:#ef6155\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e8, \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\u003euhid5 at uhidev3 reportid 2: \u003cspan style=\"color:#ef6155\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0, \u003cspan style=\"color:#ef6155\"\u003eoutput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e8, \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\u003euhub2 at uhub1 port \u003cspan style=\"color:#f99b15\"\u003e1\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;Intel Rate Matching Hub\u0026#34;\u003c/span\u003e rev 2.00/0.04 addr \u003cspan style=\"color:#f99b15\"\u003e2\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\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\u003e25417e6d803941c6.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\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003edrm\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e ACPI BIOS requests an excessive sleep of \u003cspan style=\"color:#f99b15\"\u003e2000\u003c/span\u003e ms, using \u003cspan style=\"color:#f99b15\"\u003e1500\u003c/span\u003e ms instead\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einteldrm0: 1920x1080, 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\u003ewskbd1: connecting to wsdisplay0\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\u003e48.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\u003e27.80 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\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpitz1.temp0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e29.80 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\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibat0.volt0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e14.80 VDC \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003evoltage\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibat0.volt1\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e17.02 VDC \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ecurrent voltage\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibat0.current0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e65.53 A \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003erate\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibat0.amphour0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3.06 Ah \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elast full capacity\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibat0.amphour1\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0.30 Ah \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ewarning capacity\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibat0.amphour2\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0.09 Ah \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elow capacity\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibat0.amphour3\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3.06 Ah \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eremaining capacity\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibat0.amphour4\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3.54 Ah \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003edesign capacity\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibat0.raw0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ebattery full\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibat0.raw1\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003edischarge cycles\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpiac0.indicator0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eOn \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003epower supply\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibtn0.indicator0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eOn \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elid open\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":"Récapitulatif de ce qui fonctionne ou pas sur un Dell Alienware AW13 de première génération sous OpenBSD","tags":["OpenBSD","Dell","alienware","dmesg","sensors"],"date_published":"2016-12-10T20:14:07+01:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/epson-bx525wd#ad6b9393152f3bc75225eb3cf6a3e63dbb60f3549d99ec0fc896938e07ca6189","url":"https://it-log.fr.eu.org/fr/sys/openbsd/epson-bx525wd/","title":"Epson Stylus Office BX525WD / OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"Description Testée sur OpenBSD stable : 6.0 ⇒ 6.6 !\nGestion de l\u0026rsquo;impression La partie impression fonctionne très bien…\nIndiquez à Cups d\u0026rsquo;installer le fichier ppd relatif à la version BX525WD ou BX535WD.\nSi vous avez installer le paquet gutenprint, vous aurez le choix entre sa version et celle de foomatic.\nChoisissez le protocole lpd, c\u0026rsquo;est celui qui fonctionne le mieux…\nTel que : lpd://adr_ip/PASSTHRU\nSi Avahi est installé, elle est vu par le biais du protocole DNS-SD, voire mDNS, elle s\u0026rsquo;installe, mais après lors d\u0026rsquo;impression, cups n\u0026rsquo;arrive pas à discuter avec…\nPensez à redémarrer le service CUPS !\nGestion du scanner Après avoir installer les paquets : sane-backends xsane, il vous faudra :\nmodifier le fichier /etc/sane.d/dll.conf pour ajouter : epkowa. il vous faudra ajouter le fichier de configuration /etc/sane.d/epkowa.conf, et modifiez-le : si vous êtes connecté en usb : \u0026lsquo;usb 0x04b8 0xProductId\u0026rsquo; ou si vous l\u0026rsquo;avez en réseau : \u0026rsquo;net adr_ip 1865' Une fois modifié, vous pourrez exécuter xsane.\nExemple du fichier epkowa.conf :\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 ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eTestée sur OpenBSD stable : 6.0 ⇒ 6.6 !\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\u003eIndiquez à Cups d\u0026rsquo;installer le fichier ppd relatif à la version BX525WD\nou BX535WD.\u003c/p\u003e\n\u003cp\u003eSi vous avez \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 \u003cstrong\u003egutenprint\u003c/strong\u003e, vous aurez le choix entre sa version et celle\nde \u003cstrong\u003efoomatic\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eChoisissez le protocole \u003ccode\u003elpd\u003c/code\u003e\u003c/strong\u003e, c\u0026rsquo;est celui qui fonctionne le mieux…\u003c/p\u003e\n\u003cp\u003eTel que : \u003ccode\u003elpd://adr_ip/PASSTHRU\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi \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 est installé, elle\nest vu par le biais du protocole DNS-SD, voire mDNS, elle s\u0026rsquo;installe,\nmais après lors d\u0026rsquo;impression, cups n\u0026rsquo;arrive pas à discuter avec…\u003c/p\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\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_*)'\"\u003einstaller\u003c/a\u003e\n\nles paquets : \u003ccode\u003esane-backends xsane\u003c/code\u003e, il vous faudra :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emodifier le fichier \u003ccode\u003e/etc/sane.d/dll.conf\u003c/code\u003e pour ajouter : \u003cstrong\u003eepkowa\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eil vous faudra ajouter le fichier de configuration\n\u003ccode\u003e/etc/sane.d/epkowa.conf\u003c/code\u003e, et modifiez-le :\n\u003cul\u003e\n\u003cli\u003esi vous êtes connecté en usb : \u0026lsquo;usb 0x04b8 0xProductId\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eou si vous l\u0026rsquo;avez en réseau : \u0026rsquo;net adr_ip 1865'\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne fois modifié, vous pourrez exécuter \u003ccode\u003exsane\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eExemple du fichier \u003ccode\u003eepkowa.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# 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\u003chr\u003e\n","summary":"Support de l'imprimante MFP, de marque Epson, modèle Stylus Office BX5S5WD, sous OpenBSD","tags":["OpenBSD","Epson"],"date_published":"2016-12-10T20:47:36+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/dell-xps-m1330#ff06a2575a2ddb3b799dbb57796e6461c53bbef1ae4e1e4dd789ecb501fb0f6a","url":"https://it-log.fr.eu.org/fr/sys/openbsd/dell-xps-m1330/","title":"Dell XPS M1330","author":{"name":"Stéphane HUC"},"content_text":"Description Un petit apercu du support du Dell XPS M1330 sous OpenBSD\nCe qui fonctionne le GPU Nvidia la carte réseau Broadcom, reconnue comme bge le son le lecteur biométrique - reconnu ! Ce qui ne fonctionne pas le lecteur de cartes mémoires intégré dmesg OpenBSD 6.0 (GENERIC.MP) #2319: Tue Jul 26 13:00:43 MDT 2016 deraadt@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP real mem = 4276531200 (4078MB) avail mem = 4142448640 (3950MB) mpath0 at root scsibus0 at mpath0: 256 targets mainbus0 at root bios0 at mainbus0: SMBIOS rev. 2.4 @ 0xf71d0 (44 entries) bios0: vendor Dell Inc. version \u0026#34;A15\u0026#34; date 12/26/2008 bios0: Dell Inc. XPS M1330 acpi0 at bios0: rev 2 acpi0: sleep states S0 S3 S4 S5 acpi0: tables DSDT FACP HPET APIC MCFG SLIC BOOT SSDT acpi0: wakeup devices PCI0(S5) PCIE(S4) USB1(S0) USB2(S0) USB3(S0) USB4(S0) USB5(S0) EHC2(S0) EHCI(S0) AZAL(S3) RP01(S3) RP02(S3) RP03(S3) RP04(S3) RP05(S3) RP06(S5) [...] acpitimer0 at acpi0: 3579545 Hz, 24 bits acpihpet0 at acpi0: 14318179 Hz acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat cpu0 at mainbus0: apid 0 (boot processor) cpu0: Intel(R) Core(TM)2 Duo CPU T5800 @ 2.00GHz, 965.53 MHz 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,DTES64,MWAIT,DS-CPL,EST,TM2,SSSE3,CX16,xTPR,PDCM,NXE,LONG,LAHF,PERF,SENSOR cpu0: 2MB 64b/line 8-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 199MHz cpu0: mwait min=64, max=64, C-substates=0.2.2.2.2, IBE cpu1 at mainbus0: apid 1 (application processor) cpu1: Intel(R) Core(TM)2 Duo CPU T5800 @ 2.00GHz, 927.61 MHz 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,DTES64,MWAIT,DS-CPL,EST,TM2,SSSE3,CX16,xTPR,PDCM,NXE,LONG,LAHF,PERF,SENSOR cpu1: 2MB 64b/line 8-way L2 cache cpu1: smt 0, core 1, package 0 ioapic0 at mainbus0: apid 2 pa 0xfec00000, version 20, 24 pins acpimcfg0 at acpi0 addr 0xf8000000, bus 0-63 acpiprt0 at acpi0: bus 3 (PCIE) acpiprt1 at acpi0: bus 1 (AGP_) acpiprt2 at acpi0: bus 11 (RP01) acpiprt3 at acpi0: bus 12 (RP02) acpiprt4 at acpi0: bus -1 (RP03) acpiprt5 at acpi0: bus 13 (RP04) acpiprt6 at acpi0: bus -1 (RP05) acpiprt7 at acpi0: bus 9 (RP06) acpiprt8 at acpi0: bus 0 (PCI0) acpicpu0 at acpi0: !C3(100@57 mwait.3@0x30), !C2(500@1 mwait.1@0x10), C1(1000@1 mwait.1), PSS acpicpu1 at acpi0: !C3(100@57 mwait.3@0x30), !C2(500@1 mwait.1@0x10), C1(1000@1 mwait.1), PSS acpitz0 at acpi0: critical temperature is 87 degC \u0026#34;PNP0F13\u0026#34; at acpi0 not configured \u0026#34;PNP0303\u0026#34; at acpi0 not configured acpibtn0 at acpi0: LID_ acpibtn1 at acpi0: PBTN acpibtn2 at acpi0: SBTN acpiac0 at acpi0: AC unit online acpibat0 at acpi0: BAT0 not present \u0026#34;PNP0C32\u0026#34; at acpi0 not configured \u0026#34;*pnp0c14\u0026#34; at acpi0 not configured acpivideo0 at acpi0: VID_ acpivout0 at acpivideo0: LCD_ acpivideo1 at acpi0: VID_ acpivout at acpivideo1 not configured acpivideo2 at acpi0: VID2 cpu0: Enhanced SpeedStep 965 MHz: speeds: 2000, 1600, 1200, 800 MHz pci0 at mainbus0 bus 0 pchb0 at pci0 dev 0 function 0 \u0026#34;Intel GM965 Host\u0026#34; rev 0x0c ppb0 at pci0 dev 1 function 0 \u0026#34;Intel GM965 PCIE\u0026#34; rev 0x0c: msi pci1 at ppb0 bus 1 vga1 at pci1 dev 0 function 0 \u0026#34;NVIDIA GeForce 8400M GS\u0026#34; rev 0xa1 wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation) wsdisplay0: screen 1-5 added (80x25, vt100 emulation) uhci0 at pci0 dev 26 function 0 \u0026#34;Intel 82801H USB\u0026#34; rev 0x02: apic 2 int 20 uhci1 at pci0 dev 26 function 1 \u0026#34;Intel 82801H USB\u0026#34; rev 0x02: apic 2 int 21 ehci0 at pci0 dev 26 function 7 \u0026#34;Intel 82801H USB\u0026#34; rev 0x02: apic 2 int 22 usb0 at ehci0: USB revision 2.0 uhub0 at usb0 \u0026#34;Intel EHCI root hub\u0026#34; rev 2.00/1.00 addr 1 azalia0 at pci0 dev 27 function 0 \u0026#34;Intel 82801H HD Audio\u0026#34; rev 0x02: msi azalia0: codecs: Sigmatel STAC9228X audio0 at azalia0 ppb1 at pci0 dev 28 function 0 \u0026#34;Intel 82801H PCIE\u0026#34; rev 0x02: msi pci2 at ppb1 bus 11 ppb2 at pci0 dev 28 function 1 \u0026#34;Intel 82801H PCIE\u0026#34; rev 0x02: msi pci3 at ppb2 bus 12 \u0026#34;Broadcom BCM4321\u0026#34; rev 0x03 at pci3 dev 0 function 0 not configured ppb3 at pci0 dev 28 function 3 \u0026#34;Intel 82801H PCIE\u0026#34; rev 0x02: msi pci4 at ppb3 bus 13 ppb4 at pci0 dev 28 function 5 \u0026#34;Intel 82801H PCIE\u0026#34; rev 0x02: msi pci5 at ppb4 bus 9 bge0 at pci5 dev 0 function 0 \u0026#34;Broadcom BCM5906M\u0026#34; rev 0x02, BCM5906 A2 (0xc002): msi, address 00:1d:09:37:6d:1b brgphy0 at bge0 phy 1: BCM5906 10/100baseTX PHY, rev. 0 uhci2 at pci0 dev 29 function 0 \u0026#34;Intel 82801H USB\u0026#34; rev 0x02: apic 2 int 20 uhci3 at pci0 dev 29 function 1 \u0026#34;Intel 82801H USB\u0026#34; rev 0x02: apic 2 int 21 uhci4 at pci0 dev 29 function 2 \u0026#34;Intel 82801H USB\u0026#34; rev 0x02: apic 2 int 22 ehci1 at pci0 dev 29 function 7 \u0026#34;Intel 82801H USB\u0026#34; rev 0x02: apic 2 int 20 usb1 at ehci1: USB revision 2.0 uhub1 at usb1 \u0026#34;Intel EHCI root hub\u0026#34; rev 2.00/1.00 addr 1 ppb5 at pci0 dev 30 function 0 \u0026#34;Intel 82801BAM Hub-to-PCI\u0026#34; rev 0xf2 pci6 at ppb5 bus 3 \u0026#34;Ricoh 5C832 Firewire\u0026#34; rev 0x05 at pci6 dev 1 function 0 not configured sdhc0 at pci6 dev 1 function 1 \u0026#34;Ricoh 5C822 SD/MMC\u0026#34; rev 0x22: apic 2 int 18 sdhc0: SDHC 1.0, 33 MHz base clock sdmmc0 at sdhc0: 4-bit, sd high-speed, mmc high-speed \u0026#34;Ricoh 5C843 MMC\u0026#34; rev 0x12 at pci6 dev 1 function 2 not configured \u0026#34;Ricoh 5C592 Memory Stick\u0026#34; rev 0x12 at pci6 dev 1 function 3 not configured \u0026#34;Ricoh 5C852 xD\u0026#34; rev 0x12 at pci6 dev 1 function 4 not configured pcib0 at pci0 dev 31 function 0 \u0026#34;Intel 82801HBM LPC\u0026#34; rev 0x02 pciide0 at pci0 dev 31 function 1 \u0026#34;Intel 82801HBM IDE\u0026#34; rev 0x02: DMA, channel 0 configured to compatibility, channel 1 configured to compatibility atapiscsi0 at pciide0 channel 0 drive 0 scsibus1 at atapiscsi0: 2 targets cd0 at scsibus1 targ 0 lun 0: \u0026lt;HL-DT-ST, DVD+-RW GSA-S10N, A103\u0026gt; ATAPI 5/cdrom removable cd0(pciide0:0:0): using PIO mode 4, Ultra-DMA mode 2 pciide0: channel 1 ignored (disabled) ahci0 at pci0 dev 31 function 2 \u0026#34;Intel 82801HBM AHCI\u0026#34; rev 0x02: msi, AHCI 1.1 ahci0: port 0: 3.0Gb/s ahci0: PHY offline on port 2 scsibus2 at ahci0: 32 targets sd0 at scsibus2 targ 0 lun 0: \u0026lt;ATA, TOSHIBA MQ01ABF0, AM0G\u0026gt; SCSI3 0/direct fixed naa.5000039523783257 sd0: 476940MB, 512 bytes/sector, 976773168 sectors ichiic0 at pci0 dev 31 function 3 \u0026#34;Intel 82801H SMBus\u0026#34; rev 0x02: apic 2 int 17 iic0 at ichiic0 spdmem0 at iic0 addr 0x50: 2GB DDR2 SDRAM non-parity PC2-6400CL6 SO-DIMM spdmem1 at iic0 addr 0x52: 2GB DDR2 SDRAM non-parity PC2-5300CL5 SO-DIMM usb2 at uhci0: USB revision 1.0 uhub2 at usb2 \u0026#34;Intel UHCI root hub\u0026#34; rev 1.00/1.00 addr 1 usb3 at uhci1: USB revision 1.0 uhub3 at usb3 \u0026#34;Intel UHCI root hub\u0026#34; rev 1.00/1.00 addr 1 usb4 at uhci2: USB revision 1.0 uhub4 at usb4 \u0026#34;Intel UHCI root hub\u0026#34; rev 1.00/1.00 addr 1 usb5 at uhci3: USB revision 1.0 uhub5 at usb5 \u0026#34;Intel UHCI root hub\u0026#34; rev 1.00/1.00 addr 1 usb6 at uhci4: USB revision 1.0 uhub6 at usb6 \u0026#34;Intel UHCI root hub\u0026#34; rev 1.00/1.00 addr 1 isa0 at pcib0 isadma0 at isa0 pckbc0 at isa0 port 0x60/5 irq 1 irq 12 pckbd0 at pckbc0 (kbd slot) wskbd0 at pckbd0: console keyboard, using wsdisplay0 pms0 at pckbc0 (aux slot) wsmouse0 at pms0 mux 0 pms0: Synaptics touchpad, firmware 6.3 pcppi0 at isa0 port 0x61 spkr0 at pcppi0 uvideo0 at uhub1 port 6 configuration 1 interface 0 \u0026#34;OmniVision Technologies, Inc. -2640-07.07.20.3 Laptop Integrated Webcam\u0026#34; rev 2.00/1.00 addr 2 video0 at uvideo0 ugen0 at uhub6 port 1 \u0026#34;STMicroelectronics Biometric Coprocessor\u0026#34; rev 1.00/0.01 addr 2 vscsi0 at root scsibus3 at vscsi0: 256 targets softraid0 at root scsibus4 at softraid0: 256 targets root on sd0a (7d76cb4c2570dde6.a) swap on sd0b dump on sd0b hw.sensors hw.sensors.cpu0.temp0=69.00 degC hw.sensors.acpitz0.temp0=54.50 degC (zone temperature) hw.sensors.acpibtn0.indicator0=On (lid open) hw.sensors.acpiac0.indicator0=On (power supply) ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUn petit apercu du support du Dell XPS M1330 sous OpenBSD\u003c/p\u003e\n\u003ch2 id=\"ce-qui-fonctionne\"\u003eCe qui fonctionne\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ele GPU Nvidia\u003c/li\u003e\n\u003cli\u003ela carte réseau Broadcom, reconnue comme bge\u003c/li\u003e\n\u003cli\u003ele son\u003c/li\u003e\n\u003cli\u003ele lecteur biométrique - reconnu !\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ce-qui-ne-fonctionne-pas\"\u003eCe qui ne fonctionne pas\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ele lecteur de cartes mémoires intégré\u003c/li\u003e\n\u003c/ul\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.0 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGENERIC.MP\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e#2319: Tue Jul 26 13:00:43 MDT 2016\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\"\u003e4276531200\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e4078MB\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\"\u003e4142448640\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3950MB\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\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 @ 0xf71d0 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e44\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 Dell Inc. version \u003cspan style=\"color:#48b685\"\u003e\u0026#34;A15\u0026#34;\u003c/span\u003e date 12/26/2008\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebios0: Dell Inc. XPS M1330\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpi0 at bios0: rev \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpi0: sleep states S0 S3 S4 S5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpi0: tables DSDT FACP HPET APIC MCFG SLIC BOOT SSDT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpi0: wakeup devices PCI0\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e PCIE\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e USB1\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e USB2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e USB3\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e USB4\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e USB5\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e EHC2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e EHCI\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e AZAL\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RP01\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RP02\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RP03\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RP04\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RP05\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e RP06\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS5\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\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\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\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\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 Core\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eTM\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e Duo CPU T5800 @ 2.00GHz, 965.53 MHz\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,DTES64,MWAIT,DS-CPL,EST,TM2,SSSE3,CX16,xTPR,PDCM,NXE,LONG,LAHF,PERF,SENSOR\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: 2MB 64b/line 8-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 199MHz\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.2.2.2, IBE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu1 at mainbus0: apid \u003cspan style=\"color:#f99b15\"\u003e1\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 Core\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eTM\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e Duo CPU T5800 @ 2.00GHz, 927.61 MHz\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,DTES64,MWAIT,DS-CPL,EST,TM2,SSSE3,CX16,xTPR,PDCM,NXE,LONG,LAHF,PERF,SENSOR\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu1: 2MB 64b/line 8-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\u003eioapic0 at mainbus0: apid \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e pa 0xfec00000, version 20, \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e pins\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpimcfg0 at acpi0 addr 0xf8000000, bus 0-63\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt0 at acpi0: bus \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ePCIE\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\u003eAGP_\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 \u003cspan style=\"color:#f99b15\"\u003e11\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\u003eacpiprt3 at acpi0: bus \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e \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\u003eacpiprt4 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\u003eacpiprt5 at acpi0: bus \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e \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\u003eacpiprt6 at acpi0: bus -1 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRP05\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt7 at acpi0: bus \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRP06\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt8 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\u003eacpicpu0 at acpi0: !C3\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e100@57 mwait.3@0x30\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, !C2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e500@1 mwait.1@0x10\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\u003e100@57 mwait.3@0x30\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, !C2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e500@1 mwait.1@0x10\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\u003eacpitz0 at acpi0: critical temperature is \u003cspan style=\"color:#f99b15\"\u003e87\u003c/span\u003e degC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;PNP0F13\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;PNP0303\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: LID_\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpibtn1 at acpi0: PBTN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpibtn2 at acpi0: SBTN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiac0 at acpi0: AC unit online\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpibat0 at acpi0: BAT0 not present\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;PNP0C32\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;*pnp0c14\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivideo0 at acpi0: VID_\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivout0 at acpivideo0: LCD_\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivideo1 at acpi0: VID_\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivout at acpivideo1 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivideo2 at acpi0: VID2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: Enhanced SpeedStep \u003cspan style=\"color:#f99b15\"\u003e965\u003c/span\u003e MHz: speeds: 2000, 1600, 1200, \u003cspan style=\"color:#f99b15\"\u003e800\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 GM965 Host\u0026#34;\u003c/span\u003e rev 0x0c\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eppb0 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;Intel GM965 PCIE\u0026#34;\u003c/span\u003e rev 0x0c: 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\u003evga1 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;NVIDIA GeForce 8400M GS\u0026#34;\u003c/span\u003e rev 0xa1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsdisplay0 at vga1 mux 1: console \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e80x25, vt100 emulation\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\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\u003e80x25, vt100 emulation\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhci0 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 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801H USB\u0026#34;\u003c/span\u003e rev 0x02: apic \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhci1 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e26\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801H USB\u0026#34;\u003c/span\u003e rev 0x02: apic \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e21\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eehci0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e26\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801H USB\u0026#34;\u003c/span\u003e rev 0x02: apic \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eusb0 at ehci0: USB revision 2.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhub0 at usb0 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel EHCI root hub\u0026#34;\u003c/span\u003e rev 2.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\u003eazalia0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e27\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 82801H HD Audio\u0026#34;\u003c/span\u003e rev 0x02: msi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eazalia0: codecs: Sigmatel STAC9228X\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eaudio0 at azalia0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eppb1 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 82801H PCIE\u0026#34;\u003c/span\u003e rev 0x02: msi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epci2 at ppb1 bus \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eppb2 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e28\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801H PCIE\u0026#34;\u003c/span\u003e rev 0x02: msi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epci3 at ppb2 bus \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Broadcom BCM4321\u0026#34;\u003c/span\u003e rev 0x03 at pci3 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 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eppb3 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e28\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801H PCIE\u0026#34;\u003c/span\u003e rev 0x02: msi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epci4 at ppb3 bus \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eppb4 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e28\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801H PCIE\u0026#34;\u003c/span\u003e rev 0x02: msi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epci5 at ppb4 bus \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebge0 at pci5 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;Broadcom BCM5906M\u0026#34;\u003c/span\u003e rev 0x02, BCM5906 A2 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0xc002\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: msi, address 00:1d:09:37:6d:1b\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebrgphy0 at bge0 phy 1: BCM5906 10/100baseTX PHY, rev. \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhci2 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e29\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 82801H USB\u0026#34;\u003c/span\u003e rev 0x02: apic \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhci3 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e29\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801H USB\u0026#34;\u003c/span\u003e rev 0x02: apic \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e21\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhci4 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e29\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801H USB\u0026#34;\u003c/span\u003e rev 0x02: apic \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eehci1 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e29\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801H USB\u0026#34;\u003c/span\u003e rev 0x02: apic \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eusb1 at ehci1: USB revision 2.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhub1 at usb1 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel EHCI root hub\u0026#34;\u003c/span\u003e rev 2.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\u003eppb5 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e30\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 82801BAM Hub-to-PCI\u0026#34;\u003c/span\u003e rev 0xf2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epci6 at ppb5 bus \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#34;Ricoh 5C832 Firewire\u0026#34;\u003c/span\u003e rev 0x05 at pci6 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 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdhc0 at pci6 dev \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Ricoh 5C822 SD/MMC\u0026#34;\u003c/span\u003e rev 0x22: apic \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e18\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdhc0: SDHC 1.0, \u003cspan style=\"color:#f99b15\"\u003e33\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Ricoh 5C843 MMC\u0026#34;\u003c/span\u003e rev 0x12 at pci6 dev \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\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;Ricoh 5C592 Memory Stick\u0026#34;\u003c/span\u003e rev 0x12 at pci6 dev \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\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;Ricoh 5C852 xD\u0026#34;\u003c/span\u003e rev 0x12 at pci6 dev \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e not configured\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 82801HBM LPC\u0026#34;\u003c/span\u003e rev 0x02\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epciide0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e31\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801HBM IDE\u0026#34;\u003c/span\u003e rev 0x02: DMA, channel \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e configured to compatibility, channel \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e configured to compatibility\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eatapiscsi0 at pciide0 channel \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e drive \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus1 at atapiscsi0: \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e targets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd0 at scsibus1 targ \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e lun 0: \u0026lt;HL-DT-ST, DVD+-RW GSA-S10N, A103\u0026gt; ATAPI 5/cdrom removable\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd0\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003epciide0:0:0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: using PIO mode 4, Ultra-DMA mode \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epciide0: channel \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e ignored \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003edisabled\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eahci0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e31\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801HBM AHCI\u0026#34;\u003c/span\u003e rev 0x02: msi, AHCI 1.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eahci0: port 0: 3.0Gb/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eahci0: PHY offline on port \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus2 at ahci0: \u003cspan style=\"color:#f99b15\"\u003e32\u003c/span\u003e targets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd0 at scsibus2 targ \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e lun 0: \u0026lt;ATA, TOSHIBA MQ01ABF0, AM0G\u0026gt; SCSI3 0/direct fixed naa.5000039523783257\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd0: 476940MB, \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e bytes/sector, \u003cspan style=\"color:#f99b15\"\u003e976773168\u003c/span\u003e sectors\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eichiic0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e31\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel 82801H SMBus\u0026#34;\u003c/span\u003e rev 0x02: apic \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiic0 at ichiic0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003espdmem0 at iic0 addr 0x50: 2GB DDR2 SDRAM non-parity PC2-6400CL6 SO-DIMM\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003espdmem1 at iic0 addr 0x52: 2GB DDR2 SDRAM non-parity PC2-5300CL5 SO-DIMM\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eusb2 at uhci0: USB revision 1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhub2 at usb2 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel UHCI root hub\u0026#34;\u003c/span\u003e rev 1.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\u003eusb3 at uhci1: USB revision 1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhub3 at usb3 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel UHCI root hub\u0026#34;\u003c/span\u003e rev 1.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\u003eusb4 at uhci2: USB revision 1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhub4 at usb4 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel UHCI root hub\u0026#34;\u003c/span\u003e rev 1.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\u003eusb5 at uhci3: USB revision 1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhub5 at usb5 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel UHCI root hub\u0026#34;\u003c/span\u003e rev 1.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\u003eusb6 at uhci4: USB revision 1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhub6 at usb6 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel UHCI root hub\u0026#34;\u003c/span\u003e rev 1.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\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\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, using wsdisplay0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epms0 at pckbc0 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eaux slot\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsmouse0 at pms0 mux \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epms0: Synaptics touchpad, firmware 6.3\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\u003euvideo0 at uhub1 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;OmniVision Technologies, Inc. -2640-07.07.20.3 Laptop Integrated Webcam\u0026#34;\u003c/span\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\u003evideo0 at uvideo0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eugen0 at uhub6 port \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;STMicroelectronics Biometric Coprocessor\u0026#34;\u003c/span\u003e rev 1.00/0.01 addr \u003cspan style=\"color:#f99b15\"\u003e2\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\u003e7d76cb4c2570dde6.a\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e swap on sd0b dump on sd0b\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\u003ehw.sensors.cpu0.temp0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e69.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\u003e54.50 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\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpibtn0.indicator0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eOn \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elid open\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpiac0.indicator0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eOn \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003epower supply\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":"Récapitulatif de ce qui fonctionne ou pas sur un Dell XPS M1330 sous OpenBSD","tags":["OpenBSD","Dell","alienware","dmesg","sensors"],"date_published":"2016-12-10T20:42:12+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/firefox#abb44a31de25bd1cf0a8b1a61d16a3b15790e0368a4a9680733ce2d930817a74","url":"https://it-log.fr.eu.org/fr/sys/openbsd/firefox/","title":"Firefox / OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"Description [Firefox]https://www.mozilla.org/firefox/) est un navigateur web conforme aux normes, pleinement équipé, 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 Moteurs de Recherche Installation Installez le paquet firefox.\nConfiguration AttentionLa plupart des informations de configuration ci-dessous concernent Firefox Quantum- moteur du navigateur à partir de la v57 !\nMerci d\u0026rsquo;en tenir compte.\nD-Bus Pour une intégration propre avec les composants des environnements de bureau, Firefox a besoin d\u0026rsquo;une instance de D-Bus fonctionnelle.\nVeuillez lire D-Bus [système de bus de messages] / OpenBSD\nDoH Cette option est disponible à partir de la v63.0 !\nPour activer DNS-sur-HTTPS (DoH: DNS-over-HTTPS), ouvrez les préférences\nMenu \u0026ldquo;Général\u0026rdquo; Déroulez jusqu\u0026rsquo;à la section \u0026ldquo;Paramètres réseau\u0026rdquo; Cliquez sur le bouton [ Paramètres… ] Déroulez jusqu\u0026rsquo;à la case à cocher \u0026ldquo;Activer DNS sur HTTPS\u0026rdquo; ; cochez la case ! AttentionIl semble préférable de modifier l\u0026rsquo;URL proposée par défaut… retrouvez des adresses de serveurs DNS gérant DoH, par exemple, sur :\nhttps://doh.defaultroutes.de/#sec-5 https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers Cette URL est paramétrable aussi par le biais de l' éditeur de configuration ; cherchez puis modifiez la valeur network.trr.uri.\nL\u0026rsquo;éditeur de configuration permet de modifier les valeurs des Résolveurs Récursifs de Confiance (en anglais : TRR (Trusted Recursive Resolvers) ).\nnetwork.trr.mode :\n0 : défaut, off 1 : mode race 2 : TRR en premier 3 : TRR seulement 4 : mode shadow 5 : désactivé par choix. Informations [Doh] Mozilla\u0026rsquo;s plans : Archive Security/DOH-resolver-policy Trusted Recursive Resolver FIDO/U2F OpenBSD 6.7 apporte la gestion de clés USB respectant la norme FIDO, permettant ainsi la double authentification U2F.\nFirefox supporte U2F depuis la version 60.0 et supérieure. Néanmoins, il peut être utile de vérifier sa configuration et s\u0026rsquo;assurer que la variable de type booléenne security.webauth.u2f soit bien configurée sur true.\nEnsuite, tout site web qui propose l\u0026rsquo;authentification U2F devrait être capable de voir la clé U2F, après la saisie de mots de passe :\npour la phase de reconnaissance, puis, pour permettre l\u0026rsquo;authentification (Exemples de site supportant la 2FA U2F : GitHub, GitLab, …)\nAccé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 ! Audio, Vidéo HTML5 Pour ajouter le support audio et vidéo HTML5, installez le paquet ffmpeg .\nModule complémentaire Vous pouvez ajouter le module HTML5 Video Everywhere! qui améliorera la lecture vidéo en favorisant celle-ci par le biais d\u0026rsquo;un lecteur vidéo HTML5 - utile, par exemple, pour les lectures Youtube…\nKerberosV Pour utiliser Firefox en mode KerberosV :\nil faut installer le paquet heimdal. 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 au fichier /etc/rc.conf.local Si vous désirez spécifier l\u0026rsquo;usage de Kerberos en ciblant certains domaines, utilisez l\u0026rsquo;éditeur de configuration puis modifiez la clé network.negotiate-auth.trusted-uris en ajoutant votre domaine, tel que : .example.com.\nLangue Française ≥ v69 Depuis Firefox v69.0.2, sous OpenBSD 6.6, il est possible de changer en choisissant le menu \u0026ldquo;préférences\u0026rdquo;, onglet \u0026lsquo;General\u0026rsquo; \u0026gt; Language, puis cliquez sur la liste déroulante pour ajouter une nouvelle langue.\nVous aurez une nouvelle fenêtre qui s\u0026rsquo;affiche qui vous permettra d\u0026rsquo;ajouter \u0026lsquo;French\u0026rsquo; ; validez votre choix par l\u0026rsquo;appui sur le bouton [ OK ].\nRedémarrez Firefox, et voilà !\n≥ v59 Pour Firefox v59 ou supérieure :\nInstallez le module Français Language Pack ! Activez la gestion de la langue française : menu Tools \u0026gt; Add-ons \u0026gt; Language Ensuite, ouvrez l\u0026rsquo;éditeur de configuration puis créer|chercher la variable de type \u0026lsquo;String\u0026rsquo; intl.locale.requested et la mettre à fr-FR ≥ v56 ⇒ Pour Firefox, inférieure ou égale à v56 :\nAllez dans les préférences, puis activer la langue française dans la partie \u0026ldquo;Contenu\u0026rdquo; ouvrez ensuite l\u0026rsquo;éditeur de configuration, puis cherchez general.useragent.locale et mettre à fr-FR. Paquets supplémentaires Vous pouvez aussi essayer à installer :\nle paquet firefox-i18n-fr. le module Français Language Pack : OpenBSD v6.3 : version 59 OpenBSD v6.2 : version 56 le package mozilla-dicts-fr, qui est le package additionnel, non nécessaire, du dictionnaire français… Liens mailto À-propos de la gestion des liens mailto :\nOuvrez l\u0026rsquo;éditeur de configuration, et 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) Extensions KeePassXC-Browser Depuis OpenBSD 6.6, le logiciel de confidentialité KeePassXC est installable.\nPour fonctionner correctement avec Firefox, 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 Unveil et KeePassXC Proxy Ajouter au fichier de configuration unveil de firefox 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.\nRecherche OpenBSD Manpage Retrouvez un module pour effectuer une recherche sur le site officiel OpenBSD Manual page :\nOpenBSD Manpage : https://addons.mozilla.org/addon/openbsd-manpage/ Multi-processus Pour activer la gestion de la fonctionnalité des multi-processus, ouvrez l\u0026rsquo;éditeur de configuration, puis :\nvérifiez l\u0026rsquo;option browser.tabs.remote.force-enable au besoin, si elle n\u0026rsquo;existe pas, créez-la - et positionnez-la à true ; positionnez l\u0026rsquo;option browser.tabs.remote.autostart à true ; Puis, vérifiez le support, dans la section \u0026ldquo;Paramètres de base de l’application\u0026rdquo;, vous devriez lire à \u0026ldquo;Fenêtres multi-processus 1/1 (Activé par l’utilisateur)\u0026rdquo; - sinon, cela ne fonctionne pas !\nSupport 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/browser/defaults/preferences/ lors de l\u0026rsquo;installation, principalement :\n/etc/firefox/pledge.main /etc/firefox/unveil.main Gestion 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/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 about:config L\u0026rsquo;éditeur de configuration est accessible en écrivant dans la barre d\u0026rsquo;URL : about:config.\nDangerL\u0026rsquo;édition de la configuration comporte des risques ; en effet, une mauvaise configuration peut rendre instable ou empêcher le logiciel de fonctionner.\nUne fois la configuration modifiée, il est important de redémarrer le logiciel !\nabout:preferences Les Préférences sont accessibles de deux manières :\nPar le menu \u0026ldquo;Édition\u0026rdquo; \u0026gt; \u0026ldquo;Préférences\u0026rdquo; ou, en écrivant dans la barre d\u0026rsquo;URL : about:preferences about:support La page Informations de dépannage est accessible en écrivant dans la barre d\u0026rsquo;URL : about:support.\nCette page contient des informations techniques qui permettent de vérifier le support de certaines fonctionnalités et d\u0026rsquo;aider à résoudre certains problèmes !\nDébogage Veuillez ABSOLUMENT lire le fichier pkg-readme de Firefox, pour savoir comment faire pour remonter tout problème rencontré, si Firefox crashe régulièrement.\nAttention, tout rapport de bogue envoyé sans les informations nécessaires et demandées dans la section \u0026ldquo;Debugging\u0026rdquo; sera purement et simplement ignoré !\nFirefox ne démarre pas Si Firefox 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ésactivé toutes vos extensions, vos thèmes.\nFirefox a un comportement étrange Si Firefox 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 profil ]. Firefox et firefox-esr 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, la version Firefox ESR 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 gtk+2-cups ou son pendant gtk+3-cups ?\nIPv4 / IPv6 Vous avez besoin de consulter certains sites juste sur le protocole IPv4 ?\nOuvrez l\u0026rsquo;éditeur de configuration et paramétrez la variable network.dns.ipv4OnlyDomains. Si vous voulez gérer plusieurs domaines, séparez-les par une virgule.\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. L\u0026rsquo;option de préférence du schéma de couleurs prefers-color-scheme doit être activé par l\u0026rsquo;éditeur de configuration.\nCréez une valeur numérique ui.systemUsesDarkTheme en lui donnant pour valeur 1.\nProtonmail Vous n\u0026rsquo;arrivez pas à vous connecter au service web de Protonmail.com !\nOuvrez l\u0026rsquo;éditeur de configuration, puis positionnez l\u0026rsquo;option javascript.options.asmjs sur false - (source)\nDocumentation Après l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de lire le fichier : /usr/local/share/doc/pkg-readmes/firefox\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[Firefox]https://www.mozilla.org/firefox/)\u003c/strong\u003e est un navigateur web\nconforme aux normes, pleinement équipé, construit sur la base du code de\nMozilla 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 Moteurs 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\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\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\"\u003e\u003cp\u003eLa plupart des informations de configuration ci-dessous concernent\nFirefox Quantum- moteur du navigateur à partir de la v57 !\u003c/p\u003e\n\u003cp\u003eMerci d\u0026rsquo;en tenir compte.\u003c/p\u003e\n\u003c/div\u003e\n\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 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=\"doh\"\u003eDoH\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eCette option est disponible à partir de la v63.0 !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ePour activer DNS-sur-HTTPS (DoH: DNS-over-HTTPS), ouvrez les\n\u003ca href=\"/fr/sys/openbsd/firefox/#aboutpreferences\"\u003epréférences\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMenu \u0026ldquo;Général\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eDéroulez jusqu\u0026rsquo;à la section \u0026ldquo;Paramètres réseau\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eCliquez sur le bouton [ \u003cu\u003eP\u003c/u\u003earamètres… ]\u003c/li\u003e\n\u003cli\u003eDéroulez jusqu\u0026rsquo;à la case à cocher \u0026ldquo;Activer DNS sur HTTPS\u0026rdquo; ; cochez la\ncase !\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 semble préférable de modifier l\u0026rsquo;URL proposée par défaut… retrouvez\ndes adresses de serveurs DNS gérant DoH, par exemple, sur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://doh.defaultroutes.de/#sec-5\" rel=\"external\"\u003ehttps://doh.defaultroutes.de/#sec-5\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers\" rel=\"external\"\u003ehttps://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCette URL est paramétrable aussi par le biais de l'\n\u003ca href=\"/fr/sys/openbsd/firefox/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e ; cherchez puis modifiez la valeur\n\u003ccode\u003enetwork.trr.uri\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/firefox/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e permet de\nmodifier les valeurs des Résolveurs Récursifs de Confiance\n\u003cem\u003e(en anglais : \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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\"\u003eTRR \u003cem\u003e(Trusted Recursive Resolvers)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n)\u003c/em\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003enetwork.trr.mode\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e0\u003c/code\u003e : défaut, \u003ccode\u003eoff\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e1\u003c/code\u003e : mode \u003ccode\u003erace\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e2\u003c/code\u003e : TRR en premier\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e3\u003c/code\u003e : TRR seulement\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e4\u003c/code\u003e : mode \u003ccode\u003eshadow\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e5\u003c/code\u003e : désactivé par choix.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch4 id=\"informations\"\u003eInformations\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e[Doh] Mozilla\u0026rsquo;s plans : \u003ca href=\"https://mailarchive.ietf.org/arch/msg/doh/po6GCAJ52BAKuyL-dZiU91v6hLw\" rel=\"external\"\u003eArchive\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://wiki.mozilla.org/Security/DOH-resolver-policy\" rel=\"external\"\u003eSecurity/DOH-resolver-policy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://wiki.mozilla.org/Trusted_Recursive_Resolver\" rel=\"external\"\u003eTrusted Recursive Resolver\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"fidou2f\"\u003eFIDO/U2F\u003c/h3\u003e\n\u003cp\u003eOpenBSD 6.7 apporte la gestion de clés USB respectant la norme FIDO,\npermettant ainsi la double authentification U2F.\u003c/p\u003e\n\u003cp\u003eFirefox supporte U2F depuis la version 60.0 et supérieure. Néanmoins, il peut\nêtre utile de vérifier sa \u003ca href=\"/fr/sys/openbsd/firefox/#aboutconfig\"\u003econfiguration\u003c/a\u003e et s\u0026rsquo;assurer que la\nvariable de type booléenne \u003ccode\u003esecurity.webauth.u2f\u003c/code\u003e soit bien configurée sur \u003ccode\u003etrue\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eEnsuite, tout site web qui propose l\u0026rsquo;authentification U2F devrait être\ncapable de voir la clé U2F, après la saisie de mots de passe :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour la phase de reconnaissance,\u003c/li\u003e\n\u003cli\u003epuis, pour permettre l\u0026rsquo;authentification\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003e(Exemples de site supportant la 2FA U2F : GitHub, GitLab, …)\u003c/em\u003e\u003c/p\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/#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/#aboutsupport\"\u003esupport\u003c/a\u003e, cherchez les champs \u003ccode\u003eHW_COMPOSITING\u003c/code\u003e\net \u003ccode\u003eOPENGL_COMPOSITING\u003c/code\u003e dans la section \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/#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/#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=\"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\u003ch4 id=\"module-complémentaire\"\u003eModule complémentaire\u003c/h4\u003e\n\u003cp\u003eVous pouvez ajouter le module\n\u003cstrong\u003e\u003ca href=\"https://addons.mozilla.org/en-US/firefox/addon/html5-video-everywhere-next/\" rel=\"external\"\u003eHTML5 Video Everywhere!\u003c/a\u003e\u003c/strong\u003e\nqui améliorera la lecture vidéo en favorisant celle-ci par le biais d\u0026rsquo;un\nlecteur vidéo HTML5 - \u003cem\u003eutile, par exemple, pour les lectures Youtube\u003c/em\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 \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_*)'\"\u003einstaller\u003c/a\u003e\n\nle paquet \u003ccode\u003eheimdal\u003c/code\u003e\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003epuis configurer votre client Kerberos.\u003c/li\u003e\n\u003cli\u003eajouter à votre environnement la variable \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 au 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,\nutilisez l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/firefox/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e puis\nmodifiez la clé \u003ccode\u003enetwork.negotiate-auth.trusted-uris\u003c/code\u003e en ajoutant votre\ndomaine, tel que : \u003cbr\u003e\n\u003ccode\u003e.example.com\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"langue-française\"\u003eLangue Française\u003c/h3\u003e\n\u003ch4 id=\"-v69\"\u003e≥ v69\u003c/h4\u003e\n\u003cp\u003eDepuis Firefox v69.0.2, sous OpenBSD 6.6, il est possible de changer en\nchoisissant le menu \u0026ldquo;\u003ca href=\"/fr/sys/openbsd/firefox/#aboutpreferences\"\u003epréférences\u003c/a\u003e\u0026rdquo;,\nonglet \u0026lsquo;General\u0026rsquo; \u0026gt; Language, puis cliquez sur la liste déroulante pour\najouter une nouvelle langue.\u003c/p\u003e\n\u003cp\u003eVous aurez une nouvelle fenêtre qui s\u0026rsquo;affiche qui vous permettra\nd\u0026rsquo;ajouter \u0026lsquo;French\u0026rsquo; ; validez votre choix par l\u0026rsquo;appui sur le bouton [ OK ].\u003c/p\u003e\n\u003cp\u003eRedémarrez Firefox, et voilà !\u003c/p\u003e\n\u003ch4 id=\"-v59\"\u003e≥ v59\u003c/h4\u003e\n\u003cp\u003ePour Firefox v59 ou supérieure :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eInstallez le module \u003cstrong\u003eFrançais Language Pack\u003c/strong\u003e !\u003c/li\u003e\n\u003cli\u003eActivez la gestion de la langue française : menu \u003ccode\u003eTools\u003c/code\u003e \u0026gt; \u003ccode\u003eAdd-ons\u003c/code\u003e \u0026gt; \u003ccode\u003eLanguage\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eEnsuite, ouvrez l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/firefox/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e\npuis créer|chercher la variable de type \u0026lsquo;String\u0026rsquo; \u003ccode\u003eintl.locale.requested\u003c/code\u003e\net la mettre à \u003ccode\u003efr-FR\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"-v56\"\u003e≥ v56\u003c/h4\u003e\n\u003cp\u003e⇒ Pour Firefox, inférieure ou égale à v56 :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAllez dans les \u003ca href=\"/fr/sys/openbsd/firefox/#aboutpreferences\"\u003epréférences\u003c/a\u003e, puis\nactiver la langue française dans la partie \u0026ldquo;Contenu\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eouvrez ensuite l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/firefox/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e,\npuis cherchez \u003ccode\u003egeneral.useragent.locale\u003c/code\u003e et mettre à \u003ccode\u003efr-FR\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"paquets-supplémentaires\"\u003ePaquets supplémentaires\u003c/h4\u003e\n\u003cp\u003eVous pouvez aussi essayer à \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\u003cstrong\u003ele paquet \u003ccode\u003efirefox-i18n-fr\u003c/code\u003e\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003ele module \u003cstrong\u003eFrançais Language Pack\u003c/strong\u003e :\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOpenBSD v6.3\u003c/strong\u003e : \u003cstrong\u003e\u003ca href=\"https://addons.mozilla.org/fr/firefox/addon/fran%C3%A7ais-language-pack/versions/59.0\" rel=\"external\"\u003eversion 59\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOpenBSD v6.2\u003c/strong\u003e : \u003cstrong\u003e\u003ca href=\"https://addons.mozilla.org/fr/firefox/addon/fran%C3%A7ais-language-pack/versions/56.0\" rel=\"external\"\u003eversion 56\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ele package \u003cstrong\u003emozilla-dicts-fr\u003c/strong\u003e, qui est le package additionnel, non\nnécessaire, du dictionnaire français…\u003c/li\u003e\n\u003c/ul\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\u003eOuvrez l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/firefox/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e, et\ncherchez l\u0026rsquo;option \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, tel\nque : \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; \u003cem\u003e(\u003ccode\u003enew string\u003c/code\u003e)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\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 Firefox, il est nécessaire d\u0026rsquo;installer\nle module \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\u003ch5 id=\"unveil-et-keepassxc-proxy\"\u003eUnveil et KeePassXC Proxy\u003c/h5\u003e\n\u003cp\u003eAjouter au \u003ca href=\"/fr/sys/openbsd/firefox/#support-pledge-et-unveil\"\u003efichier de configuration unveil\u003c/a\u003e\nde firefox \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=\"recherche-openbsd-manpage\"\u003eRecherche OpenBSD Manpage\u003c/h3\u003e\n\u003cp\u003eRetrouvez un module pour effectuer une recherche sur le site officiel\nOpenBSD Manual page :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOpenBSD Manpage\u003c/strong\u003e : \u003ca href=\"https://addons.mozilla.org/addon/openbsd-manpage/\" rel=\"external\"\u003ehttps://addons.mozilla.org/addon/openbsd-manpage/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"multi-processus\"\u003eMulti-processus\u003c/h3\u003e\n\u003cp\u003ePour \u003cstrong\u003eactiver la gestion de la fonctionnalité des multi-processus\u003c/strong\u003e,\nouvrez l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/firefox/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e, puis :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003evérifiez l\u0026rsquo;option \u003ccode\u003ebrowser.tabs.remote.force-enable\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eau besoin, si elle n\u0026rsquo;existe pas, créez-la\u003c/em\u003e - et positionnez-la à\n\u003ccode\u003etrue\u003c/code\u003e ;\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003epositionnez l\u0026rsquo;option \u003ccode\u003ebrowser.tabs.remote.autostart\u003c/code\u003e à \u003ccode\u003etrue\u003c/code\u003e ;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuis, vérifiez le \u003ca href=\"/fr/sys/openbsd/firefox/#aboutsupport\"\u003esupport\u003c/a\u003e, dans la\nsection \u0026ldquo;Paramètres de base de l’application\u0026rdquo;, vous devriez lire à\n\u0026ldquo;Fenêtres multi-processus     1/1 (Activé par l’utilisateur)\u0026rdquo; -\n\u003cem\u003esinon, cela ne fonctionne pas\u003c/em\u003e !\u003c/p\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\u003e/etc/firefox\u003c/code\u003e qui est une copie de\n\u003ccode\u003e/usr/local/lib/firefox/browser/defaults/preferences/\u003c/code\u003e lors de\nl\u0026rsquo;installation, principalement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/etc/firefox/pledge.main\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/etc/firefox/unveil.main\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\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/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\u003chr\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"aboutconfig\"\u003eabout:config\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;éditeur de configuration est accessible en écrivant dans la barre\nd\u0026rsquo;URL : \u003ccode\u003eabout:config\u003c/code\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cp\u003eL\u0026rsquo;édition de la configuration comporte des risques ; en effet, une\nmauvaise configuration peut rendre instable ou empêcher le logiciel de\nfonctionner.\u003c/p\u003e\n\u003cp\u003eUne fois la configuration modifiée, il est important de \u003cstrong\u003eredémarrer le\nlogiciel\u003c/strong\u003e !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"aboutpreferences\"\u003eabout:preferences\u003c/h3\u003e\n\u003cp\u003eLes \u003cstrong\u003ePréférences\u003c/strong\u003e sont accessibles de deux manières :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePar le menu \u0026ldquo;Édition\u0026rdquo; \u0026gt; \u0026ldquo;Préférences\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eou, en écrivant dans la barre d\u0026rsquo;URL : \u003ccode\u003eabout:preferences\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"aboutsupport\"\u003eabout:support\u003c/h3\u003e\n\u003cp\u003eLa page \u003cstrong\u003eInformations de dépannage\u003c/strong\u003e est accessible en écrivant dans la\nbarre d\u0026rsquo;URL : \u003ccode\u003eabout:support\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eCette page contient des informations techniques qui permettent de\nvérifier le support de certaines fonctionnalités et d\u0026rsquo;aider à résoudre\ncertains problèmes !\u003c/p\u003e\n\u003ch3 id=\"débogage\"\u003eDébogage\u003c/h3\u003e\n\u003cp\u003eVeuillez ABSOLUMENT lire le fichier pkg-readme de Firefox, pour savoir\ncomment faire pour remonter tout problème rencontré, si Firefox crashe\nrégulièrement.\u003c/p\u003e\n\u003cp\u003eAttention, tout rapport de bogue envoyé sans les informations nécessaires\net demandées dans la section \u0026ldquo;Debugging\u0026rdquo; sera purement et simplement ignoré !\u003c/p\u003e\n\u003ch3 id=\"firefox-ne-démarre-pas\"\u003eFirefox ne démarre pas\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSi Firefox ne démarre pas\u003c/strong\u003e, essayez de le démarrer en mode console,\navec l\u0026rsquo;option \u003ccode\u003e-safe-mode\u003c/code\u003e - \u003cem\u003ecela aura pour effet d\u0026rsquo;essayer à le\ndémarrer après avoir désactivé toutes vos extensions, vos thèmes.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"firefox-a-un-comportement-étrange\"\u003eFirefox a un comportement étrange\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSi Firefox a un comportement étrange\u003c/strong\u003e, essayez de créer un nouveau\nprofil :\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 profil ].\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"firefox-et-firefox-esr-en-même-temps\"\u003eFirefox et firefox-esr 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, la version\n\u003cstrong\u003e\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\u003c/strong\u003e\net celle-ci, vous 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 \u003ccode\u003egtk+2-cups\u003c/code\u003e ou son pendant \u003ccode\u003egtk+3-cups\u003c/code\u003e ?\u003c/p\u003e\n\u003ch3 id=\"ipv4--ipv6\"\u003eIPv4 / IPv6\u003c/h3\u003e\n\u003cp\u003eVous avez besoin de consulter certains sites juste sur le protocole IPv4 ?\u003c/p\u003e\n\u003cp\u003eOuvrez l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/firefox/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e et\nparamétrez la variable \u003ccode\u003enetwork.dns.ipv4OnlyDomains\u003c/code\u003e. Si vous voulez\ngérer plusieurs domaines, séparez-les par une virgule.\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/#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\u003cp\u003eL\u0026rsquo;option de préférence du schéma de couleurs \u003ccode\u003eprefers-color-scheme\u003c/code\u003e doit\nêtre activé par l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/firefox/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eCréez une valeur numérique \u003ccode\u003eui.systemUsesDarkTheme\u003c/code\u003e en lui donnant pour valeur \u003ccode\u003e1\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"protonmail\"\u003eProtonmail\u003c/h3\u003e\n\u003cp\u003eVous n\u0026rsquo;arrivez pas à vous connecter au service web de Protonmail.com !\u003c/p\u003e\n\u003cp\u003eOuvrez l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/firefox/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e, puis\npositionnez l\u0026rsquo;option \u003ccode\u003ejavascript.options.asmjs\u003c/code\u003e sur \u003ccode\u003efalse\u003c/code\u003e -\n\u003cem\u003e(\u003ca href=\"http://www.vincentdelft.be/post/post_20181001\" rel=\"external\"\u003esource\u003c/a\u003e)\u003c/em\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\u003c/strong\u003e : \u003cbr\u003e\n\u003ccode\u003e/usr/local/share/doc/pkg-readmes/firefox\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 navigateur web Firefox sous OpenBSD","tags":["OpenBSD","Firefox"],"date_published":"2016-12-10T16:44:39+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/after-install#79900b0d074fad08fdbe0972ac79f50669dfc407478ea1be89fa35ffef537a34","url":"https://it-log.fr.eu.org/fr/sys/openbsd/after-install/","title":"Que faire après l'installation d’OpenBSD ?","author":{"name":"Stéphane HUC"},"content_text":"Envoyer votre dmesg aux développeurs Si vous voulez aider à l\u0026rsquo;amélioration du support matériel d\u0026rsquo;OpenBSD, ça ne prend que quelques minutes.\nLancez la commande (dmesg; sysctl hw.sensors) \u0026gt; ~/dmesg.txt Envoyez le fichier dmesg.txt à dmesg@openbsd.org, avec quelques informations supplémentaires sur ce qui fonctionne ou non. Plus d\u0026rsquo;infos sur la FAQ.\nAccélérer le disque-dur avec les soft-updates InfoÀ partir d\u0026rsquo;OpenBSD 7.4, l\u0026rsquo;option softdep n\u0026rsquo;est plus opérationnelle.\nCf: 1, 2\nAjoutez l\u0026rsquo;option softdep dans le fichier /etc/fstab sur chaque ligne pour qu’elles ressemblent à ça :\n/dev/sd0a / ffs rw,softdep 1 1 De même, on peut rajouter l\u0026rsquo;option noatime, ce qui donne :\n/dev/sd0a / ffs rw,softdep,noatime 1 1 AttentionAttention à l\u0026rsquo;usage de cette option, dans certains contextes, elle peut être dangereuse car elle désactive la journalisation des informations relatives aux modifications dans le système de fichier.\nElle peut être utile dans le contexte d\u0026rsquo;usage de disque de type SSD, afin d\u0026rsquo;aider à ne pas les \u0026ldquo;user\u0026rdquo; prématurément…\nSi vous décidez de l\u0026rsquo;utiliser, soyez attentif à tout dysfonctionnement de votre système d\u0026rsquo;exploitation !\nLire les conseils afterboot La toute première source d\u0026rsquo;information disponible, nécessaire à consulter, juste après une installation, est celle-ci :\n$ man afterboot\npkg-readme Les \u0026lsquo;pkg-readme\u0026rsquo; sont les fichiers readme liés à un binaire, utilisables après l\u0026rsquo;installation du binaire lié :\n$ less /usr/local/share/doc/pkg-readmes/pkg_name\n\u0026lsquo;pkg_name\u0026rsquo; étant le nom du binaire… En effet, certaines informations pertinentes sont restituées dans ces fichiers \u0026lsquo;readme\u0026rsquo; et expliquées clairement…\nAstuceAstuce : si vous avez un environnement graphique, tel que XFCE , pourquoi pas créer un lien symbolique vers le répertoire /usr/local/share/doc/pkg-readmes/, sur votre \u0026ldquo;bureau\u0026rdquo; ;-)\n$ ln -s /usr/local/share/doc/pkg-readmes/ ~/Desktop/\nAutres informations Kit de survie Il peut être très utile, voire indispensable, de lire notre Kit de survie sous OpenBSD :D\nTrucs \u0026amp; Astuces Retrouvez aussi tous nos Trucs et astuces pour OpenBSD, bien utiles, pour démarrer…\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=\"envoyer-votre-dmesg-aux-développeurs\"\u003eEnvoyer votre dmesg aux développeurs\u003c/h2\u003e\n\u003cp\u003eSi vous voulez aider à l\u0026rsquo;amélioration du support matériel d\u0026rsquo;OpenBSD, ça\nne prend que quelques minutes.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLancez la commande \u003ccode\u003e(dmesg; sysctl hw.sensors) \u0026gt; ~/dmesg.txt\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eEnvoyez le fichier \u003ccode\u003edmesg.txt\u003c/code\u003e à \u003ccode\u003edmesg@openbsd.org\u003c/code\u003e, avec quelques\ninformations supplémentaires sur ce qui fonctionne ou non.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://openbsd.org/faq/faq4.html#%23SendDmesg\" rel=\"external\"\u003ePlus d\u0026rsquo;infos sur la FAQ\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"accélérer-le-disque-dur-avec-les-soft-updates\"\u003eAccélérer le disque-dur avec les soft-updates\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eÀ partir d\u0026rsquo;OpenBSD 7.4, l\u0026rsquo;option \u003ccode\u003esoftdep\u003c/code\u003e n\u0026rsquo;est plus opérationnelle.\u003c/p\u003e\n\u003cp\u003eCf: \u003ca href=\"https://undeadly.org/cgi?action=article;sid=20230706044554\" rel=\"external\"\u003e1\u003c/a\u003e,\n\u003ca href=\"https://www.linuxquestions.org/questions/%2Absd-17/openbsd-soft-updates-softdep-disabled-for-future-vfs-work-4175726674/#post6440478\" rel=\"external\"\u003e2\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eAjoutez l\u0026rsquo;option \u003ca href=\"https://openbsd.org/faq/faq14.html#SoftUpdates\" rel=\"external\"\u003e\u003ccode\u003esoftdep\u003c/code\u003e\u003c/a\u003e\ndans le fichier \u003ccode\u003e/etc/fstab\u003c/code\u003e sur chaque ligne pour qu’elles ressemblent\nà ça :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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/dev/sd0a / ffs rw,softdep 1 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eDe même, on peut rajouter l\u0026rsquo;option \u003ccode\u003enoatime\u003c/code\u003e, ce qui donne :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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/dev/sd0a / ffs rw,softdep,noatime 1 1\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\u003e\u003cstrong\u003eAttention\u003c/strong\u003e à l\u0026rsquo;usage de cette option, dans certains contextes, elle\npeut être dangereuse car elle désactive la journalisation des informations\nrelatives aux modifications dans le système de fichier.\u003c/p\u003e\n\u003cp\u003eElle peut être utile dans le contexte d\u0026rsquo;usage de disque de type SSD,\nafin d\u0026rsquo;aider à ne pas les \u0026ldquo;user\u0026rdquo; prématurément…\u003c/p\u003e\n\u003cp\u003eSi vous décidez de l\u0026rsquo;utiliser, soyez attentif à tout dysfonctionnement\nde votre système d\u0026rsquo;exploitation !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"lire-les-conseils\"\u003eLire les conseils\u003c/h2\u003e\n\u003ch3 id=\"afterboot\"\u003eafterboot\u003c/h3\u003e\n\u003cp\u003eLa toute première source d\u0026rsquo;information disponible, nécessaire à consulter,\njuste après une installation, est celle-ci :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ man afterboot\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"pkg-readme\"\u003epkg-readme\u003c/h3\u003e\n\u003cp\u003eLes \u0026lsquo;pkg-readme\u0026rsquo; sont les fichiers readme liés à un binaire, utilisables\naprès l\u0026rsquo;installation du binaire lié :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ less /usr/local/share/doc/pkg-readmes/pkg_name\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u0026lsquo;pkg_name\u0026rsquo; étant le nom du binaire…\nEn effet, certaines informations pertinentes sont restituées dans ces\nfichiers \u0026lsquo;readme\u0026rsquo; et expliquées clairement…\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eAstuce\u003c/strong\u003e : si vous avez un environnement graphique, tel que\n\u003ca class=\"inside\" href=\"/fr/sys/opebsd/xfce/\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003eXFCE\u003c/a\u003e\n, pourquoi pas créer un lien\nsymbolique vers le répertoire \u003ccode\u003e/usr/local/share/doc/pkg-readmes/\u003c/code\u003e, sur\nvotre \u0026ldquo;bureau\u0026rdquo; ;-)\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ ln -s /usr/local/share/doc/pkg-readmes/ ~/Desktop/\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"autres-informations\"\u003eAutres informations\u003c/h2\u003e\n\u003ch3 id=\"kit-de-survie\"\u003eKit de survie\u003c/h3\u003e\n\u003cp\u003eIl peut être très utile, voire indispensable, de lire notre\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/kit-survie/\" title=\"Lien interne vers l\u0026#39;article : 'Kit de survie sous OpenBSD'\"\u003eKit de survie sous OpenBSD\u003c/a\u003e :D\u003c/p\u003e\n\u003ch3 id=\"trucs--astuces\"\u003eTrucs \u0026amp; Astuces\u003c/h3\u003e\n\u003cp\u003eRetrouvez aussi tous nos \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, bien utiles,\npour démarrer…\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":"Votre installation d'OpenBSD est terminée ! Voici quelques suggestions d'actions à faire ensuite…","tags":["OpenBSD","Astuce"],"date_published":"2016-12-10T16:40:23+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/apm#34cb0b4ba62242e699f5e81536f109df95d515d0ad8656e91c9744a002cadb79","url":"https://it-log.fr.eu.org/fr/sys/openbsd/apm/","title":"Apm : Programme de contrôle de la gestion de l'énergie et de l'hibernation","author":{"name":"Stéphane HUC"},"content_text":"Configuration Activer le service apmd. Paramétrer le service apmd pour le mode d\u0026rsquo;ajustement automatique des performances : -A Démarrer le service apmd. Pour suspendre l\u0026rsquo;ordinateur, lancez : apm -S. Pour faire hiberner l\u0026rsquo;ordinateur, lancez : apm -Z. Pensez à modifier l\u0026rsquo;ordre d\u0026rsquo;exécution des services pour que messagebus démarre en premier :\nOrdonner les services messagebus apmd. Documentation man 8 apm man 8 apm Synopsis apm [-AabHLlmPSvZz] [-f sockname] zzz [-SZz] [-f sockname] ZZZ [-SZz] [-f sockname] \\\nDescription apm communique avec le service de gestion avancée d\u0026rsquo;énergie apmd(8), faisant des requêtes du statut actuel de l\u0026rsquo;énergie, ou permettre de mettre le système en étant d\u0026rsquo;hibernation ou de veille. Sans aucun drapeau, apm affiche l\u0026rsquo;état actuel de la gestion d\u0026rsquo;énergie avec des messages détaillés.\nPour connaître les options, lisez le manpage apm(8) !\nFichiers /var/run/apmdev : Le socket de communication par défaut sous Unix, avec apmd(8). Le drapeau -f peut être utilisé pour spécifier un autre nom de socket. Les modes de protection de ce socket gère quels utilisateurs peut accéder aux fonctions APM. Voir aussi apm(4), [[https://man.openbsd.org/apmd.8|apmd(8)]]\nAdvanced Power Management (APM) BIOS Interface Specification (revision 1.2), Intel Corporation and Microsoft Corporation\nHistoire La commande apm est apparue dans NetBSD 1.3 ; le support OpenBSD a été ajoutée dans OpenBSD 1.2.\nTraduction ci-dessus du manpage apm(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=\"configuration\"\u003eConfiguration\u003c/h2\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 \u003cstrong\u003eapmd\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\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étrer\u003c/a\u003e\n le\nservice \u003ccode\u003eapmd\u003c/code\u003e pour le mode d\u0026rsquo;ajustement automatique des\nperformances : \u003ccode\u003e-A\u003c/code\u003e\u003c/li\u003e\n\u003cli\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émarrer le service\u003c/a\u003e\n \u003cstrong\u003eapmd\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003ePour suspendre l\u0026rsquo;ordinateur, lancez : \u003ccode\u003eapm -S\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ePour faire hiberner l\u0026rsquo;ordinateur, lancez : \u003ccode\u003eapm -Z\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003ePensez à modifier l\u0026rsquo;ordre d\u0026rsquo;exécution des services pour que\n\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\ndémarre en premier :\u003c/p\u003e\n\u003cul\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 les services\u003c/a\u003e\n \u003ccode\u003emessagebus apmd\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/apm/#man-8-apm\"\u003eman 8 apm\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"man-8-apm\"\u003eman 8 apm\u003c/h3\u003e\n\u003ch4 id=\"synopsis\"\u003eSynopsis\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eapm\u003c/strong\u003e [\u003cstrong\u003e-AabHLlmPSvZz\u003c/strong\u003e] [\u003cstrong\u003e-f\u003c/strong\u003e \u003cstrong\u003esockname\u003c/strong\u003e] \u003cbr\u003e\n\u003cstrong\u003ezzz\u003c/strong\u003e [\u003cstrong\u003e-SZz\u003c/strong\u003e] [\u003cstrong\u003e-f\u003c/strong\u003e \u003cstrong\u003esockname\u003c/strong\u003e] \u003cbr\u003e\n\u003cstrong\u003eZZZ\u003c/strong\u003e [\u003cstrong\u003e-SZz\u003c/strong\u003e] [\u003cstrong\u003e-f\u003c/strong\u003e \u003cstrong\u003esockname\u003c/strong\u003e] \\\u003c/p\u003e\n\u003ch4 id=\"description\"\u003eDescription\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eapm\u003c/strong\u003e communique avec le service de gestion avancée d\u0026rsquo;énergie\n\u003ca href=\"https://man.openbsd.org/apmd.8\" rel=\"external\"\u003eapmd(8)\u003c/a\u003e, faisant des requêtes du statut\nactuel de l\u0026rsquo;énergie, ou permettre de mettre le système en étant d\u0026rsquo;hibernation\nou de veille. \u003cbr\u003e\nSans aucun drapeau, apm affiche l\u0026rsquo;état actuel de la gestion d\u0026rsquo;énergie avec\ndes messages détaillés.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePour connaître les options, lisez le \u003ca href=\"https://man.openbsd.org/apm.8\" rel=\"external\"\u003emanpage apm(8)\u003c/a\u003e !\u003c/strong\u003e\u003c/p\u003e\n\u003ch4 id=\"fichiers\"\u003eFichiers\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/var/run/apmdev\u003c/code\u003e : Le socket de communication par défaut sous Unix,\navec \u003ca href=\"https://man.openbsd.org/apmd.8\" rel=\"external\"\u003eapmd(8)\u003c/a\u003e. Le drapeau \u003ccode\u003e-f\u003c/code\u003e peut être\nutilisé pour spécifier un autre nom de socket. Les modes de protection de\nce socket gère quels utilisateurs peut accéder aux fonctions APM.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"voir-aussi\"\u003eVoir aussi\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eapm(4), [[https://man.openbsd.org/apmd.8|apmd(8)]]\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdvanced Power Management (APM) BIOS Interface Specification (revision 1.2),\nIntel Corporation and Microsoft Corporation\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"histoire\"\u003eHistoire\u003c/h3\u003e\n\u003cp\u003eLa commande \u003cstrong\u003eapm\u003c/strong\u003e est apparue dans NetBSD 1.3 ; le support OpenBSD a\nété ajoutée dans OpenBSD 1.2.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eTraduction ci-dessus du \u003ca href=\"https://man.openbsd.org/apm.8\" rel=\"external\"\u003emanpage apm(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 les modes d'énergie et d'hibernation sous OpenBSD, grâce au programme 'apm'.","tags":["OpenBSD","apm"],"date_published":"2016-12-10T16:30:49+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/systat#7ad8819affea7142fe08fc670d87b2b19416e900fbcf8f381287c40516b349bf","url":"https://it-log.fr.eu.org/fr/sys/openbsd/systat/","title":"Systat : Voir la charge de la machine","author":{"name":"Stéphane HUC"},"content_text":"Utilisation Quelques exemples :\n⇒ charge réseau :\nsystat ifstat\n⇒ charge système :\nsystat vm\nCharge système avec systat vm ⇒ pour les températures :\nsystat sensors\nVérification des températures avec systat sensors Documentation man systat man systat Synopsis systat [-aBbiNn] [-d count] [-s delay] [-w width] [view] [delay]\nDescription systat affiche nombre de statistiques systèmes, en fonction de l\u0026rsquo;écran, en utilisant la bibliothèque curses(3).\nDurant le fonctionnement de systat, l\u0026rsquo;écran est divisé en plusieurs zones.\nLa première ligne en haut affiche le nombre actuel d\u0026rsquo;utilisateurs, la charge moyenne des trois systèmes (réel, virtuel, et mémoire) durant l\u0026rsquo;intervalle de la première minute, des 5 et 15 dernières minutes, et l\u0026rsquo;horloge système.\nLa ligne en bas de l\u0026rsquo;écran est réservé aux entrées utilisateurs, et messages d\u0026rsquo;erreurs.\nL\u0026rsquo;information affichée dans le reste de l\u0026rsquo;écran comprend une vue de l\u0026rsquo;activité système, et est l\u0026rsquo;interface principale pour afficher les différentes statistiques du système. La vue vmstat est celle par défaut.\nCertaines informations peuvent ne pas être affichées si la taille de l\u0026rsquo;écran est insuffisante pour les afficher. Par exemple, sur une machine avec 10 disques, la barre graphique d\u0026rsquo;iostat affichera seulement 3 disques sur un terminal de 24 lignes.\nPour connaître les options, lisez le manpage !\nFichiers /etc/hosts : les noms de l\u0026rsquo;hôte. /etc/pf.conf : la configuration de pf(4). /etc/services : les noms des ports. Voir aussi fstat(1), kill(1), netstat(1), nfsstat(1), ps(1), top(1), iostat(8), pfctl(8), pstat(8), renice(8), sysctl(8), vmstat(8)\nHistoire Le programme systat est apparu la première fois dans 4.3BSD.\nBogues Certains affichages présument d\u0026rsquo;un minimum de 80 caractères par ligne. L\u0026rsquo;affichage vmstat a ce problème (il a été ajouté en tant qu\u0026rsquo;affichage séparé, plutôt qu\u0026rsquo;en tant que nouveau programme).\nTraduction du manpage systat(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=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eQuelques exemples :\u003c/p\u003e\n\u003cp\u003e⇒ charge réseau :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esystat ifstat\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ charge système :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esystat vm\u003c/code\u003e\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openbsd/systatvm.png\" title=\"Charge système avec systat vm\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openbsd/systatvm_hu_5a9b6446119d6875.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Charge système avec systat vm\" height=\"146\" loading=\"lazy\" src=\"/images/openbsd/systatvm_hu_8630c9fc64f56c1.png\" type=\"image/png\" width=\"200\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eCharge système avec systat vm\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003e⇒ pour les températures :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esystat sensors\u003c/code\u003e\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openbsd/systatsensors.png\" title=\"Vérification des températures avec systat sensors\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openbsd/systatsensors_hu_e6660ce5e0f2780c.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Vérification des températures avec systat sensors\" height=\"45\" loading=\"lazy\" src=\"/images/openbsd/systatsensors_hu_5d7531fc617eebf9.png\" type=\"image/png\" width=\"200\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eVérification des températures avec systat sensors\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/systat/#man-systat\"\u003eman systat\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"man-systat\"\u003eman systat\u003c/h3\u003e\n\u003ch4 id=\"synopsis\"\u003eSynopsis\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esystat\u003c/strong\u003e [\u003cstrong\u003e-aBbiNn\u003c/strong\u003e] [\u003cstrong\u003e-d\u003c/strong\u003e count] [\u003cstrong\u003e-s\u003c/strong\u003e delay] [\u003cstrong\u003e-w\u003c/strong\u003e width] [view] [delay]\u003c/p\u003e\n\u003ch4 id=\"description\"\u003eDescription\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esystat\u003c/strong\u003e affiche nombre de statistiques systèmes, en fonction de l\u0026rsquo;écran,\nen utilisant la bibliothèque \u003ca href=\"https://man.openbsd.org/curses\" rel=\"external\"\u003ecurses(3)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eDurant le fonctionnement de \u003cstrong\u003esystat\u003c/strong\u003e, l\u0026rsquo;écran est divisé en plusieurs zones.\u003c/p\u003e\n\u003cp\u003eLa première ligne en haut affiche le nombre actuel d\u0026rsquo;utilisateurs, la\ncharge moyenne des trois systèmes (réel, virtuel, et mémoire) durant\nl\u0026rsquo;intervalle de la première minute, des 5 et 15 dernières minutes, et\nl\u0026rsquo;horloge système.\u003c/p\u003e\n\u003cp\u003eLa ligne en bas de l\u0026rsquo;écran est réservé aux entrées utilisateurs, et\nmessages d\u0026rsquo;erreurs.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;information affichée dans le reste de l\u0026rsquo;écran comprend une vue de\nl\u0026rsquo;activité système, et est l\u0026rsquo;interface principale pour afficher les\ndifférentes statistiques du système. La vue \u003ccode\u003evmstat\u003c/code\u003e est celle par défaut.\u003c/p\u003e\n\u003cp\u003eCertaines informations peuvent ne pas être affichées si la taille de\nl\u0026rsquo;écran est insuffisante pour les afficher. Par exemple, sur une machine\navec 10 disques, la barre graphique d\u0026rsquo;iostat affichera seulement 3\ndisques sur un terminal de 24 lignes.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePour connaître les options, lisez le \u003ca href=\"https://man.openbsd.org/systat\" rel=\"external\"\u003emanpage\u003c/a\u003e !\u003c/strong\u003e\u003c/p\u003e\n\u003ch4 id=\"fichiers\"\u003eFichiers\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/etc/hosts\u003c/code\u003e : les noms de l\u0026rsquo;hôte.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/etc/pf.conf\u003c/code\u003e : la configuration de \u003ca href=\"https://man.openbsd.org/pf.4\" rel=\"external\"\u003epf(4)\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/etc/services\u003c/code\u003e : les noms des ports.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"voir-aussi\"\u003eVoir aussi\u003c/h4\u003e\n\u003cp\u003e\u003ca href=\"https://man.openbsd.org/fstat.1\" rel=\"external\"\u003efstat(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/kill.1\" rel=\"external\"\u003ekill(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/netstat.1\" rel=\"external\"\u003enetstat(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/nfsstat.1\" rel=\"external\"\u003enfsstat(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/ps.1\" rel=\"external\"\u003eps(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/top.1\" rel=\"external\"\u003etop(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/iostat.8\" rel=\"external\"\u003eiostat(8)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/pfctl.8\" rel=\"external\"\u003epfctl(8)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/pstat.8\" rel=\"external\"\u003epstat(8)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/renice.8\" rel=\"external\"\u003erenice(8)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/sysctl.8\" rel=\"external\"\u003esysctl(8)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/vmstat.8\" rel=\"external\"\u003evmstat(8)\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"histoire\"\u003eHistoire\u003c/h4\u003e\n\u003cp\u003eLe programme \u003cstrong\u003esystat\u003c/strong\u003e est apparu la première fois dans 4.3BSD.\u003c/p\u003e\n\u003ch4 id=\"bogues\"\u003eBogues\u003c/h4\u003e\n\u003cp\u003eCertains affichages présument d\u0026rsquo;un minimum de 80 caractères par ligne.\nL\u0026rsquo;affichage \u003ccode\u003evmstat\u003c/code\u003e a ce problème (il a été ajouté en tant qu\u0026rsquo;affichage\nséparé, plutôt qu\u0026rsquo;en tant que nouveau programme).\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eTraduction du manpage \u003ca href=\"https://man.openbsd.org/systat.1\" rel=\"external\"\u003esystat(1)\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":"Statut système avec l'outil 'systat' sous OpenBSD","tags":["OpenBSD","systat"],"date_published":"2016-12-10T16:30:10+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/ntp-client#8869fd6344380e2d74ebc83548b469ed6d66e5c8a0de6b23c8310359bb474d91","url":"https://it-log.fr.eu.org/fr/sys/openbsd/ntp-client/","title":"NTP Client : Heure locale synchronisée","author":{"name":"Stéphane HUC"},"content_text":"NTP Client : Heure locale synchronisée La synchronisation de l\u0026rsquo;heure locale sous OpenBSD n\u0026rsquo;est pas bien difficile. Elle s\u0026rsquo;effectue au-travers du projet OpenNTPD, intégré nativement dans OpenBSD, et fonctionnel au démarrage de votre ordinateur sous 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 europe.pool.ntp.org. La zone relative à la France est : fr.pool.ntp.org etc… Configuration Le fichier de configuration est /etc/ntpd.conf.\nPour qu\u0026rsquo;il corresponde à l\u0026rsquo;heure française, il faut modifier la ligne correspondante à l\u0026rsquo;option servers, telle que :\nservers fr.pool.ntp.org\nPour en serveur NTP en local, utilisez plutôt - à mettre en premier - :\nserver adr_ip_srvr\nadr_ip_srvr est bien sûr l\u0026rsquo;adresse ip de votre serveur NTPD local ; si vous avez une résolution DNS de celui-ci, vous pouvez spécifier le nom d\u0026rsquo;hôte !\nContraintes 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.\nLes 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.\nOù l\u0026rsquo;on apprend aussi que le domaine www.openbsd.org ne doit pas être invoqué, non plus…\nExemple Exemple de configuration 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 Serveur NTPD ⇒ OpenBSD ≥ 6.9 : Il n\u0026rsquo;est plus recommandé d\u0026rsquo;activer le drapeau -s pour gérer correctement les contraintes !\n⇒ OpenBSD \u0026lt; 6.9 : Ensuite, il faut activer le drapeau -s pour que le serveur ntpd essaye de modifier l\u0026rsquo;heure locale, immédiatement au moment du (re)démarrage du serveur.\n# rcctl set ntpd flags -s\nL\u0026rsquo;heure, svp ! Maintenant que la configuration est correctement faite, il nous faut (re)démarrer le service ntpd(8) :\n# rcctl restart ntpd ntpd(ok) ntpd(ok) Toute modification du fichier de configuration nécessite le redémarrage du service NTP !\nAttendre quelques secondes, et ensuite, vérifiez le status de ntpd, avec l\u0026rsquo;outil de contrôle ntpctl(8) :\n$ doas ntpctl -sa 5/5 peers valid, 0/1 sensors valid, constraint offset -2s, clock unsynced peer wt tl st next poll offset delay jitter 162.159.200.1 time.cloudflare.com 1 7 3 5s 9s 0.848ms 52.534ms 1.445ms 195.154.226.102 from pool fr.pool.ntp.org 1 8 2 28s 32s 5.421ms 48.736ms 1.627ms 93.113.207.65 from pool fr.pool.ntp.org 1 8 2 33s 34s 6.263ms 51.508ms 2.299ms 51.15.175.180 from pool fr.pool.ntp.org 1 8 2 31s 32s 5.530ms 49.960ms 2.917ms 5.39.80.51 from pool fr.pool.ntp.org 1 7 2 4s 9s 9.524ms 52.748ms 3.335ms sensor wt gd st next poll offset correction upd0 1 0 0 12s 15s - sensor not valid - Un coup d’œil pour vérifier l\u0026rsquo;horloge, en mode graphique, ou en mode console :\n$ date Thu Apr 27 12:29:51 CEST 2023 Documentation le manpage (en anglais) : http://man.openbsd.org/ntpd.conf un exemple en local : /etc/examples/ntpd.conf Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n","content_html":"\u003ch2 id=\"ntp-client--heure-locale-synchronisée\"\u003eNTP Client : Heure locale synchronisée\u003c/h2\u003e\n\u003cp\u003eLa synchronisation de l\u0026rsquo;heure locale sous OpenBSD n\u0026rsquo;est pas bien difficile.\nElle s\u0026rsquo;effectue au-travers du projet \u003ca href=\"http://www.openntpd.org/\" rel=\"external\"\u003eOpenNTPD\u003c/a\u003e,\nintégré nativement dans OpenBSD, et fonctionnel au démarrage de votre\nordinateur sous OpenBSD.\u003c/p\u003e\n\u003ch3 id=\"serveurs-ntp\"\u003eServeurs NTP\u003c/h3\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 \u003ca href=\"http://www.pool.ntp.org/zone/europe\" rel=\"external\"\u003eeurope.pool.ntp.org\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eLa zone relative à la France est : \u003ca href=\"http://www.pool.ntp.org/zone/fr\" rel=\"external\"\u003efr.pool.ntp.org\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eetc…\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\u003ePour qu\u0026rsquo;il corresponde à l\u0026rsquo;heure française, il faut modifier la ligne\ncorrespondante à l\u0026rsquo;option \u003ccode\u003eservers\u003c/code\u003e, telle que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eservers fr.pool.ntp.org\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour en serveur NTP en local, utilisez plutôt - \u003cem\u003eà mettre en premier\u003c/em\u003e -  :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eserver adr_ip_srvr\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eadr_ip_srvr\u003c/code\u003e est bien sûr l\u0026rsquo;adresse ip de votre serveur NTPD local ;\nsi vous avez une résolution DNS de celui-ci, vous pouvez spécifier le\nnom d\u0026rsquo;hôte !\u003c/p\u003e\n\u003ch3 id=\"contraintes\"\u003eContraintes\u003c/h3\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.\u003cbr\u003e\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\u003eExemple de configuration 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-cfg\" data-lang=\"cfg\"\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\u003ch3 id=\"serveur-ntpd\"\u003eServeur NTPD\u003c/h3\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eOpenBSD ≥ 6.9\u003c/strong\u003e : Il n\u0026rsquo;est plus recommandé d\u0026rsquo;activer le drapeau \u003ccode\u003e-s\u003c/code\u003e\npour gérer correctement les contraintes !\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eOpenBSD \u0026lt; 6.9\u003c/strong\u003e : Ensuite, il faut activer le drapeau \u003ccode\u003e-s\u003c/code\u003e pour que\nle serveur ntpd essaye de modifier l\u0026rsquo;heure locale, immédiatement au\nmoment du (re)démarrage du serveur.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# rcctl set ntpd flags -s\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"lheure-svp-\"\u003eL\u0026rsquo;heure, svp !\u003c/h2\u003e\n\u003cp\u003eMaintenant que la configuration est correctement faite, il nous faut\n(re)démarrer le service \u003ca href=\"http://man.openbsd.org/ntpd.8\" rel=\"external\"\u003entpd(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 restart ntpd \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003entpd\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eok\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003entpd\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eok\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\u003eToute modification du fichier de configuration nécessite le redémarrage\ndu service NTP !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAttendre quelques secondes, et ensuite, vérifiez le status de \u003cstrong\u003entpd\u003c/strong\u003e,\navec l\u0026rsquo;outil de contrôle \u003ca href=\"http://man.openbsd.org/ntpctl.8\" rel=\"external\"\u003entpctl(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$ doas ntpctl -sa \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e5/5 peers valid, 0/1 sensors valid, constraint offset -2s, clock unsynced\n\u003c/span\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\u003e162.159.200.1 time.cloudflare.com\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\"\u003e7\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e    5s    9s         0.848ms    52.534ms     1.445ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e195.154.226.102 from pool fr.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\"\u003e8\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e   28s   32s         5.421ms    48.736ms     1.627ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e93.113.207.65 from pool fr.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\"\u003e8\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e   33s   34s         6.263ms    51.508ms     2.299ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e51.15.175.180 from pool fr.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\"\u003e8\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e   31s   32s         5.530ms    49.960ms     2.917ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e5.39.80.51 from pool fr.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\"\u003e7\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e    4s    9s         9.524ms    52.748ms     3.335ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esensor\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   wt gd st  next  poll          offset  correction\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eupd0  \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\"\u003e0\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e   12s   15s         - sensor not valid -\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUn coup d’œil pour vérifier l\u0026rsquo;horloge, en mode graphique, ou en mode\nconsole :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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$ date\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThu Apr \u003cspan style=\"color:#f99b15\"\u003e27\u003c/span\u003e 12:29:51 CEST \u003cspan style=\"color:#f99b15\"\u003e2023\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\u003ele manpage (\u003cem\u003een anglais\u003c/em\u003e) : \u003ca href=\"http://man.openbsd.org/ntpd.conf\" rel=\"external\"\u003ehttp://man.openbsd.org/ntpd.conf\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eun exemple en local : \u003ccode\u003e/etc/examples/ntpd.conf\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":"Synchroniser l'heure locale sous OpenBSD grâce au client OpenNTP","tags":["Network","NTP"],"date_published":"2016-12-10T16:30:00+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/thunderbird#10833cd2cc06fae86baee80a6cfa39578fd67f7b2dd18750cac172eaf8e2c0bf","url":"https://it-log.fr.eu.org/fr/sys/openbsd/thunderbird/","title":"Thunderbird / OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"Description Mozilla Thunderbird est une ré-écriture des composants de la suite mail de Mozilla. Son objectif est d\u0026rsquo;exploiter une grande partie des fonctionnalités existantes de ce produit pour créer une application de messagerie autonome, simple et extensible.\nInstallation installez le paquet thunderbird.\nConfiguration Anti-aliasing Pour désactivez l\u0026rsquo;anti-aliasing, paramétrez GDK_USE_XFT=0 dans votre e nvironnement.\nDoH Cette option semble être disponible depuis la v68.1 !\nPour activer DNS-sur-HTTPS ( DoH (DNS-over-HTTPS) ), ouvrez les préférences :\nMenu \u0026ldquo;Avancé\u0026rdquo; Onglet \u0026ldquo;Réseau et espace disque\u0026rdquo; Cliquez sur le bouton [ Paramètres… ] Déroulez jusqu\u0026rsquo;à la case à cocher \u0026ldquo;Activer DNS sur HTTPS\u0026rdquo; ; cochez la case ! Cliquez sur la liste déroulante \u0026ldquo;Utiliser le fournisseur\u0026rdquo; et choisissez \u0026ldquo;Personnalisé\u0026rdquo;, puis suivez les conseils ci-dessous : InfoIl semble préférable de modifier l\u0026rsquo;URL proposée par défaut… retrouvez des adresses de serveurs DNS gérant DoH, par exemple, sur :\nhttps://doh.defaultroutes.de/#sec-5-3 https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers Cette URL est paramétrable aussi par le biais de l\u0026rsquo;éditeur de configuration ; cherchez puis modifiez la valeur network.trr.uri.\nL\u0026rsquo;éditeur de configuration permet de modifier les valeurs des Résolveurs Récursifs de Confiance - (en anglais : TRR (Trusted Recursive Resolvers) ) :\nnetwork.trr.mode : 0 : défaut, off 1 : mode race 2 : TRR en premier 3 : TRR seulement 4 : mode shadow 5 : désactivé par choix. Enigmail InfoDepuis courant de l\u0026rsquo;année 2021, Thunderbird intègre nativement la fonctionnalité de chiffrement de mails ; ce module n\u0026rsquo;est plus nécessaire Installer Enigmail depuis le site officiel ou en tant que module.\nEnigmail fonctionne avec la version GPG2 - /usr/local/bin/gpg2, installé dans la structure de base d\u0026rsquo;OpenBSD.\nNéanmoins, pour que cela fonctionne correctement, il faudra installer les paquets suivants : pinentry pinentry-gtk2 (ou pinentry-gtk3 selon votre environnement graphique).\nLangue Française Avec Thunderbird v68, sous OpenBSD 6.6, il est possible de changer en choisissant le menu \u0026ldquo;Préférences\u0026rdquo; (Edit \u0026gt; Preferences), onglet \u0026lsquo;General\u0026rsquo;, Language, puis cliquez sur la liste déroulante pour ajouter une nouvelle langue.\nVous aurez une nouvelle fenêtre qui s\u0026rsquo;affiche qui vous permettra d\u0026rsquo;ajouter \u0026lsquo;French\u0026rsquo; ; validez votre choix par l\u0026rsquo;appui sur le bouton [ OK ].\nRedémarrez Thunderbird, et voilà !\nPaquet supplémentaire Sinon, essayer d\u0026rsquo;installer le paquet : thunderbird-i18n-fr.\nÉditeur de configuration Vous pouvez aussi d\u0026rsquo;essayer l\u0026rsquo;éditeur de configuration :\npuis, faites un clic-droit pour : New \u0026gt; String. Écrivez alors intl.locale.requested et mettez la valeur fr-FR. Liens Si vous avez des problèmes pour ouvrir les liens dans les mails, en premier arrêtez Thunderbird.\nEnsuite, éditez votre fichier ~/.thunderbird/\u0026lt;something\u0026gt;.default/prefs.js pour ajouter ce qui suit :\nuser_pref(\u0026#34;network.protocol-handler.app.ftp\u0026#34;, \u0026#34;/usr/local/bin/firefox\u0026#34;); user_pref(\u0026#34;network.protocol-handler.app.http\u0026#34;, \u0026#34;/usr/local/bin/firefox\u0026#34;); user_pref(\u0026#34;network.protocol-handler.app.https\u0026#34;, \u0026#34;/usr/local/bin/firefox\u0026#34;); Puis, relancez Thunderbird !\nPlugins Thunderbird cherche les plugins dans les répertoires ~/.mozilla/plugins et /usr/local/lib/mozilla/plugins.\nSi la variable d\u0026rsquo;environnement MOZ_PLUGIN_PATH est spécifiée, elle remplacera l\u0026rsquo;endroit de recherche.\nDépannage about:config Il est possible de faire certaines modifications de la configuration de Thunderbird, par le biais de l\u0026rsquo;éditeur de configuration about:config.\nAttentionL\u0026rsquo;édition de la configuration comporte des risques ; en effet, une mauvaise configuration peut rendre instable ou empêcher le logiciel de fonctionner.\nUne fois la configuration modifiée, il est important de redémarrer le logiciel !\nThunderbird en Anglais menu Edit \u0026gt; Preferences Dans la fenêtre Thunderbird Preferences :\nmenu Advanced onglet General cliquez sur le bouton [ Config Editor ] Dans la fenêtre about:config :\ncliquez sur le bouton [ I accept the risk ] Thunderbird en Français menu Édition \u0026gt; Préférences Dans la fenêtre Préférences de Thunderbird :\nmenu Avancé onglet Général cliquez sur le bouton [ Éditeur de configuration… ] Dans la fenêtre about:config :\ncliquez sur le bouton [ J\u0026rsquo;accepte les risques ] Débogage Veuillez IMPÉRATIVEMENT lire le fichier pkg-readme pour savoir comment faire. Tout rapport sans information correcte sera purement et simplement ignoré !\nEn cas de dysfonctionnement Si vous rencontrez des problèmes étranges ou que Thunderbird refuse de démarrer, essayer de le démarrer avec l\u0026rsquo;usage de l\u0026rsquo;option -safe-mode.\nCalDAV Il semble avoir un problème avec les versions 60.x de Thunderbird pour pouvoir se connecter aux services CalDAV de Nextcloud.\n⇒ Version utilisée sous OpenBSD 6.4 !\nC\u0026rsquo;est un problème connu chez Mozilla.\nOuvrez l\u0026rsquo;éditeur de configuration, puis :\ndans la barre de recherche, écrivez : network.cookie.same-site.enabled et positionnez-la sur : false Enigmail Sous OpenBSD v6.0, un bogue fait que gpg 1 n\u0026rsquo;est pas installé|installable ; faites un lien symbolique de /usr/local/bin/gpg2 vers /usr/local/bin/gpg :\n# ln -sf /usr/local/bin/gpg2 /usr/local/bin/gpg\nOpenBSD v6.1 ne connaît pas ce soucis.\nFrançais AttentionAu-delà de Thunderbird v 52, l\u0026rsquo;installation de ces modules n\u0026rsquo;est plus fonctionnelle ! Vous devez/pouvez aussi installer le pack Français en tant qu\u0026rsquo;addon.\nUne fois téléchargé, ouvrez TB, puis le menu \u0026ldquo;Addons\u0026rdquo;, puis cliquez sur l\u0026rsquo;icône en forme de roue crantée (//alias préférences//) pour choisir le menu \u0026ldquo;Install addon from file…\u0026rdquo;.\nUne fois installé, redémarrez TB.\nOpenBSD v6.2, 6.3 : version 52 Vous pouvez aussi installer l\u0026rsquo;outil supplémentaire \u0026ldquo;Quick Locale Switcher 2\u0026quot;… qui vous servira surtout à basculer d\u0026rsquo;une langue à l\u0026rsquo;autre, au besoin.\nDocumentation Le fichier pkg-readme : /usr/local/share/doc/pkg-readmes/thunderbird 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://www.mozilla.org/thunderbird/\" rel=\"external\"\u003eMozilla Thunderbird\u003c/a\u003e\u003c/strong\u003e est une\nré-écriture des composants de la suite mail de Mozilla. Son objectif est\nd\u0026rsquo;exploiter une grande partie des fonctionnalités existantes de ce produit\npour créer une application de messagerie autonome, simple et extensible.\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\u003ethunderbird\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"anti-aliasing\"\u003eAnti-aliasing\u003c/h3\u003e\n\u003cp\u003ePour désactivez l\u0026rsquo;anti-aliasing, paramétrez \u003ccode\u003eGDK_USE_XFT=0\u003c/code\u003e dans votre e\nnvironnement.\u003c/p\u003e\n\u003ch3 id=\"doh\"\u003eDoH\u003c/h3\u003e\n\u003cp\u003eCette option semble être disponible depuis la v68.1 !\u003c/p\u003e\n\u003cp\u003ePour activer DNS-sur-HTTPS \u003cem\u003e(\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/em\u003e, ouvrez les \u003ca\u003epréférences\u003c/a\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMenu \u0026ldquo;Avancé\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eOnglet \u0026ldquo;Réseau et espace disque\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eCliquez sur le bouton [ \u003cu\u003eP\u003c/u\u003earamètres… ]\u003c/li\u003e\n\u003cli\u003eDéroulez jusqu\u0026rsquo;à la case à cocher \u0026ldquo;Activer DNS sur HTTPS\u0026rdquo; ; cochez\nla case !\u003c/li\u003e\n\u003cli\u003eCliquez sur la liste déroulante \u0026ldquo;\u003cu\u003eU\u003c/u\u003etiliser le fournisseur\u0026rdquo; et\nchoisissez \u0026ldquo;Personnalisé\u0026rdquo;, puis suivez les conseils ci-dessous :\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\u003eIl semble préférable de modifier l\u0026rsquo;URL proposée par défaut… retrouvez des\nadresses de serveurs DNS gérant DoH, par exemple, sur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://doh.defaultroutes.de/#sec-5-3\" rel=\"external\"\u003ehttps://doh.defaultroutes.de/#sec-5-3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers\" rel=\"external\"\u003ehttps://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCette URL est paramétrable aussi par le biais de\nl\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/thunderbird/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e ; cherchez puis\nmodifiez la valeur \u003ccode\u003enetwork.trr.uri\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/thunderbird/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e permet de modifier les valeurs des\nRésolveurs Récursifs de Confiance - \u003cem\u003e(en anglais : \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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\"\u003eTRR \u003cem\u003e(Trusted Recursive Resolvers)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n)\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003enetwork.trr.mode\u003c/code\u003e :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e0\u003c/code\u003e : défaut, \u003ccode\u003eoff\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e1\u003c/code\u003e : mode \u003ccode\u003erace\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e2\u003c/code\u003e : TRR en premier\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e3\u003c/code\u003e : TRR seulement\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e4\u003c/code\u003e : mode \u003ccode\u003eshadow\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e5\u003c/code\u003e : désactivé par choix.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"enigmail\"\u003eEnigmail\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eDepuis courant de l\u0026rsquo;année 2021, Thunderbird intègre nativement\nla fonctionnalité de chiffrement de mails ; ce module n\u0026rsquo;est plus nécessaire\u003c/div\u003e\n\n\u003cp\u003eInstaller Enigmail depuis le \u003ca href=\"https://www.enigmail.net/index.php/en/download/download-enigmail\" rel=\"external\"\u003esite officiel\u003c/a\u003e\nou en tant que module.\u003c/p\u003e\n\u003cp\u003eEnigmail fonctionne avec la version GPG2 - \u003ccode\u003e/usr/local/bin/gpg2\u003c/code\u003e, installé\ndans la structure de base d\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003cp\u003eNéanmoins, pour que cela fonctionne correctement, il 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 les\npaquets suivants : \u003cstrong\u003e\u003ccode\u003epinentry\u003c/code\u003e \u003ccode\u003epinentry-gtk2\u003c/code\u003e\u003c/strong\u003e \u003cbr\u003e\n\u003cem\u003e(ou \u003ccode\u003epinentry-gtk3\u003c/code\u003e selon votre environnement graphique)\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"langue-française\"\u003eLangue Française\u003c/h3\u003e\n\u003cp\u003eAvec Thunderbird v68, sous OpenBSD 6.6, il est possible de changer en\nchoisissant le menu \u0026ldquo;Préférences\u0026rdquo; (\u003cu\u003eE\u003c/u\u003edit \u0026gt; Prefere\u003cu\u003en\u003c/u\u003eces),\nonglet \u0026lsquo;General\u0026rsquo;, Language, puis cliquez sur la liste déroulante pour\najouter une nouvelle langue.\u003c/p\u003e\n\u003cp\u003eVous aurez une nouvelle fenêtre qui s\u0026rsquo;affiche qui vous permettra d\u0026rsquo;ajouter\n\u0026lsquo;French\u0026rsquo; ; validez votre choix par l\u0026rsquo;appui sur le bouton [ OK ].\u003c/p\u003e\n\u003cp\u003eRedémarrez Thunderbird, et voilà !\u003c/p\u003e\n\u003ch4 id=\"paquet-supplémentaire\"\u003ePaquet supplémentaire\u003c/h4\u003e\n\u003cp\u003eSinon, essayer d\u0026rsquo;\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_*)'\"\u003einstaller\u003c/a\u003e\n le paquet : \u003ccode\u003ethunderbird-i18n-fr\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch4 id=\"éditeur-de-configuration\"\u003eÉditeur de configuration\u003c/h4\u003e\n\u003cp\u003eVous pouvez aussi d\u0026rsquo;essayer l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/thunderbird/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epuis, faites un clic-droit pour : Ne\u003cu\u003ew\u003c/u\u003e \u0026gt; \u003cu\u003eS\u003c/u\u003etring.\u003c/li\u003e\n\u003cli\u003eÉcrivez alors \u003ccode\u003eintl.locale.requested\u003c/code\u003e et mettez la valeur \u003ccode\u003efr-FR\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"liens\"\u003eLiens\u003c/h3\u003e\n\u003cp\u003eSi vous avez des problèmes pour ouvrir les liens dans les mails, en\npremier arrêtez Thunderbird.\u003c/p\u003e\n\u003cp\u003eEnsuite, éditez votre fichier \u003ccode\u003e~/.thunderbird/\u0026lt;something\u0026gt;.default/prefs.js\u003c/code\u003e\npour 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-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003euser_pref(\u0026#34;network.protocol-handler.app.ftp\u0026#34;, \u0026#34;/usr/local/bin/firefox\u0026#34;);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003euser_pref(\u0026#34;network.protocol-handler.app.http\u0026#34;, \u0026#34;/usr/local/bin/firefox\u0026#34;);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003euser_pref(\u0026#34;network.protocol-handler.app.https\u0026#34;, \u0026#34;/usr/local/bin/firefox\u0026#34;);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis, relancez Thunderbird !\u003c/p\u003e\n\u003ch3 id=\"plugins\"\u003ePlugins\u003c/h3\u003e\n\u003cp\u003eThunderbird cherche les plugins dans les répertoires \u003ccode\u003e~/.mozilla/plugins\u003c/code\u003e\net \u003ccode\u003e/usr/local/lib/mozilla/plugins\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSi la variable d\u0026rsquo;environnement \u003ccode\u003eMOZ_PLUGIN_PATH\u003c/code\u003e est spécifiée, elle\nremplacera l\u0026rsquo;endroit de recherche.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"aboutconfig\"\u003eabout:config\u003c/h3\u003e\n\u003cp\u003eIl est possible de faire certaines modifications de la configuration de\nThunderbird, par le biais de l\u0026rsquo;\u003cstrong\u003eéditeur de configuration\u003c/strong\u003e \u003ccode\u003eabout:config\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\u003cp\u003eL\u0026rsquo;édition de la configuration comporte des risques ; en effet, une\nmauvaise configuration peut rendre instable ou empêcher le logiciel de\nfonctionner.\u003c/p\u003e\n\u003cp\u003eUne fois la configuration modifiée, il est important de redémarrer le\nlogiciel !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"thunderbird-en-anglais\"\u003eThunderbird en Anglais\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003emenu \u003cstrong\u003e\u003cu\u003eE\u003c/u\u003edit\u003c/strong\u003e \u0026gt; \u003cstrong\u003ePrefere\u003cu\u003en\u003c/u\u003eces\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans la fenêtre \u003ccode\u003eThunderbird Preferences\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emenu \u003ccode\u003eAdvanced\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eonglet \u003ccode\u003eGeneral\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ecliquez sur le bouton [ \u003cu\u003eC\u003c/u\u003eonfig Editor ]\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans la fenêtre \u003ccode\u003eabout:config\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecliquez sur le bouton [ I accept the risk ]\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"thunderbird-en-français\"\u003eThunderbird en Français\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003emenu \u003cstrong\u003eÉditio\u003cu\u003en\u003c/u\u003e \u0026gt; Préfére\u003cu\u003en\u003c/u\u003eces\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans la fenêtre \u003ccode\u003ePréférences de Thunderbird\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emenu \u003ccode\u003eAvancé\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eonglet \u003ccode\u003eGénéral\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ecliquez sur le bouton [ É\u003cu\u003ed\u003c/u\u003eiteur de configuration… ]\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans la fenêtre \u003ccode\u003eabout:config\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecliquez sur le bouton [ J\u0026rsquo;accepte les risques ]\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"débogage\"\u003eDébogage\u003c/h3\u003e\n\u003cp\u003eVeuillez IMPÉRATIVEMENT lire le fichier pkg-readme pour savoir comment faire.\nTout rapport sans information correcte sera purement et simplement ignoré !\u003c/p\u003e\n\u003ch3 id=\"en-cas-de-dysfonctionnement\"\u003eEn cas de dysfonctionnement\u003c/h3\u003e\n\u003cp\u003eSi vous rencontrez des problèmes étranges ou que Thunderbird refuse de\ndémarrer, essayer de le démarrer avec l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003e-safe-mode\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"caldav\"\u003eCalDAV\u003c/h3\u003e\n\u003cp\u003eIl semble avoir un problème avec les versions 60.x de Thunderbird pour\npouvoir se connecter aux services CalDAV de Nextcloud.\u003c/p\u003e\n\u003cp\u003e⇒ Version utilisée sous OpenBSD 6.4 !\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est un \u003ca href=\"https://www.thunderbird.net/en-US/thunderbird/60.0/releasenotes/#known-issues\" rel=\"external\"\u003eproblème connu\u003c/a\u003e\nchez Mozilla.\u003c/p\u003e\n\u003cp\u003eOuvrez l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/thunderbird/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e, puis :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edans la barre de recherche, écrivez : \u003ccode\u003enetwork.cookie.same-site.enabled\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet positionnez-la sur : \u003ccode\u003efalse\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"enigmail-1\"\u003eEnigmail\u003c/h3\u003e\n\u003cp\u003eSous OpenBSD v6.0, un bogue fait que gpg 1 n\u0026rsquo;est pas installé|installable ;\nfaites un lien symbolique de \u003ccode\u003e/usr/local/bin/gpg2\u003c/code\u003e vers \u003ccode\u003e/usr/local/bin/gpg\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# ln -sf /usr/local/bin/gpg2 /usr/local/bin/gpg\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eOpenBSD v6.1 ne connaît pas ce soucis.\u003c/p\u003e\n\u003ch3 id=\"français\"\u003eFrançais\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eAu-delà de Thunderbird v 52, l\u0026rsquo;installation de ces modules n\u0026rsquo;est plus\nfonctionnelle !\u003c/div\u003e\n\n\u003cp\u003eVous devez/pouvez aussi installer le\n\u003cstrong\u003e\u003ca href=\"https://addons.mozilla.org/en-US/thunderbird/addon/fran%C3%A7ais-language-pack-thunder/?src=search\" rel=\"external\"\u003epack Français\u003c/a\u003e\u003c/strong\u003e\nen tant qu\u0026rsquo;addon.\u003c/p\u003e\n\u003cp\u003eUne fois téléchargé, ouvrez TB, puis le menu \u0026ldquo;Addons\u0026rdquo;, puis cliquez sur\nl\u0026rsquo;icône en forme de roue crantée (//alias préférences//) pour choisir le\nmenu \u0026ldquo;Install addon from file…\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eUne fois installé, redémarrez TB.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOpenBSD v6.2, 6.3\u003c/strong\u003e : \u003cstrong\u003e\u003ca href=\"https://addons.mozilla.org/en-US/thunderbird/addon/fran%C3%A7ais-language-pack-thunder/versions/52.0\" rel=\"external\"\u003eversion 52\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVous pouvez aussi installer l\u0026rsquo;outil supplémentaire\n\u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://addons.mozilla.org/en-US/thunderbird/addon/quick-locale-switcher-2/\" rel=\"external\"\u003eQuick Locale Switcher 2\u003c/a\u003e\u003c/strong\u003e\u0026quot;…\nqui vous servira surtout à basculer d\u0026rsquo;une langue à l\u0026rsquo;autre, au besoin.\u003c/p\u003e\n\u003chr\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/thunderbird\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 client mail Thunderbird sous OpenBSD","tags":["OpenBSD","Thunderbird"],"date_published":"2016-12-10T15:59:26+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/git#ff1187cfbb0ee82751cf64dea3178e95b19ebecbebacdf3bcafc8249fadebd6c","url":"https://it-log.fr.eu.org/fr/sys/openbsd/git/","title":"Git","author":{"name":"Stéphane HUC"},"content_text":"Description GIT est un \u0026ldquo;gestionnaire de contenu de répertoire\u0026rdquo; conçu pour gérer des projets massifs avec rapidité et efficacité,\nGIT entre dans la catégorie des outils de gestion de code source distribués, semblable à par exemple GNU Arch ou Monotone (ou, dans le monde commercial, BitKeeper). Chaque répertoire de travail GIT est un référentiel à part entière avec des capacités de suivi de révision complètes, ne dépendant pas de l\u0026rsquo;accès réseau à un serveur central.\nInstallation Installez le paquet git.\nInfoPour pouvoir utiliser la fonction git send-email, et utiliser smtp, tls, il vous faut installer aussi les packages suivants :\np5-Net-SMTP-SSL p5-Authen-SASL Configuration Le fichier de configuration : ~/.gitconfig\nExemple minimaliste :\n[user] name = identifiant email = email@domain.com Signature Depuis la version 1.7.9 de Git, il est possible de signer les commits, ce qui permet d\u0026rsquo;assurer que vous êtes bien l\u0026rsquo;auteur de ceux-ci.\nPour signer vos commits, il est nécessaire d\u0026rsquo;avoir créé dans un premier temps une clé GPG - ce mémo ne vous montrera pas comment faire… L\u0026rsquo;outil GPG2 est fourni de base dans OpenBSD. Néanmoins, il vous faudra créer un lien symbolique pour lui faire croire qu\u0026rsquo;il utilise GPG, car Git semble ne pas être capable de comprendre !\nVous devrez ensuite modifier votre fichier de configuration afin de rajouter l\u0026rsquo;option signingkey dans la partie de configuration [user], tel que :\n[user] name = identifiant email = email@domain.com signingkey = votre_id_gpg La commande pour signer :\nun commit : git commit -a -S -m 'un ou plusieurs longs commentaires' un tag : git tag -s v1.5 -m 'mon tag signé' Pour en connaître plus sur le fonctionnement de git et le fait de signer, veuillez lire la doc officielle…\nDépannage error: cannot run gpg: No such file or directory Vous avez le message d\u0026rsquo;erreur suivant dans son ensemble :\nerror: cannot run gpg: No such file or directory error: impossible de lancer gpg. fatal: échec de l\u0026#39;écriture de l\u0026#39;objet commit L\u0026rsquo;outil GPG n\u0026rsquo;est pas trouvé ; normal sous OpenBSD, il n\u0026rsquo;existe pas. L\u0026rsquo;astuce est de lier GPG au binaire GPG2 :\n# ln -sf /usr/local/bin/gpg2 /usr/local/bin/gpg\ngpg: échec de la signature : Inappropriate ioctl for device Le message d\u0026rsquo;erreur est le suivant :\ngpg: échec de la signature : Inappropriate ioctl for device gpg: signing failed: Inappropriate ioctl for device error: gpg n\u0026#39;a pas pu signer les données fatal: échec de l\u0026#39;écriture de l\u0026#39;objet commit Il vous manque les paquets suivants : pinentry pinentry-gtk2 ou pinentry-gtk3 - veillez à les installer !\nPour info, il semble que ce soit lié au bogue 2680 relatif à la version 2.1x de GPG.\nDocumentation N\u0026rsquo;oubliez pas de lire le fichier /usr/local/share/doc/pkg-readmes/git ! ;-)\n⇒ Git :\nLa documentation de référence : https://git-scm.com/book/fr/v2 Un petit guide git pour démarrer ⇒ GPG :\nComment bien configuré GPG pour l\u0026rsquo;utiliser correctement : GPG : Du bon usage sécurisé\nUn guide des bonnes pratiques pour créer ses clés GPG …\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://git-scm.com/\" rel=\"external\"\u003eGIT\u003c/a\u003e\u003c/strong\u003e est un \u0026ldquo;gestionnaire de contenu de répertoire\u0026rdquo;\nconçu pour gérer des projets massifs avec rapidité et efficacité,\u003c/p\u003e\n\u003cp\u003eGIT entre dans la catégorie des outils de gestion de code source distribués,\nsemblable à par exemple GNU Arch ou Monotone (ou, dans le monde commercial,\nBitKeeper). Chaque répertoire de travail GIT est un référentiel à part\nentière avec des capacités de suivi de révision complètes, ne dépendant\npas de l\u0026rsquo;accès réseau à un serveur central.\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\u003egit\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\"\u003e\u003cp\u003ePour pouvoir utiliser la fonction \u003ccode\u003egit send-email\u003c/code\u003e, et utiliser \u003ccode\u003esmtp\u003c/code\u003e,\n\u003ccode\u003etls\u003c/code\u003e, il vous faut installer aussi les packages suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ep5-Net-SMTP-SSL\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ep5-Authen-SASL\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLe fichier de configuration : \u003ccode\u003e~/.gitconfig\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eExemple minimaliste :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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[user]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eidentifiant\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\temail = email@domain.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"signature\"\u003eSignature\u003c/h3\u003e\n\u003cp\u003eDepuis la version 1.7.9 de Git, il est possible de signer les commits,\nce qui permet d\u0026rsquo;assurer que vous êtes bien l\u0026rsquo;auteur de ceux-ci.\u003c/p\u003e\n\u003cp\u003ePour signer vos commits, il est nécessaire d\u0026rsquo;avoir créé dans un premier\ntemps une clé GPG - \u003cem\u003ece mémo ne vous montrera pas comment faire\u003c/em\u003e… \u003cbr\u003e\nL\u0026rsquo;outil GPG2 est fourni de base dans OpenBSD. Néanmoins, il vous faudra\ncréer un lien symbolique pour lui faire croire qu\u0026rsquo;il utilise GPG, car Git\nsemble ne pas être capable de comprendre !\u003c/p\u003e\n\u003cp\u003eVous devrez ensuite modifier votre fichier de configuration afin de rajouter\nl\u0026rsquo;option \u003ccode\u003esigningkey\u003c/code\u003e dans la partie de configuration [user], 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[user]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eidentifiant\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\temail = email@domain.com\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        signingkey = votre_id_gpg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa commande pour signer :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eun commit : \u003ccode\u003egit commit -a -S -m 'un ou plusieurs longs commentaires'\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eun tag : \u003ccode\u003egit tag -s v1.5 -m 'mon tag signé'\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003ePour en connaître plus sur le fonctionnement de\n\u003ca href=\"https://git-scm.com/book/fr/v2/Utilitaires-Git-Signer-votre-travail\" rel=\"external\"\u003egit et le fait de signer\u003c/a\u003e,\nveuillez lire la doc officielle…\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"error-cannot-run-gpg-no-such-file-or-directory\"\u003eerror: cannot run gpg: No such file or directory\u003c/h3\u003e\n\u003cp\u003eVous avez le message d\u0026rsquo;erreur suivant dans son ensemble :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eerror: cannot run gpg: No such file or directory\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eerror: impossible de lancer gpg.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efatal: échec de l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;écriture de l\u0026#39;\u003c/span\u003eobjet commit\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;outil GPG n\u0026rsquo;est pas trouvé ; normal sous OpenBSD, il n\u0026rsquo;existe pas.\nL\u0026rsquo;astuce est de lier GPG au binaire GPG2 :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# ln -sf /usr/local/bin/gpg2 /usr/local/bin/gpg\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"gpg-échec-de-la-signature-inappropriate-ioctl-for-device\"\u003egpg: échec de la signature : Inappropriate ioctl for device\u003c/h3\u003e\n\u003cp\u003eLe message d\u0026rsquo;erreur est le 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\u003egpg: échec de la signature : Inappropriate ioctl \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e device\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egpg: signing failed: Inappropriate ioctl \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e device\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eerror: gpg n\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a pas pu signer les données\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003efatal: échec de l\u0026#39;\u003c/span\u003eécriture de l\u003cspan style=\"color:#ef6155\"\u003e\u0026#39;\u003c/span\u003eobjet commit\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl vous manque les paquets suivants : \u003cstrong\u003e\u003ccode\u003epinentry\u003c/code\u003e \u003ccode\u003epinentry-gtk2\u003c/code\u003e\u003c/strong\u003e ou\n\u003cstrong\u003e\u003ccode\u003epinentry-gtk3\u003c/code\u003e\u003c/strong\u003e - veillez à les \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\u003cp\u003e\u003cem\u003ePour info, il semble que ce soit lié au\n\u003ca href=\"https://bugs.gnupg.org/gnupg/issue2680\" rel=\"external\"\u003ebogue 2680\u003c/a\u003e\nrelatif à la version 2.1x de GPG.\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas de \u003cstrong\u003elire le fichier \u003ccode\u003e/usr/local/share/doc/pkg-readmes/git\u003c/code\u003e\u003c/strong\u003e ! ;-)\u003c/p\u003e\n\u003cp\u003e⇒ Git :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLa \u003cstrong\u003edocumentation de référence\u003c/strong\u003e : \u003ca href=\"https://git-scm.com/book/fr/v2\" rel=\"external\"\u003ehttps://git-scm.com/book/fr/v2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUn \u003cstrong\u003epetit \u003ca href=\"https://rogerdudler.github.io/git-guide/index.fr.html\" rel=\"external\"\u003eguide git\u003c/a\u003e\npour démarrer\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ GPG :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eComment bien configuré GPG pour l\u0026rsquo;utiliser correctement :\n\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/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUn guide des\n\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-guide-bonnes-pratiques/\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Guide bonnes pratiques (RSA)'\"\u003ebonnes pratiques pour créer ses clés GPG\u003c/a\u003e\n…\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 sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n","summary":"Utiliser le gestionnaire de version Git, sous OpenBSD","tags":["OpenBSD","git"],"date_published":"2016-12-10T13:54:10+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/trunk#6f60dc42e37d3232a89985b48e60d3acb0dbf813210db9da1d21a2262158b7fb","url":"https://it-log.fr.eu.org/fr/sys/openbsd/trunk/","title":"Trunk : Bascule automatique d'interfaces réseaux","author":{"name":"Stéphane HUC"},"content_text":"Trunk : Bascule automatique d\u0026rsquo;interfaces réseaux (de l\u0026rsquo;ethernet au wifi, et réciproquement)\nPour ne pas se compliquer la vie et laisser OpenBSD utiliser la connexion disponible, c\u0026rsquo;est à dire le filaire quand il est branché physiquement, par câble RJ45 ou par le wifi le cas échéant, on peut procéder comme suit :\n⇒ Création d\u0026rsquo;un fichier /etc/hostname.re0 (où re0 est l\u0026rsquo;interface ethernet) :\n$ cat /etc/hostname.re0 up ⇒ Création d\u0026rsquo;un fichier /etc/hostname.rtwn0 (rtwn0 est l\u0026rsquo;interface wifi) :\n$ cat /etc/hostname.rtwn0 up nwid kamehameha wpakey xxxxxxxxxxxxxxx ⇒ Et enfin, création d\u0026rsquo;un fichier /etc/hostname.trunk0 qui permet de basculer sur l\u0026rsquo;interface disponible :\n$ cat /etc/hostname.trunk0 trunkproto failover trunkport re0 trunkport rtwn0 dhcp inet6 autoconf ps : bien sûr, vous pouvez ajouter d\u0026rsquo;autres interfaces si vous en disposez.\nDocumentation source Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n","content_html":"\u003ch2 id=\"trunk--bascule-automatique-dinterfaces-réseaux\"\u003eTrunk : Bascule automatique d\u0026rsquo;interfaces réseaux\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003e(de l\u0026rsquo;ethernet au wifi, et réciproquement)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003ePour ne pas se compliquer la vie et laisser OpenBSD utiliser la connexion\ndisponible, c\u0026rsquo;est à dire le filaire quand il est branché physiquement,\npar câble RJ45 ou par le wifi le cas échéant, on peut procéder comme suit :\u003c/p\u003e\n\u003cp\u003e⇒ Création d\u0026rsquo;un fichier \u003ccode\u003e/etc/hostname.re0\u003c/code\u003e (où \u003ccode\u003ere0\u003c/code\u003e est l\u0026rsquo;interface ethernet) :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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$ cat /etc/hostname.re0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eup\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Création d\u0026rsquo;un fichier \u003ccode\u003e/etc/hostname.rtwn0\u003c/code\u003e (\u003ccode\u003ertwn0\u003c/code\u003e est l\u0026rsquo;interface wifi) :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ cat /etc/hostname.rtwn0\nup\nnwid kamehameha wpakey xxxxxxxxxxxxxxx\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Et enfin, création d\u0026rsquo;un fichier \u003ccode\u003e/etc/hostname.trunk0\u003c/code\u003e qui permet de\nbasculer sur l\u0026rsquo;interface disponible :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ cat /etc/hostname.trunk0\ntrunkproto failover trunkport re0\ntrunkport rtwn0\ndhcp\ninet6 autoconf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eps : bien sûr, vous pouvez ajouter d\u0026rsquo;autres interfaces si vous en disposez.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://chown.me/blog/de-la-haute-dispo-sur-mon-lappy.html\" rel=\"external\"\u003esource\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":"Basculer d'une interface réseau (wifi, RJ45, etc) de manière automatique sous OpenBSD","tags":["OpenBSD","Trunk"],"date_published":"2016-12-10T13:37:45+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/tips#331b111fdcb4e1878c0344b942ac799789485235c7637bc30444261f8c43adcd","url":"https://it-log.fr.eu.org/fr/sys/openbsd/tips/","title":"Trucs et astuces pour OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"Description Avez-vous lu le Kit de survie après votre installation et suivie l\u0026rsquo;étape \u0026ldquo;Que faire après l\u0026#39;installation d’OpenBSD ?\u0026rdquo;\nSi oui, c\u0026rsquo;est bien… sinon, faites-le !\nAlors, retrouvez ci-dessous, classés par thématique, les différents trucs et astuces qui pourront vous aider à démarrer… :D\nGestion Système pourquoi pas en savoir plus sur KSH : Korn shell, Créer une somme de contrôle sous OpenBSD, voire Les alias / OpenBSD, Gestion du boot / OpenBSD Informations CPU / OpenBSD voire de l\u0026rsquo;icône de volume dans certains bureaux graphiques, très minimaliste… Gestion des Group(e)s Systèmes sur OpenBSD \u0026amp;\u0026amp; Gestion des Limit(e)s Systèmes / OpenBSD Configurer la langue Française / OpenBSD Gestion de la session utilisateur / OpenBSD \u0026amp;\u0026amp; Gestion d\u0026#39;un terminal ou d\u0026#39;une console sous OpenBSD Comment paramétrer vos Thèmes ; Polices ; Émoticônes / OpenBSD Comprendre FFS2 : Système de Fichiers v2 sous OpenBSD, Python : Gestion de l\u0026#39;environnement / OpenBSD Gestion Matériel Graver un CD sous OpenBSD OpenBSD et le Bluetooth Gestion des clés USB / OpenBSD Webcam / OpenBSD Gestion du Wifi / OpenBSD Réseaux Comment télécharger en ligne de commande sous OpenBSD Astuces relayd (OpenBSD) Utiliser un serveur proche pour obtenir des paquets (France) : installurl : localisation du serveur miroir OpenBSD\nUtiliser le résolveur DNS local : OpenBSD : utiliser Unbound\nDépannage OpenBSD - Dépannage 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\u003eAvez-vous lu le \u003ca class=\"inside\" href=\"/fr/sys/openbsd/kit-survie/\" title=\"Lien interne vers l\u0026#39;article : 'Kit de survie sous OpenBSD'\"\u003eKit de survie\u003c/a\u003e\n\naprès votre installation et suivie l\u0026rsquo;étape \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/p\u003e\n\u003cp\u003eSi oui, c\u0026rsquo;est bien… sinon, faites-le !\u003c/p\u003e\n\u003cp\u003eAlors, retrouvez ci-dessous, classés par thématique, les différents trucs\net astuces qui pourront vous aider à démarrer… :D\u003c/p\u003e\n\u003ch2 id=\"gestion-système\"\u003eGestion Système\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003epourquoi pas en savoir plus sur \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-pdksh/\" title=\"Lien interne vers l\u0026#39;article : 'KSH : Korn shell'\"\u003eKSH : Korn shell\u003c/a\u003e,\n\u003cul\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-checksum/\" title=\"Lien interne vers l\u0026#39;article : 'Créer une somme de contrôle sous OpenBSD'\"\u003eCréer une somme de contrôle sous OpenBSD\u003c/a\u003e,\u003c/li\u003e\n\u003cli\u003evoire \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-alias/\" title=\"Lien interne vers l\u0026#39;article : 'Les alias / OpenBSD'\"\u003eLes alias / OpenBSD\u003c/a\u003e,\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-boot/\" title=\"Lien interne vers l\u0026#39;article : 'Gestion du boot / OpenBSD'\"\u003eGestion du boot / OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-cpu/\" title=\"Lien interne vers l\u0026#39;article : 'Informations CPU / OpenBSD'\"\u003eInformations CPU / OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003evoire de l\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-tray-volume/\" title=\"Lien interne vers l\u0026#39;article : 'Gestion de l\u0026#39;icône de volume dans la barre de notifications sous OpenBSD'\"\u003eicône de volume\u003c/a\u003e\n\ndans certains bureaux graphiques, très minimaliste…\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-group/\" title=\"Lien interne vers l\u0026#39;article : 'Gestion des Group(e)s Systèmes sur OpenBSD'\"\u003eGestion des Group(e)s Systèmes sur OpenBSD\u003c/a\u003e  \u0026amp;\u0026amp; \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-limits/\" title=\"Lien interne vers l\u0026#39;article : 'Gestion des Limit(e)s Systèmes / OpenBSD'\"\u003eGestion des Limit(e)s Systèmes / OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-fr-lang/\" title=\"Lien interne vers l\u0026#39;article : 'Configurer la langue Française / OpenBSD'\"\u003eConfigurer la langue Française / OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-session/\" title=\"Lien interne vers l\u0026#39;article : 'Gestion de la session utilisateur / OpenBSD'\"\u003eGestion de la session utilisateur / OpenBSD\u003c/a\u003e \u0026amp;\u0026amp; \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-terminal/\" title=\"Lien interne vers l\u0026#39;article : 'Gestion d\u0026#39;un terminal ou d\u0026#39;une console sous OpenBSD'\"\u003eGestion d\u0026#39;un terminal ou d\u0026#39;une console sous OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eComment paramétrer vos \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-themes/\" title=\"Lien interne vers l\u0026#39;article : 'Thèmes ; Polices ; Émoticônes / OpenBSD'\"\u003eThèmes ; Polices ; Émoticônes / OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eComprendre \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-ffs2/\" title=\"Lien interne vers l\u0026#39;article : 'FFS2 : Système de Fichiers v2 sous OpenBSD'\"\u003eFFS2 : Système de Fichiers v2 sous OpenBSD\u003c/a\u003e, \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-python/\" title=\"Lien interne vers l\u0026#39;article : 'Python : Gestion de l\u0026#39;environnement / OpenBSD'\"\u003ePython : Gestion de l\u0026#39;environnement / OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"gestion-matériel\"\u003eGestion Matériel\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-burn-cdrom/\" title=\"Lien interne vers l\u0026#39;article : 'Graver un CD sous OpenBSD'\"\u003eGraver un CD sous OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-bluetooth/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD et le Bluetooth'\"\u003eOpenBSD et le Bluetooth\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-usb/\" title=\"Lien interne vers l\u0026#39;article : 'Gestion des clés USB / OpenBSD'\"\u003eGestion des clés USB / OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-webcam/\" title=\"Lien interne vers l\u0026#39;article : 'Webcam / OpenBSD'\"\u003eWebcam / OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-wifi/\" title=\"Lien interne vers l\u0026#39;article : 'Gestion du Wifi / OpenBSD'\"\u003eGestion du Wifi / OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"réseaux\"\u003eRéseaux\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-howto-dl/\" title=\"Lien interne vers l\u0026#39;article : 'Comment télécharger en ligne de commande sous OpenBSD'\"\u003eComment télécharger en ligne de commande sous OpenBSD\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-relayd/\" title=\"Lien interne vers l\u0026#39;article : 'Astuces relayd (OpenBSD)'\"\u003eAstuces relayd (OpenBSD)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUtiliser un serveur proche pour obtenir des paquets (France) : \u003ca class=\"inside\" href=\"/fr/sys/openbsd/installurl/\" title=\"Lien interne vers l\u0026#39;article : 'installurl : localisation du serveur miroir OpenBSD'\"\u003einstallurl : localisation du serveur miroir OpenBSD\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUtiliser le résolveur DNS local : \u003ca class=\"inside\" href=\"/fr/sys/openbsd/unbound/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : utiliser Unbound'\"\u003eOpenBSD : utiliser Unbound\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-depannage/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD - Dépannage'\"\u003eOpenBSD - Dépannage\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":"Recensement de différents trucs et astuces pour mieux appréhender OpenBSD","tags":["OpenBSD","Astuce"],"date_published":"2016-12-10T12:51:01+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/trad/comprendre-unix-en-10-minutes#46db1b031c986012d8c79d036a50771dbc60add170ecef10cfe474e617365ccf","url":"https://it-log.fr.eu.org/fr/trad/comprendre-unix-en-10-minutes/","title":"Comprendre Unix en 10 Minutes","author":{"name":"Stéphane HUC"},"content_text":"Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;Learn UNIX in 10 minutes\u0026rdquo;, écrit sur le site disparu \u0026lsquo;Freeengineer.org\u0026rsquo;.\nComprendre Unix en 10 Minutes Préface Le propos est d\u0026rsquo;avoir une page contenant les commandes de bases pour démarrer l\u0026rsquo;usage d\u0026rsquo;un shell UNIX.\nCe document est protégé par les droits d\u0026rsquo;auteurs, et placé sous les termes de la licence GNU/FDL.\nRépertoires Les chemins de répertoires et fichiers dans Unix utilisent le symbole \u0026lsquo;/\u0026rsquo; (slash) pour séparer le nom des répertoires, dans le contexte du chemin.\nexemples:\n/ répertoire racine\n/usr répertoire usr (répertoire enfant de la racine)\n/usr/STRIM100 STRIM100 est un sous-répertoire de /usr\nCirculer dans le système de fichiers pwd voir le nom du répertoire courant\ncd Se rediriger vers votre répertoire utilisateur personnel\ncd /usr/STRIM100 Se diriger vers /usr/STRIM100.\ncd INIT Se diriger vers le répertoire INIT, qui est un sous-répertoire du répertoire courant.\ncd .. Se diriger vers le répertoire parent du répertoire courant.\ncd $STRMWORK Se diriger vers le répertoire renfermé dans la variable d\u0026rsquo;environnement \u0026lsquo;STRMWORK\u0026rsquo;.\ncd ~bob Se diriger vers le répertoire personnel de bob.\nLister le contenu d\u0026rsquo;un répertoire ls liste un répertoire\nls -l liste un répertoire dans un format détaillé\nls -a liste le répertoire courant en affichant les fichiers cachés, ceux-ci commencent par un \u0026ldquo;.\u0026rdquo;\nls -ld Liste tous les noms de fichiers et répertoires dans le répertoire courant, utilisant un format détaillé. Sans l\u0026rsquo;option \u0026rsquo;d\u0026rsquo;, la commande \u0026rsquo;ls\u0026rsquo; listera le contenu des sous-répertoire du répertoire courant. Avec, \u0026rsquo;ls\u0026rsquo; listera juste le nom des fichiers.\nPour l\u0026rsquo;exemple :\n$ ls -l drwxr-xr-x 4 cliff user 1024 Jun 18 09:40 WAITRON_EARNINGS -rw-r--r-- 1 cliff user 767392 Jun 6 14:28 scanlib.tar.gz ^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ || | | | | | | | | | || | | | |id |group |poids |date |heure |nom || | | |nombre de contenu || | |permissions pour les autres || |permissions pour les membres du groupe ||permission pour le propriétaire du fichier : r = lecture, w = écriture, x = éxecution, - = pas de permission |type de fichier : - = fichier normal, d = répertoire, l = lien symbolique, etc… Changer les permissions et attributs de fichiers chmod 755 file Change les permissions du fichiers, en donnant tous les droits au propriétaire du fichier, et les droits de lecture et d\u0026rsquo;exécution pour le groupe et les autres. (7 = rwx = 111 en binaire ; 5 = r-x = 101 en binaire)\nchgrp user file Change l\u0026rsquo;appartenance du groupe sur le fichier.\nchown cliff file Change le propriétaire du fichier.\nchown -R cliff dir Change le propriétaire du répertoire, de manière récursive.\nVous devez être le propriétaire des fichiers ou répertoires, ou être en mode administrateur (root) avant de pouvoir interagir ainsi.\nDéplacer, renommer, et copier des fichiers cp file1 file2 Copier un fichier\nmv file1 newname Déplacer ou renommer un fichier\nmv file1 ~/AAA/ Déplacer un fichier dans le sous-répertoire AAA de votre répertoire utilisateur personnel\nrm file1 [file2…] Supprimer un fichier\nrm -r dir1 [dir2…] Supprimer un répertoire récursivement, et son contenu. FAITES ATTENTION !\nmkdir dir1 [dir2…] Créer un répertoire\nmkdir -p dirpath Créer un répertoire, incluant tous les sous-répertoires nommés en suivant\nrmdir dir1 [dir2…] Supprimer un répertoire vide\nVoir le contenu et éditer des fichiers cat filename Afficher le contenu d\u0026rsquo;un fichier à l\u0026rsquo;écran, en ascii\nmore filename Afficher le contenu d\u0026rsquo;un fichier à l\u0026rsquo;écran de manière progressive. L\u0026rsquo;appui sur la touche Entrée affiche la ligne suivante ; celui sur la barre d\u0026rsquo;espace affiche une nouvelle page ; celui sur la touche q permettra la sortie.\nless filename Un peu comme \u0026lsquo;more\u0026rsquo;, mais permet l\u0026rsquo;usage de la touche ^ \u0026ldquo;Défilement Haut\u0026rdquo;, pour remonter les pages. Fonctionne sur certains systèmes.\nvi filename Éditer le fichier en utilisant l\u0026rsquo;éditeur \u0026lsquo;vi\u0026rsquo;. Tous les systèmes Unix ont cet éditeur.\nemacs filename Éditer le fichier en utilisant l\u0026rsquo;éditeur \u0026rsquo;emacs\u0026rsquo;. Tous les systèmes Unix n\u0026rsquo;ont pas cet éditeur.\nhead filename Lire les premières lignes d\u0026rsquo;un fichier.\nhead -n x filename Lire les x premières lignes d\u0026rsquo;un fichier\ntail filename Lire les dernières lignes d\u0026rsquo;un fichier\ntail -n x filename Lire les x dernières lignes d\u0026rsquo;un fichier\nShells Le comportement d\u0026rsquo;une interface de ligne de commande diffère étroitement du programme shell dans lequel il est utilisée.\nDépendant du shell utilisé, quelques comportements supplémentaires peuvent être utiles.\nIl est possible de savoir sous quel shell vous fonctionnez, en utilisant la commande suivante :\n$ echo $SHELL\nBien-sûr, vous pouvez créer un fichier ayant une liste de commandes shell, l\u0026rsquo;exécuter tel un programme. Ceci est appelé un script shell. C\u0026rsquo;est le but premier de la plupart des shells.\nVariables d\u0026rsquo;environnement Les variables d\u0026rsquo;environnement permettent au shell d\u0026rsquo;enregistrer des données, pour un usage ultérieur.\nPar exemple, pour le shell nommé Bash :\nexport CASROOT=/usr/local/CAS3.0 Définit la variable CASROOT avec la valeur /usr/local/CAS3.0.\nexport LD_LIBRARY_PATH=$CASROOT/Linux/lib Définit la variable LD_LIBRARY_PATH avec la valeur de la variable $CASROOT concaténé avec /Linux/lib, ou /usr/local/CAS3.0/Linux/lib\nEn préfixant la variable du symbole \u0026lsquo;$\u0026rsquo;, vous pouvez utiliser son contenu dans le contexte de toute commande :\ncd $CASROOT Se rediriger vers le répertoire contenu dans la variable CASROOT\necho $CASROOT Afficher le contenu de la variable CASROOT, soit /usr/local/CAS3.0\nprintenv CASROOT Faire la même chose dans le shell bash ou d\u0026rsquo;autres environnements.\nHistorique interactif Une fonctionnalité des shells bash, tcsh (et certainement d\u0026rsquo;autres) est de pouvoir utiliser l\u0026rsquo;accès aux commandes précédentes par l\u0026rsquo;appui de la touche ^ \u0026ldquo;Flèche Haut\u0026rdquo;, de les éditer, et/ou de les exécuter à nouveau.\nCertains shells proposent l\u0026rsquo;usage de la commande history, qui affichera l\u0026rsquo;ensemble des commandes utilisées. Pour les réutiliser, si besoin, il suffit de précéder le numéro de la commande du symbole !.\nComplétion de nom de fichier Une fonctionnalité des shells bash, tcsh (et certainement d\u0026rsquo;autres) est de pouvoir utiliser la touche de Tabulation pour compléter un nom de fichier partiellement tapé. Par exemple, si vous avez un fichier nommé èconstantine-monks-and-willy-wonka.txt\u0026rsquo; dans votre répertoire et que vous désirez l\u0026rsquo;éditer, vous pouvez écrire vi const, appuyez sur la touche Tab, et le shell remplira le reste du nom de fichier.\nBash est le shell le plus cool Bash est même capable de compléter le nom des commandes et des variables d\u0026rsquo;environnement. S\u0026rsquo;il y a plusieurs complétions possibles, l\u0026rsquo;appui plusieurs fois sur la touche Tab vous affichera les différentes possibilités.\nBash est le shell par défaut pour les systèmes Linux.\nRedirection grep string filename \u0026gt; newfile Redirige la sortie de la commande grep vers un nouveau fichier\ngrep string filename \u0026gt;\u0026gt; existfile Ajoute la sortie de la commande grep à la fin du fichier existfile.\nLes directives de redirection \u0026gt; et \u0026gt;\u0026gt; peuvent être utilisées pour diriger la sortie de la plupart des commandes vers un fichier.\nPipes Le symbole | (la barre vertical sous le chiffre 6 ; appuyer simultanément sur les touches Alt Gr et 6) est utilisé pour diriger la sortie d\u0026rsquo;une commande vers l\u0026rsquo;entrée d\u0026rsquo;une autre commande.\nPar exemple :\nls -l | more Cette commande prend la sortie de la commande ls dans son format détaillé et l\u0026rsquo;affiche au-travers de la commande \u0026lsquo;more\u0026rsquo;. Cela permet dans le cas d\u0026rsquo;une très longue liste d\u0026rsquo;être affichée page par page.\ndu -sc * | sort -n | tail La commande du -sc liste les tailles des fichiers et répertoires, dans le répertoire de travail courant, puis trie le résultat de la plus petite à la plus grosse grâce à la commande sort -n. Finalement, seront affichés les quelques derniers résultats, les plus gros fichiers, par le biais de la commande tail.\nSubstitution de commande Vous pouvez utiliser la sortie d\u0026rsquo;une commande comme entrée d\u0026rsquo;une autre commande d\u0026rsquo;une autre manière, appelée \u0026ldquo;Substitution de commande\u0026rdquo;. Elle est invoquée par l\u0026rsquo;usage du symbole ` (appui simultané des touches Alt Gr et 7), tel que, pour l\u0026rsquo;exemple :\n$ cat `find . -name aaa.txt`\nCe qui affichera à l\u0026rsquo;écran tous les fichiers nommés aaa.txt dans le répertoire courant, et de ses sous-répertoires.\nActuellement, il est recommandé de l\u0026rsquo;écrire ainsi :\n$ cat \u0026quot;$(find . -name aaa.txt)\u0026quot;\ngrep : Recherche de chaînes de caractères dans un fichier grep string filename affiche toutes les lignes contenant la chaine string dans tel nom de fichier. find : Recherche de fichiers find search_path -name filename\nfind . -name aaa.txt Cherche tous les fichiers nommés aaa.txt dans le répertoire courant et ses sous-répertoires.\nfind / -name vimrc Cherche tous les fichiers nommés vimrc partout dans le système de fichiers.\nfind /usr/local/games -name \u0026quot;*xpilot*\u0026quot; Cherche tous les fichiers containant la chaîne xpilot dans leurs noms, qui existent dans le répertoire /usr/local/games.\ntar : Lire, écrire des sauvegardes et autres archives La commande \u0026rsquo;tar\u0026rsquo; signifie \u0026ldquo;tape archive\u0026rdquo;. C\u0026rsquo;est la manière \u0026ldquo;standard\u0026rdquo; de lire et d\u0026rsquo;écrire des archives (qui sont des collections de fichiers, dans un répertoire donné).\nVous trouverez souvent des archives avec des noms tels que stuff.tar, ou stuff.tar.gz. En substance, cela signifie que le répertoire stuff a été archivé dans une archive tar, et pour le second cas, que cette archive a été compressée par le moyen du programme de compression gzip.\nIl y a de fortes probabilités que si quelqu\u0026rsquo;un vous donne une sauvegarde, faite sur un système Unix, que cette sauvegarde soit faite dans le format tar… et, dans ce cas, vous devrez utiliser tar, et votre lecteur de bande, pour la lire.\nDe même, si vous voulez écrire une bande de sauvegarde pour quelqu\u0026rsquo;un d\u0026rsquo;autre, vous devriez utiliser probablement tar, aussi.\nExemples :\ntar xv Extrait les fichiers depuis la sauvegarde, en affichant le nom des fichiers à l\u0026rsquo;écran. (v = verbeux)\ntar tv Liste les fichiers depuis la sauvegarde sans les extraire.\ntar cv file1 file2 Écrit les fichiers file1 et file2 dans la sauvegarde.\ntar cvf archive.tar file1 [file2…] Créer une archive tar, nommée archive.tar, contenant les fichiers file1, file2, etc… Ne pas utilisez les symboles [, ] : c\u0026rsquo;est juste une convention d\u0026rsquo;écriture pour signifier l\u0026rsquo;option…\ntar xvf archive.tar Extrait les fichiers de l\u0026rsquo;archive archive.tar\ntar cvfz archive.tar.gz dname Créer une archive compressée par gzip, contenant tout le contenu du répertoire dname. Ne fonctionne pas avec toutes les versions de tar.\ntar xvfz archive.tar.gz Extrait une archive compressée avec gzip. Ne fonctionne pas avec toutes les versions de tar.\ntar cvfI archive.tar.bz2 dname Créer une archive tar compressée avec le programme de compression bzip2. Ne fonctionne pas avec toutes les versions de tar.\nCompression de fichiers compress Les commandes de compression Unix, par défaut, sont compress et uncompress. Les fichiers compressés ont le suffixe .Z ajouté à leur nom.\nPour l\u0026rsquo;exemple :\ncompress part.igs Créer un fichier compressé part.igs.Z\nuncompress part.igs Décompresser le contenu du fichier part.igs.Z\nNote que l\u0026rsquo;usage de .Z n\u0026rsquo;est pas requis.\ngzip Un autre utilitaire de compression commun est gzip (et gunzip). Ce sont des outils GNU de compression et décompression. gzip utilise un meilleur format de compression que le standard compress, mais n\u0026rsquo;est pas installé sur tous les systèmes. Le suffixe pour les fichiers compressés par gzip est .gz\ngzip part.igs Créer un fichier compressé part.igs.gz\ngunzip part.igs Extrait le contenu de l\u0026rsquo;archive part.igs.gz\nbzip2 L\u0026rsquo;utilitaire bzip2 a (en général) un meilleur taux de compression que gzip, mais prend plus de temps pour compresser ou décompresser des fichiers. Ce n\u0026rsquo;est pas un utilitaire commun comme gzip, mais il devient de plus en plus disponible. (À ce jour de la traduction, c\u0026rsquo;est devenu un outil commun !)\nbzip2 part.igs Créer un fichier compressé part.igs.bz2\nbunzip2 part.igs.bz2 Décompresse le contenu du fichier part.igs.bz2\nman, apropos : Rechercher de l\u0026rsquo;aide dans le système La plupart des commandes ont une page de manuel qui décrit comment l\u0026rsquo;utiliser, de manière plus ou moins détaillée. Ces pages de manuels sont appelés des man pages parce qu\u0026rsquo;elles sont faites pour être lues par des humains.\nExemple :\nman ls Lire le manuel de la commande ls. Vous pouvez trouver les man pages en utilisant la commande apropos.\nExemple :\napropos build Afficher tous les man pages dont la description contient le mot build. Pour l\u0026rsquo;exemple, exécuter donc un man apropos pour obtenir l\u0026rsquo;aide détaillé de la commande apropos.\nBases de l\u0026rsquo;éditeur vi Ouvrir un fichier vi nom_fichier Créer du texte Les modes d\u0026rsquo;édition : l\u0026rsquo;appui sur les touches ci-dessous permettent d\u0026rsquo;entrer en mode édition, puis d\u0026rsquo;écrire le contenu de votre document.\ni Insérer des caractères avant la position du curseur.\nI Insérer des caractères au début de la ligne courante.\na Ajouter après la position du curseur.\nA Ajouter à la fin de la ligne courante.\nr Remplacer un caractère.\nR Mode remplacement\n\u0026lt;ESC\u0026gt; Sort des modes insertion.\nSuppression de texte x Supprime un caractère\ndd Supprime la ligne courante et la met en mémoire-tampon\nndd Supprime n lignes (n étant un nombre) et les mets dans la mémoire-tampon.\nJ Attache une nouvelle ligne à la fin de la ligne courante (et supprime les caractères de retour-à-la ligne)\nOups : Erreur de saisie u Annule la dernière commande Copier, Coller yy Copie la ligne courante dans la mémoire-tampon\nnyy Copie n lignes dans la mémoire-tamon\np Colle le contenu de la mémoire-tampon après la ligne courante\nP Colle le contenu de la mémoire-tampon avant la ligne courante\nPositionner le curseur Le symbole ^ signifie l\u0026rsquo;appui simultanée sur la touche Ctrl puis la touche signalée !\n^d Descend d\u0026rsquo;une page\n^u Remonte d\u0026rsquo;une page\n:n Positionne le curseur à la ligne n\n:$ Positionne le curseur à la fin de la ligne courante\n^g Affiche le numéro de la ligne courante\nh,j,k,l Respectivement, à gauche, en bas, au-dessus, et à droite du curseur. Vous pouvez aussi utiliser les touches fléchées si cela fonctionne avec votre clavier.\nRemplacement de caractères :n1,n2:s/string1/string2/[g] Remplace la chaîne de caractères 1 par la chaine de caractères 2 sur les lignes n1 et n2. Quand g est inclus (pour global), toutes les instances de la chaînes de caractère 1 sur chacunes des lignes sont remplacées. Si g n\u0026rsquo;est pas inclus, seule la première instance par ligne correspondante est remplacée.\n^ correspond au début de ligne.\n. signifie tout caractère\n$ correspond à la fin de ligne.\nCes caractères, ainsi que d\u0026rsquo;autres \u0026ldquo;caractères spéciaux\u0026rdquo; (tels que l\u0026rsquo;anti-slash) peuvent être échappés par l\u0026rsquo;usage du symbole \\, tel que \\/usr\\/STRIM100\\/SOFT signifiant littéralement la chaîne de caractère /usr/STRIM100/SOFT\nExemples :\n:1,$:s/dog/cat/g Remplacer chaque instance dog par cat, dans tout le fichier. L\u0026rsquo;usage de :1,$ signifie du début à la fin du fichier. :23,25:/frog/bird/ Sur les lignes 23 à 25, remplacer la première instance de frog par bird, dans chacune de ces lignes. Sauver, quitter et autres commandes ex Ces commandes sont toutes préfixées par l\u0026rsquo;usage du symbole :, et affichées en bas, à gauche de l\u0026rsquo;écran. Ce sont les commandes ex, parce qu\u0026rsquo;elles font partie de l\u0026rsquo;éditeur de texte ex, le précurseur de l\u0026rsquo;éditeur de texte vi. Vous ne pouvez pas taper une commande ex quand vous êtes dans un des modes insertion. (la saisie de texte à l\u0026rsquo;écran). Pour pouvoir le faire, il faut appuyer sur la touche ESC, qui vous fera sortir de ce mode d\u0026rsquo;insertion.\n:w Sauvegarde le fichier courant\n:w new.file Sauvegarde le fichier courant, dans un nouveau fichier\n:w! existing.file Sauvegarde un fichier existant avec le contenu du fichier courant.\n:wq Sauvergarde le fichier et sors de l\u0026rsquo;éditeur\n:q Ferme l\u0026rsquo;éditeur\n:q! Ferme l\u0026rsquo;éditeur sans faire de changement\n:e filename Ouvre le fichier \u0026lsquo;filename\u0026rsquo; pour édition\n:set number Affiche le numéro de ligne\n:set nonumber Éteint le numéro de ligne\nFAQ Le contenu des Foire-aux-Questions Usenet devraient être le premier endroit à lire pour vos questions. Vous pouvez y trouver beaucoup de manuel RTFM (Read the F*** Manuals ; Lis ce Fichu Manuel).\nLe contenu de ce répertoire inclut les FAQs vi, bash, et comp.unix.questions.\nRechercher dans les archives Usenet est souvent très utile, aussi.\nGoogle.com a sa propre archive Usenet (formellement Deja.com), voire les règles \u0026ldquo;Advanced Group Search\u0026rdquo;.\nMention originale (traduite) Ce document (comprendre l\u0026rsquo;original ; ce n\u0026rsquo;est pas le cas de la traduction) a été converti depuis un fichier texte, en utilisant Vim. Vim est la meilleure version du seul vrai éditeur de texte : vi.\nCopyright (c) 2000-2006 - cliff@freeenginer.org\nPermission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with Invariant Section: Preface, with Front-Cover Texts, and with no Back-Cover Texts. A copy of the license can be found on the GNU web site here.\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\n\u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://web.archive.org/web/20071230095405/http://freeengineer.org/learnUNIXin10minutes.html\" rel=\"external\"\u003eLearn UNIX in 10 minutes\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit sur le site disparu \u0026lsquo;Freeengineer.org\u0026rsquo;.\u003c/p\u003e\n\u003chr\u003e\n\u003ch1 id=\"comprendre-unix-en-10-minutes\"\u003eComprendre Unix en 10 Minutes\u003c/h1\u003e\n\u003ch2 id=\"préface\"\u003ePréface\u003c/h2\u003e\n\u003cp\u003eLe propos est d\u0026rsquo;avoir une page contenant les commandes de bases pour\ndémarrer l\u0026rsquo;usage d\u0026rsquo;un shell UNIX.\u003c/p\u003e\n\u003cp\u003eCe document est protégé par les droits d\u0026rsquo;auteurs, et placé sous les\ntermes de la licence GNU/\u003ca href=\"http://www.gnu.org/copyleft/fdl.html\" rel=\"external\"\u003eFDL\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"répertoires\"\u003eRépertoires\u003c/h2\u003e\n\u003cp\u003eLes chemins de répertoires et fichiers dans Unix utilisent le symbole\n\u0026lsquo;/\u0026rsquo; (slash) pour séparer le nom des répertoires, dans le contexte du\nchemin.\u003c/p\u003e\n\u003cp\u003eexemples:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e/\u003c/code\u003e   répertoire racine\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e/usr\u003c/code\u003e    répertoire usr (répertoire enfant de la racine)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e/usr/STRIM100\u003c/code\u003e   STRIM100 est un sous-répertoire de /usr\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"circuler-dans-le-système-de-fichiers\"\u003eCirculer dans le système de fichiers\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003epwd\u003c/code\u003e voir le nom du répertoire courant\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecd\u003c/code\u003e  Se rediriger vers votre répertoire utilisateur personnel\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecd /usr/STRIM100\u003c/code\u003e    Se diriger vers /usr/STRIM100.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecd INIT\u003c/code\u003e Se diriger vers le répertoire INIT,  qui est un\nsous-répertoire du répertoire courant.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecd ..\u003c/code\u003e   Se diriger vers le répertoire parent du répertoire courant.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecd $STRMWORK\u003c/code\u003e    Se diriger vers le répertoire renfermé dans la\nvariable d\u0026rsquo;environnement \u0026lsquo;STRMWORK\u0026rsquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecd ~bob\u003c/code\u003e Se diriger vers le répertoire personnel de bob.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"lister-le-contenu-dun-répertoire\"\u003eLister le contenu d\u0026rsquo;un répertoire\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003els\u003c/code\u003e  liste un répertoire\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003els -l\u003c/code\u003e   liste un répertoire dans un format détaillé\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003els -a\u003c/code\u003e   liste le répertoire courant en affichant les fichiers cachés,\nceux-ci commencent par un \u0026ldquo;.\u0026rdquo;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003els -ld\u003c/code\u003e     Liste tous les noms de fichiers et répertoires dans le\nrépertoire courant, utilisant un format détaillé. Sans l\u0026rsquo;option \u0026rsquo;d\u0026rsquo;,\nla commande \u0026rsquo;ls\u0026rsquo; listera le contenu des sous-répertoire du\nrépertoire courant. Avec, \u0026rsquo;ls\u0026rsquo; listera juste le nom des fichiers.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour 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$ ls -l \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x   \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e cliff    user      \u003cspan style=\"color:#f99b15\"\u003e1024\u003c/span\u003e Jun \u003cspan style=\"color:#f99b15\"\u003e18\u003c/span\u003e 09:40 WAITRON_EARNINGS\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 cliff    user      \u003cspan style=\"color:#f99b15\"\u003e767392\u003c/span\u003e Jun \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e 14:28 scanlib.tar.gz\n\u003c/span\u003e\u003c/span\u003e\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\u003cspan style=\"color:#5bc4bf\"\u003e||\u003c/span\u003e  |  |      | |id      |group    |poids |date |heure |nom \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e||\u003c/span\u003e  |  |      |nombre de contenu \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e||\u003c/span\u003e  |  |permissions pour les autres\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e||\u003c/span\u003e  |permissions pour les membres du groupe\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e||\u003c/span\u003epermission pour le propriétaire du fichier : \u003cspan style=\"color:#ef6155\"\u003er\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e lecture, \u003cspan style=\"color:#ef6155\"\u003ew\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e écriture, \u003cspan style=\"color:#ef6155\"\u003ex\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e éxecution, - \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e pas de permission\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e|type de fichier : - \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e fichier normal, \u003cspan style=\"color:#ef6155\"\u003ed\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e répertoire, \u003cspan style=\"color:#ef6155\"\u003el\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e lien symbolique, etc…\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"changer-les-permissions-et-attributs-de-fichiers\"\u003eChanger les permissions et attributs de fichiers\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003echmod 755 file\u003c/code\u003e Change les permissions du fichiers, en donnant tous\nles droits au propriétaire du fichier, et les droits de lecture et\nd\u0026rsquo;exécution pour le groupe et les autres.\n(7 = rwx = 111 en binaire ; 5 = r-x = 101 en binaire)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003echgrp user file\u003c/code\u003e  Change l\u0026rsquo;appartenance du groupe sur le fichier.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003echown cliff file\u003c/code\u003e  Change le propriétaire du fichier.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003echown -R cliff dir\u003c/code\u003e Change le propriétaire du répertoire, de manière\nrécursive.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVous devez être le propriétaire des fichiers ou répertoires, ou être en\nmode administrateur (root) avant de pouvoir interagir ainsi.\u003c/p\u003e\n\u003ch3 id=\"déplacer-renommer-et-copier-des-fichiers\"\u003eDéplacer, renommer, et copier des fichiers\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecp file1 file2\u003c/code\u003e Copier un fichier\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003emv file1 newname\u003c/code\u003e Déplacer ou renommer un fichier\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003emv file1 ~/AAA/\u003c/code\u003e Déplacer un fichier dans le sous-répertoire AAA de\nvotre répertoire utilisateur personnel\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003erm file1 [file2…]\u003c/code\u003e Supprimer un fichier\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003erm -r dir1 [dir2…]\u003c/code\u003e Supprimer un répertoire récursivement, et son\ncontenu. FAITES ATTENTION !\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003emkdir dir1 [dir2…]\u003c/code\u003e Créer un répertoire\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003emkdir -p dirpath\u003c/code\u003e Créer un répertoire, incluant tous les\nsous-répertoires nommés en suivant\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ermdir dir1 [dir2…]\u003c/code\u003e Supprimer un répertoire vide\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"voir-le-contenu-et-éditer-des-fichiers\"\u003eVoir le contenu et éditer des fichiers\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecat filename\u003c/code\u003e Afficher le contenu d\u0026rsquo;un fichier à l\u0026rsquo;écran, en ascii\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003emore filename\u003c/code\u003e Afficher le contenu d\u0026rsquo;un fichier à l\u0026rsquo;écran de manière\nprogressive. L\u0026rsquo;appui sur la touche \u003ckbd\u003eEntrée\u003c/kbd\u003e affiche la ligne\nsuivante ; celui sur la barre d\u0026rsquo;\u003ckbd\u003eespace\u003c/kbd\u003e affiche une nouvelle\npage ; celui sur la touche \u003ckbd\u003eq\u003c/kbd\u003e permettra la sortie.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eless filename\u003c/code\u003e Un peu comme \u0026lsquo;more\u0026rsquo;, mais permet l\u0026rsquo;usage de la touche\n\u003ckbd\u003e^\u003c/kbd\u003e \u0026ldquo;Défilement Haut\u0026rdquo;, pour remonter les pages. Fonctionne\nsur certains systèmes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003evi filename\u003c/code\u003e Éditer le fichier en utilisant l\u0026rsquo;éditeur \u0026lsquo;vi\u0026rsquo;.\nTous les systèmes Unix ont cet éditeur.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eemacs filename\u003c/code\u003e Éditer le fichier en utilisant l\u0026rsquo;éditeur \u0026rsquo;emacs\u0026rsquo;.\nTous les systèmes Unix n\u0026rsquo;ont pas cet éditeur.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ehead filename\u003c/code\u003e Lire les premières lignes d\u0026rsquo;un fichier.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ehead -n x filename\u003c/code\u003e Lire les x premières lignes d\u0026rsquo;un fichier\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etail filename\u003c/code\u003e  Lire les dernières lignes d\u0026rsquo;un fichier\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etail -n x filename\u003c/code\u003e  Lire les x dernières lignes d\u0026rsquo;un fichier\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"shells\"\u003eShells\u003c/h2\u003e\n\u003cp\u003eLe comportement d\u0026rsquo;une interface de ligne de commande diffère étroitement\ndu programme shell dans lequel il est utilisée.\u003c/p\u003e\n\u003cp\u003eDépendant du shell utilisé, quelques comportements supplémentaires\npeuvent être utiles.\u003c/p\u003e\n\u003cp\u003eIl est possible de savoir sous quel shell vous fonctionnez, en utilisant\nla commande suivante :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ echo $SHELL\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eBien-sûr, vous pouvez créer un fichier ayant une liste de commandes shell,\nl\u0026rsquo;exécuter tel un programme. Ceci est appelé un script shell. C\u0026rsquo;est le\nbut premier de la plupart des shells.\u003c/p\u003e\n\u003ch3 id=\"variables-denvironnement\"\u003eVariables d\u0026rsquo;environnement\u003c/h3\u003e\n\u003cp\u003eLes variables d\u0026rsquo;environnement permettent au shell d\u0026rsquo;enregistrer des\ndonnées, pour un usage ultérieur.\u003c/p\u003e\n\u003cp\u003ePar exemple, pour le shell nommé Bash :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eexport CASROOT=/usr/local/CAS3.0\u003c/code\u003e    Définit la variable CASROOT avec\nla valeur /usr/local/CAS3.0.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eexport LD_LIBRARY_PATH=$CASROOT/Linux/lib\u003c/code\u003e   Définit la variable\n\u003ccode\u003eLD_LIBRARY_PATH\u003c/code\u003e avec la valeur de la variable \u003ccode\u003e$CASROOT\u003c/code\u003e concaténé\navec \u003ccode\u003e/Linux/lib\u003c/code\u003e, ou \u003ccode\u003e/usr/local/CAS3.0/Linux/lib\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEn préfixant la variable du symbole \u0026lsquo;$\u0026rsquo;, vous pouvez utiliser son\ncontenu dans le contexte de toute commande :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecd $CASROOT\u003c/code\u003e     Se rediriger vers le répertoire contenu dans la\nvariable \u003ccode\u003eCASROOT\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eecho $CASROOT\u003c/code\u003e   Afficher le contenu de la variable CASROOT,\nsoit \u003ccode\u003e/usr/local/CAS3.0\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eprintenv CASROOT\u003c/code\u003e    Faire la même chose dans le shell bash ou\nd\u0026rsquo;autres environnements.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"historique-interactif\"\u003eHistorique interactif\u003c/h3\u003e\n\u003cp\u003eUne fonctionnalité des shells bash, tcsh (et certainement d\u0026rsquo;autres) est\nde pouvoir utiliser l\u0026rsquo;accès aux commandes précédentes par l\u0026rsquo;appui de la\ntouche \u003ckbd\u003e^\u003c/kbd\u003e \u0026ldquo;Flèche Haut\u0026rdquo;, de les éditer, et/ou de les exécuter\nà nouveau.\u003c/p\u003e\n\u003cp\u003eCertains shells proposent l\u0026rsquo;usage de la commande \u003ccode\u003ehistory\u003c/code\u003e, qui\naffichera l\u0026rsquo;ensemble des commandes utilisées.\nPour les réutiliser, si besoin, il suffit de précéder le numéro de la\ncommande du symbole \u003ccode\u003e!\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"complétion-de-nom-de-fichier\"\u003eComplétion de nom de fichier\u003c/h3\u003e\n\u003cp\u003eUne fonctionnalité des shells bash, tcsh (et certainement d\u0026rsquo;autres) est\nde pouvoir utiliser la touche de Tabulation pour compléter un nom de\nfichier partiellement tapé. Par exemple, si vous avez un fichier nommé\nèconstantine-monks-and-willy-wonka.txt\u0026rsquo; dans votre répertoire et que\nvous désirez l\u0026rsquo;éditer, vous pouvez écrire \u003ccode\u003evi const\u003c/code\u003e, appuyez sur la\ntouche \u003ckbd\u003eTab\u003c/kbd\u003e, et le shell remplira le reste du nom de fichier.\u003c/p\u003e\n\u003ch3 id=\"bash-est-le-shell-le-plus-cool\"\u003eBash est le shell le plus cool\u003c/h3\u003e\n\u003cp\u003eBash est même capable de compléter le nom des commandes et des variables\nd\u0026rsquo;environnement. S\u0026rsquo;il y a plusieurs complétions possibles, l\u0026rsquo;appui\nplusieurs fois sur la touche \u003ckbd\u003eTab\u003c/kbd\u003e vous affichera les\ndifférentes possibilités.\u003c/p\u003e\n\u003cp\u003eBash est le shell par défaut pour les systèmes Linux.\u003c/p\u003e\n\u003ch3 id=\"redirection\"\u003eRedirection\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003egrep string filename \u0026gt; newfile\u003c/code\u003e Redirige la sortie de la commande\ngrep vers un nouveau fichier\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003egrep string filename \u0026gt;\u0026gt; existfile\u003c/code\u003e Ajoute la sortie de la commande\ngrep à la fin du fichier \u003ccode\u003eexistfile\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes directives de redirection \u003ccode\u003e\u0026gt;\u003c/code\u003e et \u003ccode\u003e\u0026gt;\u0026gt;\u003c/code\u003e peuvent être utilisées pour\ndiriger la sortie de la plupart des commandes vers un fichier.\u003c/p\u003e\n\u003ch3 id=\"pipes\"\u003ePipes\u003c/h3\u003e\n\u003cp\u003eLe symbole \u003ccode\u003e|\u003c/code\u003e \u003cem\u003e(la barre vertical sous le chiffre 6 ; appuyer\nsimultanément sur les touches \u003ckbd\u003eAlt Gr\u003c/kbd\u003e et \u003ckbd\u003e6\u003c/kbd\u003e)\u003c/em\u003e est\nutilisé pour diriger la sortie d\u0026rsquo;une commande vers l\u0026rsquo;entrée d\u0026rsquo;une autre\ncommande.\u003c/p\u003e\n\u003cp\u003ePar exemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003els -l | more\u003c/code\u003e Cette commande prend la sortie de la commande \u003ccode\u003els\u003c/code\u003e dans\nson format détaillé et l\u0026rsquo;affiche au-travers de la commande \u0026lsquo;more\u0026rsquo;.\nCela permet dans le cas d\u0026rsquo;une très longue liste d\u0026rsquo;être affichée page\npar page.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003edu -sc * | sort -n | tail\u003c/code\u003e La commande \u003ccode\u003edu -sc\u003c/code\u003e liste les tailles des\nfichiers et répertoires, dans le répertoire de travail courant, puis\ntrie le résultat de la plus petite à la plus grosse grâce à la\ncommande \u003ccode\u003esort -n\u003c/code\u003e. Finalement, seront affichés les quelques\nderniers résultats, les plus gros fichiers, par le biais de la\ncommande \u003ccode\u003etail\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"substitution-de-commande\"\u003eSubstitution de commande\u003c/h3\u003e\n\u003cp\u003eVous pouvez utiliser la sortie d\u0026rsquo;une commande comme entrée d\u0026rsquo;une autre\ncommande d\u0026rsquo;une autre manière, appelée \u0026ldquo;Substitution de commande\u0026rdquo;. Elle\nest invoquée par l\u0026rsquo;usage du symbole `\n\u003cem\u003e(appui simultané des touches \u003ckbd\u003eAlt Gr\u003c/kbd\u003e et \u003ckbd\u003e7\u003c/kbd\u003e)\u003c/em\u003e,\ntel que, pour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ cat `find . -name aaa.txt`\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCe qui affichera à l\u0026rsquo;écran tous les fichiers nommés \u003ccode\u003eaaa.txt\u003c/code\u003e dans le\nrépertoire courant, et de ses sous-répertoires.\u003c/p\u003e\n\u003cp\u003eActuellement, il est recommandé de l\u0026rsquo;écrire ainsi :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ cat \u0026quot;$(find . -name aaa.txt)\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"grep--recherche-de-chaînes-de-caractères-dans-un-fichier\"\u003egrep : Recherche de chaînes de caractères dans un fichier\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egrep string filename\u003c/code\u003e    affiche toutes les lignes contenant la\nchaine \u003ccode\u003estring\u003c/code\u003e dans tel nom de fichier.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"find--recherche-de-fichiers\"\u003efind : Recherche de fichiers\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003efind search_path -name filename\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003efind . -name aaa.txt\u003c/code\u003e Cherche tous les fichiers nommés \u003ccode\u003eaaa.txt\u003c/code\u003e\ndans le répertoire courant et ses sous-répertoires.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003efind / -name vimrc\u003c/code\u003e  Cherche tous les fichiers nommés \u003ccode\u003evimrc\u003c/code\u003e partout\ndans le système de fichiers.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003efind /usr/local/games -name \u0026quot;*xpilot*\u0026quot;\u003c/code\u003e Cherche tous les fichiers\ncontainant la chaîne \u003ccode\u003expilot\u003c/code\u003e dans leurs noms, qui existent dans le\nrépertoire \u003ccode\u003e/usr/local/games\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"tar--lire-écrire-des-sauvegardes-et-autres-archives\"\u003etar : Lire, écrire des sauvegardes et autres archives\u003c/h3\u003e\n\u003cp\u003eLa commande \u0026rsquo;tar\u0026rsquo; signifie \u0026ldquo;tape archive\u0026rdquo;. C\u0026rsquo;est la manière \u0026ldquo;standard\u0026rdquo;\nde lire et d\u0026rsquo;écrire des archives \u003cem\u003e(qui sont des collections de fichiers,\ndans un répertoire donné)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eVous trouverez souvent des archives avec des noms tels que \u003ccode\u003estuff.tar\u003c/code\u003e,\nou \u003ccode\u003estuff.tar.gz\u003c/code\u003e. En substance, cela signifie que le répertoire \u003ccode\u003estuff\u003c/code\u003e\na été archivé dans une archive tar, et pour le second cas, que cette\narchive a été compressée par le moyen du programme de compression \u003ccode\u003egzip\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl y a de fortes probabilités que si quelqu\u0026rsquo;un vous donne une sauvegarde,\nfaite sur un système Unix, que cette sauvegarde soit faite dans le\nformat tar… et, dans ce cas, vous devrez utiliser \u003ccode\u003etar\u003c/code\u003e, et votre lecteur\nde bande, pour la lire.\u003c/p\u003e\n\u003cp\u003eDe même, si vous voulez écrire une bande de sauvegarde pour quelqu\u0026rsquo;un\nd\u0026rsquo;autre, vous devriez utiliser probablement tar, aussi.\u003c/p\u003e\n\u003cp\u003eExemples :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etar xv\u003c/code\u003e Extrait les fichiers depuis la sauvegarde, en affichant le\nnom des fichiers à l\u0026rsquo;écran.  (\u003ccode\u003ev\u003c/code\u003e = verbeux)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etar tv\u003c/code\u003e Liste les fichiers depuis la sauvegarde sans les extraire.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etar cv file1 file2\u003c/code\u003e Écrit les fichiers \u003ccode\u003efile1\u003c/code\u003e et \u003ccode\u003efile2\u003c/code\u003e dans la\nsauvegarde.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etar cvf archive.tar file1 [file2…]\u003c/code\u003e Créer une archive tar, nommée\n\u003ccode\u003earchive.tar\u003c/code\u003e, contenant les fichiers \u003ccode\u003efile1\u003c/code\u003e, \u003ccode\u003efile2\u003c/code\u003e, etc…\n\u003cem\u003eNe pas utilisez les symboles \u003ccode\u003e[\u003c/code\u003e, \u003ccode\u003e]\u003c/code\u003e : c\u0026rsquo;est juste une convention\nd\u0026rsquo;écriture pour signifier l\u0026rsquo;option…\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etar xvf archive.tar\u003c/code\u003e Extrait les fichiers de l\u0026rsquo;archive \u003ccode\u003earchive.tar\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etar cvfz archive.tar.gz dname\u003c/code\u003e Créer une archive compressée par gzip,\ncontenant tout le contenu du répertoire \u003ccode\u003edname\u003c/code\u003e.\n\u003cem\u003eNe fonctionne pas avec toutes les versions de tar\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etar xvfz archive.tar.gz\u003c/code\u003e Extrait une archive compressée avec gzip.\n\u003cem\u003eNe fonctionne pas avec toutes les versions de tar\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etar cvfI archive.tar.bz2 dname\u003c/code\u003e Créer une archive tar compressée avec\nle programme de compression bzip2.\n\u003cem\u003eNe fonctionne pas avec toutes les versions de tar\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"compression-de-fichiers\"\u003eCompression de fichiers\u003c/h3\u003e\n\u003ch4 id=\"compress\"\u003ecompress\u003c/h4\u003e\n\u003cp\u003eLes commandes de compression Unix, par défaut, sont \u003ccode\u003ecompress\u003c/code\u003e et\n\u003ccode\u003euncompress\u003c/code\u003e. Les fichiers compressés ont le suffixe \u003ccode\u003e.Z\u003c/code\u003e ajouté à leur\nnom.\u003c/p\u003e\n\u003cp\u003ePour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecompress part.igs\u003c/code\u003e Créer un fichier compressé part.igs.Z\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003euncompress part.igs\u003c/code\u003e Décompresser le contenu du fichier part.igs.Z\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNote que l\u0026rsquo;usage de \u003ccode\u003e.Z\u003c/code\u003e n\u0026rsquo;est pas requis.\u003c/p\u003e\n\u003ch4 id=\"gzip\"\u003egzip\u003c/h4\u003e\n\u003cp\u003eUn autre utilitaire de compression commun est \u003ccode\u003egzip\u003c/code\u003e (et \u003ccode\u003egunzip\u003c/code\u003e). Ce\nsont des outils GNU de compression et décompression. gzip utilise un\nmeilleur format de compression que le standard compress, mais n\u0026rsquo;est pas\ninstallé sur tous les systèmes. Le suffixe pour les fichiers compressés\npar gzip est \u003ccode\u003e.gz\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003egzip part.igs\u003c/code\u003e Créer un fichier compressé part.igs.gz\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003egunzip part.igs\u003c/code\u003e Extrait le contenu de l\u0026rsquo;archive part.igs.gz\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"bzip2\"\u003ebzip2\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;utilitaire bzip2 a (en général) un meilleur taux de compression que\ngzip, mais prend plus de temps pour compresser ou décompresser des\nfichiers. Ce n\u0026rsquo;est pas un utilitaire commun comme gzip, mais il devient\nde plus en plus disponible.\n\u003cem\u003e(À ce jour de la traduction, c\u0026rsquo;est devenu un outil commun !)\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ebzip2 part.igs\u003c/code\u003e Créer un fichier compressé part.igs.bz2\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ebunzip2 part.igs.bz2\u003c/code\u003e Décompresse le contenu du fichier part.igs.bz2\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"man-apropos--rechercher-de-laide-dans-le-système\"\u003eman, apropos : Rechercher de l\u0026rsquo;aide dans le système\u003c/h3\u003e\n\u003cp\u003eLa plupart des commandes ont une page de manuel qui décrit comment\nl\u0026rsquo;utiliser, de manière plus ou moins détaillée. Ces pages de manuels\nsont appelés des \u003ccode\u003eman pages\u003c/code\u003e parce qu\u0026rsquo;elles sont faites pour être lues\npar des humains.\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eman ls\u003c/code\u003e  Lire le manuel de la commande \u003ccode\u003els\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVous pouvez trouver les man pages en utilisant la commande \u003ccode\u003eapropos\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eapropos build\u003c/code\u003e Afficher tous les man pages dont la description\ncontient le mot \u003ccode\u003ebuild\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour l\u0026rsquo;exemple, exécuter donc un \u003ccode\u003eman apropos\u003c/code\u003e pour obtenir l\u0026rsquo;aide\ndétaillé de la commande \u003ccode\u003eapropos\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"bases-de-léditeur-vi\"\u003eBases de l\u0026rsquo;éditeur \u003ccode\u003evi\u003c/code\u003e\u003c/h2\u003e\n\u003ch3 id=\"ouvrir-un-fichier\"\u003eOuvrir un fichier\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003evi nom_fichier\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"créer-du-texte\"\u003eCréer du texte\u003c/h3\u003e\n\u003cp\u003eLes modes d\u0026rsquo;édition : l\u0026rsquo;appui sur les touches ci-dessous permettent\nd\u0026rsquo;entrer en mode édition, puis d\u0026rsquo;écrire le contenu de votre document.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ei\u003c/code\u003e Insérer des caractères avant la position du curseur.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eI\u003c/code\u003e Insérer des caractères au début de la ligne courante.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ea\u003c/code\u003e Ajouter après la position du curseur.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eA\u003c/code\u003e Ajouter à la fin de la ligne courante.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003er\u003c/code\u003e Remplacer un caractère.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eR\u003c/code\u003e Mode remplacement\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e\u0026lt;ESC\u0026gt;\u003c/code\u003e Sort des modes insertion.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"suppression-de-texte\"\u003eSuppression de texte\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ex\u003c/code\u003e Supprime un caractère\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003edd\u003c/code\u003e Supprime la ligne courante et la met en mémoire-tampon\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003endd\u003c/code\u003e Supprime n lignes (n étant un nombre) et les mets dans la\nmémoire-tampon.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eJ\u003c/code\u003e Attache une nouvelle ligne à la fin de la ligne courante (et\nsupprime les caractères de retour-à-la ligne)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"oups--erreur-de-saisie\"\u003eOups : Erreur de saisie\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eu\u003c/code\u003e Annule la dernière commande\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"copier-coller\"\u003eCopier, Coller\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eyy\u003c/code\u003e Copie la ligne courante dans la mémoire-tampon\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003enyy\u003c/code\u003e Copie n lignes dans la mémoire-tamon\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ep\u003c/code\u003e Colle le contenu de la mémoire-tampon après la ligne courante\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eP\u003c/code\u003e Colle le contenu de la mémoire-tampon avant la ligne courante\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"positionner-le-curseur\"\u003ePositionner le curseur\u003c/h3\u003e\n\u003cp\u003eLe symbole \u003ccode\u003e^\u003c/code\u003e signifie l\u0026rsquo;appui simultanée sur la touche \u003ckbd\u003eCtrl\u003c/kbd\u003e\npuis la touche signalée !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e^d\u003c/code\u003e Descend d\u0026rsquo;une page\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e^u\u003c/code\u003e Remonte d\u0026rsquo;une page\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e:n\u003c/code\u003e Positionne le curseur à la ligne n\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e:$\u003c/code\u003e Positionne le curseur à la fin de la ligne courante\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e^g\u003c/code\u003e Affiche le numéro de la ligne courante\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eh,j,k,l\u003c/code\u003e Respectivement, à gauche, en bas, au-dessus, et à droite du\ncurseur. Vous pouvez aussi utiliser les touches fléchées si cela\nfonctionne avec votre clavier.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"remplacement-de-caractères\"\u003eRemplacement de caractères\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e:n1,n2:s/string1/string2/[g]\u003c/code\u003e Remplace la chaîne de caractères 1 par la\nchaine de caractères 2 sur les lignes n1 et n2. Quand \u003ccode\u003eg\u003c/code\u003e est inclus\n(pour global), toutes les instances de la chaînes de caractère 1 sur\nchacunes des lignes sont remplacées. Si \u003ccode\u003eg\u003c/code\u003e n\u0026rsquo;est pas inclus, seule\nla première instance par ligne correspondante est remplacée.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e^\u003c/code\u003e correspond au début de ligne.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e.\u003c/code\u003e signifie tout caractère\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e$\u003c/code\u003e correspond à la fin de ligne.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCes caractères, ainsi que d\u0026rsquo;autres \u0026ldquo;caractères spéciaux\u0026rdquo; (tels que\nl\u0026rsquo;anti-slash) peuvent être échappés par l\u0026rsquo;usage du symbole \u003ckbd\u003e\\\u003c/kbd\u003e,\ntel que \u003ccode\u003e\\/usr\\/STRIM100\\/SOFT\u003c/code\u003e signifiant littéralement la chaîne de\ncaractère \u003ccode\u003e/usr/STRIM100/SOFT\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eExemples :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e:1,$:s/dog/cat/g\u003c/code\u003e Remplacer chaque instance \u003ccode\u003edog\u003c/code\u003e par \u003ccode\u003ecat\u003c/code\u003e, dans\ntout le fichier. \u003cem\u003eL\u0026rsquo;usage de \u003ccode\u003e:1,$\u003c/code\u003e signifie du début à la fin du\nfichier\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e:23,25:/frog/bird/\u003c/code\u003e Sur les lignes 23 à 25, remplacer la première\ninstance de \u003ccode\u003efrog\u003c/code\u003e par \u003ccode\u003ebird\u003c/code\u003e, dans chacune de ces lignes.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"sauver-quitter-et-autres-commandes-ex\"\u003eSauver, quitter et autres commandes \u003ccode\u003eex\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eCes commandes sont toutes préfixées par l\u0026rsquo;usage du symbole \u003ckbd\u003e:\u003c/kbd\u003e,\net affichées en bas, à gauche de l\u0026rsquo;écran. Ce sont les commandes \u003ccode\u003eex\u003c/code\u003e,\nparce qu\u0026rsquo;elles font partie de l\u0026rsquo;éditeur de texte \u003ccode\u003eex\u003c/code\u003e, le précurseur de\nl\u0026rsquo;éditeur de texte \u003ccode\u003evi\u003c/code\u003e.\nVous ne pouvez pas taper une commande \u003ccode\u003eex\u003c/code\u003e quand vous êtes dans un des\nmodes insertion. (la saisie de texte à l\u0026rsquo;écran). Pour pouvoir le faire,\nil faut appuyer sur la touche \u003ckbd\u003eESC\u003c/kbd\u003e, qui vous fera sortir de ce\nmode d\u0026rsquo;insertion.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e:w\u003c/code\u003e  Sauvegarde le fichier courant\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e:w new.file\u003c/code\u003e Sauvegarde le fichier courant, dans un nouveau fichier\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e:w! existing.file\u003c/code\u003e   Sauvegarde un fichier existant avec le contenu\ndu fichier courant.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e:wq\u003c/code\u003e Sauvergarde le fichier et sors de l\u0026rsquo;éditeur\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e:q\u003c/code\u003e  Ferme l\u0026rsquo;éditeur\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e:q!\u003c/code\u003e Ferme l\u0026rsquo;éditeur sans faire de changement\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e:e filename\u003c/code\u003e Ouvre le fichier \u0026lsquo;filename\u0026rsquo; pour édition\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e:set number\u003c/code\u003e Affiche le numéro de ligne\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e:set nonumber\u003c/code\u003e   Éteint le numéro de ligne\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"faq\"\u003eFAQ\u003c/h2\u003e\n\u003cp\u003eLe contenu des Foire-aux-Questions Usenet devraient être le premier\nendroit à lire pour vos questions. Vous pouvez y trouver beaucoup de\nmanuel \u003ca href=\"ftp://rtfm.mit.edu/pub/\" rel=\"external\"\u003eRTFM\u003c/a\u003e\n\u003cem\u003e(Read the F*** Manuals ; Lis ce Fichu Manuel)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eLe contenu de ce \u003ca href=\"ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/comp/unix/questions/\" rel=\"external\"\u003erépertoire\u003c/a\u003e\ninclut les FAQs vi, bash, et comp.unix.questions.\u003c/p\u003e\n\u003cp\u003eRechercher dans les archives Usenet est souvent très utile, aussi.\u003c/p\u003e\n\u003cp\u003eGoogle.com a sa propre archive Usenet (formellement Deja.com), voire les\nrègles \u0026ldquo;Advanced Group Search\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"mention-originale-traduite\"\u003eMention originale (traduite)\u003c/h2\u003e\n\u003cp\u003eCe document \u003cem\u003e(comprendre l\u0026rsquo;original ; ce n\u0026rsquo;est pas le cas de la traduction)\u003c/em\u003e\na été converti depuis un fichier texte, en utilisant Vim. Vim est la\nmeilleure version du seul vrai éditeur de texte : vi.\u003c/p\u003e\n\u003cp\u003eCopyright (c)  2000-2006 - \u003ca href=\"mailto:cliff@freeenginer.org\" rel=\"external\"\u003ecliff@freeenginer.org\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ePermission is granted to copy, distribute and/or modify this document\nunder the terms of the GNU Free Documentation License, Version 1.1 or\nany later version published by the Free Software Foundation; with\nInvariant Section: Preface, with Front-Cover Texts, and with no\nBack-Cover Texts. A copy of the license can be found on the GNU web site\n\u003ca href=\"http://www.gnu.org/copyleft/fdl.html\" rel=\"external\"\u003ehere\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 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 'Learn UNIX in 10 minutes' du site disparu 'Freeengineer.org'","tags":["Traduction","Unix"],"date_published":"2016-12-10T12:13:31+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/tip-alias#56a6f20adc0285f9ceb903dad1f620fd8b97a2e7ecef19aba6596abf9d3d3b44","url":"https://it-log.fr.eu.org/fr/sys/openbsd/tip-alias/","title":"Les alias / OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"Description Éditez votre fichier ~/.profile !\nExemples alias add=\u0026#34;doas pkg_add\u0026#34; alias del=\u0026#34;doas pkg_del\u0026#34; alias enable=\u0026#34;doas rcctl enable\u0026#34; alias query=\u0026#34;pkg_info -Q\u0026#34; alias ll=\u0026#34;ls -lart\u0026#34; alias restart=\u0026#34;doas rcctl restart\u0026#34; alias start=\u0026#34;doas rcctl start\u0026#34; alias stop=\u0026#34;doas rcctl stop\u0026#34; # Alias # Raccourcis pour \u0026#39;ls\u0026#39; alias ll=\u0026#39;ls -l\u0026#39; alias la=\u0026#39;ls -a\u0026#39; alias lla=\u0026#39;ls -la\u0026#39; alias lls=\u0026#39;ls -s\u0026#39; # Quelques alias pratiques alias cls=\u0026#39;clear\u0026#39; alias less=\u0026#39;less --quiet\u0026#39; #Connaitre l\u0026#39;espace restant alias dh=\u0026#39;df -h\u0026#39; # kill\u0026#39;em all alias rmr=\u0026#39;rm -rf\u0026#39; alias cpr=\u0026#39;cp -r\u0026#39; # noir et blanc, c\u0026#39;est cool alias xterm=\u0026#39;xterm -bg black -fg white\u0026#39; # Remonter d\u0026#39;un dossier et ls alias u=\u0026#34;cd .. \u0026amp;\u0026amp; ls \u0026#34; # Edition simple alias v=\u0026#39;vim\u0026#39; # Voir le débit réseau alias bw=\u0026#39;systat ifstat\u0026#39; # infos sur la charge de la machine alias totop=\u0026#39;systat vm\u0026#39; # info ram/swap (free-like) alias freemem=\u0026#39;top -d1 | grep \u0026#34;^Memory\u0026#34; \u0026amp;\u0026amp; printf \u0026#34;Swap: \u0026#34; ; swapctl -s\u0026#39; # Une calculatrice en python alias calc=\u0026#39;python3.4 -ic \u0026#34;from math import *; from random import *\u0026#34;\u0026#39; # compare 2 répertoire alias diffdir=\u0026#39;diff -rq $1 $2\u0026#39; # réduire le poids d\u0026#39;un pdf alias pdfmini=\u0026#34;gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=fichier_reduit.pdf \u0026#34; # adresse ip alias whatsmyip=\u0026#39;http_proxy=\u0026#34;\u0026#34; ftp -o - -V http://ipecho.net/plain \u0026amp;\u0026amp; echo \u0026#34;\u0026#34;\u0026#39; alias whatsmyip2=\u0026#39;ftp -o - -V http://ifconfig.me/ip\u0026#39; # Enlever les commentaires : alias nocomment=\u0026#39;egrep -v \u0026#34;^\\s*(#|$)\u0026#34;\u0026#39; # insert image in latex slide alias img2slide=\u0026#39;mogrify -density 96 -units PixelsPerInch\u0026#39; # easy pastebin alias clbin=\u0026#39;curl -v -F \u0026#34;clbin=\u0026lt;-\u0026#34; https://clbin.com\u0026#39; # serveur http simple alias pyserver=\u0026#39;python3.4 -m http.server\u0026#39; # w3m et ses bookmarks alias web=\u0026#39;w3m -B\u0026#39; # star wars alias sw=\u0026#39;telnet towel.blinkenlights.nl\u0026#39; # quels ports sont ouverts ? alias openports=\u0026#39;netstat -na -f inet |grep LISTEN\u0026#39; # trouver un processus en lien avec un port/ip/proto/etc. openpid() { fstat | egrep \u0026#34;(^USER|$1)\u0026#34; } # take screenshot and upload. Save the URL in clipboard alias shotup=\u0026#39;scrot -s /tmp/shotup.png \u0026amp;\u0026amp; curl -F \u0026#34;clbin=@/tmp/shotup.png\u0026#34; https://clbin.com -selection clipboard\u0026#39; 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Éditez votre fichier \u003ccode\u003e~/.profile\u003c/code\u003e !\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias add\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pkg_add\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias del\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pkg_del\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias enable\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas rcctl enable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias query\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;pkg_info -Q\u0026#34;\u003c/span\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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias ll\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;ls -lart\u0026#34;\u003c/span\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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias restart\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas rcctl restart\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias start\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas rcctl start\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias stop\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas rcctl stop\u0026#34;\u003c/span\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-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Alias\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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# Raccourcis pour \u0026#39;ls\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias ll\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ls -l\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias la\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ls -a\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias lla\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ls -la\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias lls\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ls -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\u003e\u003cspan style=\"color:#776e71\"\u003e# Quelques alias pratiques\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias cls\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;clear\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias less\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;less --quiet\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#Connaitre l\u0026#39;espace restant\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias dh\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;df -h\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# kill\u0026#39;em all\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias rmr\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;rm -rf\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias cpr\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;cp -r\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# noir et blanc, c\u0026#39;est cool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias xterm\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;xterm -bg black -fg white\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# Remonter d\u0026#39;un dossier et ls\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias u\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;cd .. \u0026amp;\u0026amp; ls \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Edition simple\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias v\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;vim\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# Voir le débit réseau\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias bw\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;systat ifstat\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# infos sur la charge de la machine\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias totop\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;systat vm\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# info ram/swap (free-like)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias freemem\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;top -d1 | grep \u0026#34;^Memory\u0026#34; \u0026amp;\u0026amp; printf \u0026#34;Swap:  \u0026#34; ; swapctl -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\u003e\u003cspan style=\"color:#776e71\"\u003e# Une calculatrice en python\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias calc\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;python3.4 -ic \u0026#34;from math import *; from random import *\u0026#34;\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# compare 2 répertoire\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias diffdir\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;diff -rq $1 $2\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# réduire le poids d\u0026#39;un pdf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pdfmini\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=fichier_reduit.pdf \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# adresse ip\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias whatsmyip\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;http_proxy=\u0026#34;\u0026#34; ftp -o - -V http://ipecho.net/plain \u0026amp;\u0026amp; echo \u0026#34;\u0026#34;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias whatsmyip2\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ftp -o - -V http://ifconfig.me/ip\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# Enlever les commentaires : \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias nocomment\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;egrep -v \u0026#34;^\\s*(#|$)\u0026#34;\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# insert image in latex slide\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias img2slide\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;mogrify -density 96 -units PixelsPerInch\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# easy pastebin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias clbin\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;curl -v -F \u0026#34;clbin=\u0026lt;-\u0026#34; https://clbin.com\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# serveur http simple\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pyserver\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;python3.4 -m http.server\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# w3m et ses bookmarks\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias web\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;w3m -B\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# star wars\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias sw\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;telnet towel.blinkenlights.nl\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# quels ports sont ouverts ?\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias openports\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;netstat -na -f inet |grep LISTEN\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# trouver un processus en lien avec un port/ip/proto/etc.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eopenpid() {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003efstat | egrep \u0026#34;(^USER|$1)\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:#776e71\"\u003e# take screenshot and upload. Save the URL in clipboard\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias shotup\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;scrot -s /tmp/shotup.png \u0026amp;\u0026amp; curl -F \u0026#34;clbin=@/tmp/shotup.png\u0026#34; https://clbin.com -selection clipboard\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 de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n","summary":"Comment gérer les alias sous OpenBSD !","tags":["OpenBSD","Astuce","Alias"],"date_published":"2016-12-10T12:12:58+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-12-10:/fr/sys/openbsd/tip-burn-cdrom#3391cb9adbe5f7b0d362d4bac33d300cb8ef35ec510f0dc1c9c7efc61829c3a6","url":"https://it-log.fr.eu.org/fr/sys/openbsd/tip-burn-cdrom/","title":"Graver un CD sous OpenBSD","author":{"name":"Stéphane HUC"},"content_text":"Description La majeure partie de ce qui est écrit ici provient, comme d\u0026rsquo;habitude, de la documentation.\nDéjà, on commence par mettre tous les fichiers à graver dans un dossier que j\u0026rsquo;appelle ici \u0026ldquo;cd\u0026rdquo; par souci d\u0026rsquo;originalité :) .\nVérifiez bien que les documents ne prennent pas trop de place. Par exemple, j\u0026rsquo;ai un CD de 700MB , je regarde avec la commande \u0026ldquo;du\u0026rdquo; si ça passe :\n$ du -h cd 472M\tcd C\u0026rsquo;est bon :)\nOn fabrique maintenant un fichier moncd.iso que l\u0026rsquo;on pourra graver :\n$ mkhybrid -R -o moncd.iso cd/ On vide le cd :\n# cdio -f cd0c blank Et enfin, on grave l\u0026rsquo;iso :\n# cdio -f cd0c tao moncd.iso On peut vérifier que tout s\u0026rsquo;est bien passé en montant le CD fraîchement gravé :\n# mount /dev/cd0c /mnt/cdrom # ls /mnt/cdrom ATTENTION : Pour les DVD, la démarche est légèrement différente.\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\u003eLa majeure partie de ce qui est écrit ici provient, comme d\u0026rsquo;habitude, de\nla \u003ca href=\"https://www.openbsd.org/faq/faq13.html#burnCD\" rel=\"external\"\u003edocumentation\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eDéjà, on commence par mettre tous les fichiers à graver dans un dossier\nque j\u0026rsquo;appelle ici \u0026ldquo;cd\u0026rdquo; par souci d\u0026rsquo;originalité :) .\u003c/p\u003e\n\u003cp\u003eVérifiez bien que les documents ne prennent pas trop de place.\nPar exemple, j\u0026rsquo;ai un CD de 700MB , je regarde avec la commande \u0026ldquo;du\u0026rdquo; si\nça 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$ du -h cd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e472M\tcd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eC\u0026rsquo;est bon :)\u003c/p\u003e\n\u003cp\u003eOn fabrique maintenant un fichier \u003ccode\u003emoncd.iso\u003c/code\u003e que l\u0026rsquo;on pourra graver :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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$ mkhybrid -R -o moncd.iso cd/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn vide le cd :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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# cdio -f cd0c blank\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt enfin, on grave l\u0026rsquo;iso :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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# cdio -f cd0c tao moncd.iso\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn peut vérifier que tout s\u0026rsquo;est bien passé en montant le CD fraîchement\ngravé :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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/cd0c /mnt/cdrom\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# ls /mnt/cdrom\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Pour les DVD, la démarche est légèrement différente.\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 : comment graver un cdrom sous OpenBSD","tags":["OpenBSD","Astuce","CDRom"],"date_published":"2016-12-10T07:00:28+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-09-22:/fr/sys/debian/documentation#155be82af97d8d3b1a97ff9b066795080b2b112f3301f2dd78d6a2f7e8d31960","url":"https://it-log.fr.eu.org/fr/sys/debian/documentation/","title":"Documentation Debian","author":{"name":"Stéphane HUC"},"content_text":"Description Cette page recense la documentation officielle, si possible, en langue française, sauf si spécifiée, ainsi que toute autre information pertinente relative au projet Debian.\nManuels officiels Le manuel d\u0026rsquo;installation pour la distribution Debian GNU/Linux - officiel :\npour PC 64 bits - amd64 : version HTML, PDF. pour PC 32 bits - i386 : version HTML, PDF. pour les autres architectures, lire la page Debian stable \u0026ndash; Installation Guide Une page qui répertorie l\u0026lsquo;installation de Debian par type de matériel Manuels pour les débutants le Cahier du Débutant Debian\u0026hellip; ou https://debian-beginners-handbook.arpinux.org/index-fr.html simplifié le nouveau debianiste qui papillonne… Manuels pour utilisateurs + ou - avancés : le Cahier de l\u0026rsquo;Admin Debian Formation Debian GNU/Linux Répertoire des pages des Manuels Debian - certains man peuvent être traduits en Français, voir l\u0026rsquo;encadré \u0026ldquo;Others languages\u0026rdquo; dans la page. Autres informations sur Debian le wiki officiel de Debian dont le fameux FrankenDebian : à lire impérativement ! Installer les dépôts backports La FAQ Debian GNU/Linux Le manuel Référence Debian Les manuels de l\u0026rsquo;utilisateurs Debian - en anglais La Carte de Référence Debian GNU/Linux Le manuel Securing Debian le wiki de Debian-facile.org - à destination des débutants… les pages du wiki \u0026ldquo;Administrer\u0026rdquo; de DF… les \u0026ldquo;captures d\u0026rsquo;écran logiciels\u0026rdquo; Debian : https://screenshots.debian.net/ ⇒ Manuels Debian des outils :\napt : guide d\u0026rsquo;utilisation, et guide d\u0026rsquo;utilisation hors-line. aptitude ⇒ Trucs \u0026amp; Astuces :\nExtrepo Debian Live CD/USB ⇒ À-propos des versions LiveCD — version stable — officielles :\nVersion PC (64 bits - arch amd64) : http://cdimage.debian.org/cdimage/release/current-live/amd64/iso-hybrid/ ⇒ ISO Debian Facile : https://debian-facile.org/projets:iso-debian-facile\nDebian Sid \u0026ldquo;Unstable\u0026rdquo; À-propos des versions mini-isos - version Sid (appelée aussi \u0026ldquo;Unstable\u0026rdquo;) : (ne convient pas aux débutants)\nVersion PC (32 bits - arch i386) : http://ftp.debian.org/debian/dists/sid/main/installer-i386/current/images/netboot/mini.iso Version PC (64 bits - arch amd64) : http://ftp.debian.org/debian/dists/sid/main/installer-amd64/current/images/netboot/mini.iso Les autres architectures : http://ftp.debian.org/debian/dists/sid/main/ ⇒ Lire IMPÉRATIVEMENT la page du Wiki Debian : DebianUnstable\n⇒ Voici un guide pour savoir comment gérer Sid de manière efficace…\n⇒ Il existe plusieurs projets \u0026ldquo;autour\u0026rdquo; de la Sid, plus ou moins actifs :\nAntiX-Sid : une autre Sid, sans systemd DebianDog Sid : autour des principes de Puppy Linux, sans l\u0026rsquo;être, est une Debian Sid sans systemd Siduction Xebian Préférez le projet Xebian ; mais ceci n\u0026rsquo;est qu\u0026rsquo;un avis…\nDistributions basées sur Debian : Knoppix : un live CD/DVD, basée sur Stable http://knoppix.net/ LMDE : la Linux Mint Debian Edition, basée sur Stable, afin de délivrer la même expérience que sur Ubuntu https://www.linuxmint.com/download_lmde.php Q4OS : basée sur Stable, dédié à la \u0026ldquo;productivité\u0026rdquo; https://q4os.org et, très certainement bien d\u0026rsquo;autres… Distributions Debian dérivées : Debian Fast Track est un dépôt alternatif officiel, depuis déc. 2018, pour porter les paquets Testing, qui ne sont plus maintenus officiellement, vers stable. (cf: post de présentation) Debian Fast Forward est un dépôt alternatif officialisé depuis juillet 2025 pour porter les paquets testing ET unstable vers stable. (cf : post de présentation) grml : Live CD Debian spécifique pour les administrateurs systèmes. Kali Linux Purism Tails Ubuntu Distributions \u0026ldquo;Debian\u0026rdquo; spécifiques : OpenMediaVault : NAS - https://www.openmediavault.org/ J\u0026rsquo;écris historiquement depuis Septembre 2016 cette page sur le forum Debian-fr.org et la maintiens toujours…\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eCette page recense la documentation officielle, si possible, en langue française,\nsauf si spécifiée, ainsi que toute autre information pertinente relative au\nprojet Debian.\u003c/p\u003e\n\u003ch2 id=\"manuels-officiels\"\u003eManuels officiels\u003c/h2\u003e\n\u003cp\u003eLe \u003cstrong\u003emanuel d\u0026rsquo;installation pour la distribution Debian GNU/Linux\u003c/strong\u003e - officiel :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour PC 64 bits - \u003cstrong\u003eamd64\u003c/strong\u003e : version \u003ca href=\"https://www.debian.org/releases/stable/amd64/index.fr.html\" rel=\"external\"\u003eHTML\u003c/a\u003e, \u003ca href=\"https://www.debian.org/releases/stable/amd64/install.fr.pdf\" rel=\"external\"\u003ePDF\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003epour PC 32 bits - \u003cstrong\u003ei386\u003c/strong\u003e : version \u003ca href=\"https://www.debian.org/releases/stable/i386/index.fr.html\" rel=\"external\"\u003eHTML\u003c/a\u003e, \u003ca href=\"https://www.debian.org/releases/stable/i386/install.fr.pdf\" rel=\"external\"\u003ePDF\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cem\u003epour les autres architectures, lire la page \u003ca href=\"https://www.debian.org/releases/stable/installmanual\" rel=\"external\"\u003eDebian stable \u0026ndash; Installation Guide\u003c/a\u003e\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eUne page qui répertorie l\u003ca href=\"https://wiki.debian.org/fr/InstallingDebianOn\" rel=\"external\"\u003e\u0026lsquo;installation de Debian par type de matériel\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"manuels-pour-les-débutants\"\u003eManuels pour les débutants\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ele \u003ca href=\"https://debian-facile.org/projets/lescahiersdudebutant/\" rel=\"external\"\u003e\u003cstrong\u003eCahier du Débutant Debian\u003c/strong\u003e\u003c/a\u003e\u0026hellip; ou \u003cem\u003e\u003ca href=\"https://debian-beginners-handbook.arpinux.org/index-fr.html\" rel=\"external\"\u003ehttps://debian-beginners-handbook.arpinux.org/index-fr.html\u003c/a\u003e simplifié\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003ele \u003ca href=\"https://debian-facile.org/doc:systeme:commandes:le_debianiste_qui_papillonne\" rel=\"external\"\u003e\u003cstrong\u003enouveau debianiste qui papillonne\u003c/strong\u003e\u003c/a\u003e…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"manuels-pour-utilisateurs--ou---avancés-\"\u003eManuels pour \u003cstrong\u003eutilisateurs + ou - avancés\u003c/strong\u003e :\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ele \u003ca href=\"https://debian-handbook.info/browse/fr-FR/stable/\" rel=\"external\"\u003eCahier de l\u0026rsquo;Admin Debian\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://formation-debian.viarezo.fr\" rel=\"external\"\u003eFormation Debian GNU/Linux\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://manpages.debian.org/\" rel=\"external\"\u003eRépertoire des pages des Manuels Debian\u003c/a\u003e -\n\u003cem\u003ecertains man peuvent être traduits en Français, voir l\u0026rsquo;encadré\n\u0026ldquo;Others languages\u0026rdquo; dans la page\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"autres-informations-sur-debian\"\u003eAutres informations sur Debian\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ele \u003ca href=\"https://wiki.debian.org/fr/FrontPage\" rel=\"external\"\u003ewiki officiel de Debian\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003edont le fameux \u003cstrong\u003e\u003ca href=\"https://wiki.debian.org/fr/DontBreakDebian\" rel=\"external\"\u003eFrankenDebian\u003c/a\u003e :\nà lire impérativement\u003c/strong\u003e !\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://wiki.debian.org/fr/Backports\" rel=\"external\"\u003eInstaller les dépôts backports\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eLa \u003ca href=\"https://www.debian.org/doc/manuals/debian-faq/index.fr.html\" rel=\"external\"\u003eFAQ\u003c/a\u003e\nDebian GNU/Linux\u003c/li\u003e\n\u003cli\u003eLe manuel \u003ca href=\"https://www.debian.org/doc/manuals/debian-reference/index.fr.html\" rel=\"external\"\u003eRéférence Debian\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLes \u003ca href=\"https://www.debian.org/doc/user-manuals\" rel=\"external\"\u003emanuels de l\u0026rsquo;utilisateurs\u003c/a\u003e\nDebian - \u003cem\u003een anglais\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eLa \u003ca href=\"https://www.debian.org/doc/manuals/refcard/refcard.fr.pdf\" rel=\"external\"\u003eCarte de Référence\u003c/a\u003e\nDebian GNU/Linux\u003c/li\u003e\n\u003cli\u003eLe manuel \u003ca href=\"https://www.debian.org/doc/manuals/securing-debian-manual/index.fr.html\" rel=\"external\"\u003eSecuring Debian\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ele \u003ca href=\"https://debian-facile.org/wiki\" rel=\"external\"\u003ewiki\u003c/a\u003e de Debian-facile.org -\n\u003cem\u003eà destination des débutants\u003c/em\u003e…\u003c/li\u003e\n\u003cli\u003eles pages du \u003ca href=\"https://debian-facile.org/wiki#administrer\" rel=\"external\"\u003ewiki \u0026ldquo;Administrer\u0026rdquo;\u003c/a\u003e\nde DF…\u003c/li\u003e\n\u003cli\u003eles \u0026ldquo;captures d\u0026rsquo;écran logiciels\u0026rdquo; Debian : \u003ca href=\"https://screenshots.debian.net/\" rel=\"external\"\u003ehttps://screenshots.debian.net/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Manuels Debian des outils :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eapt : \u003ca href=\"https://www.debian.org/doc/manuals/apt-guide/index.fr.html\" rel=\"external\"\u003eguide d\u0026rsquo;utilisation\u003c/a\u003e,\net \u003ca href=\"https://www.debian.org/doc/manuals/apt-offline/index.fr.html\" rel=\"external\"\u003eguide d\u0026rsquo;utilisation hors-line\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.debian.org/doc/manuals/aptitude/index.fr.html\" rel=\"external\"\u003eaptitude\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Trucs \u0026amp; Astuces :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://doc.huc.fr.eu.org/fr/sys/debian/extrepo/\" rel=\"external\"\u003eExtrepo\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"debian-live-cdusb\"\u003eDebian Live CD/USB\u003c/h2\u003e\n\u003cp\u003e⇒ À-propos des \u003cstrong\u003eversions LiveCD\u003c/strong\u003e — version \u003cstrong\u003estable\u003c/strong\u003e — officielles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVersion PC (\u003cstrong\u003e64 bits\u003c/strong\u003e - \u003cem\u003earch amd64\u003c/em\u003e) : \u003ca href=\"http://cdimage.debian.org/cdimage/release/current-live/amd64/iso-hybrid/\" rel=\"external\"\u003ehttp://cdimage.debian.org/cdimage/release/current-live/amd64/iso-hybrid/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ ISO Debian Facile : \u003ca href=\"https://debian-facile.org/projets:iso-debian-facile\" rel=\"external\"\u003ehttps://debian-facile.org/projets:iso-debian-facile\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"debian-sid-unstable\"\u003eDebian Sid \u0026ldquo;Unstable\u0026rdquo;\u003c/h2\u003e\n\u003cp\u003eÀ-propos des \u003cstrong\u003eversions mini-isos\u003c/strong\u003e - version \u003cstrong\u003eSid\u003c/strong\u003e \u003cem\u003e(appelée aussi \u0026ldquo;Unstable\u0026rdquo;)\u003c/em\u003e :\n\u003cem\u003e\u003cstrong\u003e(ne convient pas aux débutants)\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVersion PC (\u003cstrong\u003e32 bits\u003c/strong\u003e - \u003cem\u003earch i386\u003c/em\u003e) : \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\u003cli\u003eVersion PC (\u003cstrong\u003e64 bits\u003c/strong\u003e - \u003cem\u003earch amd64\u003c/em\u003e) : \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\u003e\u003cem\u003eLes autres architectures : \u003ca href=\"http://ftp.debian.org/debian/dists/sid/main/\" rel=\"external\"\u003ehttp://ftp.debian.org/debian/dists/sid/main/\u003c/a\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eLire IMPÉRATIVEMENT  la page du Wiki Debian\u003c/strong\u003e : \u003ca href=\"https://wiki.debian.org/fr/DebianUnstable\" rel=\"external\"\u003eDebianUnstable\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Voici un guide pour savoir comment \u003ca href=\"https://doc.huc.fr.eu.org/fr/sys/debian/unstable-sid/\" rel=\"external\"\u003e\u003cstrong\u003egérer Sid\u003c/strong\u003e\u003c/a\u003e de manière efficace…\u003c/p\u003e\n\u003cp\u003e⇒ Il existe plusieurs projets \u0026ldquo;autour\u0026rdquo; de la Sid, plus ou moins actifs :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://antixlinux.com/updated-antix-sid-iso-files-available/\" rel=\"external\"\u003eAntiX-Sid\u003c/a\u003e\u003c/strong\u003e :\nune autre Sid, \u003cem\u003esans systemd\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/DebianDog/Sid\" rel=\"external\"\u003eDebianDog Sid\u003c/a\u003e\u003c/strong\u003e : autour des principes\nde Puppy Linux, sans l\u0026rsquo;être, est une Debian Sid \u003cem\u003esans systemd\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://forum.siduction.org/index.php?page=8\" rel=\"external\"\u003eSiduction\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://xebian.org/\" rel=\"external\"\u003eXebian\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003ePréférez le projet Xebian ; mais ceci n\u0026rsquo;est qu\u0026rsquo;un avis…\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"distributions-basées-sur-debian-\"\u003eDistributions basées sur Debian :\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eKnoppix\u003c/strong\u003e : un live CD/DVD, basée sur Stable\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://knoppix.net/\" rel=\"external\"\u003ehttp://knoppix.net/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLMDE\u003c/strong\u003e : la \u003cstrong\u003eLinux Mint Debian Edition\u003c/strong\u003e, basée sur Stable, afin de\ndélivrer la même expérience que sur Ubuntu\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.linuxmint.com/download_lmde.php\" rel=\"external\"\u003ehttps://www.linuxmint.com/download_lmde.php\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eQ4OS\u003c/strong\u003e : basée sur Stable, dédié à la \u0026ldquo;productivité\u0026rdquo;\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://q4os.org\" rel=\"external\"\u003ehttps://q4os.org\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eet, très certainement bien d\u0026rsquo;autres…\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"distributions-debian-dérivées-\"\u003eDistributions Debian dérivées :\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://doc.huc.fr.eu.org/fr/sys/debian/fast-track/\" rel=\"external\"\u003e\u003cstrong\u003eDebian Fast Track\u003c/strong\u003e\u003c/a\u003e\nest un dépôt alternatif officiel, depuis déc. 2018, pour porter les paquets\nTesting, qui ne sont plus maintenus officiellement, vers stable. \u003cbr\u003e\n(cf: \u003ca href=\"https://www.debian-fr.org/t/debian-fast-track/92237\" rel=\"external\"\u003e\u003cem\u003epost de présentation\u003c/em\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://doc.huc.fr.eu.org/fr/sys/debian/fast-forward/\" rel=\"external\"\u003e\u003cstrong\u003eDebian Fast Forward\u003c/strong\u003e\u003c/a\u003e\nest un dépôt alternatif officialisé depuis juillet 2025 pour porter les\npaquets testing ET unstable vers stable. \u003cbr\u003e\n(cf : \u003ca href=\"https://www.debian-fr.org/t/fast-forward-debian/92235\" rel=\"external\"\u003e\u003cem\u003epost de présentation\u003c/em\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://grml.org/\" rel=\"external\"\u003e\u003cstrong\u003egrml\u003c/strong\u003e\u003c/a\u003e : Live CD Debian spécifique pour les\nadministrateurs systèmes.\u003c/li\u003e\n\u003cli\u003eKali Linux\u003c/li\u003e\n\u003cli\u003ePurism\u003c/li\u003e\n\u003cli\u003eTails\u003c/li\u003e\n\u003cli\u003eUbuntu\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"distributions-debian-spécifiques-\"\u003eDistributions \u0026ldquo;Debian\u0026rdquo; spécifiques :\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOpenMediaVault\u003c/strong\u003e : NAS - \u003ca href=\"https://www.openmediavault.org/\" rel=\"external\"\u003ehttps://www.openmediavault.org/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;écris historiquement depuis Septembre 2016 cette page sur le forum\n\u003ca href=\"https://www.debian-fr.org/t/documentation-debian-pour-les-nouveaux-et-les-autres/71023\" rel=\"external\"\u003eDebian-fr.org\u003c/a\u003e et la maintiens toujours…\u003c/em\u003e\u003c/p\u003e\n","summary":"Documentation Debian, pour les utilisateurs récents et les avancés, et autres informations utiles autour du projet Debian.","tags":["Debian","documentation"],"date_published":"2016-09-22T00:00:00+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-09-03:/fr/sys/openbsd/spamd#2b9171eef2f5a244cdbdd5e05c65d7cb31074643392db7659447437403f026bb","url":"https://it-log.fr.eu.org/fr/sys/openbsd/spamd/","title":"Spamd","author":{"name":"Stéphane HUC"},"content_text":"Description spamd fait semblant d\u0026rsquo;être un serveur mail afin de rejeter les spams. Il a été écrit dans l\u0026rsquo;optique d\u0026rsquo;être très efficace et ne pas ralentir la machine.\nBien sûr, il transmet les mails légitimes au serveur smtp ensuite.\nCe qui est rigolo en plus, c\u0026rsquo;est qu\u0026rsquo;il va faire en sorte de ralentir les spammeurs en communiquant tout doucement avec eux et leur faire consommer inutilement leur ressources :) .\nEnfin, avantage non négligeable, il est présent par défaut dans OpenBSD.\nComment ça marche? Afin de reconnaître les spam, spamd va mettre en attente ceux qui contactent le serveur. Ils sont mis sur liste grise.\nNormalement, un expéditeur légitime réessaie automatiquement de délivrer le message.\nLors du 2e essai, ce serveur est mis sur liste blanche.\nLes spammeurs ne vont pas réessayer de délivrer le message. Dans ce cas, ils sont mis après un délai assez long sur liste noire. Par la suite, votre serveur n\u0026rsquo;écoutera même plus les requêtes provenant de ces spammeurs.\nAfin d\u0026rsquo;enregistrer les vilains expéditeurs, il faudra exécuter spamd\nrégulièrement.\nUtilisation On commence par activer spamd au démarrage, en indiquant les options dont il aura besoin, puis on le lance :\nrcctl enable spamd rcctl set spamd flags \u0026#34;-v -G 15:4:4242\u0026#34; rcctl start spamd Le premier chiffre correspond au nombre de minutes qu\u0026rsquo;un expéditeur doit attendre avant de réessayer de nous renvoyer son mail (puisque les spammeurs envoie des salves de mails très rapidement). Le second correspond au temps qu\u0026rsquo;une entrée reste dans la liste grise, et le dernier le temps pendant lequel une entrée restera sur la liste blanche (en heures). On va maintenant éditer la configuration du parefeu et filtre de paquets (packet filter). Il va envoyer à spamd tous le flux destiné au serveur smtp, qui relaiera normalement ensuite si le mail est légitime.\nVoici ce qu\u0026rsquo;il faut donc ajouter dans /etc/pf.conf :\ntable \u0026lt;nospamd\u0026gt; persist file \u0026#34;/etc/mail/nospamd\u0026#34; pass in on egress proto tcp from any to any port smtp \\ divert-to 127.0.0.1 port spamd pass in on egress proto tcp from \u0026lt;nospamd\u0026gt; to any port smtp pass in log on egress proto tcp from \u0026lt;spamd-white\u0026gt; to any port smtp Dans l\u0026rsquo;ordre des lignes :\nOn crée un fichier /etc/mail/nospamd qui contiendra les expéditeurs légitimes On dévie tout ce qui devait arriver sur le port smtp pour aller dans spamd On laisse passer toutes les IP qui étaient dans le premier fichier On laisse passer les IP enregistrée par spamd dans la liste blanche (en mémoire). spamd et pf partagent ici la même table. Voilà pour le parefeu. N\u0026rsquo;oubliez pas de le recharger :\n# pfctl -d \u0026amp;\u0026amp; pfctl -ef /etc/pf.conf Il est nécessaire de régulièrement charger la liste noire des spammeurs dans le parefeu afin que spamd fonctionne bien. Nous allons nous servir d\u0026rsquo;une tâche cron pour ça.\nÉditez votre crontab puis ajoutez la ligne suivante :\n*/10 * * * * /usr/libexec/spamd-setup Nous lançons ici spamd-setup toutes les 10 minutes. Ce temps doit être inférieur au temps que doit attendre un expéditeur pour tenter de renvoyer son message définit dans l\u0026rsquo;appel de spamd. Nous avions mis 15 minutes.\nPiéger les spammeurs Vous pouvez piéger les spammeurs en laissant traîner sur le web une fausse adresse mail. Si spamd voit un message arriver pour cette adresse, alors il sait déjà que c\u0026rsquo;est un spam : il peut donc le mettre sur liste noire.\nVous voilà protégés pour l\u0026rsquo;avenir.\nAfin de glisser cette \u0026ldquo;adresse-piège\u0026rdquo; sur le web sans que ça soit visible par les humain, vous pouvez l\u0026rsquo;insérer ainsi dans une page web de votre site :\n\u0026lt;a href=\u0026#34;mailto:blackhole@votre-nom-de-domaine.tld\u0026#34;\u0026gt;\u0026lt;/a\u0026gt; Pour indiquer à spamdb cette adresse piège, il faut ajouter les options suivantes à spamdb (attention au \u0026ldquo;b\u0026rdquo; final, ce n\u0026rsquo;est pas spamd). :\n# spamdb -T -a \u0026#39;blackhole@votre-nom-de-domaine.tld\u0026#39; Bien entendu, cette adresse piège ne doit pas être créée et ne risque pas de servir à quiconque.\nStatus Pour voir l\u0026rsquo;activité de spamd, lancez la commande spamdb pour voir apparaître des choses comme ça :\nWHITE|62.4.1.33|||1462699174|1462699174|1465809574|1|0 GREY|46.105.39.61|2.mo178.mail-out.ovh.net|\u0026lt;contact@arpinux.org\u0026gt;|\u0026lt;thuban@yeuxdelibad.net\u0026gt;|1462696130|1462710530|1462710530|1|0 On peut lire dans l\u0026rsquo;ordre :\nSi l\u0026rsquo;IP est sur liste blanche (WHITE) ou grise (GREY) L\u0026rsquo;IP concernée Temps où cette entrée a été vue la première fois Le moment où l\u0026rsquo;IP sera passée en liste blanche Le moment où l\u0026rsquo;IP sera retirée de la base de données Le nombre de fois où cette IP a été bloquée Le nombre de fois où ces IP a été autorisée. Il n\u0026rsquo;y a pas à dire, les \u0026ldquo;temps\u0026rdquo; sont illisibles pour les humains.\nUtiliser la commande date pour avoir un format lisible :\n$ date -r 1462699174 Sun May 8 11:19:34 CEST 2016 Accepter une IP manuellement Si vous constatez des erreurs en tapant spamdb, vous pouvez autoriser une IP ainsi :\n# spamdb -a 12.234.56.67 Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;, (conjointement avec Xavier Catron).\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003espamd\u003c/strong\u003e fait semblant d\u0026rsquo;être un serveur mail afin de rejeter les spams.\nIl a été écrit dans l\u0026rsquo;optique d\u0026rsquo;être très efficace et ne pas ralentir la\nmachine.\u003c/p\u003e\n\u003cp\u003eBien sûr, il transmet les mails légitimes au serveur smtp ensuite.\u003c/p\u003e\n\u003cp\u003eCe qui est rigolo en plus, c\u0026rsquo;est qu\u0026rsquo;il va faire en sorte de ralentir les\nspammeurs en communiquant tout doucement avec eux et leur faire consommer\ninutilement leur ressources :) .\u003c/p\u003e\n\u003cp\u003eEnfin, avantage non négligeable, il est présent par défaut dans OpenBSD.\u003c/p\u003e\n\u003ch3 id=\"comment-ça-marche\"\u003eComment ça marche?\u003c/h3\u003e\n\u003cp\u003eAfin de reconnaître les spam, spamd va mettre en attente ceux qui contactent\nle serveur. Ils sont mis sur \u003cstrong\u003eliste grise\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eNormalement, un expéditeur légitime réessaie automatiquement de délivrer\nle message.\u003c/p\u003e\n\u003cp\u003eLors du 2e essai, ce serveur est mis sur \u003cstrong\u003eliste blanche\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eLes spammeurs ne vont pas réessayer de délivrer le message. Dans ce cas,\nils sont mis après un délai assez long sur \u003cstrong\u003eliste noire\u003c/strong\u003e. \u003cbr\u003e\nPar la suite, votre serveur n\u0026rsquo;écoutera même plus les requêtes provenant\nde ces spammeurs.\u003c/p\u003e\n\u003cp\u003eAfin d\u0026rsquo;enregistrer les vilains expéditeurs, il faudra exécuter spamd\u003cbr\u003e\nrégulièrement.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eOn commence par activer spamd au démarrage, en indiquant les options dont\nil aura besoin, puis on le lance :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ercctl enable spamd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ercctl set spamd flags \u003cspan style=\"color:#48b685\"\u003e\u0026#34;-v -G 15:4:4242\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ercctl start spamd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eLe premier chiffre correspond au nombre de minutes qu\u0026rsquo;un expéditeur doit\nattendre avant de réessayer de nous renvoyer son mail (puisque les spammeurs\nenvoie des salves de mails très rapidement).\u003c/li\u003e\n\u003cli\u003eLe second correspond au temps qu\u0026rsquo;une entrée reste dans la liste grise,\u003c/li\u003e\n\u003cli\u003eet le dernier le temps pendant lequel une entrée restera sur la liste\nblanche (en heures).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOn va maintenant éditer la configuration du parefeu et filtre de paquets\n(packet filter). Il va envoyer à spamd tous le flux destiné au serveur\nsmtp, qui relaiera normalement ensuite si le mail est légitime.\u003c/p\u003e\n\u003cp\u003eVoici ce qu\u0026rsquo;il faut donc ajouter dans \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;nospamd\u0026gt; persist file \u0026#34;/etc/mail/nospamd\u0026#34;\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 from any to any port smtp \\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003edivert-to 127.0.0.1 port spamd\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 from \u0026lt;nospamd\u0026gt; to any port smtp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in log on egress proto tcp from \u0026lt;spamd-white\u0026gt; to any port smtp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans l\u0026rsquo;ordre des lignes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOn crée un fichier \u003ccode\u003e/etc/mail/nospamd\u003c/code\u003e qui contiendra les expéditeurs légitimes\u003c/li\u003e\n\u003cli\u003eOn dévie tout ce qui devait arriver sur le port smtp pour aller dans spamd\u003c/li\u003e\n\u003cli\u003eOn laisse passer toutes les IP qui étaient dans le premier fichier\u003c/li\u003e\n\u003cli\u003eOn laisse passer les IP enregistrée par spamd dans la liste blanche\n(en mémoire). spamd et pf partagent ici la même table.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVoilà pour le parefeu. N\u0026rsquo;oubliez pas de le recharger :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size: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# pfctl -d \u0026amp;\u0026amp; pfctl -ef /etc/pf.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl est nécessaire de régulièrement charger la liste noire des spammeurs\ndans le parefeu afin que spamd fonctionne bien. Nous allons nous servir\nd\u0026rsquo;une tâche cron pour ça.\u003c/p\u003e\n\u003cp\u003eÉditez votre crontab puis ajoutez 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*/10      *       *       *       *       /usr/libexec/spamd-setup\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNous lançons ici \u003ccode\u003espamd-setup\u003c/code\u003e toutes les 10 minutes. Ce temps doit être\ninférieur au temps que doit attendre un expéditeur pour tenter de renvoyer\nson message définit dans l\u0026rsquo;appel de spamd. Nous avions mis 15 minutes.\u003c/p\u003e\n\u003ch3 id=\"piéger-les-spammeurs\"\u003ePiéger les spammeurs\u003c/h3\u003e\n\u003cp\u003eVous pouvez piéger les spammeurs en laissant traîner sur le web une fausse\nadresse mail. Si spamd voit un message arriver pour cette adresse, alors\nil sait déjà que c\u0026rsquo;est un spam : il peut donc le mettre sur \u003cstrong\u003eliste noire\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eVous voilà protégés pour l\u0026rsquo;avenir.\u003c/p\u003e\n\u003cp\u003eAfin de glisser cette \u0026ldquo;adresse-piège\u0026rdquo; sur le web sans que ça soit visible\npar les humain, vous pouvez l\u0026rsquo;insérer ainsi dans une page web de votre site :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;a href=\u0026#34;mailto:blackhole@votre-nom-de-domaine.tld\u0026#34;\u0026gt;\u0026lt;/a\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePour indiquer à spamdb cette adresse piège, il faut ajouter les options\nsuivantes à spamdb (attention au \u0026ldquo;b\u0026rdquo; final, ce n\u0026rsquo;est pas spamd). :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# spamdb -T -a \u0026#39;blackhole@votre-nom-de-domaine.tld\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBien entendu, cette adresse piège ne doit pas être créée et ne risque pas\nde servir à quiconque.\u003c/p\u003e\n\u003ch3 id=\"status\"\u003eStatus\u003c/h3\u003e\n\u003cp\u003ePour voir l\u0026rsquo;activité de spamd, lancez la commande \u003ccode\u003espamdb\u003c/code\u003e pour voir\napparaître des choses comme ça :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-log\" data-lang=\"log\"\u003eWHITE|62.4.1.33|||1462699174|1462699174|1465809574|1|0\nGREY|46.105.39.61|2.mo178.mail-out.ovh.net|\u0026lt;contact@arpinux.org\u0026gt;|\u0026lt;thuban@yeuxdelibad.net\u0026gt;|1462696130|1462710530|1462710530|1|0\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOn peut lire dans l\u0026rsquo;ordre :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi l\u0026rsquo;IP est sur liste blanche (WHITE) ou grise (GREY)\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;IP concernée\u003c/li\u003e\n\u003cli\u003eTemps où cette entrée a été vue la première fois\u003c/li\u003e\n\u003cli\u003eLe moment où l\u0026rsquo;IP sera passée en liste blanche\u003c/li\u003e\n\u003cli\u003eLe moment où l\u0026rsquo;IP sera retirée de la base de données\u003c/li\u003e\n\u003cli\u003eLe nombre de fois où cette IP a été bloquée\u003c/li\u003e\n\u003cli\u003eLe nombre de fois où ces IP a été autorisée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl n\u0026rsquo;y a pas à dire, les \u0026ldquo;temps\u0026rdquo; sont illisibles pour les humains.\u003c/p\u003e\n\u003cp\u003eUtiliser la commande \u003ccode\u003edate\u003c/code\u003e pour avoir un format lisible :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ date -r 1462699174\n    Sun May  8 11:19:34 CEST 2016\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"accepter-une-ip-manuellement\"\u003eAccepter une IP manuellement\u003c/h3\u003e\n\u003cp\u003eSi vous constatez des erreurs en tapant \u003ccode\u003espamdb\u003c/code\u003e, vous pouvez autoriser\nune IP 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\u003cspan style=\"color:#776e71\"\u003e# spamdb -a 12.234.56.67\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;, (conjointement avec Xavier Catron).\u003c/p\u003e\n\u003chr\u003e\n","summary":"Utiliser le serveur d'antispam, Spamd, sous OpenBSD","tags":["OpenBSD","spamd"],"date_published":"2016-09-03T12:40:46+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-09-01:/fr/sys/debian/unbound-dnssec-trigger#c6fc99433f4fdc7fd233d70b84f9961f17fcef060e0d05693200125eebfae145","url":"https://it-log.fr.eu.org/fr/sys/debian/unbound-dnssec-trigger/","title":"Debian : Utiliser Unbound avec DNSSEC + dnssec-trigger","author":{"name":"Stéphane HUC"},"content_text":"Description Le but d\u0026rsquo;utiliser Unbound est d\u0026rsquo;avoir localement sur sa station son propre serveur DNS Cache (enregistrant la relation noms de domaine et adresses IP déjà visités, afin de ne pas aller interroger les serveurs DNS Root, sauf à changement de ladite information). Et, utiliser Unbound avec la gestion sécurisée des informations DNS, par le biais de la technologie DNSSEC, est un plus indéniable (cela évite d\u0026rsquo;avoir à obtenir des informations DNS faussées, par une action pirate).\nCette dernière est assumée, en partie, par l\u0026rsquo;outil dnssec-trigger !\nVersions utilisées OS : Debian Stable / Sid unbound : selon la version de Debian utilisée dnssec-trigger : selon la version de Debian utilisée Installation Avec Debian, comme d\u0026rsquo;habitude, rien de bien compliqué !\n# apt install unbound unbound-host dnssec-trigger\nLes fichiers de configuration principaux :\nd\u0026rsquo;unbound sont dans /etc/unbound/ ; ceux de dnssec-trigger dans /etc/dnssec-trigger/ InfoPréférez utiliser la version des backports ! dnssec-trigger Testez que l\u0026rsquo;installation de dnssec-trigger est correcte à l\u0026rsquo;aide de la commande de contrôle dnssec-trigger-control-setup :\n:# dnssec-trigger-control-setup setup in directory /etc/dnssec-trigger dnssec_trigger_server.key exists dnssec_trigger_control.key exists create dnssec_trigger_server.pem (self signed certificate) create dnssec_trigger_control.pem (signed client certificate) Signature ok subject=/CN=dnssec-trigger-control Getting CA Private Key Setup success. Certificates created. run this script again with -i to: - enable remote-control in unbound.conf - start unbound-control-setup - add root trust anchor to unbound.conf if you have not done this already Si c\u0026rsquo;est votre cas, c\u0026rsquo;est une bonne chose ! :p\nPensez à redémarrer le service lié à unbound !\nConfiguration Unbound La configuration d\u0026rsquo;unbound ne pose pas de gros problème, en soit, il faut veiller à l\u0026rsquo;écriture correcte des informations !\nToutes les variables et leur impact sont expliquées dans la documentation officielle anglaise : https://unbound.net/documentation/unbound.conf.html\nVoyons quelques détails dits de sécurité à paramétrer absolument dans votre propre fichier de configuration, que l\u0026rsquo;on nommera ainsi, pour l\u0026rsquo;exemple : /etc/unbound/unbound.conf.d/perso.conf\nPour tester la configuration de vos fichiers, utilisez la commande unbound-checkconf !\nGestion des réseaux autorisés access-control: 127.0.0.0/8 allow ## j\u0026rsquo;autorise l\u0026rsquo;interface de bouclage local sur la couche IPv4 access-control: 192.168.1.0/24 allow ## j\u0026rsquo;autorise le réseau local access-control: 0.0.0.0/0 refuse ## j\u0026rsquo;interdis tout le reste de l\u0026rsquo;Internet !\nLe segment réseau peut-être de type IPv4 ou IPv6. L\u0026rsquo;action à allouer peut-être :\nallow permet l\u0026rsquo;accès allow_snoop permet l\u0026rsquo;accès, en utilisant une technique de \u0026ldquo;cache snopping\u0026rdquo;, qui donne le droit d\u0026rsquo;examiner le contenu en cache. deny refuse l\u0026rsquo;accès - option par défaut, si non spécifiée deny_non_local, refuse refuse l\u0026rsquo;accès, tout en envoyant un message d\u0026rsquo;erreur adéquat. ou refuse_non_local Pour les autres options, ou afin de mieux saisir les subtilités, merci de lire la page officielle anglaise !\nDurcir et cacher certaines informations harden-algo-downgrade: no harden-glue: yes hide-identity: yes hide-version: yes private-address: 192.168.0.0/16 private-address: 172.16.0.0/12 private-address: 10.0.0.0/8 use-caps-for-id: no val-clean-additional: yes Explications\nharden-algo-downgrade empêche ou non de choisir l’algorithme le plus faible . Si no est choisi, ce sera l\u0026rsquo;algorithme le plus faible qui sera élu… Si les zones DNS ne sont pas configurées pour fonctionner correctement avec cette option, cela peut entraîner des échecs de validation ; dans ce cas, il faut la mettre sur no. Cette option n\u0026rsquo;est pas reconnue avec la version Jessie, utilisez la version backports ! Les variables private-address renforcent l\u0026rsquo;aspect privé de ces réseaux. Cela empêche l\u0026rsquo;inclusion de ces segments réseaux dans les réponses DNS, et protège de la technique des \u0026ldquo;Relais DNS\u0026rdquo; (qui utilise, par exemple, un navigateur internet comme relais ou proxy réseau). La variable use-caps-for-id est expérimentale et peut créer des bogues, ou résultats incorrects - ne pas l\u0026rsquo;utiliser à moins d\u0026rsquo;être sûr de ce que vous faites… La variable val-clean-additional assure de nettoyer toutes les données DNS non sécurisées Optimisation num-threads: 4 key-cache-slabs: 8 infra-cache-slabs: 8 msg-cache-slabs: 8 rrset-cache-slabs: 8 key-cache-size: 16m msg-cache-size: 4m rrset-cache-size: 8m outgoing-range: 206 qname-minimisation: yes so-rcvbuf: 1m so-sndbuf: 1m so-reuseport: yes Explications\nLa variable num-thread correspond au nombre de cœurs CPU dont dispose votre station, soit pour 4 CPU ayant chacun deux cœurs, on lui attribuera le chiffre 8. Une manière d\u0026rsquo;être sûr du nombre de cœurs utilisés dans votre machine est d\u0026rsquo;utiliser la commande suivante : $ cat /proc/cpuinfo | grep processor | wc -l Les variables terminant par le mot *-cache-slabs doivent être paramétrées au double de la variable num-thread. Ces variables gèrent les conflits de verrouillage en les diminuant. La gestion des variables *-cache-size est sensible et doit être ainsi paramétrée : la variable rrset-cache-size doit être le double de la variable msg-cache-size ; quant à la variable key-cache-size, elle doit être elle-même le double de la variable rrset. La variable outgoing-range qui gère le nombre de connexions par cœurs CPU doit être ainsi calculée : 1024 / nb_coeurs_CPU - 50 La variable so-reuseport permet d\u0026rsquo;améliorer significativement les performances de l\u0026rsquo;usage du protocole UDP ! La variable qname-minimisation envoie un minimum d\u0026rsquo;information DNS pour améliorer l\u0026rsquo;aspect privé de celles-ci : Cette option n\u0026rsquo;est pas reconnue avec la version Jessie, utilisez la version backports ! Lisez la documentation officielle anglaise pour les options so-rcvbuf, et so-sndbuf qui doivent être augmentées dans le cas de serveur surchargé. Autrement, laissez la valeur 0 par défaut - cela utilise les valeurs systèmes ! Gestion des caches # garde en cache les bons résultats prefetch: yes cache-min-ttl: 3600 cache-max-ttl: 86400 Gestion des journaux # gestion logs logfile: /var/log/unbound/unbound.log use-syslog: yes unwanted-reply-threshold: 10000000 val-log-level: 2 verbosity: 1 Explications\nSi l\u0026rsquo;option unwanted-reply-threshold est définie, le nombre paramétré total de réponses indésirables est gardé dans chacun des processus. Ce nombre paramétré atteint déclenche une action défensive de nettoyage des caches rrset et autres messages, un avertissement est affiché dans les journaux. Il est recommandé de positionner ce nombre à une valeur de 10 Millions ! L\u0026rsquo;option verbosity est le degré de verbosité des journaux : 0 signifie que seules les erreurs seront affichées ; 1 que ce sont des informations opérationnelles - valeur par défaut - ; 2 que celles-ci seront plus détaillées ; 3 définit les informations par niveau de requêtes et leurs sorties ; 4 restitue l\u0026rsquo;information du niveau d\u0026rsquo;algorithme utilisé ; 5, quant à lui, enregistre l\u0026rsquo;identification des clients en cas d\u0026rsquo;erreurs de cache. Bloquer certains sites # bloque certaines pubs local-zone: \u0026#34;doubleclick.net\u0026#34; redirect local-data: \u0026#34;doubleclick.net A 127.0.0.1\u0026#34; local-zone: \u0026#34;googlesyndication.com\u0026#34; redirect local-data: \u0026#34;googlesyndication.com A 127.0.0.1\u0026#34; local-zone: \u0026#34;googleadservices.com\u0026#34; redirect local-data: \u0026#34;googleadservices.com A 127.0.0.1\u0026#34; local-zone: \u0026#34;google-analytics.com\u0026#34; redirect local-data: \u0026#34;google-analytics.com A 127.0.0.1\u0026#34; local-zone: \u0026#34;ads.youtube.com\u0026#34; redirect local-data: \u0026#34;ads.youtube.com A 127.0.0.1\u0026#34; local-zone: \u0026#34;adserver.yahoo.com\u0026#34; redirect local-data: \u0026#34;adserver.yahoo.com A 127.0.0.1\u0026#34; local-zone: \u0026#34;ask.com\u0026#34; redirect local-data: \u0026#34;ask.com A 127.0.0.1\u0026#34; InfoPour info, il existe des projets de listes, tels que :\nPGL-Yoyo l\u0026rsquo;excellent unbound-badhosts Dans le cas d\u0026rsquo;usage de listes, il faut les inclure en utilisant la déclaration : include: /var/lib/unbound/nom-fichier-liste\nGérer des statistiques statistics-interval: 0 extended-statistics: yes statistics-cumulative: no Explications\nL\u0026rsquo;option statistics-cumulative est à paramétrer sur yes - si vous utilisez un outil d\u0026rsquo;affichage graphique des rapports, tel que Munin… Fichier root.hints Le fichier root.hints est une liste des serveurs de noms faisant autorité, les premiers serveurs DNS, dits roots.\nPour le récupèrer : # curl ftp://FTP.INTERNIC.NET/domain/named.cache -o /var/lib/unbound/root.hints\nPuis, modifiez le fichier de configuration, pour ajouter : root-hints: \u0026quot;var/lib/unbound/root.hints\nAstucePensez à créer un fichier cron pour mettre-à-jour régulièrement ce fichier… normalement, une période de 6 mois suffit. Gestion DNSSEC La gestion DNSSEC se fait par l\u0026rsquo;usage de l\u0026rsquo;outil unbound-anchor qui crée un fichier de clé nécessaire et l\u0026rsquo;ajout de la variable auto-trust-anchor-file qui pointe vers ledit fichier de clés.\nExécutez : # unbound-anchor -a \u0026quot;/var/lib/unbound/root.key\u0026quot;\nLa variable auto-trust-anchor-file est normalement déclarée dans le fichier /etc/unbound/unbound.conf.d/root-auto-trust-anchor-file.conf. Si ce fichier n\u0026rsquo;existe pas, vous pouvez l\u0026rsquo;ajouter à votre fichier de configuration personnel, ou créer ledit fichier qui sera pris en charge lors du (re)démarrage lié au service unbound.\nElle a cette teneur : auto-trust-anchor-file: \u0026quot;/var/lib/unbound/root.key\u0026quot;\nDe même, il faut ajouter les variables suivantes à votre propre fichier de configuration :\nharden-below-nxdomain: yes harden-dnssec-stripped: yes harden-referral-path: yes Explications\nL\u0026rsquo;option harden-referral-path renforce la validation DNSSEC - c\u0026rsquo;est une option expérimentale, sans norme RFC, et peut poser des problèmes de performances ! AttentionVeillez à redémarrer le service unbound si vous l\u0026rsquo;avez configuré après l\u0026rsquo;installation et le démarrage post-install ! Tests DNSSEC Dig Un premier test à faire est l\u0026rsquo;usage de la commande dig, telle que :\n:$ dig com. SOA +dnssec ; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.10.3-P4-Debian \u0026lt;\u0026lt;\u0026gt;\u0026gt; com. SOA +dnssec ;; global options: +cmd ;; Got answer: ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NOERROR, id: 60764 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 14, ADDITIONAL: 1 (…) Ce qu\u0026rsquo;il faut repérer dans la sortie complète de la commande dig est sur la ligne flags: : il faut la présence du drapeau ad - si celui-ci figure bien, c\u0026rsquo;est bon signe ! :D\n:$ dig com. SOA +dnssec | grep \u0026#34;;; flags\u0026#34; ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 Unbound-host L\u0026rsquo;autre commande à utiliser est la commande unbound-host qui permet de s\u0026rsquo;assurer du même résultat, telle que :\n:$ unbound-host com. -f /var/lib/unbound/root.key -v com. has no address (secure) com. has no IPv6 address (secure) com. has no mail handler record (secure) $ unbound-host dnssec.cz -f /var/lib/unbound/root.key -v dnssec.cz has address 217.31.205.51 (secure) dnssec.cz has IPv6 address 2001:1488:0:3::5 (secure) dnssec.cz mail is handled by 10 mail.nic.cz. (secure) dnssec.cz mail is handled by 15 mx.nic.cz. (secure) dnssec.cz mail is handled by 20 bh.nic.cz. (secure) # unbound-host dnssec.cz -C /etc/unbound/unbound.conf -v [1472755792] libunbound[44222:0] debug: switching log to /var/log/unbound/unbound.log dnssec.cz has address 217.31.205.51 (secure) dnssec.cz has IPv6 address 2001:1488:0:3::5 (secure) dnssec.cz mail is handled by 10 mail.nic.cz. (secure) dnssec.cz mail is handled by 15 mx.nic.cz. (secure) dnssec.cz mail is handled by 20 bh.nic.cz. (secure) dnssec-trigger Utilisez l\u0026rsquo;outil dnssec-trigger est trivial :\n:# dnssec-trigger-control status at 2016-09-01 08:41:22 authority 192.33.4.12: OK http ster.nlnetlabs.nl (185.49.140.10): OK state: auth secure Navigateur internet Un moyen visuel est d\u0026rsquo;ouvrir votre navigateur internet favori, puis d\u0026rsquo;aller sur les sites suivants :\nhttp://www.dnssec.cz : si, sur la partie droite, vous voyez une clé verte, c\u0026rsquo;est tout autant bon signe ! https://en.internet.nl : cliquez sur le lien titré \u0026ldquo;Test my internet connection\u0026rdquo; Cron Pensez à créer un fichier cron mensuel /etc/crond.monthly/unbound, pour mettre-à-jour les fichiers root.hints, et ads server :\n#!/bin/sh # update file named.cache curl ftp://FTP.INTERNIC.NET/domain/named.cache -o /var/lib/unbound/root.hints # update file ads servers curl -sS -L --compressed \u0026#34;http://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound\u0026amp;showintro=0\u0026amp;mimetype=plaintext\u0026#34; \u0026gt; /var/lib/unbound/unbound_ad_servers chown unbound:unbound /var/lib/unbound/unbound_ad_servers Dépannage fatal error: SSL handshake Si vous avez l\u0026rsquo;erreur ci-dessous :\n:# dnssec-trigger-control status Mar 20 15:08:13 dnssec-trigger-control[2016] fatal error: SSL handshake failed error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed` \u0026lt;/code\u0026gt; redémarrez d\u0026rsquo;abord le service unbound !\nDocumentations Pour en savoir un peu plus sur l\u0026rsquo;outil, les raisons de son existence et de son usage, lisez l\u0026rsquo;article de Stéphane Bortzmeyer : dnssec-trigger, un outil pour mettre DNSSEC à la disposition de M. Toutlemonde… J\u0026rsquo;ai écrit pour la première fois cet article pour le wiki de la communauté de Debian-fr.xyz !\n","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe but d\u0026rsquo;utiliser Unbound est d\u0026rsquo;avoir localement sur sa station son propre\nserveur DNS Cache (enregistrant la relation noms de domaine et adresses IP\ndéjà visités, afin de ne pas aller interroger les serveurs DNS Root, sauf\nà changement de ladite information). Et, utiliser Unbound avec la gestion\nsécurisée des informations DNS, par le biais de la technologie DNSSEC, est\nun plus indéniable \u003cem\u003e(cela évite d\u0026rsquo;avoir à obtenir des informations DNS faussées,\npar une action pirate)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eCette dernière est assumée, en partie, par l\u0026rsquo;outil \u003cstrong\u003ednssec-trigger\u003c/strong\u003e !\u003c/p\u003e\n\u003ch3 id=\"versions-utilisées\"\u003eVersions utilisées\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eOS : Debian Stable / Sid\u003c/li\u003e\n\u003cli\u003eunbound : selon la version de Debian utilisée\u003c/li\u003e\n\u003cli\u003ednssec-trigger : selon la version de Debian utilisée\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eAvec Debian, comme d\u0026rsquo;habitude, rien de bien compliqué !\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# apt install unbound unbound-host dnssec-trigger\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLes fichiers de configuration principaux :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ed\u0026rsquo;unbound sont dans \u003ccode\u003e/etc/unbound/\u003c/code\u003e ;\u003c/li\u003e\n\u003cli\u003eceux de dnssec-trigger dans \u003ccode\u003e/etc/dnssec-trigger/\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\"\u003ePréférez utiliser la version des backports !\u003c/div\u003e\n\n\u003ch3 id=\"dnssec-trigger\"\u003ednssec-trigger\u003c/h3\u003e\n\u003cp\u003eTestez que l\u0026rsquo;installation de dnssec-trigger est correcte à l\u0026rsquo;aide de la\ncommande de contrôle \u003ccode\u003ednssec-trigger-control-setup\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:# dnssec-trigger-control-setup\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esetup in directory /etc/dnssec-trigger\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec_trigger_server.key exists\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec_trigger_control.key exists\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecreate dnssec_trigger_server.pem \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eself signed certificate\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecreate dnssec_trigger_control.pem \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esigned client certificate\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSignature ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003esubject\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/CN\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ednssec-trigger-control\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eGetting CA Private Key\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSetup success. Certificates created.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erun this script again with -i to:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    - enable remote-control in unbound.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    - start unbound-control-setup\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    - add root trust anchor to unbound.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e you have not \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e this already\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi c\u0026rsquo;est votre cas, c\u0026rsquo;est une bonne chose ! :p\u003c/p\u003e\n\u003cp\u003ePensez à redémarrer le service lié à unbound !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"unbound\"\u003eUnbound\u003c/h3\u003e\n\u003cp\u003eLa configuration d\u0026rsquo;unbound ne pose pas de gros problème, en soit, il faut\nveiller à l\u0026rsquo;écriture correcte des informations !\u003c/p\u003e\n\u003cp\u003eToutes les variables et leur impact sont expliquées dans la documentation\nofficielle anglaise : \u003ca href=\"https://unbound.net/documentation/unbound.conf.html\" rel=\"external\"\u003ehttps://unbound.net/documentation/unbound.conf.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eVoyons quelques détails dits de sécurité à paramétrer absolument dans votre\npropre fichier de configuration, que l\u0026rsquo;on nommera ainsi, pour l\u0026rsquo;exemple : \u003cbr\u003e\n\u003ccode\u003e/etc/unbound/unbound.conf.d/perso.conf\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour tester la configuration de vos fichiers, utilisez la commande \u003ccode\u003eunbound-checkconf\u003c/code\u003e !\u003c/p\u003e\n\u003ch4 id=\"gestion-des-réseaux-autorisés\"\u003eGestion des réseaux autorisés\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003eaccess-control: 127.0.0.0/8 allow\u003c/code\u003e ## j\u0026rsquo;autorise l\u0026rsquo;interface de bouclage local\nsur la couche IPv4 \u003cbr\u003e\n\u003ccode\u003eaccess-control: 192.168.1.0/24 allow\u003c/code\u003e ## j\u0026rsquo;autorise le réseau local \u003cbr\u003e\n\u003ccode\u003eaccess-control: 0.0.0.0/0 refuse\u003c/code\u003e ## j\u0026rsquo;interdis tout le reste de l\u0026rsquo;Internet !\u003c/p\u003e\n\u003cp\u003eLe segment réseau peut-être de type IPv4 ou IPv6. L\u0026rsquo;action à allouer peut-être :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eallow\u003c/code\u003e permet l\u0026rsquo;accès\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eallow_snoop\u003c/code\u003e permet l\u0026rsquo;accès, en utilisant une technique de \u0026ldquo;cache snopping\u0026rdquo;,\nqui donne le droit d\u0026rsquo;examiner le contenu en cache.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edeny\u003c/code\u003e refuse l\u0026rsquo;accès - \u003ccode\u003eoption par défaut, si non spécifiée\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edeny_non_local\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erefuse\u003c/code\u003e refuse l\u0026rsquo;accès, tout en envoyant un message d\u0026rsquo;erreur adéquat.\u003c/li\u003e\n\u003cli\u003eou \u003ccode\u003erefuse_non_local\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003ePour les autres options, ou afin de mieux saisir les subtilités, merci de lire\nla \u003ca href=\"https://unbound.net/documentation/unbound.conf.html\" rel=\"external\"\u003epage officielle anglaise\u003c/a\u003e !\u003c/em\u003e\u003c/p\u003e\n\u003ch4 id=\"durcir-et-cacher-certaines-informations\"\u003eDurcir et cacher certaines informations\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\"\u003eharden-algo-downgrade: no\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eharden-glue: 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\"\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eprivate-address: 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\"\u003eprivate-address: 172.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\"\u003eprivate-address: 10.0.0.0/8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003euse-caps-for-id: 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\"\u003eval-clean-additional: yes\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\u003ccode\u003eharden-algo-downgrade\u003c/code\u003e empêche ou non de choisir l’algorithme le plus faible .\n\u003cul\u003e\n\u003cli\u003eSi \u003ccode\u003eno\u003c/code\u003e est choisi, ce sera l\u0026rsquo;algorithme le plus faible qui sera élu…\u003c/li\u003e\n\u003cli\u003eSi les zones DNS ne sont pas configurées pour fonctionner correctement\navec cette option, cela peut entraîner des échecs de validation ;\ndans ce cas, il faut la mettre sur \u003ccode\u003eno\u003c/code\u003e. \u003cbr\u003e\n\u003cem\u003eCette option n\u0026rsquo;est pas reconnue avec la version Jessie, utilisez la version backports !\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eLes variables \u003ccode\u003eprivate-address\u003c/code\u003e renforcent l\u0026rsquo;aspect privé de ces réseaux.\nCela empêche l\u0026rsquo;inclusion de ces segments réseaux dans les réponses DNS,\net protège de la technique des \u0026ldquo;Relais DNS\u0026rdquo;\n\u003cem\u003e(qui utilise, par exemple, un navigateur internet comme relais ou proxy réseau)\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eLa variable \u003ccode\u003euse-caps-for-id\u003c/code\u003e est expérimentale et peut créer des bogues,\nou résultats incorrects - \u003cem\u003ene pas l\u0026rsquo;utiliser à moins d\u0026rsquo;être sûr de ce que vous faites…\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eLa variable \u003ccode\u003eval-clean-additional\u003c/code\u003e assure de nettoyer toutes les données DNS non sécurisées\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"optimisation\"\u003eOptimisation\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\"\u003enum-threads: 4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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-cache-slabs: 8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einfra-cache-slabs: 8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003emsg-cache-slabs: 8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003errset-cache-slabs: 8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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-cache-size: 16m\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003emsg-cache-size: 4m\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003errset-cache-size: 8m\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eoutgoing-range: 206\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eqname-minimisation: 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\"\u003eso-rcvbuf: 1m\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eso-sndbuf: 1m\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\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\"\u003eso-reuseport: yes\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\u003eLa variable \u003ccode\u003enum-thread\u003c/code\u003e correspond au nombre de cœurs CPU dont dispose\nvotre station, soit pour 4 CPU ayant chacun deux cœurs, on lui attribuera\nle chiffre \u003ccode\u003e8\u003c/code\u003e. \u003cbr\u003e\nUne manière d\u0026rsquo;être sûr du nombre de cœurs utilisés dans votre machine\nest d\u0026rsquo;utiliser la commande suivante : \u003cbr\u003e\n\u003ccode\u003e$ cat /proc/cpuinfo | grep processor | wc -l\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLes variables terminant par le mot \u003ccode\u003e*-cache-slabs\u003c/code\u003e doivent être paramétrées\nau double de la variable \u003ccode\u003enum-thread\u003c/code\u003e. Ces variables gèrent les conflits\nde verrouillage en les diminuant.\u003c/li\u003e\n\u003cli\u003eLa gestion des variables \u003ccode\u003e*-cache-size\u003c/code\u003e est sensible et doit être ainsi\nparamétrée : la variable \u003ccode\u003errset-cache-size\u003c/code\u003e doit être le double de la\nvariable \u003ccode\u003emsg-cache-size\u003c/code\u003e ; quant à la variable \u003ccode\u003ekey-cache-size\u003c/code\u003e, elle\ndoit être elle-même le double de la variable \u003ccode\u003errset\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eLa variable \u003ccode\u003eoutgoing-range\u003c/code\u003e qui gère le nombre de connexions par cœurs\nCPU doit être ainsi calculée : \u003cbr\u003e\n\u003cstrong\u003e1024 / nb_coeurs_CPU - 50\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eLa variable \u003ccode\u003eso-reuseport\u003c/code\u003e permet d\u0026rsquo;améliorer significativement les performances\nde l\u0026rsquo;usage du protocole UDP !\u003c/li\u003e\n\u003cli\u003eLa variable \u003ccode\u003eqname-minimisation\u003c/code\u003e envoie un minimum d\u0026rsquo;information DNS pour\naméliorer l\u0026rsquo;aspect privé de celles-ci : \u003cbr\u003e\n\u003cem\u003eCette option n\u0026rsquo;est pas reconnue avec la version Jessie, utilisez la version backports !\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eLisez la documentation officielle anglaise pour les options \u003ccode\u003eso-rcvbuf\u003c/code\u003e,\net \u003ccode\u003eso-sndbuf\u003c/code\u003e qui doivent être augmentées dans le cas de serveur surchargé.\nAutrement, laissez la valeur \u003ccode\u003e0\u003c/code\u003e par défaut - cela utilise les valeurs systèmes !\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"gestion-des-caches\"\u003eGestion des caches\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# garde en cache les bons résultats\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecache-min-ttl: 3600\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecache-max-ttl: 86400\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"gestion-des-journaux\"\u003eGestion des journaux\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# gestion logs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elogfile: /var/log/unbound/unbound.log\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003euse-syslog: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eunwanted-reply-threshold: 10000000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eval-log-level: 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003everbosity: 1\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\u003eSi l\u0026rsquo;option \u003ccode\u003eunwanted-reply-threshold\u003c/code\u003e est définie, le nombre paramétré\ntotal de réponses indésirables est gardé dans chacun des processus.\nCe nombre paramétré atteint déclenche une action défensive de nettoyage\ndes caches \u003ccode\u003errset\u003c/code\u003e et autres messages, un avertissement est affiché\ndans les journaux.\n\u003cstrong\u003eIl est recommandé de positionner ce nombre à une valeur de 10 Millions\u003c/strong\u003e !\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;option \u003ccode\u003everbosity\u003c/code\u003e est le degré de verbosité des journaux :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e0\u003c/code\u003e signifie que seules les erreurs seront affichées ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e1\u003c/code\u003e que ce sont des informations opérationnelles - \u003cem\u003evaleur par défaut\u003c/em\u003e - ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e2\u003c/code\u003e que celles-ci seront plus détaillées ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e3\u003c/code\u003e définit les informations par niveau de requêtes et leurs sorties ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e4\u003c/code\u003e restitue l\u0026rsquo;information du niveau d\u0026rsquo;algorithme utilisé ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e5\u003c/code\u003e, quant à lui, enregistre l\u0026rsquo;identification des clients en cas d\u0026rsquo;erreurs de cache.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"bloquer-certains-sites\"\u003eBloquer certains sites\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# bloque certaines pubs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-zone: \u0026#34;doubleclick.net\u0026#34; redirect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-data: \u0026#34;doubleclick.net A 127.0.0.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-zone: \u0026#34;googlesyndication.com\u0026#34; redirect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-data: \u0026#34;googlesyndication.com A 127.0.0.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-zone: \u0026#34;googleadservices.com\u0026#34; redirect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-data: \u0026#34;googleadservices.com A 127.0.0.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-zone: \u0026#34;google-analytics.com\u0026#34; redirect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-data: \u0026#34;google-analytics.com A 127.0.0.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-zone: \u0026#34;ads.youtube.com\u0026#34; redirect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-data: \u0026#34;ads.youtube.com A 127.0.0.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-zone: \u0026#34;adserver.yahoo.com\u0026#34; redirect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-data: \u0026#34;adserver.yahoo.com A 127.0.0.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-zone: \u0026#34;ask.com\u0026#34; redirect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elocal-data: \u0026#34;ask.com A 127.0.0.1\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\u003ePour info, il existe des projets de listes, tels que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://pgl.yoyo.org/adservers/\" rel=\"external\"\u003ePGL-Yoyo\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;excellent \u003cstrong\u003e\u003ca href=\"https://www.geoghegan.ca/unbound-adblock.html\" rel=\"external\"\u003eunbound-badhosts\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans le cas d\u0026rsquo;usage de listes, il faut les inclure en utilisant la déclaration : \u003cbr\u003e\n\u003ccode\u003einclude: /var/lib/unbound/nom-fichier-liste\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"gérer-des-statistiques\"\u003eGérer des statistiques\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\"\u003estatistics-interval: 0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eextended-statistics: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003estatistics-cumulative: no\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\u003eL\u0026rsquo;option \u003ccode\u003estatistics-cumulative\u003c/code\u003e est à paramétrer sur \u003ccode\u003eyes\u003c/code\u003e -\n\u003cem\u003esi vous utilisez un outil d\u0026rsquo;affichage graphique des rapports, tel que Munin…\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"fichier-roothints\"\u003eFichier root.hints\u003c/h4\u003e\n\u003cp\u003eLe fichier \u003ccode\u003eroot.hints\u003c/code\u003e est une liste des serveurs de noms faisant autorité,\nles premiers serveurs DNS, dits \u003ccode\u003eroots\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePour le récupèrer : \u003cbr\u003e\n\u003ccode\u003e# curl ftp://FTP.INTERNIC.NET/domain/named.cache -o /var/lib/unbound/root.hints\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis, modifiez le fichier de configuration, pour ajouter : \u003cbr\u003e\n\u003ccode\u003eroot-hints: \u0026quot;var/lib/unbound/root.hints\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\"\u003ePensez à créer un fichier \u003ca href=\"/fr/sys/debian/unbound-dnssec-trigger/#cron\"\u003ecron\u003c/a\u003e pour mettre-à-jour régulièrement ce\nfichier… \u003cbr\u003e\nnormalement, une période de 6 mois suffit.\u003c/div\u003e\n\n\u003ch4 id=\"gestion-dnssec\"\u003eGestion DNSSEC\u003c/h4\u003e\n\u003cp\u003eLa gestion DNSSEC se fait par l\u0026rsquo;usage de l\u0026rsquo;outil \u003ca href=\"https://unbound.net/documentation/unbound-anchor.html\" rel=\"external\"\u003e\u003ccode\u003eunbound-anchor\u003c/code\u003e\u003c/a\u003e\nqui crée un fichier de clé nécessaire et l\u0026rsquo;ajout de la variable \u003ccode\u003eauto-trust-anchor-file\u003c/code\u003e\nqui pointe vers ledit fichier de clés.\u003c/p\u003e\n\u003cp\u003eExécutez : \u003cbr\u003e\n\u003ccode\u003e# unbound-anchor -a \u0026quot;/var/lib/unbound/root.key\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLa variable \u003ccode\u003eauto-trust-anchor-file\u003c/code\u003e est normalement déclarée dans le fichier\n\u003ccode\u003e/etc/unbound/unbound.conf.d/root-auto-trust-anchor-file.conf\u003c/code\u003e.\n\u003cem\u003eSi ce fichier n\u0026rsquo;existe pas, vous pouvez l\u0026rsquo;ajouter à votre fichier de configuration\npersonnel, ou créer ledit fichier qui sera pris en charge lors du (re)démarrage\nlié au service unbound\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eElle a cette teneur : \u003cbr\u003e\n\u003ccode\u003eauto-trust-anchor-file: \u0026quot;/var/lib/unbound/root.key\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eDe même, il faut ajouter les variables suivantes à votre propre fichier de\nconfiguration :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003eharden-below-nxdomain: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eharden-dnssec-stripped: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eharden-referral-path: yes\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\u003eL\u0026rsquo;option \u003ccode\u003eharden-referral-path\u003c/code\u003e renforce la validation DNSSEC -\nc\u0026rsquo;est une option expérimentale, sans norme RFC, et peut poser des problèmes\nde performances !\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\"\u003eVeillez à redémarrer le service unbound si vous l\u0026rsquo;avez configuré après\nl\u0026rsquo;installation et le démarrage post-install !\u003c/div\u003e\n\n\u003ch3 id=\"tests-dnssec\"\u003eTests DNSSEC\u003c/h3\u003e\n\u003ch4 id=\"dig\"\u003eDig\u003c/h4\u003e\n\u003cp\u003eUn premier test à faire est l\u0026rsquo;usage de la commande \u003ccode\u003edig\u003c/code\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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ dig com. SOA +dnssec\n\u003c/span\u003e\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;\u0026lt;\u0026gt;\u0026gt; DiG 9.10.3-P4-Debian \u0026lt;\u0026lt;\u0026gt;\u0026gt; com. SOA +dnssec\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; global options: +cmd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; Got answer:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; -\u0026gt;\u0026gt;HEADER\u003cspan style=\"color:#48b685\"\u003e\u0026lt;\u0026lt;- opco\u003c/span\u003ede: QUERY, status: NOERROR, id: \u003cspan style=\"color:#f99b15\"\u003e60764\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 14, ADDITIONAL: \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…\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\u003eCe qu\u0026rsquo;il faut repérer dans la sortie complète de la commande \u003ccode\u003edig\u003c/code\u003e est\nsur la ligne \u003ccode\u003eflags:\u003c/code\u003e : il faut la présence du drapeau \u003ccode\u003ead\u003c/code\u003e -\n\u003cstrong\u003esi celui-ci figure bien, c\u0026rsquo;est bon signe !\u003c/strong\u003e :D\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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:$ dig com. SOA +dnssec | grep \u003cspan style=\"color:#48b685\"\u003e\u0026#34;;; flags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"unbound-host\"\u003eUnbound-host\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;autre commande à utiliser est la commande \u003ccode\u003eunbound-host\u003c/code\u003e qui permet\nde s\u0026rsquo;assurer du même résultat, 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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ unbound-host com. -f /var/lib/unbound/root.key -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom. has no address \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom. has no IPv6 address \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom. has no mail handler record \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\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$ unbound-host dnssec.cz -f /var/lib/unbound/root.key -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz has address 217.31.205.51 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz has IPv6 address 2001:1488:0:3::5 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e mail.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e mx.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e bh.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\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# unbound-host dnssec.cz -C /etc/unbound/unbound.conf -v\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e1472755792\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e libunbound\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e44222:0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e debug: switching log to /var/log/unbound/unbound.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz has address 217.31.205.51 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz has IPv6 address 2001:1488:0:3::5 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e mail.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e mx.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednssec.cz mail is handled by \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e bh.nic.cz. \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esecure\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"dnssec-trigger-1\"\u003ednssec-trigger\u003c/h4\u003e\n\u003cp\u003eUtilisez l\u0026rsquo;outil \u003ccode\u003ednssec-trigger\u003c/code\u003e est trivial :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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:# dnssec-trigger-control status\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eat 2016-09-01 08:41:22\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eauthority 192.33.4.12: OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehttp ster.nlnetlabs.nl \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e185.49.140.10\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estate: auth secure\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"navigateur-internet\"\u003eNavigateur internet\u003c/h4\u003e\n\u003cp\u003eUn moyen visuel est d\u0026rsquo;ouvrir votre navigateur internet favori, puis d\u0026rsquo;aller\nsur les sites suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.dnssec.cz\" rel=\"external\"\u003ehttp://www.dnssec.cz\u003c/a\u003e : si, sur la partie droite, vous\nvoyez une clé verte, c\u0026rsquo;est tout autant bon signe !\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.internet.nl\" rel=\"external\"\u003ehttps://en.internet.nl\u003c/a\u003e :  cliquez sur le lien titré \u0026ldquo;Test my internet connection\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"cron\"\u003eCron\u003c/h3\u003e\n\u003cp\u003ePensez à créer un fichier cron mensuel \u003ccode\u003e/etc/crond.monthly/unbound\u003c/code\u003e, pour\nmettre-à-jour les fichiers \u003ccode\u003eroot.hints\u003c/code\u003e, et \u003ccode\u003eads server\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:#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# update  file named.cache\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl ftp://FTP.INTERNIC.NET/domain/named.cache -o /var/lib/unbound/root.hints\n\u003c/span\u003e\u003c/span\u003e\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# update file ads servers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl -sS -L --compressed \u003cspan style=\"color:#48b685\"\u003e\u0026#34;http://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound\u0026amp;showintro=0\u0026amp;mimetype=plaintext\u0026#34;\u003c/span\u003e \u0026gt; /var/lib/unbound/unbound_ad_servers\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echown unbound:unbound /var/lib/unbound/unbound_ad_servers\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=\"fatal-error-ssl-handshake\"\u003efatal error: SSL handshake\u003c/h3\u003e\n\u003cp\u003eSi vous avez l\u0026rsquo;erreur ci-dessous :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# dnssec-trigger-control status\nMar 20 15:08:13 dnssec-trigger-control[2016] fatal error: SSL handshake failed error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed` \u0026lt;/code\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eredémarrez\u003c/strong\u003e d\u0026rsquo;abord le service unbound !\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePour en savoir un peu plus sur l\u0026rsquo;outil, les raisons de son existence et\nde son usage, lisez l\u0026rsquo;article de Stéphane Bortzmeyer : \u003ca href=\"http://www.bortzmeyer.org/dnssec-trigger.html\" rel=\"external\"\u003ednssec-trigger, un outil pour mettre DNSSEC à la disposition de M. Toutlemonde\u003c/a\u003e…\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eJ\u0026rsquo;ai écrit pour la première fois cet article pour le \u003ca href=\"https://wiki.debian-fr.xyz/Utiliser_Unbound_avec_DNSSEC\" rel=\"external\"\u003ewiki de la communauté de Debian-fr.xyz\u003c/a\u003e !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Sécuriser les connexions, requêtes DNS sous Debian, en utilisant la technologie DNSSEC avec unbound + dnssec-trigger","tags":["Debian","unbound","dnssec-trigger","DNSSEC"],"date_published":"2016-09-01T11:37:35+02:00","date_modified":"2020-04-20T14:02:35+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-07-16:/fr/sys/android/flash-rockchip#06fd4b65f18d778b9a646bb9dce8ba01cc40b9398b63b56ca67e09bff534c4d4","url":"https://it-log.fr.eu.org/fr/sys/android/flash-rockchip/","title":"Android 4.4 : Flasher sa tablette Rockchip","author":{"name":"Stéphane HUC"},"content_text":"Description Tout d\u0026rsquo;abord commençons par cet avertissement auquel vous devez consentir, AUTREMENT passez votre chemin et fermer cette page :\nDangerJe ne suis pas responsable en cas de problème sur votre tablette ; vous prenez VOS responsabilités !\nPour toute manœuvre root, flash, etc, veillez à ce que votre tablette soit impérativement à plus de 50 % de charge de batterie… mieux vaut la brancher électriquement.\n/!\\ Risque de brickage /!\\\nFONCTIONNE À PARTIR D\u0026rsquo;ANDROID 4.4.4\nPré-requis Que votre tablette soit reconnue par votre GNU/Linux… IMPERATIF : ON NE RAPPELLERA JAMAIS ASSEZ L\u0026rsquo;IMPORTANCE DE SAUVEGARDER VOS DONNÉES AVANT DE FAIRE TOUTE AUTRE ACTION… CELA EST DE VOTRE STRICTE RESPONSABILITÉ PERSONNELLE ! Téléchargez l\u0026rsquo;outil Linux Upgrade Tool Utilisation adb Mode fastboot Concernant les tablettes Rockchip, oubliez l\u0026rsquo;usage de l\u0026rsquo;outil fastboot - cet outil ne fonctionne pas avec !\nMode bootloader L\u0026rsquo;outil adb va nous servir simplement à redémarrer la tablette dans le mode nécessaire : le mode bootloader…\n$ adb reboot-bootloader\nDans le mode bootloader, la tablette semble éteinte ; en effet, l\u0026rsquo;écran est tout noir, et aucune des touches - s\u0026rsquo;il y\u0026rsquo;en a - ne réagit !\nDe même, dans ce mode, l\u0026rsquo;outil adb ne sera plus d\u0026rsquo;aucune utilité.\nRockChip Linux Upgrade Tool Cet outil nous permet donc de flasher et/ou sauvegarder les partitions de nos tablettes.\nIl s\u0026rsquo;utilise aussi en mode terminal console.\nDe même, il est nécessaire d\u0026rsquo;être dans le mode bootloader afin qu\u0026rsquo;il fonctionne, sinon il ne trouvera pas correctement votre tablette !\nEntrez dans le répertoire de l\u0026rsquo;outil, puis en mode console, exécutez-le :\n:$ ./upgrade_tool List of rockusb connected DevNo=1 Vid=0x2207,Pid=0x310b,LocationID=217 Loader Found 1 rockusb,Select input DevNo,Rescan press \u0026lt;R\u0026gt;,Quit press \u0026lt;Q\u0026gt;: On remarque qu\u0026rsquo;un périphérique est détecté en tant que device numero = 1, les paramètres VendorId (Vid) et ProductId (Pid) sont ceux qui correspondent bien à notre tablette.\nLe système attend votre réponse ; tapez le chiffre correspondant, dans ce cas, le chiffre 1 !\nFound 1 rockusb,Select input DevNo,Rescan press \u0026lt;R\u0026gt;,Quit press \u0026lt;Q\u0026gt;:1 ---------------------Tool Usage --------------------- Help: H Quit: Q Version: V Clear Screen: CS ------------------Upgrade Command ------------------ \u0026lt;/nowiki\u0026gt; ChooseDevice: CD SwitchDevice: SD UpgradeFirmware: UF \u0026lt;Firmware\u0026gt; UpgradeLoader: UL \u0026lt;Loader\u0026gt; DownloadImage: DI \u0026lt;-p|-b|-k|-s|-r|-m image\u0026gt; [parameter file] \u0026lt;/nowiki\u0026gt; DownloadBoot: DB \u0026lt;Loader\u0026gt; \u0026lt;/nowiki\u0026gt; EraseFlash: EF \u0026lt;Loader|firmware\u0026gt; \u0026lt;/nowiki\u0026gt; LowerFormat: LF ----------------Professional Command ----------------- \u0026lt;/nowiki\u0026gt; TestDevice: TD ResetDevice: RD ReadFlashID: RID ReadFlashInfo: RFI ReadChipInfo: RCI ReadSector: RS \u0026lt;BeginSec\u0026gt; \u0026lt;SectorLen\u0026gt; [-decode] [File] \u0026lt;/nowiki\u0026gt; WriteSector: WS \u0026lt;BeginSec\u0026gt; \u0026lt;File\u0026gt; \u0026lt;/nowiki\u0026gt; ReadLBA: RL \u0026lt;BeginSec\u0026gt; \u0026lt;SectorLen\u0026gt; [File] WriteLBA: WL \u0026lt;BeginSec\u0026gt; \u0026lt;File\u0026gt; EraseBlock: EB \u0026lt;CS\u0026gt; \u0026lt;BeginBlock\u0026gt; \u0026lt;BlokcLen\u0026gt; [--Force] ------------------------------------------------------- Rockusb\u0026gt; À savoir que certaines commandes sont directement fonctionnelles, en mode console, en tant qu\u0026rsquo;argument de l\u0026rsquo;outil. Ce sont les commandes UF, UL, DI, DB, EL, LF, SD, RD…\nTel que : ./upgrade_tool UF update.img\nDe même, la commande RD signifiant Reset Device est en fait la commande pour redémarrer la tablette - c\u0026rsquo;est un reboot, ni plus ni moins !\nDepuis la version 1.13 de l\u0026rsquo;outil \u0026ldquo;Linux Upgrade Tool\u0026rdquo;, il est possible de flasher simultanément plusieurs partitions.\nTel que : ./upgrade_tool DI -k,-s kernel.img, system.img\nFlasher une ROM originale Très simplement, en utilisant l\u0026rsquo;option UF :\n:$ Rockusb\u0026gt;UF PiPO_M9pro_update_andriod4.4_20140504.img Loading firmware... Support Type:RK31 FW Ver:4.4.02 FW Time:2014-05-04 17:38:05 Loader ver:2.10 Loader Time:2013-12-27 22:12:16 Upgrade firmware ok. ou, directement en mode CLI : ./upgrade_tool UF PiPO_M9pro_update_andriod4.4_20140504.img\nFlasher une ROM Custom Pour flasher une ROM Custom, telles que les RileyROM, FinlessRom, il faut, dans un premier temps décompresser, l\u0026rsquo;archive de la ROM.\nCopier le répertoire RileyRom dans celui de l\u0026rsquo;outil \u0026ldquo;Linux Upgrage Tool\u0026rdquo; ; cela simpliefiera l\u0026rsquo;usage.\nIl nous faut formater la tablette : :$ Rockusb\u0026gt;LF Lower Format Device,total(8192),current(7460) Lower Format Device OK. Ensuite, il faut flasher le Loader : :$ Rockusb\u0026gt;UL RileyROM/RK3188Loader(L)_V2.10.bin Loading loader... Support Type:RK310B Loader ver:2.10 Loader Time:2013-12-27 22:12:16 Upgrade loader ok Après cette seconde étape, il semble nécessaire de faire reconnaître à nouveau la tablette : :$ Rockusb\u0026gt;CD List of rockusb connected DevNo=1 Vid=0x2207,Pid=0x310b,LocationID=210 Loader Found 1 rockusb,Select input DevNo,Rescan press \u0026lt;R\u0026gt;,Quit press \u0026lt;Q\u0026gt;:1 Il devient nécessaire de flasher le fichier parameter : :$ Rockusb\u0026gt;DI -p RileyROM/parameter Download parameter ok. Puis de terminer en flashant les différentes \u0026ldquo;partitions\u0026rdquo; nécessaires : :$ Rockusb\u0026gt;DI -k,-b,-r,-m,-s RileyROM/kernel.img,RileyROM/boot.img,RileyROM/recovery.img,RileyROM/misc.img,RileyROM/system.img Download kernel start... Download image ok. Download boot start... Download image ok. Download recovery start... Download image ok. Download misc start... Download image ok. Download system start... Download image ok. Si après avoir lancé la commande, le système vous répond avec ce message buffer overflow detected: ./upgrade_tool terminated le logiciel vient de s\u0026rsquo;arrêter ! Relancez-le en utilisant la commande DI fichier après fichier…\nCeci étant fait, et si tous les messages annoncent ok, il ne reste plus qu\u0026rsquo;à redémarrer la tablette : $ Rockusb\u0026gt;RD Reset Device OK. Dépannage Mode maskrom Sortir du mode maskrom n\u0026rsquo;est pas chose aisée car vous n\u0026rsquo;avez aucun voyant, ni aucun moyen visuel pour être sûr !\nL\u0026rsquo;outil upgrade_tool nous y aide :\n:$ ./upgrade_tool List of rockusb connected DevNo=1 Vid=0x2207,Pid=0x310b,LocationID=265 Maskrom Found 1 rockusb,Select input DevNo,Rescan press \u0026lt;R\u0026gt;,Quit press \u0026lt;Q\u0026gt;: Comme nous le voyons sur la ligne DevNo, à la fin de celle-ci, est indiqué Maskrom - au lieu de Loader !\nOn lance le formatage de l\u0026rsquo;image avec upgrade_tool :\n:$ Rockusb\u0026gt;UF PiPO_M9pro_update_andriod4.4_20140504.img Loading firmware... Support Type:RK31 FW Ver:4.4.02 FW Time:2014-05-04 17:38:05 Loader ver:2.10 Loader Time:2013-12-27 22:12:16 Upgrade firmware ok. Une fois le message Upgrade firmware ok affiché, la tablette redémarrera toute seule !\nErreurs buffer overflow detected: ./upgrade_tool terminated Le logiciel vient de terminer son processus, à cause d\u0026rsquo;un problème de gestion de la mémoire. Veuillez relancer le processus fichier après fichier !\nLoading loader failed Vérifiez le chemin de votre fichier !!! Il y a de fortes probabilités pour que le chemin entré ne corresponde pas à celui dans votre système de fichier…\nNo found match device,please press CD to choose device Le logiciel vous dit d\u0026rsquo;utiliser la commande CD pour faire (re?)connaître votre tablette, à nouveau !\nReset Device quit,Creating comm object failed Le programme n\u0026rsquo;arrive pas à faire redémarrer la tablette… c\u0026rsquo;est signe qu\u0026rsquo;il y a un problème de communication entre celle-ci et votre ordinateur.\nCherchez à comprendre la raison !\nDocumentation J\u0026rsquo;ai écrit ce tutoriel pour la première fois sur le wiki de la communauté Debian-fr.xyz ! ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eTout d\u0026rsquo;abord commençons par cet avertissement auquel vous devez consentir,\nAUTREMENT passez votre chemin et fermer cette page :\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cp\u003eJe ne suis pas responsable en cas de problème sur votre tablette ; vous\nprenez VOS responsabilités !\u003c/p\u003e\n\u003cp\u003ePour toute manœuvre root, flash, etc, veillez à ce que votre tablette soit\nimpérativement à plus de 50 % de charge de batterie… \u003cbr\u003e\nmieux vaut la brancher électriquement.\u003c/p\u003e\n\u003cp\u003e/!\\ Risque de brickage /!\\\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003eFONCTIONNE À PARTIR D\u0026rsquo;ANDROID 4.4.4\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"pré-requis\"\u003ePré-requis\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eQue votre tablette soit \n\u003ca class=\"inside\" href=\"/fr/sys/android/reconnaissance-peripheriques/\" title=\"Lien interne vers l\u0026#39;article : 'Faire reconnaître sa tablette Android sous Linux'\"\u003ereconnue\u003c/a\u003e\n par votre GNU/Linux…\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIMPERATIF : ON NE RAPPELLERA JAMAIS ASSEZ L\u0026rsquo;IMPORTANCE DE\n\n    \u003ca class=\"inside\" href=\"/fr/systeme/android/sauvegarde-restauration/\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003eSAUVEGARDER\u003c/a\u003e\n\nVOS DONNÉES AVANT DE FAIRE TOUTE AUTRE ACTION…\n\u003cspan class=\"red\"\u003eCELA EST DE VOTRE STRICTE RESPONSABILITÉ PERSONNELLE\u003c/span\u003e\n !\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eTéléchargez l\u0026rsquo;outil \u003ca href=\"http://wiki.radxa.com/Rock/flash_the_image#Linux\" rel=\"external\"\u003eLinux Upgrade Tool\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003ch3 id=\"adb\"\u003eadb\u003c/h3\u003e\n\u003ch4 id=\"mode-fastboot\"\u003eMode fastboot\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eConcernant les tablettes Rockchip, oubliez l\u0026rsquo;usage de l\u0026rsquo;outil fastboot\u003c/strong\u003e -\ncet outil ne fonctionne pas avec !\u003c/p\u003e\n\u003ch4 id=\"mode-bootloader\"\u003eMode bootloader\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;outil \u003ccode\u003eadb\u003c/code\u003e va nous servir simplement à redémarrer la tablette dans le\nmode nécessaire : le mode bootloader…\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ adb reboot-bootloader\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eDans le mode bootloader, la tablette semble éteinte ; en effet, l\u0026rsquo;écran\nest tout noir, et aucune des touches - s\u0026rsquo;il y\u0026rsquo;en a - ne réagit !\u003c/p\u003e\n\u003cp\u003eDe même, dans ce mode, l\u0026rsquo;outil \u003ccode\u003eadb\u003c/code\u003e ne sera plus d\u0026rsquo;aucune utilité.\u003c/p\u003e\n\u003ch3 id=\"rockchip-linux-upgrade-tool\"\u003eRockChip Linux Upgrade Tool\u003c/h3\u003e\n\u003cp\u003eCet outil nous permet donc de flasher et/ou sauvegarder les \u003cstrong\u003epartitions\u003c/strong\u003e\nde nos tablettes.\u003c/p\u003e\n\u003cp\u003eIl s\u0026rsquo;utilise aussi en mode terminal console.\u003c/p\u003e\n\u003cp\u003eDe même, il est nécessaire d\u0026rsquo;être dans le \u003ca href=\"/fr/sys/android/flash-rockchip/#mode-bootloader\"\u003emode bootloader\u003c/a\u003e\nafin qu\u0026rsquo;il fonctionne, sinon il ne trouvera pas correctement votre tablette !\u003c/p\u003e\n\u003cp\u003eEntrez dans le répertoire de l\u0026rsquo;outil, puis en mode console, exécutez-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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ./upgrade_tool\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eList of rockusb connected\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eDevNo\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e   \u003cspan style=\"color:#ef6155\"\u003eVid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0x2207,Pid\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0x310b,LocationID\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e217\u003c/span\u003e   Loader\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFound \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e rockusb,Select input DevNo,Rescan press \u0026lt;R\u0026gt;,Quit press \u0026lt;Q\u0026gt;:\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn remarque qu\u0026rsquo;un périphérique est détecté en tant que \u003ccode\u003edevice numero = 1\u003c/code\u003e,\nles paramètres \u003cstrong\u003eVendorId (Vid)\u003c/strong\u003e et \u003cstrong\u003eProductId (Pid)\u003c/strong\u003e sont ceux qui\ncorrespondent bien à notre tablette.\u003c/p\u003e\n\u003cp\u003eLe système attend votre réponse ; tapez le chiffre correspondant,\ndans ce cas, le chiffre \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\u003eFound \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e rockusb,Select input DevNo,Rescan press \u0026lt;R\u0026gt;,Quit press \u0026lt;Q\u0026gt;:1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e---------------------Tool Usage ---------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eHelp:             H\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eQuit:             Q\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eVersion:          V\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eClear Screen:     CS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e------------------Upgrade Command ------------------ \u0026lt;/nowiki\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChooseDevice:      CD\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSwitchDevice:      SD\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUpgradeFirmware:   UF \u0026lt;Firmware\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUpgradeLoader:      UL \u0026lt;Loader\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownloadImage:      DI \u0026lt;-p|-b|-k|-s|-r|-m image\u0026gt; \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eparameter file\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u0026lt;/nowiki\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownloadBoot:      DB \u0026lt;Loader\u0026gt; \u0026lt;/nowiki\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEraseFlash:      EF \u0026lt;Loader|firmware\u0026gt; \u0026lt;/nowiki\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLowerFormat:      LF\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e----------------Professional Command ----------------- \u0026lt;/nowiki\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTestDevice:      TD\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eResetDevice:      RD\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReadFlashID:      RID\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReadFlashInfo:      RFI\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReadChipInfo:      RCI\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReadSector:      RS  \u0026lt;BeginSec\u0026gt; \u0026lt;SectorLen\u0026gt; \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e-decode\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eFile\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u0026lt;/nowiki\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWriteSector:      WS  \u0026lt;BeginSec\u0026gt; \u0026lt;File\u0026gt; \u0026lt;/nowiki\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReadLBA:      RL  \u0026lt;BeginSec\u0026gt; \u0026lt;SectorLen\u0026gt; \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eFile\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWriteLBA:      WL  \u0026lt;BeginSec\u0026gt; \u0026lt;File\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEraseBlock:      EB \u0026lt;CS\u0026gt; \u0026lt;BeginBlock\u0026gt; \u0026lt;BlokcLen\u0026gt; \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e--Force\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\u003eRockusb\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eÀ savoir que certaines commandes sont directement fonctionnelles, en mode\nconsole, en tant qu\u0026rsquo;argument de l\u0026rsquo;outil. \u003cbr\u003e\nCe sont les commandes \u003ccode\u003eUF\u003c/code\u003e, \u003ccode\u003eUL\u003c/code\u003e, \u003ccode\u003eDI\u003c/code\u003e, \u003ccode\u003eDB\u003c/code\u003e, \u003ccode\u003eEL\u003c/code\u003e, \u003ccode\u003eLF\u003c/code\u003e, \u003ccode\u003eSD\u003c/code\u003e, \u003ccode\u003eRD\u003c/code\u003e…\u003c/p\u003e\n\u003cp\u003eTel que : \u003ccode\u003e./upgrade_tool UF update.img\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eDe même, la commande RD signifiant \u003cstrong\u003eReset Device\u003c/strong\u003e est en fait la commande\npour redémarrer la tablette - c\u0026rsquo;est un reboot, ni plus ni moins !\u003c/p\u003e\n\u003cp\u003eDepuis la version 1.13 de l\u0026rsquo;outil \u0026ldquo;Linux Upgrade Tool\u0026rdquo;, il est possible\nde flasher simultanément plusieurs partitions.\u003c/p\u003e\n\u003cp\u003eTel que : \u003ccode\u003e./upgrade_tool DI -k,-s kernel.img, system.img\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"flasher-une-rom-originale\"\u003eFlasher une ROM originale\u003c/h4\u003e\n\u003cp\u003eTrès simplement, en utilisant l\u0026rsquo;option \u003ccode\u003eUF\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:$ Rockusb\u0026gt;UF PiPO_M9pro_update_andriod4.4_20140504.img\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLoading firmware...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSupport Type:RK31   FW Ver:4.4.02   FW Time:2014-05-04 17:38:05\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLoader ver:2.10   Loader Time:2013-12-27 22:12:16\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUpgrade firmware ok.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eou, directement en mode CLI : \u003ccode\u003e./upgrade_tool UF PiPO_M9pro_update_andriod4.4_20140504.img\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"flasher-une-rom-custom\"\u003eFlasher une ROM Custom\u003c/h4\u003e\n\u003cp\u003ePour flasher une ROM Custom, telles que les RileyROM, FinlessRom, il faut,\ndans un premier temps décompresser, l\u0026rsquo;archive de la ROM.\u003c/p\u003e\n\u003cp\u003eCopier le répertoire RileyRom dans celui de l\u0026rsquo;outil \u0026ldquo;Linux Upgrage Tool\u0026rdquo; ;\ncela simpliefiera l\u0026rsquo;usage.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIl nous faut formater la tablette :\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:$ Rockusb\u0026gt;LF\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLower Format Device,total\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8192\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e,current\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e7460\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLower Format Device OK.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eEnsuite, il faut flasher le Loader :\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:$ Rockusb\u0026gt;UL RileyROM/RK3188Loader\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eL\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e_V2.10.bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLoading loader...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSupport Type:RK310B   Loader ver:2.10   Loader Time:2013-12-27 22:12:16\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUpgrade loader ok\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eAprès cette seconde étape, il semble nécessaire de faire reconnaître à\nnouveau la tablette :\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:$ Rockusb\u0026gt;CD\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eList of rockusb connected\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eDevNo\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e   \u003cspan style=\"color:#ef6155\"\u003eVid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0x2207,Pid\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0x310b,LocationID\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e210\u003c/span\u003e   Loader\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFound \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e rockusb,Select input DevNo,Rescan press \u0026lt;R\u0026gt;,Quit press \u0026lt;Q\u0026gt;:1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eIl devient nécessaire de flasher le fichier \u003ccode\u003eparameter\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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ Rockusb\u0026gt;DI -p RileyROM/parameter\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownload parameter ok.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003ePuis de terminer en flashant les différentes \u0026ldquo;partitions\u0026rdquo; nécessaires :\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:$ Rockusb\u0026gt;DI -k,-b,-r,-m,-s RileyROM/kernel.img,RileyROM/boot.img,RileyROM/recovery.img,RileyROM/misc.img,RileyROM/system.img\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownload kernel start...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownload image ok.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownload boot start...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownload image ok.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownload recovery start...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownload image ok.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownload misc start...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownload image ok.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownload system start...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDownload image ok.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi après avoir lancé la commande, le système vous répond avec ce message \u003cbr\u003e\n\u003ccode\u003ebuffer overflow detected: ./upgrade_tool terminated\u003c/code\u003e \u003cbr\u003e\nle logiciel vient de s\u0026rsquo;arrêter ! \u003cbr\u003e\n\u003cstrong\u003eRelancez-le en utilisant la commande \u003ccode\u003eDI\u003c/code\u003e fichier après fichier\u003c/strong\u003e…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCeci étant fait, et si tous les messages annoncent \u003ccode\u003eok\u003c/code\u003e, il ne reste\nplus qu\u0026rsquo;à redémarrer la tablette :\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$ Rockusb\u0026gt;RD\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReset Device OK.\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=\"mode-maskrom\"\u003eMode maskrom\u003c/h3\u003e\n\u003cp\u003eSortir du mode maskrom n\u0026rsquo;est pas chose aisée car vous n\u0026rsquo;avez aucun voyant,\nni aucun moyen visuel pour être sûr !\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;outil \u003ccode\u003eupgrade_tool\u003c/code\u003e nous y aide :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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:$ ./upgrade_tool\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eList of rockusb connected\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eDevNo\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e   \u003cspan style=\"color:#ef6155\"\u003eVid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0x2207,Pid\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0x310b,LocationID\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e265\u003c/span\u003e   Maskrom\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFound \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e rockusb,Select input DevNo,Rescan press \u0026lt;R\u0026gt;,Quit press \u0026lt;Q\u0026gt;:\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eComme nous le voyons sur la ligne \u003ccode\u003eDevNo\u003c/code\u003e, à la fin de celle-ci, est indiqué\n\u003ccode\u003eMaskrom\u003c/code\u003e - au lieu de \u003ccode\u003eLoader\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003eOn lance le formatage de l\u0026rsquo;image avec \u003cstrong\u003eupgrade_tool\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-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ Rockusb\u0026gt;UF PiPO_M9pro_update_andriod4.4_20140504.img\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLoading firmware...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSupport Type:RK31   FW Ver:4.4.02   FW Time:2014-05-04 17:38:05\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLoader ver:2.10   Loader Time:2013-12-27 22:12:16\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUpgrade firmware ok.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUne fois le message \u003ccode\u003eUpgrade firmware ok\u003c/code\u003e affiché, la tablette redémarrera\ntoute seule !\u003c/p\u003e\n\u003ch3 id=\"erreurs\"\u003eErreurs\u003c/h3\u003e\n\u003ch4 id=\"buffer-overflow-detected-upgrade_tool-terminated\"\u003ebuffer overflow detected: ./upgrade_tool terminated\u003c/h4\u003e\n\u003cp\u003eLe logiciel vient de terminer son processus, à cause d\u0026rsquo;un problème de\ngestion de la mémoire. Veuillez relancer le processus fichier après fichier !\u003c/p\u003e\n\u003ch4 id=\"loading-loader-failed\"\u003eLoading loader failed\u003c/h4\u003e\n\u003cspan class=\"red\"\u003eVérifiez le chemin de votre fichier !!!\u003c/span\u003e\n\n\u003cp\u003eIl y a de fortes probabilités pour que le chemin entré ne corresponde pas\nà celui dans votre système de fichier…\u003c/p\u003e\n\u003ch4 id=\"no-found-match-deviceplease-press-cd-to-choose-device\"\u003eNo found match device,please press CD to choose device\u003c/h4\u003e\n\u003cp\u003eLe logiciel vous dit d\u0026rsquo;utiliser la commande \u003ccode\u003eCD\u003c/code\u003e pour faire (re?)connaître\nvotre tablette, à nouveau !\u003c/p\u003e\n\u003ch4 id=\"reset-device-quitcreating-comm-object-failed\"\u003eReset Device quit,Creating comm object failed\u003c/h4\u003e\n\u003cp\u003eLe programme n\u0026rsquo;arrive pas à faire redémarrer la tablette… \u003cbr\u003e\nc\u0026rsquo;est signe qu\u0026rsquo;il y a un problème de communication entre celle-ci et votre ordinateur.\u003c/p\u003e\n\u003cp\u003eCherchez à comprendre la raison !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eJ\u0026rsquo;ai écrit ce tutoriel pour la première fois sur le \u003ca href=\"https://wiki.debian-fr.xyz/Flasher_sa_tablette_Rockchip_-_Android_4.4_-\" rel=\"external\"\u003ewiki de la communauté Debian-fr.xyz\u003c/a\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Comment flasher sa tablette de type Rockchip sous Android 4.4.4","tags":["Android","Rockchip","flash"],"date_published":"2016-07-16T13:30:51+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-07-16:/fr/sys/android/sauvegarde-restauration#11272d0028a260c6866e166171ec1d2895124f4621236284aca2cb41818eec5a","url":"https://it-log.fr.eu.org/fr/sys/android/sauvegarde-restauration/","title":"Sauvegarder/Restaurer sa tablette Android","author":{"name":"Stéphane HUC"},"content_text":"Description Tout d\u0026rsquo;abord commençons par cet avertissement auquel vous devez consentir, AUTREMENT passez votre chemin et fermer cette page :\nDangerJe ne suis pas responsable en cas de problème sur votre tablette ; vous prenez VOS responsabilités !\nPour toute manœuvre root, flash, etc, veillez à ce que votre tablette soit impérativement à plus de 50 % de charge de batterie… mieux vaut la brancher électriquement.\n/!\\ Risque de brickage /!\\\nPré-requis Que votre tablette soit reconnue sous GNU/Linux ! Il n\u0026rsquo;y a pas besoin d\u0026rsquo;être en mode administrateur pour effectuer les opérations de sauvegarde et restauration. Sauvegarde La commande principale est :\n$ adb backup -f nom_fichier_sauvegarde.ab\nSi l\u0026rsquo;option -f n\u0026rsquo;est pas spécifiée, le fichier backup.ab sera créé dans le répertoire courant où est exécutée la commande de sauvegarde…\nL\u0026rsquo;aide nous restitue :\nadb backup [-f \u0026lt;file\u0026gt;] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [\u0026lt;packages...\u0026gt;] - write an archive of the device\u0026#39;s data to \u0026lt;file\u0026gt;. If no -f option is supplied then the data is written to \u0026#34;backup.ab\u0026#34; in the current directory. (-apk|-noapk enable/disable backup of the .apks themselves in the archive; the default is noapk.) (-obb|-noobb enable/disable backup of any installed apk expansion (aka .obb) files associated with each application; the default is noobb.) (-shared|-noshared enable/disable backup of the device\u0026#39;s shared storage / SD card contents; the default is noshared.) (-all means to back up all installed applications) (-system|-nosystem toggles whether -all automatically includes system applications; the default is to include system apps) (\u0026lt;packages...\u0026gt; is the list of applications to be backed up. If the -all or -shared flags are passed, then the package list is optional. Applications explicitly given on the command line will be included even if -nosystem would ordinarily cause them to be omitted.) Sauvegarde applications :$ adb backup -f nom_fichier_sauvegarde.ab -apk -obb\nCette commande sauvegarde les fichiers apk des applications installées.\nL\u0026rsquo;option par défaut est -noapk qui signifie que les fichiers apk ne seront pas sauvegardés !\nL\u0026rsquo;option -obb implique la sauvegarde des fichiers relatifs aux applications installées, tels que fichiers de sauvegarde, de config, etc… par défaut, c\u0026rsquo;est l\u0026rsquo;option -noobb qui est active !\n$ adb backup -f nom_fichier_sauvegarde.ab package1 package2 package_n\nSauvegarde les noms des applications concernées !\nSauvegarde partitions L\u0026rsquo;outil adb peut servir à sauvegarder indirectement les partitions de votre tablette…\nPour cela, il faut télécharger l\u0026rsquo;outil rkdump !\nPuis l\u0026rsquo;utiliser ainsi :\n`$ adb push rkdump /data/ `$ adb shell chmod 0755 /data/rkdump` Sauvegarde SD Carte $ adb backup -f nom_fichier_sauvegarde.ab -shared\nSauvegarde le contenu de la SD Carte, ainsi que de tout répertoire de stockage partagé.\nIl est bien sûr nécessaire d\u0026rsquo;avoir une SD Carte dans votre appareil…\nPar défaut, c\u0026rsquo;est l\u0026rsquo;option -noshared qui est active et implique la non sauvegarde !\nSauvegarde Système $ adb backup -f nom_fichier_sauvegarde.ab -system\nPar défaut, c\u0026rsquo;est l\u0026rsquo;option -nosystem qui est activée, ce qui a pour effet de ne pas inclure les applications systèmes !\nSauvegarde tout $ adb backup -f nom_fichier_sauvegarde.ab -all\nCette commande implique la sauvegarde de toutes les applications installées, dont les applications systèmes.\nCette option intègre l\u0026rsquo;option -system !\nSauvegarde Pertinente Le moyen pertinent de sauvegarder tout correctement est, sans s\u0026rsquo;occuper du contenu de la SD Carte :\n$ adb backup -f nom_fichier_sauvegarde.ab -apk -obb -all\nRestauration $ adb restore nom_fichier_sauvegarde.ab\nTout ce qui concerne le contenu du fichier de sauvegarde sera restauré !\nJ\u0026rsquo;ai écrit pour la première fois ce tutoriel sur le wiki de la communauté Debian-fr.xyz ! ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eTout d\u0026rsquo;abord commençons par cet avertissement auquel vous devez consentir,\nAUTREMENT passez votre chemin et fermer cette page :\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cp\u003eJe ne suis pas responsable en cas de problème sur votre tablette ; vous\nprenez VOS responsabilités !\u003c/p\u003e\n\u003cp\u003ePour toute manœuvre root, flash, etc, veillez à ce que votre tablette soit\nimpérativement à plus de 50 % de charge de batterie… \u003cbr\u003e\nmieux vaut la brancher électriquement.\u003c/p\u003e\n\u003cp\u003e/!\\ Risque de brickage /!\\\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"pré-requis\"\u003ePré-requis\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eQue votre tablette soit \n\u003ca class=\"inside\" href=\"/fr/sys/android/reconnaissance-peripheriques/\" title=\"Lien interne vers l\u0026#39;article : 'Faire reconnaître sa tablette Android sous Linux'\"\u003ereconnue\u003c/a\u003e\n\nsous GNU/Linux !\u003c/li\u003e\n\u003cli\u003eIl n\u0026rsquo;y a pas besoin d\u0026rsquo;être en mode administrateur pour effectuer les\nopérations de sauvegarde et restauration.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"sauvegarde\"\u003eSauvegarde\u003c/h2\u003e\n\u003cp\u003eLa commande principale est :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ adb backup -f nom_fichier_sauvegarde.ab\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi l\u0026rsquo;option \u003ccode\u003e-f\u003c/code\u003e n\u0026rsquo;est pas spécifiée, le fichier \u003ccode\u003ebackup.ab\u003c/code\u003e sera créé dans\nle répertoire courant où est exécutée la commande de sauvegarde…\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;aide nous restitue :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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  adb backup \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e-f \u0026lt;file\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e-apk|-noapk\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e-obb|-noobb\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e-shared|-noshared\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e-all\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e-system|-nosystem\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;packages...\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                               - write an archive of the device\u003cspan style=\"color:#48b685\"\u003e\u0026#39;s data to \u0026lt;file\u0026gt;.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                                 If no -f option is supplied then the data is written\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                                 to \u0026#34;backup.ab\u0026#34; in the current directory.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                                 (-apk|-noapk enable/disable backup of the .apks themselves\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                                    in the archive; the default is noapk.)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                                 (-obb|-noobb enable/disable backup of any installed apk expansion\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                                    (aka .obb) files associated with each application; the default\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                                    is noobb.)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                                 (-shared|-noshared enable/disable backup of the device\u0026#39;\u003c/span\u003es\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                    shared storage / SD card contents; the default is noshared.\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-all means to back up all installed applications\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-system|-nosystem toggles whether -all automatically includes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                    system applications; the default is to include system apps\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\u0026lt;packages...\u0026gt; is the list of applications to be backed up.  If\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                    the -all or -shared flags are passed, \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e the package\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                    list is optional.  Applications explicitly given on the\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                    command line will be included even \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e -nosystem would\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                    ordinarily cause them to be omitted.\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=\"sauvegarde-applications\"\u003eSauvegarde applications\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e:$ adb backup -f nom_fichier_sauvegarde.ab -apk -obb\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCette commande sauvegarde les fichiers apk des applications installées.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;option par défaut est \u003ccode\u003e-noapk\u003c/code\u003e qui signifie que les fichiers apk ne seront\npas sauvegardés !\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;option \u003ccode\u003e-obb\u003c/code\u003e implique la sauvegarde des fichiers relatifs aux applications\ninstallées, tels que fichiers de sauvegarde, de config, etc… \u003cbr\u003e\npar défaut, c\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003e-noobb\u003c/code\u003e qui est active !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003ccode\u003e$ adb backup -f nom_fichier_sauvegarde.ab package1 package2 package_n\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSauvegarde les noms des applications concernées !\u003c/p\u003e\n\u003ch3 id=\"sauvegarde-partitions\"\u003eSauvegarde partitions\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;outil \u003ccode\u003eadb\u003c/code\u003e peut servir à sauvegarder indirectement les partitions de votre\ntablette…\u003c/p\u003e\n\u003cp\u003ePour cela, il faut télécharger l\u0026rsquo;outil \u003ca href=\"http://files.androtab.info/rk2818/devel/rkdump_android.zip\" rel=\"external\"\u003erkdump\u003c/a\u003e !\u003c/p\u003e\n\u003cp\u003ePuis l\u0026rsquo;utiliser ainsi :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e`$ adb push rkdump /data/\n`$ adb shell chmod 0755 /data/rkdump`\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"sauvegarde-sd-carte\"\u003eSauvegarde SD Carte\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e$ adb backup -f nom_fichier_sauvegarde.ab -shared\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSauvegarde le contenu de la SD Carte, ainsi que de tout répertoire de stockage\npartagé.\u003c/p\u003e\n\u003cp\u003eIl est bien sûr nécessaire d\u0026rsquo;avoir une SD Carte dans votre appareil…\u003c/p\u003e\n\u003cp\u003ePar défaut, c\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003e-noshared\u003c/code\u003e qui est active et implique la non\nsauvegarde !\u003c/p\u003e\n\u003ch3 id=\"sauvegarde-système\"\u003eSauvegarde Système\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e$ adb backup -f nom_fichier_sauvegarde.ab -system\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePar défaut, c\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003e-nosystem\u003c/code\u003e qui est activée, ce qui a pour effet\nde ne pas inclure les applications systèmes !\u003c/p\u003e\n\u003ch3 id=\"sauvegarde-tout\"\u003eSauvegarde tout\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e$ adb backup -f nom_fichier_sauvegarde.ab -all\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCette commande implique la sauvegarde de toutes les applications installées,\ndont les applications systèmes.\u003c/p\u003e\n\u003cp\u003eCette option intègre l\u0026rsquo;option \u003ccode\u003e-system\u003c/code\u003e !\u003c/p\u003e\n\u003ch3 id=\"sauvegarde-pertinente\"\u003eSauvegarde Pertinente\u003c/h3\u003e\n\u003cp\u003eLe moyen pertinent de sauvegarder tout correctement est, \u003cem\u003esans s\u0026rsquo;occuper\ndu contenu de la SD Carte\u003c/em\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ adb backup -f nom_fichier_sauvegarde.ab -apk -obb -all\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"restauration\"\u003eRestauration\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003e$ adb restore nom_fichier_sauvegarde.ab\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eTout ce qui concerne le contenu du fichier de sauvegarde sera restauré !\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eJ\u0026rsquo;ai écrit pour la première fois ce tutoriel sur le \u003ca href=\"https://wiki.debian-fr.xyz/Sauvegarder_et_Restaurer_sa_tablette_Android\" rel=\"external\"\u003ewiki de la communauté Debian-fr.xyz\u003c/a\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Comment sauvegarder ou restaurer une tablette Android","tags":["Android","adb"],"date_published":"2016-07-16T11:09:03+02:00","date_modified":"2026-10-02T15:49:57+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-07-13:/fr/sys/android/reconnaissance-peripheriques#d1d0614a529f47748b9fbe433bb0b089eff1291280b2958b50241b95cb705c67","url":"https://it-log.fr.eu.org/fr/sys/android/reconnaissance-peripheriques/","title":"Faire reconnaître sa tablette Android sous Linux","author":{"name":"Stéphane HUC"},"content_text":"Description Tout d\u0026rsquo;abord commençons par cet avertissement auquel vous devez consentir, AUTREMENT passez votre chemin et fermer cette page :\nDangerJe ne suis pas responsable en cas de problème sur votre tablette ; vous prenez VOS responsabilités !\nPour toute manœuvre root, flash, etc, veillez à ce que votre tablette soit impérativement à plus de 50 % de charge de batterie… mieux vaut la brancher électriquement.\n/!\\ Risque de brickage /!\\\nTablettes testées :\nArchos 101 Oxygen : OK - VendorId: 0e79; ProductId: 50f8 Cdisplay : OK - VendorId:201e; ProductId: 4289 Pipo M8 HD : OK - VendorId: 2207; ProductId: 0010 Teclast X89 Kindow : OK - VendorId: 8087; ProductId: 0a5f Pré-requis Utiliser un ordinateur ayant des ports USB 2 - pas USB 3 : avec ces ports, il peut y avoir des difficultés de reconnaissance ! Pour Debian : avant wheezy, oubliez pour wheezy, utilisez les dépôts backports. pour Jessie, et Sid, utilisez les dépôts officiels. Que votre tablette soit en mode \u0026ldquo;Débogage USB\u0026rdquo; : Paramètres \u0026gt; {} Outils pour les développeurs \u0026gt; Déboguage USB [v] Et, bien sûr, une connection Internet fonctionnelle… AttentionTant que le mode “Débogage USB” n\u0026rsquo;est pas actif, ou que vous ne pouvez pas l\u0026rsquo;activer, pas la peine de continuer… en effet, sans ce mode actif, le périphérique NE PEUT être reconnu !\nCe mode s\u0026rsquo;active différemment selon la version d\u0026rsquo;Android.\nVeuillez-vous référer à la documentation technique de votre périphérique…\nInstallation Il faut installer les outils suivants : android-tools-adb android-tools-fastboot android-tools-fsutils\nLes deux derniers ne sont pas strictement nécessaires…\nÀ vous de le faire, selon votre convenance - terminal-console, synaptic, etc.\nConfiguration Pour faire reconnaître proprement la tablette, il faut :\nDans un premier temps, connectez votre tablette, sur le port micro-usb - et, non host - par câble usb à votre ordinateur. (Peu importe le mode de connexion USB : MTP, PTP ou stockage USB). Ouvrez un terminal-console pour taper dedans la commande lsusb. Exemple : Pour une tablette PiPo, telle la M8HD, vous aurez comme réponse :\n$ lsusb (…) Bus 002 Device 014: ID 2207:0010` L\u0026rsquo;information importante est celle après ID, dans ce cas : 2207:0010\nla première série de 4 chiffres avant le symbole \u0026lsquo;:\u0026rsquo; est l\u0026rsquo;identifiant fabriquant - nommé idVendor - la seconde série de 4 chiffres après le symbole \u0026lsquo;:\u0026rsquo; est l\u0026rsquo;identifiant du produit - nommé idProduct - Il nous faut créer une règle udev, et pour cela, écrire le fichier /etc/udev/rules.d/51-android.rules : SUBSYSTEM==\u0026quot;usb\u0026quot;, ATTR{idVendor}==\u0026quot;2207\u0026quot;, MODE=\u0026quot;0666\u0026quot;, GROUP=\u0026quot;plugdev\u0026quot;\n⇒ Modifiez dans cette règle selon les informations idVendor, idProduct que vous avez trouvées…\nEnsuite, il nous faut créer/modifier un autre fichier utile ~/.android/adb_usb.ini, pour y ajouter l\u0026rsquo;information de l\u0026rsquo;identifiant du fabriquant de la manière suivante, soit un 0x suivi de idVendor, un identifiant par ligne.\nPour l\u0026rsquo;exemple ci-dessus, ce serait 0x2207\n⇒ Assurez-vous que votre utilisateur linux soit dans le groupe plugdev… sinon ajoutez-le ! # usermod -G plugdev votre_id_utilisateur\n⇒ Enregistrez le fichier, puis redémarrez udev : # service udev restart\nUtilisation Pour être sûr que la tablette soit reconnue, utilisez la commande adb devices :\n:$ adb devices List of devices attached WAWJM5UMUW device Pour le reste, tapez la commande adb ; elle vous restituera les différentes options !\nErreurs adb : commande introuvable Êtes-vous sûr d\u0026rsquo;avoir installé les outils adb ???\n\u0026lsquo;adb devices\u0026rsquo; : rien n\u0026rsquo;est affiché Si rien n\u0026rsquo;est reconnu, et donc qu\u0026rsquo;aucun device n\u0026rsquo;apparaît, c\u0026rsquo;est que vous avez peut-être mal renseigné le fichier /etc/udev/rules.d/51-android.rules et/ou n\u0026rsquo;avez pas redémarré le système udev !\nSi malgré tout, vous êtes absolument sûr d\u0026rsquo;avoir bien rempli le fichier en question, et d\u0026rsquo;avoir redémarré udev, il peut être intéressant d\u0026rsquo;effectuer la manipulation suivante :\nCréer le fichier ~/.android/adb_usb.ini, et écrivez dedans 0x suivi de votre idVendor Pour la tablette PiPo M8HD, ce sera : 0x2207\nRedémarrer le serveur adb : :# adb kill-server Exécutez à nouveau : adb devices adb devices : ???????????? no permissions Lorsque je tape adb devices, le périphérique n\u0026rsquo;est pas reconnu et il est affiché ???????????? no permissions\nIl vous faut tuer le serveur, le redémarrer avec des droits administrateur ensuite le périphérique apparaîtra !\n:$ adb kill-server :# adb start-server adb devices : offline Lorsque je tape adb devices, le périphérique est reconnu mais affiché offline\n:$ adb devices List of devices attached WAWJM5UMUW offline Il vous faudra alors :\ndésactiver l\u0026rsquo;option \u0026ldquo;Débogage USB\u0026rdquo;… déconnecter/reconnecter votre tablette à l\u0026rsquo;ordinateur, en débranchant/rebranchant le câble USB. activer à nouveau l\u0026rsquo;option \u0026ldquo;Débogage USB\u0026rdquo; À ce moment-là, essayez à nouveau la commande adb devices ; vous devriez voir apparaître votre périphérique… correctement !\nerror while loading shared libraries: libncurses.so.5 Si vous fonctionnez avec une distribution GNU/Linux 64 bits, c\u0026rsquo;est qu\u0026rsquo;il vous manque les librairies pour l\u0026rsquo;architecture 32 bits !\nDocumentations Vous pouvez lire mes autres articles, pour :\nRooter sa tablette Android 4.x Sauvegarder/Restaurer sa tablette Android Android 4.4 : Flasher sa tablette Rockchip Remerciements Ce tutoriel n\u0026rsquo;aurait pas existé sans le fourmillement d\u0026rsquo;idées glanées ici et là… merci à leurs auteurs respectifs !\nforum XDA : http://forum.xda-developers.com/showthread.php?t=2262494 http://sorrodje.alter-it.org/index.php?article12/ubuntu-rooter-flasher-rom-sdk-android J\u0026rsquo;ai écrit ce tutoriel la première fois sur le wiki de la communauté Debian-fr.xyz ! ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eTout d\u0026rsquo;abord commençons par cet avertissement auquel vous devez consentir,\nAUTREMENT passez votre chemin et fermer cette page :\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cp\u003eJe ne suis pas responsable en cas de problème sur votre tablette ; vous\nprenez VOS responsabilités !\u003c/p\u003e\n\u003cp\u003ePour toute manœuvre root, flash, etc, veillez à ce que votre tablette soit\nimpérativement à plus de 50 % de charge de batterie… \u003cbr\u003e\nmieux vaut la brancher électriquement.\u003c/p\u003e\n\u003cp\u003e/!\\ Risque de brickage /!\\\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eTablettes testées :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eArchos 101 Oxygen\u003c/strong\u003e : \u003cspan class=\"green\"\u003eOK\u003c/span\u003e\n - VendorId: 0e79; ProductId: 50f8\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCdisplay\u003c/strong\u003e : \u003cspan class=\"green\"\u003eOK\u003c/span\u003e\n - VendorId:201e; ProductId: 4289\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePipo M8 HD\u003c/strong\u003e : \u003cspan class=\"green\"\u003eOK\u003c/span\u003e\n - VendorId: 2207; ProductId: 0010\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTeclast X89 Kindow\u003c/strong\u003e : \u003cspan class=\"green\"\u003eOK\u003c/span\u003e\n - VendorId: 8087; ProductId: 0a5f\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"pré-requis\"\u003ePré-requis\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUtiliser un ordinateur ayant des ports USB 2 - \u003cspan class=\"red\"\u003epas USB 3\u003c/span\u003e\n :\navec ces ports, il peut y avoir des difficultés de reconnaissance !\u003c/li\u003e\n\u003cli\u003ePour Debian :\n\u003cul\u003e\n\u003cli\u003e\u003cspan class=\"red\"\u003eavant wheezy, oubliez\u003c/span\u003e\n\u003c/li\u003e\n\u003cli\u003epour wheezy, utilisez les dépôts backports.\u003c/li\u003e\n\u003cli\u003epour Jessie, et Sid, utilisez les dépôts officiels.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eQue votre tablette soit en mode \u0026ldquo;Débogage USB\u0026rdquo; :\n\u003cstrong\u003eParamètres \u0026gt; {} Outils pour les développeurs \u0026gt; Déboguage USB [v]\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eEt, bien sûr, une connection Internet fonctionnelle…\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\u003eTant que le mode “Débogage USB” n\u0026rsquo;est pas actif, ou que vous ne pouvez pas\nl\u0026rsquo;activer, pas la peine de continuer… en effet, sans ce mode actif, le périphérique\nNE PEUT être reconnu !\u003c/p\u003e\n\u003cp\u003eCe mode s\u0026rsquo;active différemment selon la version d\u0026rsquo;Android.\u003c/p\u003e\n\u003cp\u003eVeuillez-vous référer à la documentation technique de votre périphérique…\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eIl faut installer les outils suivants : \u003cbr\u003e\n\u003ccode\u003eandroid-tools-adb android-tools-fastboot android-tools-fsutils\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLes deux derniers ne sont pas strictement nécessaires…\u003c/p\u003e\n\u003cp\u003eÀ vous de le faire, selon votre convenance - terminal-console, synaptic, etc.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePour faire reconnaître proprement la tablette, il faut :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDans un premier temps, connectez votre tablette, sur le port micro-usb -\n\u003cem\u003eet, non host\u003c/em\u003e - par câble usb à votre ordinateur. \u003cbr\u003e\n\u003cem\u003e(Peu importe le mode de connexion USB : MTP, PTP ou stockage USB)\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eOuvrez un terminal-console pour taper dedans la commande \u003ccode\u003elsusb\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eExemple : Pour une tablette PiPo, telle la M8HD, vous aurez comme réponse :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ lsusb\n(…)\nBus 002 Device 014: ID 2207:0010`\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eL\u0026rsquo;information importante est celle après \u003ccode\u003eID\u003c/code\u003e, dans ce cas : \u003ccode\u003e2207:0010\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela première série de 4 chiffres avant le symbole \u0026lsquo;:\u0026rsquo; est l\u0026rsquo;identifiant\nfabriquant - nommé \u003cstrong\u003eidVendor\u003c/strong\u003e -\u003c/li\u003e\n\u003cli\u003ela seconde série de 4 chiffres après le symbole \u0026lsquo;:\u0026rsquo; est l\u0026rsquo;identifiant du\nproduit - nommé \u003cstrong\u003eidProduct\u003c/strong\u003e -\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl nous faut créer une règle \u003ccode\u003eudev\u003c/code\u003e, et pour cela, écrire le fichier \u003ccode\u003e/etc/udev/rules.d/51-android.rules\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003eSUBSYSTEM==\u0026quot;usb\u0026quot;, ATTR{idVendor}==\u0026quot;2207\u0026quot;, MODE=\u0026quot;0666\u0026quot;, GROUP=\u0026quot;plugdev\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Modifiez dans cette règle selon les informations idVendor, idProduct que\nvous avez trouvées…\u003c/p\u003e\n\u003cp\u003eEnsuite, il nous faut créer/modifier un autre fichier utile \u003ccode\u003e~/.android/adb_usb.ini\u003c/code\u003e,\npour y ajouter l\u0026rsquo;information de l\u0026rsquo;identifiant du fabriquant de la manière\nsuivante, soit un \u003ccode\u003e0x\u003c/code\u003e suivi de idVendor, un identifiant par ligne.\u003c/p\u003e\n\u003cp\u003ePour l\u0026rsquo;exemple ci-dessus, ce serait \u003ccode\u003e0x2207\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Assurez-vous que votre utilisateur linux soit dans le groupe \u003ccode\u003eplugdev\u003c/code\u003e…\nsinon ajoutez-le ! \u003cbr\u003e\n\u003ccode\u003e# usermod -G plugdev votre_id_utilisateur\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Enregistrez le fichier, puis redémarrez udev : \u003cbr\u003e\n\u003ccode\u003e# service udev restart\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003ePour être sûr que la tablette soit reconnue, utilisez la commande \u003ccode\u003eadb devices\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb devices\nList of devices attached\nWAWJM5UMUW   device\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePour le reste, tapez la commande \u003ccode\u003eadb\u003c/code\u003e ; elle vous restituera les différentes\noptions !\u003c/p\u003e\n\u003ch2 id=\"erreurs\"\u003eErreurs\u003c/h2\u003e\n\u003ch3 id=\"adb--commande-introuvable\"\u003eadb : commande introuvable\u003c/h3\u003e\n\u003cp\u003eÊtes-vous sûr d\u0026rsquo;avoir \u003ca href=\"/fr/sys/android/reconnaissance-peripheriques/#installation\"\u003einstallé\u003c/a\u003e les outils \u003ccode\u003eadb\u003c/code\u003e ???\u003c/p\u003e\n\u003ch3 id=\"adb-devices--rien-nest-affiché\"\u003e\u0026lsquo;adb devices\u0026rsquo; : rien n\u0026rsquo;est affiché\u003c/h3\u003e\n\u003cp\u003eSi rien n\u0026rsquo;est reconnu, et donc qu\u0026rsquo;aucun device n\u0026rsquo;apparaît, c\u0026rsquo;est que vous\navez peut-être mal renseigné le fichier \u003ccode\u003e/etc/udev/rules.d/51-android.rules\u003c/code\u003e\net/ou n\u0026rsquo;avez pas redémarré le système udev !\u003c/p\u003e\n\u003cp\u003eSi malgré tout, vous êtes absolument sûr d\u0026rsquo;avoir bien rempli le fichier\nen question, et d\u0026rsquo;avoir redémarré udev, il peut être intéressant d\u0026rsquo;effectuer\nla manipulation suivante :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCréer le fichier \u003ccode\u003e~/.android/adb_usb.ini\u003c/code\u003e, et écrivez dedans \u003ccode\u003e0x\u003c/code\u003e suivi de\nvotre idVendor\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour la tablette PiPo M8HD, ce sera : \u003ccode\u003e0x2207\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRedémarrer le serveur adb : \u003ccode\u003e:# adb kill-server\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eExécutez à nouveau : \u003ccode\u003eadb devices\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"adb-devices---no-permissions\"\u003e\u003ccode\u003eadb devices\u003c/code\u003e : ???????????? no permissions\u003c/h3\u003e\n\u003cp\u003eLorsque je tape \u003ccode\u003eadb devices\u003c/code\u003e, le périphérique n\u0026rsquo;est pas reconnu et il est\naffiché \u003cstrong\u003e???????????? no permissions\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eIl vous faut tuer le serveur, le redémarrer avec des droits administrateur\nensuite le périphérique apparaîtra !\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb kill-server\n:# adb start-server\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"adb-devices--offline\"\u003e\u003ccode\u003eadb devices\u003c/code\u003e : offline\u003c/h3\u003e\n\u003cp\u003eLorsque je tape \u003ccode\u003eadb devices\u003c/code\u003e, le périphérique est reconnu mais affiché \u003cstrong\u003eoffline\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb devices\nList of devices attached\nWAWJM5UMUW   offline\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIl vous faudra alors :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edésactiver l\u0026rsquo;option \u0026ldquo;Débogage USB\u0026rdquo;…\u003c/li\u003e\n\u003cli\u003edéconnecter/reconnecter votre tablette à l\u0026rsquo;ordinateur, en débranchant/rebranchant\nle câble USB.\u003c/li\u003e\n\u003cli\u003eactiver à nouveau l\u0026rsquo;option \u0026ldquo;Débogage USB\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eÀ ce moment-là, essayez à nouveau la commande \u003ccode\u003eadb devices\u003c/code\u003e ; vous devriez\nvoir apparaître votre périphérique…  correctement !\u003c/p\u003e\n\u003ch3 id=\"error-while-loading-shared-libraries-libncursesso5\"\u003eerror while loading shared libraries: libncurses.so.5\u003c/h3\u003e\n\u003cp\u003eSi vous fonctionnez avec une distribution GNU/Linux 64 bits, c\u0026rsquo;est qu\u0026rsquo;il\nvous manque les librairies pour l\u0026rsquo;architecture 32 bits !\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cp\u003eVous pouvez lire mes autres articles, pour :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/android/root/\" title=\"Lien interne vers l\u0026#39;article : 'Rooter sa tablette Android 4.x'\"\u003eRooter sa tablette Android 4.x\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/android/sauvegarde-restauration/\" title=\"Lien interne vers l\u0026#39;article : 'Sauvegarder/Restaurer sa tablette Android'\"\u003eSauvegarder/Restaurer sa tablette Android\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/android/flash-rockchip/\" title=\"Lien interne vers l\u0026#39;article : 'Android 4.4 : Flasher sa tablette Rockchip'\"\u003eAndroid 4.4 : Flasher sa tablette Rockchip\u003c/a\u003e\n\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"remerciements\"\u003eRemerciements\u003c/h3\u003e\n\u003cp\u003eCe tutoriel n\u0026rsquo;aurait pas existé sans le fourmillement d\u0026rsquo;idées glanées ici et là…\nmerci à leurs auteurs respectifs !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eforum XDA : \u003ca href=\"http://forum.xda-developers.com/showthread.php?t=2262494\" rel=\"external\"\u003ehttp://forum.xda-developers.com/showthread.php?t=2262494\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://sorrodje.alter-it.org/index.php?article12/ubuntu-rooter-flasher-rom-sdk-android\" rel=\"external\"\u003ehttp://sorrodje.alter-it.org/index.php?article12/ubuntu-rooter-flasher-rom-sdk-android\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eJ\u0026rsquo;ai écrit ce tutoriel la première fois sur le \u003ca href=\"https://wiki.debian-fr.xyz/Reconna%C3%AEtre_sa_tablette\" rel=\"external\"\u003ewiki de la communauté Debian-fr.xyz\u003c/a\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment faire reconnaitre sa tablette Android sous Linux","tags":["Android","adb"],"date_published":"2016-07-13T09:37:51+02:00","date_modified":"2017-01-08T04:26:51+02:00"},{"id":"tag:doc.huc.fr.eu.org,2016-07-13:/fr/sys/android/root#69ffa4afb98c7167f70ab207f43a38304d1f92a43eeb93282deb2813b586d0e4","url":"https://it-log.fr.eu.org/fr/sys/android/root/","title":"Rooter sa tablette Android 4.x","author":{"name":"Stéphane HUC"},"content_text":"Description Tout d\u0026rsquo;abord commençons par cet avertissement auquel vous devez consentir, AUTREMENT passez votre chemin et fermer cette page :\nDangerJe ne suis pas responsable en cas de problème sur votre tablette ; vous prenez VOS responsabilités !\nPour toute manœuvre root, flash, etc, veillez à ce que votre tablette soit impérativement à plus de 50 % de charge de batterie… mieux vaut la brancher électriquement.\n/!\\ Risque de brickage /!\\\nFONCTIONNE AVEC ANDROID 4.2.2, 4.4.2, 4.4.4\nTablette testée :\nArchos 101 Oxygen : KO - n\u0026rsquo;est pas possible nativement car en mode production ! Pipo M8 HD : OK - 4.2.2, 4.4.2 Teclast X89 Kindow : OK - 4.4.4 Pré-requis Que votre tablette soit en mode \u0026ldquo;Débogage USB\u0026rdquo;… Que votre tablette soit reconnue par Linux… Il est prudent de sauvegarder votre tablette avant ! Obtenir Supersu Installation TOUTES les manipulations, que nous allons faire, se font dans un terminal console !\nDécompressez l\u0026rsquo;archive de Supersu, précédemment téléchargée et allez dans le répertoire de l\u0026rsquo;archive décompressée.\nVous trouverez dans l\u0026rsquo;archive de SuperSu des répertoires portant les noms relatifs aux différentes architectures matérielles de tablettes gérées :\n\u0026ldquo;arm\u0026rdquo; équivaut à \u0026ldquo;arm\u0026rdquo; - à savoir : c\u0026rsquo;est la valeur par défaut ! \u0026ldquo;armeabi-v7a\u0026rdquo; = \u0026ldquo;armv7\u0026rdquo; \u0026ldquo;x86\u0026rdquo; = \u0026ldquo;x86\u0026rdquo; \u0026ldquo;mip\u0026rdquo; ou \u0026ldquo;mips\u0026rdquo; = \u0026ldquo;mips\u0026rdquo; \u0026ldquo;arm64-v8a\u0026rdquo; = \u0026ldquo;arm64\u0026rdquo; \u0026ldquo;mips64\u0026rdquo; = \u0026ldquo;mips64\u0026rdquo; \u0026ldquo;x86_64\u0026rdquo; = \u0026ldquo;x64\u0026rdquo; Si dans l\u0026rsquo;archive de SuperSu, vous n\u0026rsquo;avez pas de répertoire correspondant à votre version, c\u0026rsquo;est que vous avez une ancienne version… téléchargez la plus récente !\nUtilisation Vérifions que la tablette soit \u0026ldquo;vue\u0026rdquo; :\n:$ adb devices List of devices attached WAWJM5UMUW device Mode écriture Entrons la tablette dans le mode en écriture nécessaire :\n:$ adb wait-for-device :$ adb root :$ adb remount Si la commande adb root restitue adbd cannot run as root in production build, cela semble compromis !\nSi la commande adb remount ne fonctionne pas :\nSi la commande précédente adb root a fonctionné ; essayez la commande : adb shell mount -o remount,rw /system Si elle ne fonctionne pas non plus… cela ne sert à rien d'aller plus loin ! Si la commande précédente adb root n\u0026rsquo;a pas fonctionné, et que vous avez le message suivant remount failed: permission denied… inutile d'aller plus loin ! Détections Version Android Détectons votre version Android :\n$ adb shell getprop ro.build.version.sdk 17 Si cela ne fonctionne pas, essayez ceci :\n$ adb shell cat /system/build.prop \u0026amp;#124; grep \u0026#34;ro.build.version.sdk=\u0026#34; ro.build.version.sdk=17 La version du sdk qui correspond au chiffre 17 est Jelly Bean. Si la commande vous restitue 19, nous avons bien KitKat. Architecture matérielle Détectons votre architecture :\n:$ adb shell getprop ro.product.cpu.abi armeabi-v7a Si cela ne fonctionne pas, essayez ceci :\n:$ adb shell cat /system/build.prop /default.prop \u0026amp;#124; grep -m 1 \u0026#34;ro.product.cpu.abi=\u0026#34; ro.product.cpu.abi=armeabi-v7a Les valeurs détectées correspondent aux architectures nommées par SuperSU !\nRootage Dirigez-vous dans le répertoire de l\u0026rsquo;archive décompressée de SuperSU !\nEn partant du principe que l\u0026rsquo;architecture détectée correspond à \u0026ldquo;armv7\u0026rdquo; - adaptez selon votre architecture - passons à la phase de rootage proprement dite :\n:$ adb push armv7/su /system/xbin/su :$ adb shell chown root.root /system/xbin/su :$ adb shell chmod 0755 /system/xbin/su Installons SuperSu :\n:$ adb push common/Superuser.apk /system/app/Superuser.apk :$ adb shell chown root.root /system/app/Superuser.apk :$ adb shell chmod 0644 /system/app/Superuser.apk KitKat : étapes supplémentaires Copier su en daemonsu, qui sera lancé en tant que service par le système au démarrage :\n:$ adb shell cp /system/xbin/su /system/xbin/daemonsu :$ adb shell chown root.root /system/xbin/daemonsu :$ adb shell chmod 0755 /system/xbin/daemonsu La deuxième étape est d\u0026rsquo;injecter le fichier install-recovery.sh - c\u0026rsquo;est lui qui lancera daemonsu au démarrage - :\n:$ adb push common/install-recovery.sh /system/etc/install-recovery.sh :$ adb shell chown root.root /system/etc/install-recovery.sh :$ adb shell chmod 0755 /system/etc/install-recovery.sh Pour finir Redémarrons proprement la tablette :\n:$ adb reboot adb kill-server Une fois, la tablette redémarrée, entrez dans votre session, il vous sera certainement demander de mettre-à-jour le binaire SuperSu : faites-le ! Sinon, cliquez sur l\u0026rsquo;icône de Supersu, et faites-la mise-à-jour qui sera demandée.\nPuis cliquez sur le binaire SuperSU - qui la première fois, vous demandera d\u0026rsquo;installer le binaire SU - choisissez le mode normal, quand il vous sera proposé \u0026ldquo;Normal\u0026rdquo; ou \u0026ldquo;TWRP\u0026rdquo;.\nSi le binaire vous informe que tout est ok, redémarrez à nouveau la tablette !\nDocumentations Vous pouvez lire mes autres articles, pour :\nSauvegarder/Restaurer sa tablette Android Android 4.4 : Flasher sa tablette Rockchip J\u0026rsquo;ai écrit ce tutoriel la première fois sur le wiki de la communauté Debian-fr.xyz ! ","content_html":"\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eTout d\u0026rsquo;abord commençons par cet avertissement auquel vous devez consentir,\nAUTREMENT passez votre chemin et fermer cette page :\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cp\u003eJe ne suis pas responsable en cas de problème sur votre tablette ; vous\nprenez VOS responsabilités !\u003c/p\u003e\n\u003cp\u003ePour toute manœuvre root, flash, etc, veillez à ce que votre tablette soit\nimpérativement à plus de 50 % de charge de batterie… \u003cbr\u003e\nmieux vaut la brancher électriquement.\u003c/p\u003e\n\u003cp\u003e/!\\ Risque de brickage /!\\\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003eFONCTIONNE AVEC ANDROID 4.2.2, 4.4.2, 4.4.4\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eTablette testée :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eArchos 101 Oxygen\u003c/strong\u003e : \u003cspan class=\"red\"\u003eKO\u003c/span\u003e\n - n\u0026rsquo;est pas possible\nnativement car en mode production !\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePipo M8 HD\u003c/strong\u003e : \u003cspan class=\"green\"\u003eOK\u003c/span\u003e\n - 4.2.2, 4.4.2\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTeclast X89 Kindow\u003c/strong\u003e : \u003cspan class=\"green\"\u003eOK\u003c/span\u003e\n - 4.4.4\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"pré-requis\"\u003ePré-requis\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eQue votre tablette soit en mode \u0026ldquo;Débogage USB\u0026rdquo;…\u003c/li\u003e\n\u003cli\u003eQue votre tablette soit \n\u003ca class=\"inside\" href=\"/fr/sys/android/reconnaissance-peripheriques/\" title=\"Lien interne vers l\u0026#39;article : 'Faire reconnaître sa tablette Android sous Linux'\"\u003ereconnue\u003c/a\u003e\n\npar Linux…\u003c/li\u003e\n\u003cli\u003eIl est prudent de \n\u003ca class=\"inside\" href=\"/fr/sys/android/sauvegarde-restauration/\" title=\"Lien interne vers l\u0026#39;article : 'Sauvegarder/Restaurer sa tablette Android'\"\u003esauvegarder\u003c/a\u003e\n\nvotre tablette avant !\u003c/li\u003e\n\u003cli\u003eObtenir \u003ca href=\"http://download.chainfire.eu/supersu\" rel=\"external\"\u003eSupersu\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eTOUTES les manipulations, que nous allons faire, se font dans un terminal console !\u003c/p\u003e\n\u003cp\u003eDécompressez l\u0026rsquo;archive de Supersu, précédemment téléchargée et allez dans\nle répertoire de l\u0026rsquo;archive décompressée.\u003c/p\u003e\n\u003cp\u003eVous trouverez dans l\u0026rsquo;archive de SuperSu des répertoires portant les noms\nrelatifs aux différentes architectures matérielles de tablettes gérées :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u0026ldquo;arm\u0026rdquo; équivaut à \u0026ldquo;arm\u0026rdquo; - à savoir : c\u0026rsquo;est la valeur par défaut !\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;armeabi-v7a\u0026rdquo; = \u0026ldquo;armv7\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;x86\u0026rdquo; = \u0026ldquo;x86\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;mip\u0026rdquo; ou \u0026ldquo;mips\u0026rdquo; = \u0026ldquo;mips\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;arm64-v8a\u0026rdquo; = \u0026ldquo;arm64\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;mips64\u0026rdquo; = \u0026ldquo;mips64\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;x86_64\u0026rdquo; = \u0026ldquo;x64\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi dans l\u0026rsquo;archive de SuperSu, vous n\u0026rsquo;avez pas de répertoire correspondant\nà votre version, c\u0026rsquo;est que vous avez une ancienne version… \u003cbr\u003e\ntéléchargez la plus récente !\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eVérifions que la tablette soit \u0026ldquo;vue\u0026rdquo; :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb devices\nList of devices attached\nWAWJM5UMUW   device\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"mode-écriture\"\u003eMode écriture\u003c/h3\u003e\n\u003cp\u003eEntrons la tablette dans le mode en écriture nécessaire :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb wait-for-device\n:$ adb root\n:$ adb remount\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi la commande \u003ccode\u003eadb root\u003c/code\u003e restitue \u003ccode\u003eadbd cannot run as root in production build\u003c/code\u003e,\n\u003cspan class=\"red\"\u003ecela semble compromis\u003c/span\u003e\n !\u003c/p\u003e\n\u003cp\u003eSi la commande \u003ccode\u003eadb remount\u003c/code\u003e ne fonctionne pas :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi la commande précédente \u003ccode\u003eadb root\u003c/code\u003e a fonctionné ; essayez la commande : \u003cbr\u003e\n\u003ccode\u003eadb shell mount -o remount,rw /system\u003c/code\u003e \u003cbr\u003e\n\u003cspan class=\"red\"\u003eSi elle ne fonctionne pas non plus… cela ne sert à rien\n    d'aller plus loin !\u003c/span\u003e\n\u003c/li\u003e\n\u003cli\u003eSi la commande précédente \u003ccode\u003eadb root\u003c/code\u003e n\u0026rsquo;a pas fonctionné, et que vous avez\nle message suivant \u003ccode\u003eremount failed: permission denied\u003c/code\u003e… \u003cbr\u003e\n\u003cspan class=\"red\"\u003einutile d'aller plus loin !\u003c/span\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"détections\"\u003eDétections\u003c/h3\u003e\n\u003ch4 id=\"version-android\"\u003eVersion Android\u003c/h4\u003e\n\u003cp\u003eDétectons votre version Android :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ adb shell getprop ro.build.version.sdk\n17\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi cela ne fonctionne pas, essayez ceci :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ adb shell cat /system/build.prop \u0026amp;#124; grep \u0026#34;ro.build.version.sdk=\u0026#34;\nro.build.version.sdk=17\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003eLa version du sdk qui correspond au chiffre \u003ccode\u003e17\u003c/code\u003e est Jelly Bean.\u003c/li\u003e\n\u003cli\u003eSi la commande vous restitue \u003ccode\u003e19\u003c/code\u003e, nous avons bien KitKat.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"architecture-matérielle\"\u003eArchitecture matérielle\u003c/h4\u003e\n\u003cp\u003eDétectons votre architecture :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb shell getprop ro.product.cpu.abi\narmeabi-v7a\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi cela ne fonctionne pas, essayez ceci :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb shell cat /system/build.prop /default.prop \u0026amp;#124; grep -m 1 \u0026#34;ro.product.cpu.abi=\u0026#34;\nro.product.cpu.abi=armeabi-v7a\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLes valeurs détectées correspondent aux architectures nommées par SuperSU !\u003c/p\u003e\n\u003ch3 id=\"rootage\"\u003eRootage\u003c/h3\u003e\n\u003cp\u003eDirigez-vous dans le répertoire de l\u0026rsquo;archive décompressée de SuperSU !\u003c/p\u003e\n\u003cp\u003eEn partant du principe que l\u0026rsquo;architecture détectée correspond à \u0026ldquo;armv7\u0026rdquo; -\n\u003cem\u003eadaptez selon votre architecture\u003c/em\u003e - passons à la phase de rootage proprement dite :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb push armv7/su /system/xbin/su\n:$ adb shell chown root.root /system/xbin/su\n:$ adb shell chmod 0755 /system/xbin/su\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eInstallons SuperSu :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb push common/Superuser.apk /system/app/Superuser.apk\n:$ adb shell chown root.root /system/app/Superuser.apk\n:$ adb shell chmod 0644 /system/app/Superuser.apk\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"kitkat--étapes-supplémentaires\"\u003eKitKat : étapes supplémentaires\u003c/h4\u003e\n\u003cp\u003eCopier \u003ccode\u003esu\u003c/code\u003e en \u003ccode\u003edaemonsu\u003c/code\u003e, qui sera lancé en tant que service par le système\nau démarrage :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb shell cp /system/xbin/su /system/xbin/daemonsu\n:$ adb shell chown root.root /system/xbin/daemonsu\n:$ adb shell chmod 0755 /system/xbin/daemonsu\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLa deuxième étape est d\u0026rsquo;injecter le fichier \u003ccode\u003einstall-recovery.sh\u003c/code\u003e -\n\u003cem\u003ec\u0026rsquo;est lui qui lancera daemonsu au démarrage\u003c/em\u003e - :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb push common/install-recovery.sh /system/etc/install-recovery.sh\n:$ adb shell chown root.root /system/etc/install-recovery.sh\n:$ adb shell chmod 0755 /system/etc/install-recovery.sh\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"pour-finir\"\u003ePour finir\u003c/h3\u003e\n\u003cp\u003eRedémarrons proprement la tablette :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ adb reboot\nadb kill-server\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUne fois, la tablette redémarrée, entrez dans votre session, il vous sera\ncertainement demander de mettre-à-jour le binaire SuperSu : faites-le !\nSinon, cliquez sur l\u0026rsquo;icône de Supersu, et faites-la mise-à-jour qui sera demandée.\u003c/p\u003e\n\u003cp\u003ePuis cliquez sur le binaire SuperSU - qui la première fois, vous demandera\nd\u0026rsquo;installer le binaire SU - choisissez le mode normal, quand il vous sera\nproposé \u0026ldquo;Normal\u0026rdquo; ou \u0026ldquo;TWRP\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eSi le binaire vous informe que tout est ok, redémarrez à nouveau la tablette !\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cp\u003eVous pouvez lire mes autres articles, pour :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/android/sauvegarde-restauration/\" title=\"Lien interne vers l\u0026#39;article : 'Sauvegarder/Restaurer sa tablette Android'\"\u003eSauvegarder/Restaurer sa tablette Android\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\n\n\u003ca class=\"inside\" href=\"/fr/sys/android/flash-rockchip/\" title=\"Lien interne vers l\u0026#39;article : 'Android 4.4 : Flasher sa tablette Rockchip'\"\u003eAndroid 4.4 : Flasher sa tablette Rockchip\u003c/a\u003e\n\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eJ\u0026rsquo;ai écrit ce tutoriel la première fois sur le \u003ca href=\"https://wiki.debian-fr.xyz/Rooter_sa_tablette\" rel=\"external\"\u003ewiki de la communauté Debian-fr.xyz\u003c/a\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003chr\u003e\n","summary":"Comment rooter sa tablette Android (4.2.2, 4.4.2, 4.4.4)","tags":["Android","adb"],"date_published":"2016-07-13T09:37:51+02:00","date_modified":"2016-12-16T10:19:51+02:00"},{"id":"tag:doc.huc.fr.eu.org,2013-01-14:/fr/sys/debian/nvidia-optimus-bumblebee#67810585fc37ccbe5da49e5fdfa794039f136ae99ea0c91632ebe1fde5d4eafa","url":"https://it-log.fr.eu.org/fr/sys/debian/nvidia-optimus-bumblebee/","title":"Debian : Nvidia Optimus Bumblebee","author":{"name":"Stéphane HUC"},"content_text":"Depuis Debian 11 Bullseye, publiée en Août 2021, cet article est obsolète. Merci de lire ce post sur le forum Debian-fr.org, qui explique ce qu\u0026rsquo;il faut faire.\nJe reprends le propos ici :\nD\u0026rsquo;après la page du wiki officiel Debian « Nvidia Optimus », section \u0026quot; Using NVIDIA PRIME Render Offload\u0026quot; 17, il est recommandé :\nde désactiver dans le Bios UEFI, l’option « Secure BOOT » ! il n’y a(ura) plus besoin d’installer le projet Bumblebee ; s\u0026rsquo;il est installé, il faut le supprimer absolument. d\u0026rsquo;installer directement le pilote propriétaire nVidia depuis les dépôts Debian puis utiliser à minima la variable d’environnement __NV_PRIME_RENDER_OFFLOAD=1 et d’ajouter dans certains cas la suivante __GLX_VENDOR_LIBRARY_NAME=nvidia. ⇒ Dans le contexte de Steam, il faut modifier les propriétés de jeux, en ajoutant le paramètrage complet : __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia %command%\nPlus d’informations et autres astuces, sur la page officielle nVidia primerenderoffload :\nhttps://us.download.nvidia.com/XFree86/Linux-x86_64/450.57/README/primerenderoffload.html De même, il est possible de se faire aider sur le forum des développeurs nvidia :\nhttps://forums.developer.nvidia.com/c/gpu-graphics/linux/148 Obsolète Cette documentation 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 ! Présentation Nvidia a créé une technologie hybride, appelée Optimus. Cette technologie a pour but d\u0026rsquo;utiliser la puce graphique intégrée, généralement de marque Intel, ainsi que le processeur graphique, couplée à la première puce, de marque Nvidia. Cela permet de faire fonctionner le GPU Nvidia, à la demande, lors de nécessités de fonctions 3D poussées (vidéos, jeux…), et de \u0026ldquo;rendre la main\u0026rdquo; à l\u0026rsquo;IGP Intel, soulageant ainsi la batterie, pour le reste.\nUn développeur a créé un projet, nommé Bumblebee, qui nous apporte une certaine gestion de cette technologie. Elle n\u0026rsquo;est pas complètement gérée, mais est fonctionnelle ! Néanmoins, la gestion HDMI n\u0026rsquo;est pas accessible…\nLa page du projet : http://www.bumblebee-project.org/ Le dépôt git : https://github.com/Bumblebee-Project/Bumblebee Informations DangerNE SURTOUT PAS CHERCHER À INSTALLER LES PILOTES NVIDIA PAR TOUTE AUTRE MÉTHODE !!! Si jamais vous l\u0026rsquo;avez fait, désinstallez tout avant : # apt remove --purge nvidia-* Nativement sous Linux, cette technologie n\u0026rsquo;est pas pleinement supportée.\nOfficiellement, depuis la version 319.12, Nvidia apporte son support, en phase bêta - cela nécessite de pouvoir connecter l\u0026rsquo;écran au GPU Nvidia ; cette option est modifiable par certains BIOS récents. Si votre pilote est plus ancien, ou que vous n\u0026rsquo;êtes pas dans ce cas de configuration matérielle, cette page est vraiment faite pour vous.\nAttentionNe pas utiliser le pilote Nvidia 340… la technologie Optimus n\u0026rsquo;est pas gérée, pour Linux - oubli/erreur du fabriquant ! C\u0026rsquo;est la version par défaut pour Jessie !!! Vérifications InfoCe tutoriel est plutôt à l\u0026rsquo;intention d\u0026rsquo;utilisateurs avancés de Debian - et, traite plus particulièrement de l\u0026rsquo;installation du projet Bumblebee pour sa gestion avec le pilote \u0026ldquo;privatif\u0026rdquo; nvidia. Merci d\u0026rsquo;en tenir compte… Si vous avez besoin d\u0026rsquo;un tutoriel décrivant étape par étape, préférez la lecture de ce tutoriel ! Vérification matérielle Si vous voulez être sûr d\u0026rsquo;avoir une telle technologie, entrez la commande suivante dans votre terminal préféré : lspci | egrep \u0026quot;VGA|3D|Display\u0026quot;\nSi le système vous répond, ainsi, avec deux lignes, telles que :\n:$ lspci | egrep \u0026#34;VGA|3D|Display\u0026#34; 00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09) 01:00.0 VGA compatible controller: NVIDIA Corporation GF108 [GeForce GT 540M] (rev ff) Alors, c\u0026rsquo;est votre cas !\nExplications\nla première information \u0026lsquo;01:00.0\u0026rsquo; est relative à l\u0026rsquo;option BusID - elle peut-être différente selon votre configuration matérielle. InfoINFORMATION : Ne cherchez pas à utiliser le pilote libre \u0026rsquo;nouveau' si votre carte graphique de fabriquant nvidia n\u0026rsquo;est pas supportée par celui-ci.\nPour savoir, si elle est supportée, lisez la page du \u0026ldquo;code name\u0026rdquo; fournie par le projet nouveau, et recherchez la mention correspondante à votre GPU.\nPuis selon le \u0026ldquo;code name\u0026rdquo; correspondant, lisez cette page pour connaître le support ou non de votre carte vidéo.\nSi votre carte graphique n\u0026rsquo;est pas supportée, utilisez directement le projet Bumblebee avec le pilote privatif !\nPour récapituler, il faut la version du serveur X suivante pour :\nl\u0026rsquo;architecture matérielle NV110, nommée Maxwell : xf86-video-nouveau-1.0.14\nl\u0026rsquo;architecture matérielle NV130, nommée Pascal : xf86-video-nouveau-1.0.15\nLa version du serveur X est disponible à partir de :\nJessie : 1.0.11 Stretch : 1.0.13 Buster : 1.0.16 De fait, les cartes de famille Maxwell, ou Pascal, n\u0026rsquo;ont pas le support du pilote libre ni pour Jessie, ni pour Stretch. Pour les plus récentes, passez directement à nvidia. Si votre carte graphique n\u0026rsquo;est pas supportée, ou semble mal supportée du fait de saccades, utilisez directement le projet Bumblebee avec le pilote privatif !\nVérification modules kernel Vérifiez que vous n\u0026rsquo;avez aucun des deux modules suivants installés et/ou chargés : :$ lsmod | egrep -i \u0026quot;nouveau|vga_switcheroo\u0026quot;\nSi c\u0026rsquo;est le cas, il faudra les décharger, à l\u0026rsquo;aide de la commande : `:# modprobe -r nom-du-module\nAttentionATTENTION : Il est possible que vous ayez le message d\u0026rsquo;erreur suivant \u0026lsquo;modprobe:FATAL:Module nouveau in use\u0026rsquo; lorsque vous cherchez à décharger le pilote… veuillez lire le chapitre concernant l\u0026rsquo;erreur, ci-dessous, en fin de page, à la section sus-nommée… sans trop vous en soucier, non plus ! Pré-requis Vérifier que vous avez bien les binaires, ci-dessous, installés :\nPour architecture 32bits : :# apt install gcc make linux-headers-i586 dkms bbswitch-dkms Pour architecture 32bits (Stretch Backports) : :# apt install -t stretch-backports gcc make linux-headers-i686 dkms bbswitch-dkms Pour architecture 64bits : :# apt install gcc make linux-headers-amd64 dkms bbswitch-dkms Puis, assurez-vous que le module bbswitch fonctionne bien : :# modprobe bbswitch load_state=0\nDernières vérifications Vérifiez que vous n\u0026rsquo;avez pas de fichier de configuration /etc/X11/xorg.conf, ni de répertoire /etc/X11/xorg.conf.d/ - si c\u0026rsquo;est le cas, supprimez-le avec vos droits administrateur !\nInstallation Gestion des dépôts La page wiki du projet Debian nous informe que les utilisateurs de Jessie, et Sid peuvent installer Bumblebee à partir des dépôts officiels Debian.\nDepuis le 26.05.2013, cela semble aussi le cas pour les utilisateurs des dépôts Wheezy-Backports !\nInfoNOTE : Il est aussi nécessaire de s\u0026rsquo;assurer d\u0026rsquo;avoir paramétré les dépôts contrib et non-free. Ajout support architecture 32 bits Architecture 64 bits : Pensez à ajouter la gestion de l\u0026rsquo;architecture i386, et installez en plus le package primus-libs-ia32 - anciennement primus-libs:i386 - si vous voulez faire fonctionner un binaire 32 bits.\nChoisir le pilote Mettez-à-jour votre système, et installez les binaires :\nbumblebee - rien que pour l\u0026rsquo;usage du pilote libre nouveau, ou bumblebee-nvidia - pour l\u0026rsquo;usage du pilote privatif Nvidia. pilote nouveau :# apt update \u0026amp;\u0026amp; apt install bumblebee mesa-utils\nAinsi que le fait remarquer le changelog, il est suggéré d\u0026rsquo;installer à-partir de la version 1.0.15-2 du serveur X nouveau le firmware firmware-misc-nonfree. Si vous exécutez Buster, ou supérieure, faites-le !\npilote nvidia :# apt update \u0026amp;\u0026amp; apt install bumblebee-nvidia primus nvidia-kernel-dkms nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver mesa-utils xserver-xorg-video-nvidia linux-headers-$(uname -r)\nPréférez la version des backports si elle est disponible !\n(En 2015, vous auriez pu subir ce bogue 735049…)\nInfoINFORMATION : Il semble nécessaire d\u0026rsquo;installer le binaire VirtualGL, requis par Optirun ; malheureusement il n\u0026rsquo;est pas dans les dépôts Debian.\nTéléchargez-le à partir de la page de téléchargement du projet… ne téléchargez pas l\u0026rsquo;archive .tar.gz ; cliquez sur le répertoire portant le nom de la dernière version en cours, puis vous trouverez parmi les différents fichiers un fichier portant le nom suivant virtualgl_num-version_arch.deb (où \u0026rsquo;num-version\u0026rsquo; est le numéro de version en cours, et \u0026lsquo;arch\u0026rsquo; est à choisir selon votre architecture…)… puis installez-le à l\u0026rsquo;aide de l\u0026rsquo;outil dpkg…\nsource\nConfiguration Ajout groupe Bumblebee AttentionATTENTION : Normalement cette étape est exécutée automatiquement lors de l\u0026rsquo;installation. À ne faire que si vous avez le message d\u0026rsquo;erreur ci-dessous ! Avec les droits administrateur, il vous faut ensuite ajouter votre utilisateur au groupe bumblebee : :# adduser ID_USER bumblebee\nPensez à redémarrer votre session, voire votre machine !\nConfigurations supplémentaires Les configurations ci-dessous ne sont normalement pas nécessaires !\nCes informations sont utiles au cas où se pose un souci relatif à l\u0026rsquo;utilisation.\nConfiguration pilote nvidia Il peut être utile d\u0026rsquo;informer Bumblebee d\u0026rsquo;utiliser le module nvidia, au lieu du module nouveau. Par défaut, il utilise le pilote nouveau.\nAvec des droits administrateur, il faut d\u0026rsquo;abord modifier le fichier /etc/bumblebee/bumblebee.conf pour configurer la ligne DRIVER=, telle que : DRIVER=nvidia\nAstuceSi nvidia ne fonctionne pas, changez pour DRIVER=nvidia-current. Pensez à redémarrer le service !\nListe noire : module nouveau Cela peut être intéressant de \u0026ldquo;blacklister\u0026rdquo; le module nouveau, si et seulement si, vous voulez n\u0026rsquo;utiliser que le pilote privatif Nvidia. (afin d\u0026rsquo;être sûr que ce ne sera pas ce module qui gérera la carte Nvidia, mais bien le pilote Nvidia !)\nCréez, avec vos droits administrateur, le fichier /etc/modprobe.d/nouveau-blacklist.conf, et ajoutez ces écritures :\nblacklist nouveau blacklist lbm-nouveau options nouveau modeset=0 alias nouveau off alias lbm-nouveau off upgrade Si le système ne le fait pas tout seul, comme un grand, pensez à faire courir à nouveau le module pour votre kernel, avec vos droits administrateur !\nAvec la commande dkms, telle que : :# dpkg-reconfigure nvidia-kernel-dkms\nGestion de la batterie Pour gérer correctement l\u0026rsquo;énergie de la batterie lors de l\u0026rsquo;usage de la carte Nvidia, il peut être nécessaire de créer le fichier /etc/modprobe.d/bbswitch.conf et d\u0026rsquo;y ajouter ceci - normalement le projet Bumblebee installe le paquet bbswitch et le gère correctement - : options bbswitch load_state=0 unload_state=0\nEnsuite, il vous faut modifier le fichier /etc/bumblebee/bumblebee.conf et configurer les lignes PMMethod ainsi : PMMethod=bbswitch\nPensez à redémarrer le service !\nEnsuite, testez le bon fonctionnement de la gestion de la batterie.\nSteam Ajoutez la variable d\u0026rsquo;environnement OPTIMUS_PREFIX : :# sh -c 'echo OPTIMUS_PREFIX=\\\u0026quot;primusrun\\\u0026quot; \u0026gt;\u0026gt; /etc/environment'\nDéloguez-vous de votre session pour vous reconnectez !\nPuis, pour chaque jeu, dont vous voulez profiter d\u0026rsquo;optirun, il faut modifier les propriétés de lancement de celui-ci. Exécutez Steam, allez dans votre librairie de jeux, sélectionnez le jeu en question, puis faites un clic droit dessus, et choisissez le menu \u0026ldquo;Properties\u0026rdquo;. Ensuite, cliquez sur le bouton [SET LAUNCH OPTIONS] et spécifiez dans le champ l\u0026rsquo;information qui suit : $OPTIMUS_PREFIX %command% Une solution plus simple est d\u0026rsquo;éditer les propriétés de lancement et d\u0026rsquo;ajouter directement : primusrun %command%\nUtilisation Toutes les étapes précédentes de vérifications, d\u0026rsquo; installations et de configurations, ayant été faites, vous pouvez être sûr que Bumblebee fonctionne grâce au binaire optirun. Donc, pour activer la gestion du GPU Nvidia, il faut faire précéder toute commande par l\u0026rsquo;usage de la commande optirun.\n:$ optirun [optirun-options] \u0026lt;application\u0026gt; [application-parameters]\nPour trouver la liste des options de optirun, vous pouvez, soit :\nlire la page du manuel avec la commande man optirun, exécuter : $ optirun --help Test Le premier test que vous pouvez faire est : :$ optirun glxgears -info\nPanel Nvidia Ne cherchez pas à l\u0026rsquo;utiliser en cliquant sur l\u0026rsquo;icône correspondante, dans votre menu, cela ne fonctionnera pas.\nIl vous faut le lancer ainsi - c\u0026rsquo;est le seul moyen ! - : :$ optirun nvidia-settings -c :8\nRedémarrage du service bumblebeed Selon votre version de debian :\nSi initd : /etc/init.d/bumblebeed restart Si service : service bumblebeed restart Si systemd : systemctl restart bumblebeed Dépannage InfoConcernant la gestion des erreurs ci-dessous, après avoir appliqué la correction, pensez à redémarrer le service ! Bogue 735049 ATTENTION : Depuis Janvier 2014, lors de l\u0026rsquo;installation du package bumblebee-nvidia, il est possible que vous ayez droit à un fenêtre d\u0026rsquo;avertissement vous demandant de créer le fichier xorg.conf !\nNE LE FAITES PAS ! NE LAISSEZ PAS l\u0026rsquo;outil debconf créer le fichier pour vous ! N\u0026rsquo;EXÉCUTEZ PAS l\u0026rsquo;outil nvidia-xconfig ! Bogue 735049 qui semble être résolu depuis octobre 2015 !\n[ERROR]Cannot access secondary GPU - error: Could not enable discrete graphics card Vérifiez le journal de dmesg pour savoir si vous trouvez la référence suivante : Refused to change power state, currently in D3\nCela semble être dû à un problème de gestion de l\u0026rsquo;ACPI (souvent retrouvés dans des portables de marque Dell) avec le noyau 4.8 et plus récent.\nPMMethod=none Éditez /etc/bumblebee/bumblebee.conf pour paramétrez PMMethod=none.\npcie_port_pm=off Si vous utilisez le pilote nvidia, il peut être utile de modifier le fichier /etc/default/grub pour ajouter la désactivation suivante : pcie_port_pm=off\nMettez-à-jour votre grub et redémarrez votre ordinateur :\n:# update-grub :# shutdown -r now source\n[ERROR]Cannot access secondary GPU - error: Could not load GPU driver InfoNOTE : Cette erreur peut-être générée par un des différents points suivants… veuillez les vérifier un par un, pas tous en même temps, cela ne sert à rien. Une fois qu\u0026rsquo;un point est vérifié/corrigé, redémarrez le service et essayez à nouveau votre commande. Si cela ne fonctionne pas, passez au point suivant qui peut aider à la résolution, et répétez le même processus de vérification/modification puis redémarrage du service adéquat - bien comprendre et accepter que cela ne réglera pas forcément votre problème ! Modification de \u0026ldquo;Driver\u0026rdquo; Ouvrez le fichier /etc/bumblebee/bumblebee.conf, avec les droits administrateur, et modifiez la ligne Driver= par Driver=nvidia.\nModification de \u0026ldquo;KernelDriver\u0026rdquo; Ouvrez le fichier /etc/bumblebee/bumblebee.conf, avec les droits administrateur, et dans la section [Driver-nvidia], vérifiez la ligne KernelDriver= qu\u0026rsquo;elle soit bien ainsi KernelDriver=nvidia-current.\nPour vérifier le nom du module nvidia, exécutez les deux commandes suivantes :\n:# modinfo nvidia :# modinfo nvidia-current` Normalement vous devriez avoir ces retours :\n:# modinfo nvidia modinfo: ERROR: Module nvidia not found. ou, par exemple :\n:# modinfo nvidia-current filename: /lib/modules/3.16.0-4-amd64/updates/dkms/nvidia-current.ko alias: char-major-195-* version: 340.96 supported: external license: NVIDIA (…) Si jamais, vous avez un résultat sur modinfo nvidia, modifiez la ligne KernelDriver= ainsi KernelDriver=nvidia \u0026lt;= ce qui ne devrait pas avoir lieu !\nSi aucune des deux commandes ne retourne rien, vous avez eu un souci lors de l\u0026rsquo;installation \u0026lt;= ce n\u0026rsquo;est pas normal ; cherchez la raison !\nBogue 717687\n[ERROR]Cannot access secondary GPU - error: [XORG] (EE) /dev/dri/card0: failed to set DRM interface version 1.4: Permission denied InfoNOTE : Cette erreur peut-être générée par un des différents points suivants… veuillez les vérifier un par un, pas tous en même temps, cela ne sert à rien. Une fois qu\u0026rsquo;un point est vérifié/corrigé, redémarrez le service et essayez à nouveau votre commande. Si cela ne fonctionne pas, passez au point suivant qui peut aider à la résolution, et répétez le même processus de vérification/modification puis redémarrage du service adéquat - bien comprendre et accepter que cela ne réglera pas forcément votre problème ! Vérification xserver-xorg-video-nvidia Vérifiez l\u0026rsquo;installation du paquet \u0026ldquo;xserver-xorg-video-nvidia\u0026rdquo; - s\u0026rsquo;il n\u0026rsquo;est pas installé, faites-le !\nModification fichier xorg.conf.nvidia Ouvrez le fichier /etc/bumblebee/xorg.conf.nvidia, et ajoutez les informations suivantes :\nSection \u0026#34;Screen\u0026#34; Identifier \u0026#34;Default Screen\u0026#34; Device \u0026#34;DiscreteNvidia\u0026#34; EndSection Bogue 756522 qui touche Debian Jessie, à-propos des Bumblebee versions : 3.2.1-5, 3.2.1-7 et nvidia versions : 340.*,\nVérification prise en charge par nouveau Si vous avez installé Bumblebee pour fonctionner avec le pilote libre \u0026rsquo;nouveau\u0026rsquo;, vérifiez le support de votre GPU nvidia par le pilote. Si votre version de GPU est bien prise en charge par le pilote \u0026rsquo;nouveau\u0026rsquo;, vérifiez l\u0026rsquo;écriture de l\u0026rsquo;identifiant de Bus PCI, tel que ci-dessous. S\u0026rsquo;il n\u0026rsquo;est pas pris-en-charge, installez la version \u0026ldquo;Bumblebee+nvidia\u0026rdquo;. Erreur Identifiant BusPCI Profitez-en pour vérifier l\u0026rsquo;écriture de l\u0026rsquo;identifiant du Bus PCI relatif à votre carte graphique Nvidia.\nAttentionATTENTION : L\u0026rsquo;identifiant de Bus PCI doit bien être écrit ainsi : BusID \u0026ldquo;PCI:01:00:0\u0026rdquo; - et non pas BusID \u0026ldquo;PCI:01:00.0\u0026rdquo;.\nParfois il peut être nécessaire de mettre en commentaire l\u0026rsquo;identifiant de Bus PCI, pour que cela puisse fonctionner correctement… ce qui normalement est le cas d\u0026rsquo;une installation par défaut !\nIncompatibilité Xorg \u0026gt;= 1.18 Si le serveur X est \u0026gt;= 1.18 et que votre Debian est une Testing, ou une Sid, il semble exister une incompatibilité entre le projet Bumblebee et le paquet xserver-xorg-legacy, donc virez ce dernier, s\u0026rsquo;il est installé !\nsource\n[ERROR]Cannot access secondary GPU - error: [XORG] (EE) Failed to load module \u0026ldquo;mouse\u0026rdquo; (module does not exist, 0) InfoNOTE : Cette erreur peut-être générée par un des différents points suivants… veuillez les vérifier un par un, pas tous en même temps, cela ne sert à rien. Une fois qu\u0026rsquo;un point est vérifié/corrigé, redémarrez le service et essayez à nouveau votre commande. Si cela ne fonctionne pas, passez au point suivant qui peut aider à la résolution, et répétez le même processus de vérification/modification puis redémarrage du service adéquat - bien comprendre et accepter que cela ne réglera pas forcément votre problème ! Vérifier xserver-xorg-input-mouse Vérifiez l\u0026rsquo;installation du paquet xserver-xorg-input-mouse, si ce n\u0026rsquo;est pas le cas, faites-le !\nVérifier le fichier xorg.conf.nvidia Vérifiez le fichier /etc/bumblebee/xorg.conf.nvidia.\nVérifier votre identifiant PCI Vérifiez que votre identifiant de Bus PCI soit correctement écrit !\n[ERROR]Cannot access secondary GPU - error: [XORG] (EE) No devices detected Ouvrez le fichier /etc/bumblebee/xorg.conf.nvidia, et modifiez l\u0026rsquo;option BusID. Vous trouverez cette information par l\u0026rsquo;usage de la commande lsusb…\nvoir le chapitre vérifications !\n[ERROR]Cannot access secondary GPU - error: [XORG] (EE) Problem parsing the config file Vérifiez le fichier de configuration que vous venez de modifier !!!\nQue ce soit /etc/bumblebee/xorg.config.nvidia ou /etc/bumblebee/xorg.config.nouveau, vous avez créé/modifié une section, et oublié/supprimé par erreur, de fermer correctement la section, voire une section est mal écrite !\n[ERROR]Could not connect to bumblebee daemon - is it running? Vérifiez que le service Bumblebee soit fonctionnel !\n[ERROR]Unknown accel/display bridge: Le \u0026ldquo;pont\u0026rdquo; (\u0026lsquo;bridge\u0026rsquo; en anglais) que vous cherchez à utiliser avec l\u0026rsquo;option -b d\u0026rsquo;optirun n\u0026rsquo;existe pas. Modifiez votre commande !!!\n[ERROR]You\u0026rsquo;ve no permission to communicate with the Bumblebee daemon. Try adding yourself to the \u0026lsquo;bumblebee\u0026rsquo; group Ce message d\u0026rsquo;erreur vous informe que votre identifiant utilisateur semble ne pas être ajouté groupe bumblebee.\nAjoutez-le !\nfallen off the bus InfoNOTE : Cette erreur peut-être générée par un des différents points suivants… veuillez les vérifier un par un, pas tous en même temps, cela ne sert à rien. Une fois qu\u0026rsquo;un point est vérifié/corrigé, redémarrez le service et essayez à nouveau votre commande. Si cela ne fonctionne pas, passez au point suivant qui peut aider à la résolution, et répétez le même processus de vérification/modification puis redémarrage du service adéquat - bien comprendre et accepter que cela ne réglera pas forcément votre problème ! Vérifiez la sortie dmesg !\nSi dmesg vous informe du souci GPU suivant fallen off the bus, il y a deux manières de régler le problème :\nTest \u0026ldquo;rcu_idle_gp_delay \u0026laquo;\u0026lt;1\u0026rdquo; Testez la commande suivante, avant le lancement d\u0026rsquo;optirun : :# tee /sys/module/rcutree/parameters/rcu_idle_gp_delay \u0026lt;\u0026lt;\u0026lt;1\nSi cela fonctionne en effet correctement, modifiez le fichier /etc/default/grub pour ajouter l\u0026rsquo;information suivante à la ligne de commande GRUB_CMDLINE_LINUX_DEFAULT : rcutree.rcu_idle_gp_delay=1.\nMettez-à-jour votre grub et redémarrez votre ordinateur :\n:# update-grub :# shutdown -r now Incompatibilité kernels (3.10 à 3.19) L\u0026rsquo;autre solution est de vérifier votre version de kernel linux - en effet ce problème concerne les noyaux versions 3.10 à 3.19 !\nSoit vous choisissez un noyau antérieur, soit vous upgradez sur un noyau plus récent !\nIl semble que ce soit surtout un bogue Nvidia… cf Bumblebee issue 445\nerror while loading shared libraries: libturbojpeg.so L\u0026rsquo;erreur complète est la suivante : error while loading shared libraries: libturbojpeg.so: cannot open shared object file: No such file or directory\nSi vous avez une architecture 32 ou 64 bits :\narchitecture 32 bits Si votre architecture est 32 bits, tapez dans votre terminal console préférée, cette commande avec les droits administrateur : # ln -s /usr/lib/i386-linux-gnu/libturbojpeg.so.0 /usr/lib/i386-linux-gnu/libturbojpeg.so\narchitecture 64 bits Si votre architecture est 64 bits, tapez cette commande-ci, toujours avec les droits administrateur : # ln -s /usr/lib/x86_64-linux-gnu/libturbojpeg.so.0 /usr/lib/x86_64-linux-gnu/libturbojpeg.so\nmodprobe:FATAL:Module nouveau in use Lors de l\u0026rsquo;installation, au tout début, il vous est dit de décharger le module nouveau. Si le système vous répond l\u0026rsquo;erreur suivante : modprobe:FATAL:Module nouveau in use, il est intéressant de le désactiver lors du démarrage du noyau.\nNe vous inquiétez pas trop de ce message d\u0026rsquo;erreur, mais plutôt paramétrez le fichier de configuration de grub /etc/default/grub afin de rajouter les paramètres noyau suivants nouveau.modeset=0 et modprobe.blacklist=nouveau dans la ligne de configuration relative à GRUB_CMDLINE_LINUX_DEFAULT, telle que, par exemple : GRUB_CMDLINE_LINUX_DEFAULT=\u0026quot;quiet nouveau.modeset=0 modprobe.blacklist=nouveau\u0026quot;\nMettez-à-jour votre grub… et redémarrez votre station.\nsource\nprimus: fatal: failed to load any of the libraries: (…)/libGL.so.1 Lorsque vous exécutez optirun, vous avez le retour d\u0026rsquo;erreur suivant :\n:$ primus: fatal: failed to load any of the libraries: /usr/lib/x86_64-linux-gnu/nvidia/libGL.so.1:/usr/lib/i386-linux-gnu/nvidia/libGL.so.1:/usr/lib/nvidia/libGL.so.1 /usr/lib/x86_64-linux-gnu/nvidia/libGL.so.1: cannot open shared object file: No such file or directory /usr/lib/i386-linux-gnu/nvidia/libGL.so.1: cannot open shared object file: No such file or directory /usr/lib/nvidia/libGL.so.1: cannot open shared object file: No such file or directory ou :\n:$ primus: fatal: failed to load any of the libraries: /usr/lib/x86_64-linux-gnu/ nvidia/libGL.so.1:/usr/lib/i386-linux-gnu/nvidia/libGL.so.1:/usr/lib/nvidia/libGL.so.1 /usr/lib/x86_64-linux-gnu/nvidia/libGL.so.1: wrong ELF class: ELFCLASS64 /usr/lib/i386-linux-gnu/nvidia/libGL.so.1: cannot open shared object file: No such file or directory /usr/lib/nvidia/libGL.so.1: cannot open shared object file: No such file or directory La première chose à tester est : $ primusrun glxgears Si cela fonctionne, alors précéder les commandes non pas avec optirun, mais primusrun. Sinon un bogue #867033 est ouvert… sachez que c\u0026rsquo;est galère à corriger, parce que même en installant les packages ci-dessous, vous ne serez pas sûr de résoudre le problème. Dans un premier temps, vérifiez que vous avez bien installé le package primus-libs-ia32. Vous pouvez essayer l\u0026rsquo;une des solutions suivantes - sachant qu\u0026rsquo;il n\u0026rsquo;y a aucune garantie de fonctionnement : Exécutez primusrun en le préfixant de l\u0026rsquo;option _GLVND_DISALLOW_PATCHING=1, tel que : _GLVND_DISALLOW_PATCHING=1 primusrun glxgears - (cf, la réponse 22) Éditez le fichier /usr/bin/primusrun, pour modifier la ligne PRIMUS_libGL=${PRIMUS_libGL:-'/usr/$LIB/primus'} par PRIMUS_libGL=${PRIMUS_libGL:-\u0026quot;/usr/$LIB/primus\u0026quot;} - c\u0026rsquo;est-à-dire changer les simples quotes en doubles quotes - (cf, la réponse 59) Essayez l\u0026rsquo;installation des packages suivants : libgl1-nvidia-glx libgl1-nvidia-glx:i386 nvidia-driver-libs nvidia-driver-libs-i386 Freezes diverses Il existe plusieurs raisons pour lesquelles le portable peut \u0026ldquo;freezer\u0026rdquo;, essayez les solutions proposées - en anglais :\nFreezes lors de l\u0026rsquo;activation du serveur graphique https://github.com/Bumblebee-Project/Bumblebee/issues/764#issuecomment-559980823 https://github.com/Bumblebee-Project/Bumblebee/issues/764#issuecomment-612384824 Freezes au boot https://github.com/Bumblebee-Project/Bumblebee/issues/1036#issuecomment-521974873 https://github.com/Bumblebee-Project/Bumblebee/issues/1036#issuecomment-612779453 Test du fonctionnement de la batterie Pour tester le fonctionnement :\nvous pouvez procéder ainsi en mode terminal : \\ :$ cat /proc/acpi/bbswitch 0000:01:00.0 OFF Lancement d\u0026rsquo;optirun : :$ optirun glxgears \u0026gt; /dev/null \u0026amp; [1] 4785 Vérification de bbswitch : :$ cat /proc/acpi/bbswitch 0000:01:00.0 ON Arrêt d\u0026rsquo;optirun, par l\u0026rsquo;appui simultanée des touches CTRL+C : [VGL] ERROR: in readback-- [VGL] 246: Window has been deleted by window manager [1]+ Termine 1 optirun glxgears \u0026gt; /dev/null Après avoir fermé la fenêtre de glxgears : :$ cat /proc/acpi/bbswitch 0000:01:00.0 OFF Documentations Vous pouvez retrouver un complément d\u0026rsquo;informations sur la page wiki du projet Debian… Sur le forum Debian-fr.org, à-partir du 23 août 2019, j\u0026rsquo;ai écrit ce complément d\u0026rsquo;informations titré \u0026quot;[Doc] Nvidia Optimus + Bumblebee : Dans quel état gère… [Infos]\u0026quot; qui montre à quel point la situation devient compliquée… je l\u0026rsquo;ai maintenu jusqu\u0026rsquo;en début 2020 - je n\u0026rsquo;ai de fait plus ce type d\u0026rsquo;architecture graphique ! J\u0026rsquo;ai écrit ce tutoriel la première fois en Janvier 2013, pour la communauté Debian-fr.xyz ;-) J\u0026rsquo;ai collaboré à l\u0026rsquo;écriture de cette page wiki pour la communauté Debian-Facile.org, depuis mai 2016. ","content_html":"\u003cp\u003eDepuis Debian 11 Bullseye, publiée en Août 2021, cet article est obsolète.\nMerci de lire ce\n\u003ca href=\"https://www.debian-fr.org/t/doc-nvidia-optimus-bumblebee-dans-quel-etat-gere-infos/79959/9?u=pengouinpdt\" rel=\"external\"\u003epost sur le forum Debian-fr.org\u003c/a\u003e,\nqui explique ce qu\u0026rsquo;il faut faire.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eJe reprends le propos ici :\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eD\u0026rsquo;après la page du wiki officiel Debian « Nvidia Optimus »,\nsection \u0026quot; Using NVIDIA PRIME Render Offload\u0026quot; 17, il est recommandé :\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cul\u003e\n\u003cli\u003ede désactiver dans le Bios UEFI, l’option « Secure BOOT » !\u003c/li\u003e\n\u003cli\u003eil n’y a(ura) plus besoin d’installer le projet Bumblebee ; s\u0026rsquo;il est installé,\nil faut le supprimer absolument.\u003c/li\u003e\n\u003cli\u003ed\u0026rsquo;installer directement le pilote propriétaire nVidia depuis les dépôts Debian\npuis utiliser à minima la variable d’environnement \u003ccode\u003e__NV_PRIME_RENDER_OFFLOAD=1\u003c/code\u003e\net d’ajouter dans certains cas la suivante \u003ccode\u003e__GLX_VENDOR_LIBRARY_NAME=nvidia\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Dans le contexte de Steam, il faut modifier les propriétés de jeux, en\najoutant le paramètrage complet :\n\u003ccode\u003e__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia %command%\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePlus d’informations et autres astuces, sur la page officielle nVidia \u003ca href=\"https://us.download.nvidia.com/XFree86/Linux-x86_64/450.57/README/primerenderoffload.html\" rel=\"external\"\u003eprimerenderoffload\u003c/a\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://us.download.nvidia.com/XFree86/Linux-x86_64/450.57/README/primerenderoffload.html\" rel=\"external\"\u003ehttps://us.download.nvidia.com/XFree86/Linux-x86_64/450.57/README/primerenderoffload.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDe même, il est possible de se faire aider sur le forum des développeurs nvidia :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://forums.developer.nvidia.com/c/gpu-graphics/linux/148\" rel=\"external\"\u003ehttps://forums.developer.nvidia.com/c/gpu-graphics/linux/148\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\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\u003eCette documentation 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=\"présentation\"\u003ePrésentation\u003c/h2\u003e\n\u003cp\u003eNvidia a créé une technologie hybride, appelée Optimus. Cette technologie\na pour but d\u0026rsquo;utiliser la puce graphique intégrée, généralement de marque\nIntel, ainsi que le processeur graphique, couplée à la première puce, de\nmarque Nvidia. Cela permet de faire fonctionner le GPU Nvidia, à la demande,\nlors de nécessités de fonctions 3D poussées (vidéos, jeux…), et de\n\u0026ldquo;rendre la main\u0026rdquo; à l\u0026rsquo;IGP Intel, soulageant ainsi la batterie, pour le reste.\u003c/p\u003e\n\u003cp\u003eUn développeur a créé un projet, nommé Bumblebee, qui nous apporte une\ncertaine gestion de cette technologie. Elle n\u0026rsquo;est pas complètement gérée,\nmais est fonctionnelle ! \u003cbr\u003e\nNéanmoins, la gestion HDMI n\u0026rsquo;est pas accessible…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLa page du projet : \u003ca href=\"http://www.bumblebee-project.org/\" rel=\"external\"\u003ehttp://www.bumblebee-project.org/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLe dépôt git : \u003ca href=\"https://github.com/Bumblebee-Project/Bumblebee\" rel=\"external\"\u003ehttps://github.com/Bumblebee-Project/Bumblebee\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"informations\"\u003eInformations\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cstrong\u003eNE SURTOUT PAS CHERCHER À INSTALLER LES PILOTES NVIDIA PAR TOUTE AUTRE MÉTHODE !!!\u003c/strong\u003e \u003cbr\u003e\nSi jamais vous l\u0026rsquo;avez fait, désinstallez tout avant :\n\u003ccode\u003e# apt remove --purge nvidia-*\u003c/code\u003e\u003c/div\u003e\n\n\u003cp\u003eNativement sous Linux, cette technologie n\u0026rsquo;est pas pleinement supportée.\u003cbr\u003e\nOfficiellement, depuis la version 319.12, Nvidia apporte son support, en\nphase bêta - cela nécessite de pouvoir connecter l\u0026rsquo;écran au GPU Nvidia ;\ncette option est modifiable par certains BIOS récents. \u003cbr\u003e\nSi votre pilote est plus ancien, ou que vous n\u0026rsquo;êtes pas dans ce cas de\nconfiguration matérielle, cette page est vraiment faite pour vous.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cstrong\u003eNe pas utiliser le pilote Nvidia 340\u003c/strong\u003e… la technologie Optimus n\u0026rsquo;est\npas gérée, pour Linux - oubli/erreur du fabriquant ! \u003cbr\u003e\nC\u0026rsquo;est la version \u003cstrong\u003epar défaut pour Jessie\u003c/strong\u003e !!!\u003c/div\u003e\n\n\u003chr\u003e\n\u003ch2 id=\"vérifications\"\u003eVérifications\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCe tutoriel est plutôt à l\u0026rsquo;intention d\u0026rsquo;utilisateurs avancés de Debian -\net, traite plus particulièrement de l\u0026rsquo;installation du projet Bumblebee pour\nsa gestion avec le pilote \u0026ldquo;privatif\u0026rdquo; nvidia. Merci d\u0026rsquo;en tenir compte… \u003cbr\u003e\nSi vous avez besoin d\u0026rsquo;un tutoriel décrivant étape par étape, préférez\nla \u003ca href=\"https://debian-facile.org/doc:materiel:cartes-graphique:nvidia:optimus\" rel=\"external\"\u003electure de ce tutoriel\u003c/a\u003e !\u003c/div\u003e\n\n\u003ch3 id=\"vérification-matérielle\"\u003eVérification matérielle\u003c/h3\u003e\n\u003cp\u003eSi vous voulez être sûr d\u0026rsquo;avoir une telle technologie, entrez la commande\nsuivante dans votre terminal préféré :\n\u003ccode\u003elspci | egrep \u0026quot;VGA|3D|Display\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi le système vous répond, ainsi, avec deux lignes, telles que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ lspci | egrep \u0026#34;VGA|3D|Display\u0026#34;\n00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)\n01:00.0 VGA compatible controller: NVIDIA Corporation GF108 [GeForce GT 540M] (rev ff)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAlors, c\u0026rsquo;est votre cas !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela première information \u0026lsquo;01:00.0\u0026rsquo; est relative à l\u0026rsquo;option BusID - elle\npeut-être différente selon votre configuration matérielle.\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\u003eINFORMATION\u003c/strong\u003e : Ne cherchez pas à utiliser le pilote libre \u0026rsquo;nouveau'\nsi votre carte graphique de fabriquant nvidia n\u0026rsquo;est pas supportée par\ncelui-ci.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003ePour savoir, si elle est supportée, lisez la \u003ca href=\"https://nouveau.freedesktop.org/wiki/CodeNames/\" rel=\"external\"\u003epage du \u0026ldquo;code name\u0026rdquo; fournie par le projet nouveau\u003c/a\u003e,\net recherchez la mention correspondante à votre GPU.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePuis selon le \u0026ldquo;code name\u0026rdquo; correspondant, lisez cette \u003ca href=\"https://nouveau.freedesktop.org/wiki/VideoAcceleration/\" rel=\"external\"\u003epage\u003c/a\u003e\npour connaître le support ou non de votre carte vidéo.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSi votre carte graphique n\u0026rsquo;est pas supportée, utilisez directement le\nprojet Bumblebee avec le pilote privatif !\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ePour récapituler, il faut la version du serveur X suivante pour :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003el\u0026rsquo;architecture matérielle NV110, nommée \u003cstrong\u003eMaxwell\u003c/strong\u003e : \u003cstrong\u003e\u003ca href=\"https://cgit.freedesktop.org/nouveau/xf86-video-nouveau/commit/?h=xf86-video-nouveau-1.0.14\u0026amp;id=e6479845ec0db20dc733c621b7967b751840a552\" rel=\"external\"\u003exf86-video-nouveau-1.0.14\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003el\u0026rsquo;architecture matérielle NV130, nommée \u003cstrong\u003ePascal\u003c/strong\u003e : \u003cstrong\u003e\u003ca href=\"https://cgit.freedesktop.org/nouveau/xf86-video-nouveau/commit/?id=e472b47d15634a864c8c981ed588d882aceaf26b\" rel=\"external\"\u003exf86-video-nouveau-1.0.15\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLa version du serveur X est disponible à partir de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eJessie : \u003ca href=\"https://packages.debian.org/jessie/xserver-xorg-video-nouveau\" rel=\"external\"\u003e1.0.11\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eStretch : \u003ca href=\"https://packages.debian.org/stretch/xserver-xorg-video-nouveau\" rel=\"external\"\u003e1.0.13\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBuster : \u003ca href=\"https://packages.debian.org/buster/xserver-xorg-video-nouveau\" rel=\"external\"\u003e1.0.16\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDe fait, \u003cstrong\u003eles cartes de famille Maxwell, ou Pascal, n\u0026rsquo;ont pas le support\ndu pilote libre ni pour Jessie, ni pour Stretch\u003c/strong\u003e. \u003cbr\u003e\n\u003cstrong\u003ePour les plus récentes, passez directement à nvidia\u003c/strong\u003e. \u003cbr\u003e\n\u003cstrong\u003eSi votre carte graphique n\u0026rsquo;est pas supportée, ou semble mal supportée du\nfait de saccades, utilisez directement le projet Bumblebee avec le pilote privatif !\u003c/strong\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"vérification-modules-kernel\"\u003eVérification modules kernel\u003c/h3\u003e\n\u003cp\u003eVérifiez que vous n\u0026rsquo;avez aucun des deux modules suivants installés et/ou chargés :\n\u003ccode\u003e:$ lsmod | egrep -i \u0026quot;nouveau|vga_switcheroo\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi c\u0026rsquo;est le cas, il faudra les décharger, à l\u0026rsquo;aide de la commande :\n`:# modprobe -r nom-du-module\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 : Il est possible que vous ayez le message d\u0026rsquo;erreur suivant\n\u0026lsquo;modprobe:FATAL:Module nouveau in use\u0026rsquo; lorsque vous cherchez à décharger\nle pilote… veuillez lire le chapitre concernant\nl\u0026rsquo;\u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#modprobefatalmodule-nouveau-in-use\"\u003eerreur\u003c/a\u003e, ci-dessous, en fin de page, à\nla section sus-nommée… \u003cbr\u003e\nsans trop vous en soucier, non plus !\u003c/div\u003e\n\n\u003ch3 id=\"pré-requis\"\u003ePré-requis\u003c/h3\u003e\n\u003cp\u003eVérifier que vous avez bien les binaires, ci-dessous, installés :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour architecture 32bits :\n\u003ccode\u003e:# apt install gcc make linux-headers-i586 dkms bbswitch-dkms\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour architecture 32bits (Stretch Backports) : \u003cbr\u003e\n\u003ccode\u003e:# apt install -t stretch-backports gcc make linux-headers-i686 dkms bbswitch-dkms\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour architecture 64bits : \u003cbr\u003e\n\u003ccode\u003e:# apt install gcc make linux-headers-amd64 dkms bbswitch-dkms\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuis, assurez-vous que le module bbswitch fonctionne bien : \u003cbr\u003e\n\u003ccode\u003e:# modprobe bbswitch load_state=0\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"dernières-vérifications\"\u003eDernières vérifications\u003c/h3\u003e\n\u003cp\u003eVérifiez que vous n\u0026rsquo;avez pas de fichier de configuration \u003ccode\u003e/etc/X11/xorg.conf\u003c/code\u003e,\nni de répertoire \u003ccode\u003e/etc/X11/xorg.conf.d/\u003c/code\u003e - si c\u0026rsquo;est le cas, supprimez-le\navec vos droits administrateur !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003ch3 id=\"gestion-des-dépôts\"\u003eGestion des dépôts\u003c/h3\u003e\n\u003cp\u003eLa \u003ca href=\"https://wiki.debian.org/fr/Bumblebee\" rel=\"external\"\u003epage wiki du projet Debian\u003c/a\u003e nous informe que les utilisateurs de \u003ca href=\"http://packages.debian.org/search?suite=jessie\u0026amp;searchon=names\u0026amp;keywords=bumblebee\" rel=\"external\"\u003eJessie\u003c/a\u003e,\net \u003ca href=\"http://packages.debian.org/search?suite=sid\u0026amp;searchon=names\u0026amp;keywords=bumblebee\" rel=\"external\"\u003eSid\u003c/a\u003e peuvent installer Bumblebee à partir des dépôts officiels Debian.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eDepuis le 26.05.2013, cela semble aussi le cas pour les utilisateurs des\ndépôts \u003ca href=\"http://backports.debian.org/changes/wheezy-backports.html\" rel=\"external\"\u003eWheezy-Backports\u003c/a\u003e !\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\"\u003e\u003cstrong\u003eNOTE\u003c/strong\u003e : Il est aussi nécessaire de s\u0026rsquo;assurer d\u0026rsquo;avoir paramétré les dépôts\n\u003ccode\u003econtrib\u003c/code\u003e et \u003ccode\u003enon-free\u003c/code\u003e.\u003c/div\u003e\n\n\u003ch3 id=\"ajout-support-architecture-32-bits\"\u003eAjout support architecture 32 bits\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eArchitecture 64 bits\u003c/strong\u003e : Pensez à \u003cstrong\u003eajouter la gestion de l\u0026rsquo;architecture i386\u003c/strong\u003e,\net installez en plus le package \u003ccode\u003eprimus-libs-ia32\u003c/code\u003e - anciennement \u003cem\u003eprimus-libs:i386\u003c/em\u003e -\nsi vous voulez faire fonctionner un binaire 32 bits.\u003c/p\u003e\n\u003ch3 id=\"choisir-le-pilote\"\u003eChoisir le pilote\u003c/h3\u003e\n\u003cp\u003eMettez-à-jour votre système, et installez les binaires :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ebumblebee\u003c/code\u003e - rien que pour l\u0026rsquo;usage du \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#pilote-nouveau\"\u003epilote libre nouveau\u003c/a\u003e,\u003c/li\u003e\n\u003cli\u003eou \u003ccode\u003ebumblebee-nvidia\u003c/code\u003e - pour l\u0026rsquo;usage du \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#pilote-nvidia\"\u003epilote privatif Nvidia\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"pilote-nouveau\"\u003epilote nouveau\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003e:# apt update \u0026amp;\u0026amp; apt install bumblebee mesa-utils\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAinsi que le fait remarquer le \u003ca href=\"https://metadata.ftp-master.debian.org/changelogs//main/x/xserver-xorg-video-nouveau/xserver-xorg-video-nouveau_1.0.16-1_changelog\" rel=\"external\"\u003echangelog\u003c/a\u003e, il est suggéré d\u0026rsquo;installer\nà-partir de la version 1.0.15-2 du serveur X nouveau le firmware \u003cem\u003efirmware-misc-nonfree\u003c/em\u003e. \u003cbr\u003e\n\u003cstrong\u003eSi vous exécutez Buster, ou supérieure, faites-le !\u003c/strong\u003e\u003c/p\u003e\n\u003ch4 id=\"pilote-nvidia\"\u003epilote nvidia\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003e:# apt update \u0026amp;\u0026amp; apt install bumblebee-nvidia primus nvidia-kernel-dkms nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver mesa-utils xserver-xorg-video-nvidia linux-headers-$(uname -r)\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePréférez la version des backports si elle est disponible !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e(En 2015, vous auriez pu subir ce \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#bogue-735049\"\u003ebogue 735049\u003c/a\u003e…)\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\"\u003e\u003cp\u003e\u003cstrong\u003eINFORMATION\u003c/strong\u003e : Il semble nécessaire d\u0026rsquo;installer le binaire \u003ca href=\"http://www.virtualgl.org/\" rel=\"external\"\u003eVirtualGL\u003c/a\u003e,\nrequis par Optirun ; malheureusement il n\u0026rsquo;est pas dans les dépôts Debian.\u003c/p\u003e\n\u003cp\u003eTéléchargez-le à partir de la \u003ca href=\"https://sourceforge.net/projects/virtualgl/files/\" rel=\"external\"\u003epage de téléchargement du projet\u003c/a\u003e…\n\u003cstrong\u003ene téléchargez pas l\u0026rsquo;archive .tar.gz\u003c/strong\u003e ; cliquez sur le répertoire portant\nle nom de la dernière version en cours, puis vous trouverez parmi les\ndifférents fichiers un fichier portant le nom suivant \u003cem\u003evirtualgl_num-version_arch.deb\u003c/em\u003e\n(où \u0026rsquo;num-version\u0026rsquo; est le numéro de version en cours, et \u0026lsquo;arch\u0026rsquo; est à choisir\nselon votre architecture…)… \u003cbr\u003e\npuis installez-le à l\u0026rsquo;aide de l\u0026rsquo;outil \u003ccode\u003edpkg\u003c/code\u003e…\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003ca href=\"https://fixmynix.com/install-and-configure-nvidia-optimus-with-bumblebee-in-debian/\" rel=\"external\"\u003esource\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"ajout-groupe-bumblebee\"\u003eAjout groupe Bumblebee\u003c/h3\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 : Normalement cette étape est exécutée automatiquement lors\nde l\u0026rsquo;installation. À ne faire que si vous avez le \u003ca\u003emessage d\u0026rsquo;erreur\u003c/a\u003e\nci-dessous !\u003c/div\u003e\n\n\u003cp\u003eAvec les droits administrateur, il vous faut ensuite ajouter votre utilisateur\nau groupe bumblebee :  \u003cbr\u003e\n\u003ccode\u003e:# adduser ID_USER bumblebee\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePensez à redémarrer votre session, voire votre machine !\u003c/p\u003e\n\u003ch3 id=\"configurations-supplémentaires\"\u003eConfigurations supplémentaires\u003c/h3\u003e\n\u003cp\u003eLes configurations ci-dessous ne sont normalement pas nécessaires !\u003c/p\u003e\n\u003cp\u003eCes informations sont utiles au cas où se pose un souci relatif à\nl\u0026rsquo;\u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#utilisation\"\u003eutilisation\u003c/a\u003e.\u003c/p\u003e\n\u003ch4 id=\"configuration-pilote-nvidia\"\u003eConfiguration pilote nvidia\u003c/h4\u003e\n\u003cp\u003eIl peut être utile d\u0026rsquo;informer Bumblebee d\u0026rsquo;utiliser le module \u003cem\u003envidia\u003c/em\u003e,\nau lieu du module \u003cem\u003enouveau\u003c/em\u003e. Par défaut, il utilise le pilote nouveau.\u003c/p\u003e\n\u003cp\u003eAvec des droits administrateur, il faut d\u0026rsquo;abord modifier le fichier\n\u003ccode\u003e/etc/bumblebee/bumblebee.conf\u003c/code\u003e\npour configurer la ligne \u003ccode\u003eDRIVER=\u003c/code\u003e, telle que : \u003cbr\u003e\n\u003ccode\u003eDRIVER=nvidia\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\"\u003eSi \u003ccode\u003envidia\u003c/code\u003e ne fonctionne pas, changez pour \u003ccode\u003eDRIVER=nvidia-current\u003c/code\u003e.\u003c/div\u003e\n\n\u003cp\u003ePensez à \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#redemarrage-du-service-bumblebeed\"\u003eredémarrer le service\u003c/a\u003e !\u003c/p\u003e\n\u003ch4 id=\"liste-noire--module-nouveau\"\u003eListe noire : module nouveau\u003c/h4\u003e\n\u003cp\u003eCela peut être intéressant de \u0026ldquo;blacklister\u0026rdquo; le module nouveau, si et seulement si,\nvous voulez n\u0026rsquo;utiliser que le pilote privatif Nvidia. \u003cbr\u003e\n\u003cem\u003e(afin d\u0026rsquo;être sûr que ce ne sera pas ce module qui gérera la carte Nvidia, mais\nbien le pilote Nvidia !)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eCréez, avec vos droits administrateur, le fichier \u003ccode\u003e/etc/modprobe.d/nouveau-blacklist.conf\u003c/code\u003e,\net ajoutez ces écritures :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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\"\u003eblacklist nouveau\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblacklist lbm-nouveau\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eoptions nouveau modeset\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\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias nouveau off\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias lbm-nouveau off\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"upgrade\"\u003eupgrade\u003c/h4\u003e\n\u003cp\u003eSi le système ne le fait pas tout seul, comme un grand, pensez à faire\ncourir à nouveau le module pour votre kernel, avec vos droits administrateur !\u003c/p\u003e\n\u003cp\u003eAvec la commande \u003ccode\u003edkms\u003c/code\u003e, telle que : \u003cbr\u003e\n\u003ccode\u003e:# dpkg-reconfigure nvidia-kernel-dkms\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"gestion-de-la-batterie\"\u003eGestion de la batterie\u003c/h4\u003e\n\u003cp\u003ePour gérer correctement l\u0026rsquo;énergie de la batterie lors de l\u0026rsquo;usage de la\ncarte Nvidia, il peut être nécessaire de créer le fichier\n\u003ccode\u003e/etc/modprobe.d/bbswitch.conf\u003c/code\u003e et d\u0026rsquo;y ajouter ceci - normalement le projet\nBumblebee installe le paquet \u003cstrong\u003ebbswitch\u003c/strong\u003e et le gère correctement - : \u003cbr\u003e\n\u003ccode\u003eoptions bbswitch load_state=0 unload_state=0\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEnsuite, il vous faut modifier le fichier \u003ccode\u003e/etc/bumblebee/bumblebee.conf\u003c/code\u003e\net configurer les lignes \u003ccode\u003ePMMethod\u003c/code\u003e ainsi : \u003cbr\u003e\n\u003ccode\u003ePMMethod=bbswitch\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePensez à \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#redemarrage-du-service-bumblebeed\"\u003eredémarrer le service\u003c/a\u003e !\u003c/p\u003e\n\u003cp\u003eEnsuite, \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#test-du-fonctionnement-de-la-batterie\"\u003etestez le bon fonctionnement\u003c/a\u003e\nde la gestion de la batterie.\u003c/p\u003e\n\u003ch4 id=\"steam\"\u003eSteam\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eAjoutez la variable d\u0026rsquo;environnement \u003ccode\u003eOPTIMUS_PREFIX\u003c/code\u003e :\n\u003ccode\u003e:# sh -c 'echo OPTIMUS_PREFIX=\\\u0026quot;primusrun\\\u0026quot; \u0026gt;\u0026gt; /etc/environment'\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDéloguez-vous de votre session pour vous reconnectez !\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePuis, pour chaque jeu, dont vous voulez profiter d\u0026rsquo;optirun, il faut\nmodifier les propriétés de lancement de celui-ci. \u003cbr\u003e\nExécutez Steam, allez dans votre librairie de jeux, sélectionnez le jeu\nen question, puis faites un clic droit dessus, et choisissez le menu \u0026ldquo;Properties\u0026rdquo;. \u003cbr\u003e\nEnsuite, cliquez sur le bouton [SET LAUNCH OPTIONS] et spécifiez dans le\nchamp l\u0026rsquo;information qui suit : \u003cbr\u003e\n\u003ccode\u003e$OPTIMUS_PREFIX %command%\u003c/code\u003e \u003cbr\u003e\nUne solution plus simple est d\u0026rsquo;éditer les propriétés de lancement et d\u0026rsquo;ajouter\ndirectement : \u003cbr\u003e\n\u003ccode\u003eprimusrun %command%\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eToutes les étapes précédentes de \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#verifications\"\u003evérifications\u003c/a\u003e, d\u0026rsquo;\n\u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#installation\"\u003einstallations\u003c/a\u003e et de \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#configuration\"\u003econfigurations\u003c/a\u003e,\nayant été faites, vous pouvez être sûr que Bumblebee fonctionne grâce au\nbinaire \u003cstrong\u003eoptirun\u003c/strong\u003e. \u003cbr\u003e\nDonc, pour activer la gestion du GPU Nvidia, il faut faire précéder toute\ncommande par l\u0026rsquo;usage de la commande \u003ccode\u003eoptirun\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ optirun [optirun-options] \u0026lt;application\u0026gt; [application-parameters]\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour trouver la liste des options de optirun, vous pouvez, soit :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003elire la page du manuel avec la commande \u003ccode\u003eman optirun\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003eexécuter : \u003ccode\u003e$ optirun --help\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"test\"\u003eTest\u003c/h3\u003e\n\u003cp\u003eLe premier test que vous pouvez faire est :  \u003cbr\u003e\n\u003ccode\u003e:$ optirun glxgears -info\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"panel-nvidia\"\u003ePanel Nvidia\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eNe cherchez pas à l\u0026rsquo;utiliser en cliquant sur l\u0026rsquo;icône correspondante, dans\nvotre menu, cela ne fonctionnera pas.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eIl vous faut le lancer ainsi - c\u0026rsquo;est le seul moyen ! - : \u003cbr\u003e\n\u003ccode\u003e:$ optirun nvidia-settings -c :8\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"redémarrage-du-service-bumblebeed\"\u003eRedémarrage du service bumblebeed\u003c/h3\u003e\n\u003cp\u003eSelon votre version de debian :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi \u003cstrong\u003einitd\u003c/strong\u003e : \u003ccode\u003e/etc/init.d/bumblebeed restart\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSi \u003cstrong\u003eservice\u003c/strong\u003e : \u003ccode\u003eservice bumblebeed restart\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSi \u003cstrong\u003esystemd\u003c/strong\u003e : \u003ccode\u003esystemctl restart bumblebeed\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eConcernant la gestion des erreurs ci-dessous, après avoir appliqué la correction,\npensez à \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#redemarrage-du-service-bumblebeed\"\u003eredémarrer le service\u003c/a\u003e !\u003c/div\u003e\n\n\u003ch3 id=\"bogue-735049\"\u003eBogue 735049\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Depuis Janvier 2014, lors de l\u0026rsquo;installation du package\n\u003cem\u003ebumblebee-nvidia\u003c/em\u003e, il est possible que vous ayez droit à un fenêtre d\u0026rsquo;avertissement\nvous demandant de créer le fichier xorg.conf !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNE LE FAITES PAS !\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNE LAISSEZ PAS\u003c/strong\u003e l\u0026rsquo;outil debconf créer le fichier pour vous !\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eN\u0026rsquo;EXÉCUTEZ PAS\u003c/strong\u003e l\u0026rsquo;outil nvidia-xconfig !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eBogue \u003ca href=\"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=735049\" rel=\"external\"\u003e735049\u003c/a\u003e qui semble être résolu depuis octobre 2015 !\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"errorcannot-access-secondary-gpu---error-could-not-enable-discrete-graphics-card\"\u003e[ERROR]Cannot access secondary GPU - error: Could not enable discrete graphics card\u003c/h3\u003e\n\u003cp\u003eVérifiez le journal de dmesg pour savoir si vous trouvez la référence suivante : \u003cbr\u003e\n\u003ccode\u003eRefused to change power state, currently in D3\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCela semble être dû à un problème de gestion de l\u0026rsquo;ACPI \u003cem\u003e(souvent retrouvés\ndans des portables de marque Dell)\u003c/em\u003e avec le noyau 4.8 et plus récent.\u003c/p\u003e\n\u003ch4 id=\"pmmethodnone\"\u003ePMMethod=none\u003c/h4\u003e\n\u003cp\u003eÉditez \u003ccode\u003e/etc/bumblebee/bumblebee.conf\u003c/code\u003e pour paramétrez \u003ccode\u003ePMMethod=none\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"pcie_port_pmoff\"\u003epcie_port_pm=off\u003c/h4\u003e\n\u003cp\u003eSi vous utilisez le pilote nvidia, il peut être utile de modifier le\nfichier \u003ccode\u003e/etc/default/grub\u003c/code\u003e  pour ajouter la désactivation suivante : \u003cbr\u003e\n\u003ccode\u003epcie_port_pm=off\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMettez-à-jour votre grub et redémarrez votre ordinateur :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# update-grub\n:# shutdown -r now\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003e\u003ca href=\"https://github.com/Bumblebee-Project/bbswitch/issues/140#issuecomment-403306682\" rel=\"external\"\u003esource\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"errorcannot-access-secondary-gpu---error-could-not-load-gpu-driver\"\u003e[ERROR]Cannot access secondary GPU - error: Could not load GPU driver\u003c/h3\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 : Cette erreur peut-être générée par un des différents points suivants…\nveuillez les vérifier un par un, pas tous en même temps, cela ne sert à rien.\nUne fois qu\u0026rsquo;un point est vérifié/corrigé, \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#redemarrage-du-service-bumblebeed\"\u003eredémarrez le service\u003c/a\u003e\net essayez à nouveau votre commande. \u003cbr\u003e\nSi cela ne fonctionne pas, passez au point suivant qui peut aider à la résolution,\net répétez le même processus de vérification/modification puis redémarrage\ndu service adéquat - \u003cstrong\u003ebien comprendre et accepter que cela ne réglera pas\nforcément votre problème !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch4 id=\"modification-de-driver\"\u003eModification de \u0026ldquo;Driver\u0026rdquo;\u003c/h4\u003e\n\u003cp\u003eOuvrez le fichier \u003ccode\u003e/etc/bumblebee/bumblebee.conf\u003c/code\u003e, avec les droits administrateur,\net modifiez la ligne \u003ccode\u003eDriver=\u003c/code\u003e par \u003ccode\u003eDriver=nvidia\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"modification-de-kerneldriver\"\u003eModification de \u0026ldquo;KernelDriver\u0026rdquo;\u003c/h4\u003e\n\u003cp\u003eOuvrez le fichier \u003ccode\u003e/etc/bumblebee/bumblebee.conf\u003c/code\u003e, avec les droits administrateur,\net dans la section \u003ccode\u003e[Driver-nvidia]\u003c/code\u003e, vérifiez la ligne \u003ccode\u003eKernelDriver=\u003c/code\u003e\nqu\u0026rsquo;elle soit bien ainsi \u003ccode\u003eKernelDriver=nvidia-current\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePour vérifier le nom du module nvidia, exécutez les deux commandes suivantes :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# modinfo nvidia\n:# modinfo nvidia-current`\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNormalement vous devriez avoir ces retours :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# modinfo nvidia\nmodinfo: ERROR: Module nvidia not found.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eou, par exemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:#  modinfo nvidia-current\nfilename: /lib/modules/3.16.0-4-amd64/updates/dkms/nvidia-current.ko\nalias: char-major-195-*\nversion: 340.96\nsupported: external\nlicense: NVIDIA\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi jamais, vous avez un résultat sur \u003ccode\u003emodinfo nvidia\u003c/code\u003e, modifiez la ligne\n\u003ccode\u003eKernelDriver=\u003c/code\u003e ainsi \u003ccode\u003eKernelDriver=nvidia\u003c/code\u003e \u0026lt;= \u003cstrong\u003ece qui ne devrait pas avoir\nlieu !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSi aucune des deux commandes ne retourne rien, vous avez eu un souci lors\nde l\u0026rsquo;installation \u0026lt;= \u003cstrong\u003ece n\u0026rsquo;est pas normal ; cherchez la raison !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eBogue \u003ca href=\"https://bugs.debian.org/717687\" rel=\"external\"\u003e717687\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"errorcannot-access-secondary-gpu---error-xorg-ee-devdricard0-failed-to-set-drm-interface-version-14-permission-denied\"\u003e[ERROR]Cannot access secondary GPU - error: [XORG] (EE) /dev/dri/card0: failed to set DRM interface version 1.4: Permission denied\u003c/h3\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 : Cette erreur peut-être générée par un des différents points suivants…\nveuillez les vérifier un par un, pas tous en même temps, cela ne sert à rien.\nUne fois qu\u0026rsquo;un point est vérifié/corrigé, \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#redemarrage-du-service-bumblebeed\"\u003eredémarrez le service\u003c/a\u003e\net essayez à nouveau votre commande. \u003cbr\u003e\nSi cela ne fonctionne pas, passez au point suivant qui peut aider à la résolution,\net répétez le même processus de vérification/modification puis redémarrage\ndu service adéquat - \u003cstrong\u003ebien comprendre et accepter que cela ne réglera pas\nforcément votre problème !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch4 id=\"vérification-xserver-xorg-video-nvidia\"\u003eVérification xserver-xorg-video-nvidia\u003c/h4\u003e\n\u003cp\u003eVérifiez l\u0026rsquo;installation du paquet \u0026ldquo;xserver-xorg-video-nvidia\u0026rdquo; - \u003cstrong\u003es\u0026rsquo;il n\u0026rsquo;est\npas installé, faites-le !\u003c/strong\u003e\u003c/p\u003e\n\u003ch4 id=\"modification-fichier-xorgconfnvidia\"\u003eModification fichier xorg.conf.nvidia\u003c/h4\u003e\n\u003cp\u003eOuvrez le fichier \u003ccode\u003e/etc/bumblebee/xorg.conf.nvidia\u003c/code\u003e, et ajoutez les informations\nsuivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#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;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;Default Screen\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;DiscreteNvidia\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\u003cp\u003e\u003cem\u003e\u003cstrong\u003eBogue \u003ca href=\"https://bugs.debian.org/756522\" rel=\"external\"\u003e756522\u003c/a\u003e\u003c/strong\u003e qui touche \u003cstrong\u003eDebian Jessie\u003c/strong\u003e, à-propos des \u003cstrong\u003eBumblebee\nversions\u003c/strong\u003e : \u003cstrong\u003e3.2.1-5\u003c/strong\u003e, \u003cstrong\u003e3.2.1-7\u003c/strong\u003e et \u003cstrong\u003envidia versions\u003c/strong\u003e : \u003cem\u003e340.\u003c/em\u003e\u003c/em\u003e*,\u003c/p\u003e\n\u003ch4 id=\"vérification-prise-en-charge-par-nouveau\"\u003eVérification prise en charge par nouveau\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eSi vous avez installé Bumblebee pour fonctionner avec le pilote libre\n\u0026rsquo;nouveau\u0026rsquo;, vérifiez le \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#verification-materielle\"\u003esupport de votre GPU\u003c/a\u003e\nnvidia par le pilote.\u003c/li\u003e\n\u003cli\u003eSi votre version de GPU est bien prise en charge par le pilote \u0026rsquo;nouveau\u0026rsquo;,\nvérifiez l\u0026rsquo;écriture de l\u0026rsquo;\u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#erreur-identifiant-buspci\"\u003eidentifiant de Bus PCI\u003c/a\u003e,\ntel que ci-dessous.\u003c/li\u003e\n\u003cli\u003eS\u0026rsquo;il n\u0026rsquo;est pas pris-en-charge, installez la version \u0026ldquo;\u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#pilote-nivida\"\u003eBumblebee+nvidia\u003c/a\u003e\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"erreur-identifiant-buspci\"\u003eErreur Identifiant BusPCI\u003c/h4\u003e\n\u003cp\u003eProfitez-en pour vérifier l\u0026rsquo;écriture de l\u0026rsquo;identifiant du Bus PCI relatif\nà votre carte graphique Nvidia.\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 : L\u0026rsquo;identifiant de Bus PCI doit bien être écrit ainsi :\n\u003cstrong\u003eBusID \u0026ldquo;PCI:01:00:0\u0026rdquo;\u003c/strong\u003e - \u003cem\u003eet non pas BusID \u0026ldquo;PCI:01:00.0\u0026rdquo;\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eParfois il peut être nécessaire de mettre en commentaire l\u0026rsquo;identifiant de\nBus PCI, pour que cela puisse fonctionner correctement… \u003cbr\u003e\nce qui normalement est le cas d\u0026rsquo;une installation par défaut !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"incompatibilité-xorg--118\"\u003eIncompatibilité Xorg \u0026gt;= 1.18\u003c/h4\u003e\n\u003cp\u003eSi le serveur X est \u003cstrong\u003e\u0026gt;= 1.18\u003c/strong\u003e et que votre Debian est une Testing, ou une Sid,\nil semble exister une incompatibilité entre le projet Bumblebee et le\npaquet \u003cstrong\u003exserver-xorg-legacy\u003c/strong\u003e, donc \u003cstrong\u003evirez ce dernier\u003c/strong\u003e, s\u0026rsquo;il est installé !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003ca href=\"https://github.com/Bumblebee-Project/Bumblebee/issues/749#issuecomment-216352740\" rel=\"external\"\u003esource\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"errorcannot-access-secondary-gpu---error-xorg-ee-failed-to-load-module-mouse-module-does-not-exist-0\"\u003e[ERROR]Cannot access secondary GPU - error: [XORG] (EE) Failed to load module \u0026ldquo;mouse\u0026rdquo; (module does not exist, 0)\u003c/h3\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 : Cette erreur peut-être générée par un des différents points suivants…\nveuillez les vérifier un par un, pas tous en même temps, cela ne sert à rien.\nUne fois qu\u0026rsquo;un point est vérifié/corrigé, \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#redemarrage-du-service-bumblebeed\"\u003eredémarrez le service\u003c/a\u003e\net essayez à nouveau votre commande. \u003cbr\u003e\nSi cela ne fonctionne pas, passez au point suivant qui peut aider à la résolution,\net répétez le même processus de vérification/modification puis redémarrage\ndu service adéquat - \u003cstrong\u003ebien comprendre et accepter que cela ne réglera pas\nforcément votre problème !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch4 id=\"vérifier-xserver-xorg-input-mouse\"\u003eVérifier xserver-xorg-input-mouse\u003c/h4\u003e\n\u003cp\u003eVérifiez l\u0026rsquo;installation du paquet \u003cstrong\u003exserver-xorg-input-mouse\u003c/strong\u003e, si ce n\u0026rsquo;est pas\nle cas, faites-le !\u003c/p\u003e\n\u003ch4 id=\"vérifier-le-fichier-xorgconfnvidia\"\u003eVérifier le fichier xorg.conf.nvidia\u003c/h4\u003e\n\u003cp\u003eVérifiez le fichier \u003ccode\u003e/etc/bumblebee/xorg.conf.nvidia\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"vérifier-votre-identifiant-pci\"\u003eVérifier votre identifiant PCI\u003c/h4\u003e\n\u003cp\u003eVérifiez que votre \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#erreur-identifiant-buspci\"\u003eidentifiant de Bus PCI\u003c/a\u003e soit\ncorrectement écrit !\u003c/p\u003e\n\u003ch3 id=\"errorcannot-access-secondary-gpu---error-xorg-ee-no-devices-detected\"\u003e[ERROR]Cannot access secondary GPU - error: [XORG] (EE) No devices detected\u003c/h3\u003e\n\u003cp\u003eOuvrez le fichier \u003ccode\u003e/etc/bumblebee/xorg.conf.nvidia\u003c/code\u003e, et modifiez l\u0026rsquo;option BusID.\nVous trouverez cette information par l\u0026rsquo;usage de la commande \u003ccode\u003elsusb\u003c/code\u003e…\u003c/p\u003e\n\u003cp\u003evoir le chapitre \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#verifications\"\u003evérifications\u003c/a\u003e !\u003c/p\u003e\n\u003ch3 id=\"errorcannot-access-secondary-gpu---error-xorg-ee-problem-parsing-the-config-file\"\u003e[ERROR]Cannot access secondary GPU - error: [XORG] (EE) Problem parsing the config file\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eVérifiez le fichier de configuration que vous venez de modifier !!!\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eQue ce soit \u003ccode\u003e/etc/bumblebee/xorg.config.nvidia\u003c/code\u003e ou \u003ccode\u003e/etc/bumblebee/xorg.config.nouveau\u003c/code\u003e,\nvous avez créé/modifié une section, et oublié/supprimé par erreur, de fermer\ncorrectement la section, voire une section est mal écrite !\u003c/p\u003e\n\u003ch3 id=\"errorcould-not-connect-to-bumblebee-daemon---is-it-running\"\u003e[ERROR]Could not connect to bumblebee daemon - is it running?\u003c/h3\u003e\n\u003cp\u003eVérifiez que le \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#redemarrage-du-service-bumblebeed\"\u003eservice Bumblebee\u003c/a\u003e soit\nfonctionnel !\u003c/p\u003e\n\u003ch3 id=\"errorunknown-acceldisplay-bridge\"\u003e[ERROR]Unknown accel/display bridge:\u003c/h3\u003e\n\u003cp\u003eLe \u0026ldquo;pont\u0026rdquo; \u003cem\u003e(\u0026lsquo;bridge\u0026rsquo; en anglais)\u003c/em\u003e que vous cherchez à utiliser avec\nl\u0026rsquo;option \u003ccode\u003e-b\u003c/code\u003e d\u0026rsquo;optirun n\u0026rsquo;existe pas. \u003cstrong\u003eModifiez votre commande !!!\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"erroryouve-no-permission-to-communicate-with-the-bumblebee-daemon-try-adding-yourself-to-the-bumblebee-group\"\u003e[ERROR]You\u0026rsquo;ve no permission to communicate with the Bumblebee daemon. Try adding yourself to the \u0026lsquo;bumblebee\u0026rsquo; group\u003c/h3\u003e\n\u003cp\u003eCe message d\u0026rsquo;erreur vous informe que votre identifiant utilisateur semble\nne pas être ajouté \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#ajout-groupe-bumblebee\"\u003egroupe bumblebee\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAjoutez-le !\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"fallen-off-the-bus\"\u003efallen off the bus\u003c/h3\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 : Cette erreur peut-être générée par un des différents points suivants…\nveuillez les vérifier un par un, pas tous en même temps, cela ne sert à rien.\nUne fois qu\u0026rsquo;un point est vérifié/corrigé,\n\u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#redemarrage-du-service-bumblebeed\"\u003eredémarrez le service\u003c/a\u003e et\nessayez à nouveau votre commande. \u003cbr\u003e\nSi cela ne fonctionne pas, passez au point suivant qui peut aider à la résolution,\net répétez le même processus de vérification/modification puis redémarrage\ndu service adéquat - \u003cstrong\u003ebien comprendre et accepter que cela ne réglera pas\nforcément votre problème !\u003c/strong\u003e\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003eVérifiez la sortie dmesg !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSi \u003ccode\u003edmesg\u003c/code\u003e vous informe du souci GPU suivant \u003ccode\u003efallen off the bus\u003c/code\u003e, il y a\ndeux manières de régler le problème :\u003c/p\u003e\n\u003ch4 id=\"test-rcu_idle_gp_delay-1\"\u003eTest \u0026ldquo;rcu_idle_gp_delay \u0026laquo;\u0026lt;1\u0026rdquo;\u003c/h4\u003e\n\u003cp\u003eTestez la commande suivante, avant le lancement d\u0026rsquo;optirun : \u003cbr\u003e\n\u003ccode\u003e:# tee /sys/module/rcutree/parameters/rcu_idle_gp_delay \u0026lt;\u0026lt;\u0026lt;1\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi cela fonctionne en effet correctement, modifiez le fichier \u003ccode\u003e/etc/default/grub\u003c/code\u003e\npour ajouter l\u0026rsquo;information suivante à la ligne de commande \u003ccode\u003eGRUB_CMDLINE_LINUX_DEFAULT : rcutree.rcu_idle_gp_delay=1\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eMettez-à-jour votre grub et redémarrez votre ordinateur :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# update-grub\n:# shutdown -r now\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"incompatibilité-kernels-310-à-319\"\u003eIncompatibilité kernels (3.10 à 3.19)\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;autre solution est de vérifier votre version de kernel linux - en effet\n\u003cstrong\u003ece problème concerne les noyaux versions 3.10 à 3.19 !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSoit vous choisissez un noyau antérieur, soit vous upgradez sur un noyau plus\nrécent !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eIl semble que ce soit surtout un bogue Nvidia… cf \u003ca href=\"https://github.com/Bumblebee-Project/Bumblebee/issues/455#issuecomment-22497464\" rel=\"external\"\u003eBumblebee issue 445\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"error-while-loading-shared-libraries-libturbojpegso\"\u003eerror while loading shared libraries: libturbojpeg.so\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;erreur complète est la suivante : \u003cbr\u003e\n\u003ccode\u003eerror while loading shared libraries: libturbojpeg.so: cannot open shared object file: No such file or directory\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi vous avez une architecture \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#architecture-32-bits\"\u003e32\u003c/a\u003e ou \u003ca href=\"/fr/sys/debian/nvidia-optimus-bumblebee/#architecture-64-bits\"\u003e64\u003c/a\u003e\nbits :\u003c/p\u003e\n\u003ch4 id=\"architecture-32-bits\"\u003earchitecture 32 bits\u003c/h4\u003e\n\u003cp\u003eSi votre architecture est 32 bits, tapez dans votre terminal console préférée,\ncette commande avec les droits administrateur : \u003cbr\u003e\n\u003ccode\u003e# ln -s /usr/lib/i386-linux-gnu/libturbojpeg.so.0 /usr/lib/i386-linux-gnu/libturbojpeg.so\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"architecture-64-bits\"\u003earchitecture 64 bits\u003c/h4\u003e\n\u003cp\u003eSi votre architecture est 64 bits, tapez cette commande-ci, toujours avec\nles droits administrateur : \u003cbr\u003e\n\u003ccode\u003e# ln -s /usr/lib/x86_64-linux-gnu/libturbojpeg.so.0 /usr/lib/x86_64-linux-gnu/libturbojpeg.so\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"modprobefatalmodule-nouveau-in-use\"\u003emodprobe:FATAL:Module nouveau in use\u003c/h3\u003e\n\u003cp\u003eLors de l\u0026rsquo;installation, au tout début, il vous est dit de décharger le module\nnouveau. Si le système vous répond l\u0026rsquo;erreur suivante : \u003ccode\u003emodprobe:FATAL:Module nouveau in use\u003c/code\u003e,\nil est intéressant de le désactiver lors du démarrage du noyau.\u003c/p\u003e\n\u003cp\u003eNe vous inquiétez pas trop de ce message d\u0026rsquo;erreur, mais plutôt paramétrez\nle fichier de configuration de grub \u003ccode\u003e/etc/default/grub\u003c/code\u003e afin de rajouter\nles paramètres noyau suivants \u003ccode\u003enouveau.modeset=0\u003c/code\u003e et \u003ccode\u003emodprobe.blacklist=nouveau\u003c/code\u003e\ndans la ligne de configuration relative à \u003ccode\u003eGRUB_CMDLINE_LINUX_DEFAULT\u003c/code\u003e,\ntelle que, par exemple : \u003cbr\u003e\n\u003ccode\u003eGRUB_CMDLINE_LINUX_DEFAULT=\u0026quot;quiet nouveau.modeset=0 modprobe.blacklist=nouveau\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMettez-à-jour votre grub… et redémarrez votre station.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003ca href=\"https://fixmynix.com/nvidia-optimus-troubleshooting-in-debain-kali-linux-ubuntu/\" rel=\"external\"\u003esource\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"primus-fatal-failed-to-load-any-of-the-libraries-libglso1\"\u003eprimus: fatal: failed to load any of the libraries: (…)/libGL.so.1\u003c/h3\u003e\n\u003cp\u003eLorsque vous exécutez optirun, vous avez le retour d\u0026rsquo;erreur suivant :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ primus: fatal: failed to load any of the libraries: /usr/lib/x86_64-linux-gnu/nvidia/libGL.so.1:/usr/lib/i386-linux-gnu/nvidia/libGL.so.1:/usr/lib/nvidia/libGL.so.1\n/usr/lib/x86_64-linux-gnu/nvidia/libGL.so.1: cannot open shared object file: No such file or directory\n/usr/lib/i386-linux-gnu/nvidia/libGL.so.1: cannot open shared object file: No such file or directory\n/usr/lib/nvidia/libGL.so.1: cannot open shared object file: No such file or directory\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eou :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ primus: fatal: failed to load any of the libraries: /usr/lib/x86_64-linux-gnu/ nvidia/libGL.so.1:/usr/lib/i386-linux-gnu/nvidia/libGL.so.1:/usr/lib/nvidia/libGL.so.1\n/usr/lib/x86_64-linux-gnu/nvidia/libGL.so.1: wrong ELF class: ELFCLASS64\n/usr/lib/i386-linux-gnu/nvidia/libGL.so.1: cannot open shared object file: No such file or directory\n/usr/lib/nvidia/libGL.so.1: cannot open shared object file: No such file or directory\n\u003c/code\u003e\u003c/pre\u003e\u003col\u003e\n\u003cli\u003eLa première chose à tester est : \u003cbr\u003e\n\u003ccode\u003e$ primusrun glxgears\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003eSi cela fonctionne, alors précéder les commandes non pas avec \u003cem\u003eoptirun\u003c/em\u003e,\nmais \u003ccode\u003eprimusrun\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eSinon un bogue \u003ca href=\"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=876033\" rel=\"external\"\u003e#867033\u003c/a\u003e est ouvert… sachez que c\u0026rsquo;est galère\nà corriger, parce que même en installant les packages ci-dessous,\nvous ne serez pas sûr de résoudre le problème.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eDans un premier temps, vérifiez que vous avez bien installé le package \u003cstrong\u003eprimus-libs-ia32\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eVous pouvez essayer l\u0026rsquo;une des solutions suivantes - \u003cem\u003esachant qu\u0026rsquo;il n\u0026rsquo;y\na aucune garantie de fonctionnement\u003c/em\u003e :\n\u003cul\u003e\n\u003cli\u003eExécutez \u003cstrong\u003eprimusrun\u003c/strong\u003e en le préfixant de l\u0026rsquo;option \u003ccode\u003e_GLVND_DISALLOW_PATCHING=1\u003c/code\u003e,\ntel que : \u003cbr\u003e\n\u003ccode\u003e_GLVND_DISALLOW_PATCHING=1 primusrun glxgears\u003c/code\u003e - (cf, la réponse \u003ca href=\"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=876033#22\" rel=\"external\"\u003e22\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eÉditez le fichier \u003ccode\u003e/usr/bin/primusrun\u003c/code\u003e, pour modifier la ligne \u003ccode\u003ePRIMUS_libGL=${PRIMUS_libGL:-'/usr/$LIB/primus'}\u003c/code\u003e\npar \u003ccode\u003ePRIMUS_libGL=${PRIMUS_libGL:-\u0026quot;/usr/$LIB/primus\u0026quot;}\u003c/code\u003e - \u003cbr\u003e\nc\u0026rsquo;est-à-dire changer les simples quotes en doubles quotes - (cf, la réponse \u003ca href=\"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=876033#59\" rel=\"external\"\u003e59\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eEssayez l\u0026rsquo;installation des packages suivants : \u003cbr\u003e\n\u003cstrong\u003elibgl1-nvidia-glx libgl1-nvidia-glx:i386 nvidia-driver-libs nvidia-driver-libs-i386\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"freezes-diverses\"\u003eFreezes diverses\u003c/h3\u003e\n\u003cp\u003eIl existe plusieurs raisons pour lesquelles le portable peut \u0026ldquo;freezer\u0026rdquo;,\nessayez les solutions proposées - \u003cem\u003een anglais\u003c/em\u003e :\u003c/p\u003e\n\u003ch4 id=\"freezes-lors-de-lactivation-du-serveur-graphique\"\u003eFreezes lors de l\u0026rsquo;activation du serveur graphique\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Bumblebee-Project/Bumblebee/issues/764#issuecomment-559980823\" rel=\"external\"\u003ehttps://github.com/Bumblebee-Project/Bumblebee/issues/764#issuecomment-559980823\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Bumblebee-Project/Bumblebee/issues/764#issuecomment-612384824\" rel=\"external\"\u003ehttps://github.com/Bumblebee-Project/Bumblebee/issues/764#issuecomment-612384824\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"freezes-au-boot\"\u003eFreezes au boot\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Bumblebee-Project/Bumblebee/issues/1036#issuecomment-521974873\" rel=\"external\"\u003ehttps://github.com/Bumblebee-Project/Bumblebee/issues/1036#issuecomment-521974873\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Bumblebee-Project/Bumblebee/issues/1036#issuecomment-612779453\" rel=\"external\"\u003ehttps://github.com/Bumblebee-Project/Bumblebee/issues/1036#issuecomment-612779453\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"test-du-fonctionnement-de-la-batterie\"\u003eTest du fonctionnement de la batterie\u003c/h3\u003e\n\u003cp\u003ePour tester le fonctionnement :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003evous pouvez procéder ainsi en mode terminal : \\\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ cat /proc/acpi/bbswitch\n0000:01:00.0 OFF\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eLancement d\u0026rsquo;optirun :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ optirun glxgears \u0026gt; /dev/null \u0026amp;\n[1] 4785\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"3\"\u003e\n\u003cli\u003eVérification de bbswitch :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ cat /proc/acpi/bbswitch\n0000:01:00.0 ON\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"4\"\u003e\n\u003cli\u003eArrêt d\u0026rsquo;optirun, par l\u0026rsquo;appui simultanée des touches \u003ckbd\u003eCTRL+C\u003c/kbd\u003e\n :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[VGL] ERROR: in readback--\n[VGL] 246: Window has been deleted by window manager\n\n[1]+ Termine 1 optirun glxgears \u0026gt; /dev/null\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"5\"\u003e\n\u003cli\u003eAprès avoir fermé la fenêtre de glxgears :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ cat /proc/acpi/bbswitch\n0000:01:00.0 OFF\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eVous pouvez retrouver un complément d\u0026rsquo;informations sur la \u003ca href=\"http://wiki.debian.org/fr/Bumblebee\" rel=\"external\"\u003epage wiki du projet Debian\u003c/a\u003e…\u003c/li\u003e\n\u003cli\u003eSur le forum Debian-fr.org, à-partir du 23 août 2019, j\u0026rsquo;ai écrit ce complément d\u0026rsquo;informations titré\n\u003cstrong\u003e\u003ca href=\"https://www.debian-fr.org/t/doc-nvidia-optimus-bumblebee-dans-quel-etat-gere-infos/79959\" rel=\"external\"\u003e\u0026quot;[Doc] Nvidia Optimus + Bumblebee : Dans quel état gère… [Infos]\u0026quot;\u003c/a\u003e\u003c/strong\u003e\nqui montre à quel point la situation devient compliquée… \u003cbr\u003e\nje l\u0026rsquo;ai maintenu jusqu\u0026rsquo;en début 2020 - je n\u0026rsquo;ai de fait plus ce type\nd\u0026rsquo;architecture graphique !\u003c/li\u003e\n\u003cli\u003eJ\u0026rsquo;ai écrit ce tutoriel la première fois en Janvier 2013, pour la \u003ca href=\"https://wiki.debian-fr.xyz/NVidia_Optimus_Bumblebee\" rel=\"external\"\u003ecommunauté Debian-fr.xyz\u003c/a\u003e ;-)\u003c/li\u003e\n\u003cli\u003eJ\u0026rsquo;ai collaboré à l\u0026rsquo;écriture de cette \u003ca href=\"https://debian-facile.org/doc:materiel:cartes-graphique:nvidia:optimus\" rel=\"external\"\u003epage wiki\u003c/a\u003e pour la communauté Debian-Facile.org,\ndepuis mai 2016.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n","summary":"Comment faire fonctionner la technologie Optimus de Nvidia grâce au projet Bumblebee sous Debian !","tags":["Debian","nvidia","Optimus","Bumblebee"],"date_published":"2013-01-14T21:00:00+02:00","date_modified":"2026-10-02T15:49:57+02:00"}]}