<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="rss.css" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">

<channel>
<title>Les projets de lili - blog</title>
<description>Le flux RSS de mon blog. Cette page est destinée aux lecteurs RSS, et non pas aux humains.</description>
<language>fr-fr</language>
<link>http://partage.les-miquelots.net/rss.xml</link>
<atom:link href="http://partage.les-miquelots.net/rss.xml" rel="self" type="application/rss+xml" />
<atom:icon href="http://partage.les-miquelots.net/bimi_img.svg" rel="self" type="image/svg+xml" />

<!-- LB -->
<item>
      <title>Joyeuse ann&eacute;e 2026 !
Joyeuse année 2026</title>
      <guid>http://partage.les-miquelots.net/blog/2026/#joyeuse-annee-2026</guid>
      <pubDate>Sun, 18 Jan 2026 22:08:42 +0100</pubDate>
      <description><![CDATA[
      <p>Et bonne sant&eacute; &agrave; tous. Je me suis mis &agrave; Blender pour
cr&eacute;&eacute; le mod&egrave;le des barettes de RAM en 3D qui sont visibles &agrave; l'arri&egrave;re (et puis voir mon p&egrave;re bien s'amuser avec son imprimante 3D et Fusion360 a piqu&eacute; mon int&eacute;r&ecirc;t!) la quantit&eacute; d'options et de param&egrave;tres est <i>&eacute;touffante</i>, mais heureusement il y a des super articles et tutoriels (<a href="https://gachoki.com">gachoki.com</a> m'a pas mal aid&eacute;, j'appr&eacute;cie particuli&egrave;rement les images anim&eacute;es pour visualiser les &eacute;tapes et r&eacute;sultats).
<p>Quoiqu'il en soit, la course &agrave; l'IA &agrave; de co&ucirc;teuses... RAMifications. J'esp&egrave;re que mes PCs n'auront pas de probl&egrave;mes de m&eacute;moire dans les ann&eacute;es. Quelle id&eacute;e folle d'acheter 40% du stock mondial...
      ]]></description>
</item><item>
      <title>Serveur xrdp: gel de la mise à jour framebuffer lorsque datation dans le passé (sauf si la souris bouge)</title>
      <guid>http://partage.les-miquelots.net/blog/2025/#serveur-xrdp-gel-de-la-mise-a-jour-framebuffer-lorsque-datation-dans-le-passe-sauf-si-la-souris-bouge</guid>
      <pubDate>Sun, 28 Dec 2025 19:12:07 +0100</pubDate>
      <description><![CDATA[
      <p>Bonjour, ce billet est surtout une note &agrave; moi-m&ecirc;me.
<p>Si vous &ecirc;tes dans le cas o&ugrave; vous faites r&eacute;guli&eacute;rement des redatations dans le pass&eacute; importantes
depuis une session RDP via serveur XRDP sous Linux, il est possible que vous
rencontez un &eacute;trange probl&egrave;me: l'affichage de fige, ne se mettant &agrave; jour seulement
si une des conditions suivantes est remplie:
<ul>
  <li>Vous bougez la souris constamment</li>
  <li>Vous revenez &agrave; la date d'origine</li>
  <li>Vous vous connectez &agrave; un utilisateur diff&eacute;rent sur le m&ecirc;me serveur XRDP</li>
  <li>Vous terminez la session RDP en cours puis connexion &agrave; une nouvelle</li>
</ul>
<p>D'apr&egrave;s quelques tests, il semblerait que le coupable est l'utilisation d'une
vieille impl&eacute;mentation (2010 et ant&eacute;rieur) du binaire <code>Xvnc</code> qu'utilise
xrdp pour cr&eacute;er le bureau de l'utilisateur.
Si il n'est pas possible pour vous de mettre &agrave; jour le paquet fournissant ce binaire
, g&eacute;n&eacute;ralement <code>vnc-server</code> (par RealVNC Ltd.)
ou <code>tigervnc-server</code>, il reste possible de changer comment <code>Xvnc</code>
est lanc&eacute; via le fichier <code>/etc/xrdp/sesman.ini</code>. Il faut y ajouter le param&egrave;tre
<code>-deferUpdate 0</code> &agrave; la liste des options de lancement de <code>Xvnc</code>, c'est
&agrave; dire si le dernier param&egrave;tre commence par <code>param9=[...]</code> alors il faut ins&eacute;rer ceci dessous:
<pre>
param10=-deferUpdate
param11=0
</pre>
<p>Puis red&eacute;marrer le serveur xrdp. <span style="color:red;font-weight:bold">ATTENTION POUR LES &Eacute;PILEPTIQUES, CERTAINS &Eacute;L&Eacute;MENTS PEUVENT FLASHER DE FA&ccedil;ON RAPIDE &Agrave; L'&Eacute;CRAN SUITE &Agrave; CES CHANGEMENTS !</span>
      ]]></description>
</item>
<item>
<title>Facilement récupérer son IP publique avec SFR Box 8 (et autres implémentant l'api wan.getInfo)</title>
<guid>http://partage.les-miquelots.net/blog/2025/#facilement-recuperer-son-ip-publique-avec-sfr-box-8-et-autres-implementant-lapi-wangetinfo</guid>
<pubDate>Fri, 24 Oct 2025 20:31:55 +0200</pubDate>
<description><![CDATA[
<p>Heya

<p>Je me note &ccedil;a ici pour pas oublier !
<p>Il y a un moyen tr&egrave;s facile de r&eacute;cup&eacute;rer votre IP sans besoin de d&eacute;pendre de tierces parties si vous avec une SFR Box 8 (mod&egrave;le <b>GR140CG</b>). Vous pouvez int&eacute;grer ceci dans vos scripts de <abbr title="Syst&egrave;me de nom de domaines dynamique (Dynamic Domain Name System)">DDNS</abbr> par exemple :
<br>
<pre>
curl -sJLk "https://192.168.1.1/api/1.0/?method=wan.getInfo" | head -1 |cut -d'"' -f14
</pre>

<p>Cette m&eacute;thode devrait &ecirc;tre utilisable par les routeurs AlticeLabs sauce SFR (<a href="https://www.alticelabs.com/wp-content/uploads/2023/10/FL_GR140CG_FiberGateway-4x4_ALB_EN.pdf" title="PDF pr&eacute;sentation du routeur GR140CG">cliquez ici pour un PDF de pr&eacute;sentation sur le site AlticeLabs</a>) impl&eacute;mentant l'API neufbox document&eacute;e sur <a href="https://lafibre.info/images/altice/201207_sfr_api-rest.pdf">ce PDF chez https://lafibre.info</a>.

<p>Tchao et bon weekend ;) !
]]></description>
</item>


<item>
<title>Interlude photos</title>
<guid>http://partage.les-miquelots.net/blog/2025/#interlude-photos</guid>
<pubDate>Sun, 31 Aug 2025 11:15:51 +0200</pubDate>
<description><![CDATA[
<p>Heya,
<br>
<p>Interlude photos pour changer, tiens. L'image servant de fond sur la majorit&eacute; des pages est celle-ci:
<br>
<figure class="photos_avec_legende">
<img alt="Un jour d'hiver brumeux. Le soleil perce &agrave; peine sur la vall&eacute;e glac&eacute;e. Au milieu de l'image, une route coupant un sentier de marche peut &ecirc;tre aper&ccedil;ue &agrave; travers les arbres g&ecirc;l&eacute;s." src="/img/photo_balade_hiver2023.jpg"/>
<figcaption>Prise lors d'une balade un jour d'hiver, 2023.</figcaption>
</figure>

J'aime la fa&ccedil;on dont les arbres g&ecirc;l&eacute;s se fondent dans la brume &agrave; l'horizon, soleil per&ccedil;ant &agrave; peine. On pourrait croire que c'est un phare au loin.
<p>Une autre est cette photo:
<figure class="photos_avec_legende">
    <img alt="Cadr&eacute;e vers les nuages, une mar&eacute;e de c&acirc;ble de poteaux t&eacute;l&eacute;phoniques. Cette photo a &eacute;t&eacute; prise au Japon." src="/img/cables_jp_orig_scaled.jpg"/>
<figcaption>Prise lors d'un voyage au Japon &agrave; Kyoto, 2016.</figcaption>
</figure>
J'aime bien le cadrage dans celle-ci, sacr&eacute;e soupe de c&acirc;bles aussi.
]]></description>
</item>


<item>
<title>Déclencher les hauts-parleurs de sa caméra Axis M1054 via SSH</title>
<guid>http://partage.les-miquelots.net/blog/2025/#declencher-les-hautsparleurs-de-sa-camera-axis-m1054-via-ssh</guid>
<pubDate>Sat, 12 Jul 2025 08:30:24 +0200</pubDate>
<description><![CDATA[
<p>Salut à tous,
<p>Un beau soir je me suis dis <i>"Mais comment est-ce que la caméra peut jouer du son au niveau logiciel?"</i> et décide
de fureter le système de fichier puisque <a href="https://partage.les-miquelots.net/blog/activer-le-serveur-ssh-sur-sa-camera-ip-axis-m1054" title="Activer le serveur SSH sur sa caméra IP AXIS M1054">j'ai accès au système via SSH</a>.
<p>La réponse se trouve dans le fichier <code>/usr/html/axis-cgi/playclip.cgi</code>, ligne 41. Une commande <code>dbus</code> est lancée, et j'ai pu la reconstruire pour la lancer sur la ligne de commande:
<pre>
# Je vous conseille d'envoyer votre fichier audio dans le /tmp de la caméra, et de convertir le fichier audio de la sorte:
# ffmpeg -i votre_audio.mp3  -c pcm_mulaw -ac 1 -ar 16000 -vn votre_audio.au
dbus-send --system --dest=com.axis.Streamer --print-reply --type=method_call /com/axis/Streamer/Audio com.axis.Streamer.Audio.StartPlayingClip string:"location=/tmp/musique.au"
</pre>
<br>
<p>Et voilà! Joyeux bidouillage à vous tous (en passant n'oubliez pas de signer <a href="https://eci.ec.europa.eu/045/public/#/screen/home" title="Campagne de préservation des jeux vidéos 'Stop Killing Games'">l'initiave Européenne Communautaire "Arrêtez de tuer les jeux vidéos"/"Stop Killing Games"</a> avant la fin Juillet 2025).
]]></description>
</item>


<item>
<title>Activer le serveur SSH sur sa caméra IP AXIS M1054</title>
<guid>http://partage.les-miquelots.net/blog/2025/#activer-le-serveur-ssh-sur-sa-camera-ip-axis-m1054</guid>
<pubDate>Fri, 18 Apr 2025 00:01:51 +0200</pubDate>
<description><![CDATA[
<p>Bonjour,<br>
<p>Cette fonctionnalité n'est pas ou peu documentée sur le Net de ce que j'ai pu voir, donc voici les étapes pour activer le serveur SSH sur votre caméra AXIS M1054.
<br>
<p>Tout d'abord, rendez vous sur la page <i>"Advanced scripting"</i> de votre caméra, qui devrait se trouver à l'adresse <code>https://ip.de.la.camera/admin/scripting.shtml</code> et ressemble à ça: <br>
<img src="/img/AdvancedScripting_AXISM1054.png" alt="Une image de la page de scripting avancé d'une camera Axis M1054."/>
<br>
<p>Ensuite, cliquez sur le bouton <i>Open Script Editor</i> et une fois la fenêtre popup ouverte, cliquez sur le fichier <code>inittab (dans /etc/)</code>.
<p>Cherchez ensuite la ligne <code>#tnet:35:respawn:/usr/sbin/telnetd -F</code> et décommentez la, puis redémarrez la caméra via le bouton <i>"Restart"</i> du menu de maintenance (normalement sur la page <code>https://ip.de.la.camera/admin/maintenance.shtml</code>).
<br>
<img src="/img/MaintenanceMenu_AXISM1054.png" alt="Une image de la page de lamaintenance d'une camera Axis M1054."/>
<br>
<p>Attendez environ ~3 à 5 minutes puis connectez-vous via avec telnet sur la caméra. Les identifiants sont les mêmes que sur l'interface web.
<p>Une fois connecté en <code>root</code>, exécutez <code>ssh-keygen -A</code> car <u>les host_key ne sont pas initialisés de base dans <code>/etc/ssh</code></u>.<br>
<p>Une fois fait, utilisez vi pour éditer le fichier <code>/etc/inittab</code> et rajouter la ligne suivante à la fin du fichier:<br>
<pre>
sshd:35:respawn:/usr/sbin/sshd
</pre>
<p>Puis redémarrez. Et voilà! Vous pouvez ssh (port 22) sur votre caméra Axis M1054.
]]></description>
</item>




<item>
<title>Script de service (rc) pour Readeck sur FreeBSD</title>
<guid>http://partage.les-miquelots.net/blog/2025/#script-de-service-rc-pour-readeck-sur-freebsd</guid>
<pubDate>Sun, 09 Mar 2025 17:55:18 +0100</pubDate>
<description><![CDATA[
<p>Salut et bonne année 2025 à tous.<br>

<p>Il m'est venu à l'esprit que jusque ici, je n'avais pas localement
mise en place une manière d'archiver les pages Web qui me plaisent et
m'ont plues.
<p>Rien n'est éternel, et un marque-page suit la même logique: un beau
jour, vous allez cliquer pour revisiter un étrange mais intéressant site
web et là c'est le drame. Le domaine a été vendu, l'auteur n'avait plus
envie de le maintenir, 404 Not Found... Les raisons peuvent être multiples.
<p>Une solution existe depuis un bon bout de temps sur l'Internet:
<a href="https://archive.org">Archive.org</a>. La WayBack machine m'a 
sauvé (et me sauve encore) pour trouver de vieux exécutables Windows et morceaux
d'informations disparus de l'Internet. <br>

<p>Je me suis donc dit <i>"Est-ce qu'il existe un projet libre et open 
source équivalent et pas trop dur à lancer?"</i> et fichtrement que oui! J'ai
trouvé ma joie avec
<a href="https://readeck.org" target="_blank">Readeck</a> : écrit en Go, il
suffit de <a href="https://readeck.org/en/download" target="_blank">télécharger le binaire</a> 
pour la bonne plateforme, le rendre exécutable, <a href="https://readeck.org/en/docs/commands#readeck-user" target="_blank">créer un utilisateur</a> 
puis enfin <a href="https://readeck.org/en/docs/deploy" target="_blank">démarrer le serveur</a>. 
Ne pas oublier télécharger l'extension de navigateur (<i><a href="https://addons.mozilla.org/en-US/firefox/addon/readeck/" target="_blank">Firefox</a></i>, <a href="https://chromewebstore.google.com/detail/readeck/jnmcpmfimecibicbojhopfkcbmkafhee" target="_blank"><i>Chrome</i></a>) pour envoyer une page à Readeck en 3 clics!
<p>Dans mon cas, la page de documentation concernant le déploiement
de Readeck n'avait pas de mention de script rc.d de service pour FreeBSD: 
c'est embêtant car si je redémarre, Readeck ne sera pas démarré en même 
temps que le serveur ! Et pas de possibilité de voir le status ou stopper Readeck via la commande native <code>service</code>.
<br>
<p>Voici donc ci-dessous un script de service rc.d que j'ai créé et testé. 
D'abord, créez l'utilisateur <code>readeck</code> avec les commandes suivantes:
<pre>
mkdir /home/readeck
pw useradd -d /home/readeck -w no -s /usr/sbin/nologin -n readeck
chown readeck /home/readeck
sysrc readeck_enable="YES"
</pre>
<br>

<p><code>/etc/rc.d/readeck</code>:
<pre>
#!/bin/sh
# PROVIDE: readeck
# REQUIRE: FILESYSTEMS networking
# KEYWORDS: web archiving

. /etc/rc.subr

name="readeck"
program_name="readeck"
procname="${name}"
rcvar=readeck_enable
readeck_user="root"

load_rc_config $name
: ${readeck_enable="NO"}
: ${readeck_launch_user="readeck"}
: ${readeck_chdir="/home/readeck"}
: ${readeck_config="${readeck_chdir}/config.toml"}
: ${readeck_exec="${readeck_chdir}/${program_name}"}
: ${readeck_logfile="${readeck_chdir}/${program_name}.log"}

required_files="${readeck_config}"
exec_path=${readeck_exec}
status_cmd="readeck_status"
stop_cmd="readeck_stop"

pidfile="${readeck_chdir}/${program_name}.pid"

command="/usr/local/bin/daemonize"
command_args="-u ${readeck_launch_user} -c ${readeck_chdir} -o ${readeck_logfile} -e ${readeck_logfile}.err -p ${pidfile} -l ${exec_path}.lck ${exec_path} serve"


readeck_status()
{
	${exec_path} healthcheck -config ${required_files} > /dev/null 2>&1
	if [ $? = 0 ]; then
		echo "Readeck is running and it's PID is `cat ${pidfile}`."
	else
		echo "Readeck is not running:"
		${exec_path} healthcheck -config ${required_files}
	fi
}

readeck_stop()
{
	echo Stopping readeck...
	${exec_path} healthcheck -config ${required_files} > /dev/null 2>&1
	if [ $? = 0 ]; then
		${exec_path} cleanup -config ${required_files}
		kill `cat ${pidfile}`
		rm -f ${pidfile}
		rm -f ${exec_path}.lck
		echo Stopped readeck.
	else
		echo Server is stopped 
	fi 
}

run_rc_command "$1"
</pre>
<br>

<p>Et un grand merci à <a href="https://codeberg.org/olivier" target="_blank">Olivier Meunier</a>
et leurs contributeurs pour avoir créé Readeck.
]]></description>
</item>




<item>
<title>Désactiver complétement les logs (journalisation) dans NSClient++ 0.3.923 pour Windows</title>
<guid>http://partage.les-miquelots.net/blog/2024/#desactiver-completement-les-logs-journalisation-dans-nsclient-03923-pour-windows</guid>
<pubDate>Thu, 11 Apr 2024 23:32:54 +0200</pubDate>
<description><![CDATA[
<p>Salut à tous
<br/>
<br/>
<p>Je me note ça ici car je l'ai découvert par moi-même mais je n'ai pas pu trouver de source claire sur le net qui le documente. Si vous voulez stopper les logs d'un agent Nagios NSClient++ sur Windows, il faut se rendre dans le dossier où se trouve le fichier de configuration <code>NSC.ini</code> ou <code>nsclient.ini</code> (ça sera généralement dans le dossier <code>C:\Program Files (x86)\NSClient++\</code> et commenter la ligne <code>FileLogger.dll</code> en rajoutant un <code>;</code> devant. Cette ligne devrait se trouver dans une section <code>[Modules]</code> au début du fichier de configuration.
<p>Après avoir redémarré le nsclient via <code>services.msc</code>, le log/journal <code>nsclient.log</code> ne s'alimentera plus.
<br/>
<br/>
<p><b>NOTE:</b> Cette astuce devrait être applicable pour les version du nsclient Windows inférieure à 0.4.0. Les versions plus récentes ont <code>log file = none</code> qui est documenté. 
]]></description>
</item>






<item>
<title>Alias Git pour afficher vos alias git</title>
<guid>http://partage.les-miquelots.net/blog/2024/#alias-git-pour-afficher-vos-alias-git</guid>
<pubDate>Wed, 31 Jan 2024 21:51:31 +0100</pubDate>
<description><![CDATA[
<p>Salut les surfeurs du net,
<p>Je me note ça ici pour m'en rappeler au cas où. Git donne la possibilité de faire des alias via la commande <code>git config alias.</code> mais il n'y a pas de commande git native permettant de tous les afficher. Heuresement, il est possible de le faire grâce à, vous l'avez deviné, un alias. Le voici:
<br>
<br>
<pre>git config --global alias.aliases '!git --no-pager config --get-regexp "alias.*"'</pre>
<br>
<p>Exécuter <code>git aliases</code> par la suite permet d'afficher tous les alias configuré en cours que ce soit pour le répertoire git courant ou en globalité.
]]></description>
</item>




<item>
<title>Script rc pour prosody-filer sur FreeBSD</title>
<guid>http://partage.les-miquelots.net/blog/2024/#script-rc-pour-prosodyfiler-sur-freebsd</guid>
<pubDate>Mon, 15 Jan 2024 22:57:05 +0100</pubDate>
<description><![CDATA[
<p>Bonne ann&eacute;e &agrave; tous et meilleurs voeux!!!
<p>Je n'ai pas trouv&eacute; de fichier rc pour lancer <a href="https://github.com/ThomasLeister/prosody-filer">prosody-filer</a> sur 
un syst&egrave;me d'exploitation BSD en tant que service, donc j'en ai fait un moi-m&ecirc;me. Voici le contenu, &ccedil;a marche avec un utilisateur non-root et sans mot de passe + le shell mis sur <code>/usr/sbin/nologin</code>:
<br>
<pre>
#!/bin/sh

# PROVIDE: prosody_filer
# REQUIRE: FILESYSTEMS networking
# KEYWORDS: http upload

. /etc/rc.subr

name="prosody_filer"
program_name="prosody-filer"
title="Prosody-Filer"
rcvar=prosody_filer_enable
prosody_filer_user="prosodyfiler"  # cr&eacute;ez l'utilisateur et le groupe
prosody_filer_group="prosodyfiler" # au pr&eacute;alable !
prosody_filer_chdir="/home/prosodyfiler/"

pidfile="/home/prosodyfiler/${program_name}.pid"
required_files="/home/prosodyfiler/config.toml"
exec_path="/home/prosodyfiler/${program_name}"
output_file="/var/log/${program_name}.log"

command="/usr/sbin/daemon"
command_args="-r -t ${title} -o ${output_file} -P ${pidfile} -f ${exec_path}"

load_rc_config $name
: ${prosody_filer_enable="NO"}

run_rc_command "$1"
</pre>
<br>
<p>Vous pouvez ensuite lancer <code>sysrc prosody_filer_enable=YES</code> pour activer le service au d&eacute;marrage puis <code>service prosody_filer start</code> pour d&eacute;marrer le service.
]]></description>
</item>






<item>
<title>Configurer Searx pour réécrire les URLs dans les résultats</title>
<guid>http://partage.les-miquelots.net/blog/2023/#configurer-searx-pour-reecrire-les-urls-dans-les-resultats</guid>
<pubDate>Sat, 18 Nov 2023 23:42:23 +0100</pubDate>
<description><![CDATA[
<p>Bonjour les surfeurs,
<br>
<p>Aujourd'hui, je vais vous montrer comment réécrire les URLs des résultats renvoyé par
<a href="https://github.com/searxng/searxng">Searx</a>, un méta-moteur de recherche libre et
à code ouvert, donc extrêmement cool. Et configurable !!
<br>
<p>Cette fonctionnalité est intéressante pour remplacer les adresses de services utiles
mais bourrés de traqueurs pour ne citer que Twitter, Reddit, Youtube (<a href="https://www.commentcamarche.net/image-son/streaming/28255-ad-blockers-youtube/">surtout avec sa guerre
contre les bloqueurs de pub en ce moment</a>) par des clients/frontend alternatives libre et 
à code ouvert pour continuer à visionner le contenu de ces plateformes de façon plus légère pour le navigateur
et respectant bien mieux la vie privée :il faut encore faire confiance à ceux qui héberge ces clients alternatifs
de ne pas journaliser plus de ce qu'il ne faut ou ajouter des traqueurs furtivement...
<br>
<p>Voici quelques exemples de ces interfaces:
<ul>
	<li><a href="https://instances.invidio.us/">Invidious</a>, pour voir des vidéos Youtube.</li>
	<li><a href="https://github.com/zedeus/nitter/wiki/Instances">Nitter</a>, pour Twitter.</li>
	<li><a href="https://github.com/libreddit/libreddit-instances/blob/master/instances.md">Libreddit</a>, pour Reddit.</li>
</ul>
<br>
<p>Bref, je pense que j'ai assez donné de contexte. Dans votre fichier de configuration Searx
 dont le chemin est sûrement <tt>/etc/searxng/settings.yml</tt>, il faudra mettre le texte suivant:
 <p>
<pre>
# Réécriture des nom d'hôtes
# Vous pouvez mettre ceci à la fin de votre fichier.
enabled_plugins:       # la documentation officielle dit d'utiliser 'plugins:' mais ça marche pas
  - 'Hostname replace' # voir <a href="https://github.com/searxng/searxng/blob/b3d29cb86db4cc1a4e6320016529d1361451e1f1/utils/templates/etc/searxng/settings.yml#L39C64-L39C69" title="lien vers ligne de configuration intéressante dans github" alt="lien github">https://github.com/searxng/searxng/blob/b3d29cb86db4cc1a4e6320016529d1361451e1f1/utils/templates/etc/searxng/settings.yml#L39C64-L39C69</a>

hostname_replace:
  '(.*\.)?youtube\.com$': 'yewtu.be'
  '(.*\.)?youtu\.be$': 'yewtu.be'
  '(.*\.)?youtube-noocookie\.com$': 'yewtu.be'
  '(.*\.)?twitter\.com$': 'nitter.net'
  '(.*\.)?x\.com$': 'nitter.net'
  '(.*\.)?reddit\.com$': 'libreddit.freedit.eu'
</pre>
<p>Vous pouvez maintenant redémarrer le service Searx et faire une recherche ciblées sur les
sites dont vous souhaitez changer l'URL: ça devrait être <b><span style="color:green">OK</span></b>.
]]></description>
</item>




<item>
<title>Soudures pour prise jack d'un casque Y250CPX(-B) sur casque BeyerDynamics DT770 Pro</title>
<guid>http://partage.les-miquelots.net/blog/2022/#soudures-pour-prise-jack-dun-casque-y250cpxb-sur-casque-beyerdynamics-dt770-pro</guid>
<pubDate>Mon, 07 Feb 2022 23:57:29 +0100</pubDate>
<description><![CDATA[
<p>Bonjour,
<p>J'ai récemment accidentellement cassé la prise jack sur un casque Beyer Dynamic DT7770 Pro. Bien heuresement, j'avais une prise jack d'un ancien micro casque, un Thrustmaster Y25OCPX, qui traînait dans les parages. Voici les soudures que j'ai faites avec quelques annotations:
<br>
<a target="_blank" rel="noopener" href="/img/BeyerDynamicsDT770Pro+Y250CPXjack_fr.jpeg"><img loading="lazy" src="/img/BeyerDynamicsDT770Pro+Y250CPXjack_fr.jpeg" alt="Photo montrant àgauche le cable d'un casque BeyerDynamics DT770 Pro soudé avec le câble jack d'un casque Thrustmaster Y250CPX sur la droite."></a></p>
<p>Sous format texte, le câblage donne ceci avec le casque BeyerDynamics à gauche et le Thurtmaster à droite:
<ul>
    <li><span style="color:red">Rouge</span> &lt;=&gt; <span style="color:red">Rouge</span>
    <li><b><span style="color:whitesmoke;background:#222222;padding:2px">Blanc</b></span> &lt;=&gt; <span style="color:cyan">Bleu</span>
    <li> Noir &lt;=&gt; Noir
    <li> Ne rien faire &lt;=&gt; <b><span style="color:whitesmoke;background:#222222;padding:2px">Blanc</b></span>
</ul>
<p>À noter: le fil de microphone blanc côté Thrustmaster est inutile et peut-être coupé. C'est aussi la raison qu'il n'a pas de correspondance côté casque Beyer Dynamics (le X rouge).
<br>
<p>Après ceci soudé, le stéréo devrait marcher sans aucun problème. N'oubliez pas de protéger vos câbles après soudure.
]]></description>
</item>








<item>
<title>Quelques astuces pour mettre un site sur IPFS.</title>
<guid>http://partage.les-miquelots.net/blog/2022/#quelques-astuces-pour-mettre-un-site-sur-ipfs</guid>
<pubDate>Wed, 26 Jan 2022 00:04:54 +0100</pubDate>
<description><![CDATA[
<p>Bonjour à tous,

<p>J'ai mis la main sur <a href="https://app.ens.domains/name/les-miquelots.eth" target="_blank" rel="noopener">un nom de domaine .ETH</a> car le concept d'un système de nom de domaine sur la blockchain m'intéressait et il se trouve que le service en question permet de faire pointer l'adresse .eth vers du contenu <a href="https://ipfs.io">IPFS</a>. Un cocktail bien cors&eacute; pour construire des sites statiques plus résistant à la censure ! Dans ce qui va suivre, je vais addresser les difficultés et les réponses que j'ai trouvé pour mettre mon contenu sur IPFS.

<h3>Les ports à ouvrir</h3>
<p>J'ai t&eacute;l&eacute;charg&eacute; l'impl&eacute;mentation en Go de IPFS et commenc&eacute; à suivre <a href="https://docs.ipfs.io/how-to/websites-on-ipfs/multipage-website/#publish-to-ipns" target="_blank" rel="noopener">ce guide</a> pour publier le site web ici présent sur IPFS. La manipulation peut se résumer comme ceci:
<pre>
systemctl enable --user --now ipfs # activation du service ipfs au démaragge pour l'utilisateur
ipfs init # initialisation fichier de config IPFS
cd /srv/www/blog
ipfs add -r .
&gt; [...output...]
&gt; added QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9 partage.les-miquelots.net
# noter la dernière valeur de la commande `ipfs add -r` du dessus, c'est le hash du répertoire contenant les autres fichiers de notre site sur ipfs.
# vous pouvez la récupérer APRÈS ajout en ajoutant les paramètres '-n -q' à la commande `ipfs add -r`, seul les hashs seront listés.
ipfs name publish QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9
&gt; Publishing to /ipfs/QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9...
Published to k51qzi5uqu5di7tiomn1hejxpswnctdg6m0p6ywk044nv22nk34bapve8ji6xe: /ipfs/QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9
</pre>

<p><i>"Super"</i> me suis-je dis, <i>"je vais pouvoir y accéder dans un navigateur via la clé d'installation IPFS du répertoire (celle qui commence par <code>k51qzi...</code>) et <a href="https://gateway.ipfs.io/ipfs/QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9">une passerelle ipfs...</a>"</i>. Mais non, je fus accueilli par l'erreur suivante: <code>Error: context deadline exceeded</code>.

<p>Il se trouve qu'il faut ouvrir le(s) port(s) correspondant à une valeur trouvé dans le fichier de configuration d'IPFS, <b>Addresses.Swarm</b>:
<pre>
ipfs config Addresses.Swarm
&gt;[
&gt;    "/ip4/0.0.0.0/tcp/4001",
&gt;    "/ip6/::/tcp/4001",
&gt;    "/ip4/0.0.0.0/udp/4001/quic",
&gt;    "/ip6/::/udp/4001/quic"
&gt;]
</pre>

<p>Ce qui nous intéresse ici est la valeur après le type du protocole de communication: dans notre mon cas c'est <b>4001</b> (votre valeur peut différer). Ouvrons ce port dans le pare-feu:
<pre>ufw allow 4001</pre>

<p>J'ai ensuite réajouté mon site web dans IPFS via <code>ipfs add -r</code> et <code>ipfs name publish ...</code> puis retenter le chargement via ipns, et ça a marché.

<h3>Actions Git de post-réception</h3>
<p>Ou dénommés <i>hooks</i>, sont essentiels pour le déploiement d'un site web statique via Git (<a href="https://gist.github.com/Nilpo/8ed5e44be00d6cf21f22" target="_blank" rel="noopener">j'aime bien ce guide sur le sujet</a>). La modification pour intégration avec IPFS est simple, voici à quoi ressemble mon hook <code>post-receive</code>:
<pre>
#!/bin/sh
WEBDIR="/srv/www/webdir"
GIT_WORK_TREE="$WEBDIR" git checkout -f
chmod 755 -R $WEBDIR
rm -rf $WEBDIR/.git $WEBDIR/.gitignore # ménage des dossiers 
                                       # et fichiers inutiles
                                       # pour le site

ipfs add -r $WEBDIR # ajout du répertoire du site web sur IPFS
IPFS_DIR_HASH="$(ipfs add -r -q -n $WEBDIR | tail -1)" # hash du répertoire sur
                                                       # la dernière ligne, on recup
ipfs name publish $IPFS_DIR_HASH # publication sur ipns
</pre>

<p>L'attente devrait être en moyenne aux alentours de 30 secondes pour la publication du contenu sur IPFS.


<h3>Une bonne configuration par défaut</h3>
<p>Après ça je me suis demandais s'il y avait des configurations préfaites selon le contexte d'utilisation d'IPFS. Il se trouve que <a href="https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#profiles" target="_blank" rel="noopener">oui et on peut les appliquer via la ligne de commande</a>. Si vous êtes sur un VPS, <code>ipfs config profile apply server</code> est intéressant: il désactive le balayage du réseau local pour la recherche de noeud IPFS.
<p>Redémarrez votre daemon IPFS après la commande.

<h3>Les chemins absolus pour les ressources</h3>
<p>Si vous utilisez par exemple <u>https://gateway.ipfs.io/ipfs/QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9</u> pour accéder à votre site hébergé via IPFS, la déclaration de chemin absolu dans la source HTML de votre site va poser problème: la feuille de style <code>href="/styles.css"</code> pointera vers <u>https://gateway.ipfs.io/styles.css</u>.

<p>À cet effet, je préfère <u>dweb.link</u> parce que cette passerelle dirige vers un <i>sous</i> domaine lors de la résolution de nom des addresses de contenu ipfs: <u>https://dweb.link/ipfs/QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9/</u> redirigera vers <u>https://bafybeibdqbrggbnn5to7rd2nieobiiklhikjiwcexb5arpziqb7u5khygi.ipfs.dweb.link/</u> et on n'aura pas de soucis. Celà évite de réécrire tout en chemin relatifs.

<h3>Mises à jour du site web et transactions dans la zone ENS</h3>
<p>Pour que le nom de domaine en .eth pointe vers notre site hébergé depuis IPFS, il faut lui donner l'<a href="https://docs.ipfs.io/concepts/content-addressing/#identifier-formats" target="_blank" rel="noopener" title="CID ou 'content identifier' pour IPFS">adresse du contenu</a>. Si vous avez déjà fait plusieurs mise à jour et publié sur IPFS, vous avez pu voir que <b>le CID change lors du changemnt du contenu du répertoire ou fichier</b>.
<p>Mettre à jour ce contenu dans l'interface de <u>ens.domains</u> coûte de l'ETH avec les coûts du gas qui l'accompagne, puisque on inscrit cette donnée dans la blockchain. Avec les prix du gas actuel et surtout si vous faites des mises à jour fréquentes, vous allez payer bonbon.
<p>Je pense donc que la solution pour contrecarrer le fait qu'on est pas Crésus est d'utiliser <a href="https://docs.ipfs.io/concepts/ipns/" target="_blank" rel="noopener" title="InterPlanetary Name System">IPNS</a> + <a href="https://dnslink.io/" target="_blank" rel="noopener">DNSLink</a>. La démarche est comme suit:
<ul>
    <li>Depuis la zone dns de votre domaine, rajoutez une entrée de type TXT avec le nom <code>_dnslink</code> et comme valeur <code>dnslink=/ipfs/hash_du_fichier_ou_repertoire_sur_ipfs</code>. Automatisable si votre hébergeur DNS fournit l'accés à son API. Dans mon cas, on a par exemple:
    <pre>;; ANSWER SECTION:
    _dnslink.partage.les-miquelots.net.     60      IN      TXT     "dnslink=/ipfs/QmPud4wyhs58VWxyzgKNSi2rFwFdtjscHADt4rbw1WaMNp"</pre>
    </li>
    <li>Récupérer le format base32 de la clé d'installation avec la commande
    <pre>ipfs key list -l --ipns-base base32
&gt;<b>bafzaajaiaejcaum5ub77e74hftph3jbbitj2njlmrn2zs2xbsp4aedog776jnjus</b> self
    </pre>
    </li>
    <li>Copier ce que vous avez obtenu précédemment dans le champ <i>content</i> de votre zone ENS sous la forme
    <code>/ipns/bafzaajaiaejcaum5ub77e74hftph3jbbitj2njlmrn2zs2xbsp4aedog776jnjus</code> ou <code>ipns://bafzaajaiaejcaum5ub77e74hftph3jbbitj2njlmrn2zs2xbsp4aedog776jnjus</code></li>
<li>Valider la transaction</li>
</ul>
<br>
    <p>De ce fait, vous n'avez plus qu'à mettre à jour votre zone DNS (de façon automatisée de préférence) hors blockchain afin que votre domaine .eth pointe toujours vers le contenu IPFS le plus récent pour votre site web.


<h3>Rafraîchissement du contenu</h3>
<p>J'ai remarqué que malgré le fait que <code>ipfs add -r</code> épingle (<i>pin</i>) les fichiers pour les rendre disponible, au bout d'un certain temps, si vous ne refaites pas un <code>ipfs add -r</code> m&ecirc;me quand le contenu de votre site ne change pas, il ne sera plus accessible via ipns. L'astuce est donc de refaire un coup de <code>ipfs add -r</code> et pourquoi pas de mettre tout ça dans la crontab de l'utilisateur d'IPFS:
<pre>
# adaptez le chemin /srv/www/webdir avec le votre

# lancement de la commande d'ajout des fichiers sur IPFS toutes les heures
* */1 * * * /usr/bin/ipfs add -r /srv/www/webdir 
</pre>

<br>
<br>
<p>C'est tout ce que j'ai à dire pour l'instant sur le sujet. Hey, c'est d'ailleurs le premier poste de 2022! Bonne année à vous tous!
]]></description>
</item>



<item>
<title>Récupérer facilement son IP publique avec sa box SFR (modèle NB6-FXC-R2)</title>
<guid>http://partage.les-miquelots.net/blog/2021/#recuperer-facilement-son-ip-publique-avec-sa-box-sfr-modele-nb6fxcr2</guid>
<pubDate>Sun, 05 Dec 2021 03:28:07 +0100</pubDate>
<description><![CDATA[
<p>Bonjour &agrave; tous, <br>
Aujourd'hui je vais vous montrer comment r&eacute;cup&eacute;rer facilement 
l'IP publique de votre box SFR depuis la ligne de commande sous Windows et syst&egrave;mes Unix, sans passer par de tierce partie
comme <a href="http://ipecho.net/plain">ipecho</a>.
Les pr&eacute;requis sont les suivants, m&ecirc;me si je pense que si vous avez "<b>Addresse IPv4: XX.XX.XX.XX</b>"
sur la page web d'accueilde votre box, &ccedil;a marcherait avec pas ou peu de modifications:
<ul>
    <li> Vous avez une box de l'op&eacute;rateur SFR
    <li> Son mod&egrave;le est NB6-FXC-R2
    <li> (facultatif) La version logicielle est NB6-MAIN-R3.5.8
</ul>
<br>

<p>Si vous allez dans l'interface de votre box, qui est en g&eacute;n&eacute;ral <a href="http://192.168.1.1" target="_blank"
 rel="noopener">192.168.1.1</a>, vous pouvez voir que l'adresse IP publique est d&eacute;j&agrave; list&eacute; sans m&ecirc;me
 vous connecter en tant qu'admin. Pour r&eacute;cup&eacute;rer la valeur, ex&eacute;cutez ceci dans votre terminal Unix (adaptez selon votre
 OS):
<pre>
# Sous Linux et Unixes
curl -s 192.168.1.1 | grep -A 2 "Adresse IPv4" | tail -1 | cut -d" " -f3

# Sous Windows 10, cmd.exe et PowerShell
powershell -nologo -noprofile -command "(curl.exe -s 192.168.1.1 | sls 'Adresse IPv4' -Context 2).Split('&gt;')[6].Trim()"

# (Non test&eacute;) Sous Windows 7, cmd.exe et PowerShell 2.0/3.0
bitsadmin.exe /transfer sfrpubip /download /priority normal http://192.168.1.1/ c:\\sfr
powershell -nologo -noprofile -command "((Get-Content 'C:\sfr' | sls 'Adresse IPv4' -Context 2)).toString().Split('&gt;')[6].Trim()"
</pre>

<p>Qu'est ce qui se passe:
    <ul>
        <li><code>curl -s</code> permet d'imprimer dans le terminal le code source HTML
        de la page d'accueil</li>
        <li><code>grep -A 2 "Adresse IPv4"</code> recherche et affiche la ligne correspondant
        aux mots "Adresse IPv4" ainsi que les 2 lignes d'apr&egrave;s. La 3<sup>i&egrave;me</sup> ligne est l'IP. C&ocirc;t&eacute; Windows, c'est ce qu'accomplit le <code>sls</code> qui est un raccourci de <code><a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string" target="_blank" rel="noopener">Select-String</code></a></li>
        <li><code>tail -1</code> r&eacute;cup&egrave;rera la derni&egrave;re ligne derni&egrave;re commande.</li>
        <li><code>cut -d" " -f3</code> va finalement "d&eacute;couper" la cha&icirc;ne de caract&egrave;res en prenant
        1 espace comme d&eacute;limiteur et on demande d'afficher le 3<sup>i&egrave;me</sup> champ li&eacute; &agrave; ce d&eacute;coupage: c'est
        notre adresse IP publique sans balise HTML superflue et espaces ou charact&egrave;res vides.</li>
    </ul>
<br>
<p>En esp&eacute;rant que ça vous a aid&eacute;, je vous souhaite une bonne journ&eacute;e.
]]></description>
</item>










<item>
<title>Faire marcher Freenet sur FreeBSD</title>
<guid>http://partage.les-miquelots.net/blog/2021/#faire-marcher-freenet-sur-freebsd</guid>
<pubDate>Sun, 31 Oct 2021 11:21:17 +0100</pubDate>
<description><![CDATA[
<p>Bonjour,<br>
Si vous n'arrivez pas &agrave; d&eacute;marrer le routeur Freenet sur FreeBSD version 12.3 et que vous avez une erreur semblable &agrave; ceci:

<pre>
Your java executable at /usr/local/bin/java is a script... looking for alternatives...
Your java executable at /usr/local/openjdk8/jre/bin/java seems suitable
Unable to locate any of the following binaries:
    /usr/home/freenet/app/./bin/wrapper-freebsd-x86-64
    /usr/home/freenet/app/./bin/wrapper
Starting Freenet 0.7...

Let's start the node without the wrapper, you'll have to daemonize it yourself.
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/Platform
    at freenet.support.ProcessPriority.enterBackgroundMode(ProcessPriority.java:63)
    at freenet.node.NodeStarter.main(NodeStarter.java:264)
Caused by: java.lang.ClassNotFoundException: com.sun.jna.Platform
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 2 more
</pre>

<p>Vous avez besoin d'installer le paquet <code>javaservicewrapper</code> et copier le binaire du wrapper dans le dossier ou vous avez install&eacute; Freenet. Dans notre exemple, &ccedil;a serait donc <code>/usr/home/freenet/app/bin/wrapper</code>:

<pre>
pkg install javaservicewrapper
cp /usr/local/lib/javaservicewrapper/bin/wrapper /usr/home/freenet/app/bin/wrapper
chmod 755 /usr/home/freenet/app/bin/wrapper
</pre>

<p>Relancez le routeur gr&acirc;ce au script <code>run.sh</code> ou <a href="https://github.com/freenet/wiki/wiki/Simple-FreeBSD-rc.d-wrapper-for-freenet">le script rc.d pour FreeBSD</a> (n'oubliez pas d'&eacute;diter le chemin du script <code>run.sh</code> et du r&eacute;pertoire s'il ne convient pas d&eacute;j&agrave;). Ici, on va utiliser le script rc.d et je devrais noter qu'il faut ins&eacute;rer <code>freenet_enable="YES"</code> dans le <code>/etc/rc.conf</code>:

<pre>
$ service freenet start
Your java executable at /usr/local/bin/java is a script... looking for alternatives...
Your java executable at /usr/local/openjdk8/jre/bin/java seems suitable
Starting Freenet 0.7...
</pre>
]]></description>
</item>




<item>
<title>Workaround for '[ffmpeg] https: Cannot reuse HTTP connection for different host' errors</title>
<guid>http://partage.les-miquelots.net/blog/2021/#workaround-for-ffmpeg-https-cannot-reuse-http-connection-for-different-host-errors</guid>
<pubDate>Sat, 23 Oct 2021 15:34:12 +0100</pubDate>
<description><![CDATA[
<p>Hi pals

<p>Say you want to play a livestream from Youtube but you get a choppy
playback and the console spews out error like
<pre>[ffmpeg] https: Cannot reuse HTTP connection for different host:</pre>

<p> The trick is to purge your <code>youtube-dl</code> cache (usually located at
<code>~/.cache/youtube-dl/</code>), so 
good ol' <code>rm -rf</code> will do.

<p>Quit and reopen the stream and it should be fine.
]]></description>
</item>


<item>
<title>Quelques conseils pour faire marcher une clé USB avec Ventoy installé dessus</title>
<guid>http://partage.les-miquelots.net/blog/2021/#quelques-conseils-pour-faire-marcher-une-cle-usb-avec-ventoy-installe-dessus</guid>
<pubDate>Wed, 08 Sep 2021 23:35:00 +0100</pubDate>
<description><![CDATA[
<p>Bonjour à tous,</p>
<p>J'ai d&eacute;couvert <a href="https://ventoy.net/" rel="noopener">Ventoy</a> en tant que remplacement de <a href="https://www.pendrivelinux.com/yumi-multiboot-usb-creator/" rel="noopener">YUMI</a> pour cr&eacute;er des USB avec de multiples choix de d&eacute;marrage. Les infos sont sur le site officiel, mais pour faire court, c'est YUMI en plus simple et multiplateforme. Il suffit de d&eacute;poser l'ISO de la distribution de votre choix dans la partition faite pour sur le p&eacute;riph de stockage o&ugrave; vous avez install&eacute; Ventoy.</p>
<p>Sur un Acer Aspire avec un BIOS <u>Insyde Corp</u>, il est possible que malgr&eacute; la d&eacute;sactivation du <i>Secure Boot</i> dans le BIOS et la cl&eacute; USB vous n'avez toujours pas la possibilit&eacute; de d&eacute;marrer sur votre cl&eacute; USB Ventoy.</p>
<p>L'astuce est d'abord de brancher votre cl&eacute; USB, red&eacute;marrer puis aller dans l'onglet "<i>Security</i>" du BIOS et en dessous de la section "<i>Secure Boot Mode</i>" il y aura une option "<i>Select an UEFI file as trusted for executing</i>".<br>
Appuyez sur <kbd>Entr&eacute;e</kbd>: vous devez maintenant choisir un fichier avec une extension <b>.efi</b>. Cherchez donc un fichier s'appelant <b>ventoyboot.efi</b> (il est normalement dans le dossier <u>EFI/</u>) et choisissez-le. Red&eacute;marrez, pressez <kbd>F12</kbd>, choisissez <b>ventoyboot.efi</b> et vous devriez maintenant voir appara&icirc;tre le menu GRUB de Ventoy avec les ISOs mis dans votre cl&eacute;.</p>

<h3>Mais comment faire pour d&eacute;sactiver le Secure Boot sur ma cl&eacute; USB ?</h3>
<pre>ventoy -u -S /dev/sdX # n'entra&icirc;ne pas de perte de donn&eacute;es sur la cl&eacute;</pre>
]]></description>
</item>




<item>
<title>Mise en place d'un client web XMPP avec liens de création de compte (conversejs+prosody)</title>
<guid>http://partage.les-miquelots.net/blog/2021/#mise-en-place-dun-client-web-xmpp-avec-liens-de-creation-de-compte-conversejsprosody</guid>
<pubDate>Thu, 20 May 2021 12:54:33 +0100</pubDate>
<description><![CDATA[
<p><b>maj 22/05/2021</b>: OMEMO par pas d&eacute;faut au final, on laisse le choix &agrave;
l'utilisateur de l'activer dans ses discussions, et c'est mieux niveau historique des messages
sur plusieurs appareils. On am&eacute;liore aussi la commande apt  (-y --no-install-recommends). <br><br>
<p>Bonjour &agrave; tous, <br><br>
<p>Aujourd'hui je vais vous montrer comment mettre en place un serveur XMPP avec un
client Web sur la m&ecirc;me machine, avec la
possibilit&eacute;
d'envoyer des liens d'invitations de cr&eacute;ation de comptes ou d'ajout
en contact pour faciliter l'embarquement de vos proches et amis.
Je ne fais pas de pr&eacute;sentation du protocole XMPP, c'est hors de la
port&eacute;e de ce guide et des gens l'explique mieux que moi, je pense
surtout &agrave; <a
href="https://www.goffi.org/b/S%C3%A0T_DOTCLEAR_IMPORT_BLOG_default_goffi_99%3A2015%2F06%2F24%2FParlons-XMPP-%C3%A9pisode-1-les-bases">cette
 suite d'articles de chez goffi.org</a>.<br>
<b>pav&eacute; c&eacute;sar g&eacute;palu lol</b>: c'est un protocole
compos&eacute; d'une myriade de standards permettant
la construction de r&eacute;seaux de messagerie instantan&eacute;e 
d&eacute;centralis&eacute;s et s&eacute;curis&eacute;s. Possibilit&eacute; d'avoir
des salons publics et priv&eacute;s.
<br><br>

<p><div id="guide-sommaire">
        <u>Sommaire:</u>
            <ol>
                <li><a href="#xmpp-guide-prereq">Pr&eacute;requis</a></li>
                <li><a href="#xmpp-guide-dnszone">Configuration zone DNS</a></li>
                <li><a href="#xmpp-guide-iptables">Configuration pare-feu</a></li>
                <li><a href="#xmpp-guide-pkgs">Installation des
                paquets</a></li>
                <li><a href="#xmpp-guide-certs">Installation des
                certificats</a></li>
                <li><a href="#xmpp-guide-confpkgs">Configuration des
                paquets</a></li>
                <li><a href="#xmpp-guide-con">Connexion &agrave; l'interface web</a></li>
                <li><a href="#xmpp-guide-genlinks">G&eacute;n&eacute;ration des liens d'invitation</a></li>
                
                <li><a href="#xmpp-guide-remarks">Remarques</a></li>
                <li><a href="#xmpp-guide-docs">Documentations</a></li>
                <li><a href="#xmpp-guide-thanks">Remerciements</a></li>


            </ol>
    </div>
        <br><br>

<h3 id="xmpp-guide-prereq"><a href="#xmpp-guide-prereq">1.
Pr&eacute;requis</a></h3>

<p>Tr&ecirc;ve de bavardages, voici ce que l'on va devoir installer:
<ul>
    <li><samp>certbot</samp>: g&eacute;n&eacute;ration des certificats
    pour renforcer la s&eacute;curit&eacute; de la communication
    client=&gt;serveur et serveur&lt;=&gt;serveur.</li>
    <li><samp>prosody</samp>: le serveur XMPP, la pi&egrave;ce maîtresse.</li>
    <li><samp>nginx</samp>: le proxy invers&eacute; qui g&eacute;rera les
    connexions &agrave; l'interface web et les connexions <span
    style="color:green"><b>HTTPS</b></span>.</li>
    <li><samp>conversejs</samp>: l'interface web pour notre serveur XMPP.</li>
    <li><samp>libjs-bootstrap4 libjs-jquery</samp>: le module
    <samp><a
    href="https://modules.prosody.im/mod_invites.html#external-dependencies"
    target="_blank" rel="noopener" >mod_invites</a></samp> de Prosody a
    besoin de ces biblioth&egrave;ques pour le CSS et bouts de JavaScript.
    <li><samp>hg</samp>: pour cloner le d&eacute;pôt des modules de
    <samp>prosody</samp> et les maintenir &agrave; jour.</li>
</ul><br>


<p>Mettez-vous d'accord sur votre nom de domaine: vous remplacerez les
occurences de <samp>exemple.fr</samp> dans ce guide par votre
nom de domaine. On va aussi utiliser un sous-domaine pour
l'interface web, <samp>chat.exemple.fr</samp>, un qui contiendra les
salons publics et priv&eacute;s, <samp>salons.exemple.fr</samp> et un
autre pour le serveur d'envoi de fichiers,
<samp>f.exemple.fr</samp>.<br>
N'oubliez pas de rajouter des entr&eacute;es DNS type A pour ces
sous-domaines.
<br><br>

<h3 id="xmpp-guide-dnszone"><a href="#xmpp-guide-dnszone">2. Configuration zone DNS</a></h3>
<p>Tout d'abord, rendez-vous dans la zone DNS de votre nom de domaine, on va
rajouter quelques entr&eacute;es de type SRV et TXT pour faciliter la
communication des clients et serveurs XMPP avec nous (plus de
d&eacute;tails en anglais <a
href="https://wiki.xmpp.org/web/SRV_Records">par l&agrave;</a> ou <a
href="https://prosody.im/doc/dns">encore ici</a>):
<pre>
_xmpp-client._tcp.exemple.fr 86400 SRV 1 1 5222 exemple.fr.
_xmpps-client._tcp.exemple.fr 86400 SRV 1 1 5223 exemple.fr.
_xmpp-server._tcp.exemple.fr 86400 SRV 1 1 5269 exemple.fr.
_xmppconnect.exemple.fr TXT _xmpp-client-xbosh=https://chat.exemple.fr/http-bind
</pre>

<p><b>À noter:</b> le <samp>exemple.fr</samp> &agrave; de gauche
repr&eacute;nte le domaine XMPP, celui de droite est le serveur qui
r&eacute;pondra aux requ&ecirc;tes et une entr&eacute;e DNS de type A
doit exister pour celui-ci, pas de raccourci type CNAME autoris&eacute;.
C'est pratique quand vous voulez des adresses utilisateurs "propres" tel
que <u>vous@exemple.fr</u> mais que le serveur est en fait sur le
sous-domaine <samp>xmpp.exemple.fr</samp>. Si c'est le cas, changez
alors le <samp>exemple.fr</samp> de droite par
<samp>xmpp.exemple.fr</samp>.<br><br>


<h3 id="xmpp-guide-iptables"><a href="#xmpp-guide-iptables">3. Configuration pare-feu</a></h3>
<p><b><u>IMPORTANT</u>:Connectez-vous en tant que root avant d'ex&eacute;cutez les
commandes contenues dans
ce tutoriel</b>. On va ensuite configurer des r&egrave;gles
<samp>iptables</samp> pour &eacute;viter de se mordre les doigts
de rage par la suite. Je pars du principe que vous avez d&eacute;j&agrave;
 configur&eacute; quelques r&egrave;gles vous permettant de SSH tranquillou.

<pre>
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5222 -j ACCEPT # on accepte les connexions client &agrave; serveur
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5223 -j ACCEPT # pareil que le dessus mais celles qui sont chiffr&eacute;s.
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5269 -j ACCEPT # connexions serveur &agrave; serveur.
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # HTTP pour l'interface web
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT # HTTPS
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT # pour envoyer des requ&ecirc;te DNS
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT # en output aussi si des serveurs utilisant l'HTTP upload pour les pjs
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT

iptables-save &gt; /etc/iptables/iptables.rules


# pareil pour l'ipv6
ip6tables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5222 -j ACCEPT
ip6tables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5223 -j ACCEPT
ip6tables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5269 -j ACCEPT
ip6tables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # HTTP
ip6tables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT # HTTPS
ip6tables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # HTTP pour l'interface web
ip6tables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT # HTTPS
ip6tables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT # pour envoyer des requ&ecirc;te DNS
ip6tables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT # en output aussi si des serveurs utilise l'HTTP upload pour les pjs
ip6tables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT

ip6tables-save &gt; /etc/iptables/ip6tables.rules
systemctl enable --now iptables # activation du service iptables si pas
# d&eacute;j&agrave; fait pour garder la config du pare-feu apr&egrave;s reboot.
</pre><br>

<h3 id="xmpp-guide-pkgs"><a href="#xmpp-guide-pkgs">4. Installation des paquets</a></h3>

<p>Apr&egrave;s ceci, installez <samp>prosody</samp> depuis <a
href="https://prosody.im/doc/installing_from_source">les sources</a> ou
votre <a href="https://prosody.im/download/start">installeur de
paquets</a>. On en profitera pour installer les autres composants requis
&agrave; ce guide. Sur un Debian classique cel&agrave; donnera:<br>
<pre>sudo apt-get install -y --no-install-recommends prosody nginx-full \ 
certbot python3-certbot-nginx \
mercurial libjs-bootstrap4 libjs-jquery</pre><br>

<p>On va maintenant cloner les <samp>prosody-modules</samp> depuis la 
source. Il n'est pas toujours &agrave; jour dans les d&eacute;p&ocirc;ts de
paquets:
<pre>
hg clone https://hg.prosody.im/prosody-modules/ /usr/lib/prosody/modules/
</pre>
<p>On pr&eacute;pare en m&ecirc;me temps un script pour mettre
&agrave; automatiquement via la crontab. Cr&eacute;ez le fichier
<samp>/usr/local/sbin/maj_prosodymods.sh</samp> avec le contenu suivant:
<pre>
#!/bin/sh
MODDIR="/usr/lib/prosody/modules/"

if test -d $MODDIR; then
    cd $MODDIR
    hg pull --update
else
    mkdir -p /usr/lib/prosody
    hg clone https://hg.prosody.im/prosody-modules/ $MODDIR
fi
</pre>
<p>N'oubliez pas de faire un coup de <samp>chmod +x</samp> dessus...
<br><br>

<p>On va ensuite t&eacute;l&eacute;charger <samp>conversejs</samp>.
&Agrave; ce jour sur Debian Buster, il n'y a pas de paquet &agrave; jour
officiel pour <samp>conversejs</samp>, donc on va faire un script qu'on
int&eacute;grera dans notre crontab.<br>
Ins&eacute;rez le contenu suivant
dans le fichier <samp>/usr/local/sbin/update_conversejs.sh</samp> puis
rendez-le ex&eacute;cutable:
<pre>
#!/bin/sh
TEMPDIR="$(mktemp -d)"
LOG=/var/log/update_conversejs.log
WWWDIR='/var/www/chat.exemple.fr'
WWWUSER='www-data' # cette valeur sera s&ucirc;rement diff&eacute;rente
                   # si vous n'&ecirc;tes pas sur Debian avec nginx.
                   # par ex. &ccedil;a sera 'http' sous Arch avec nginx.

mkdir -p $WWWDIR/dist
cd $TEMPDIR
printf "\n\n$(date) - INFO - Starting updating conversejs..." | tee -a $LOG
CURL_ERR=$(curl -s \
    https://api.github.com/repos/conversejs/converse.js/releases/latest | \
    grep -o "https://.*\.tgz" | \
    grep converse\.js- | \
    xargs curl -fsOJL) || \
    (printf "\n$(date) - ERR - Updating conversejs failed." | tee -a $LOG &amp;&amp; exit)

# on installe libsignal pour pouvoir utiliser OMEMO
# dans le client web
if test -e "$WWWDIR/dist/libsignal-protocol.min.js"; then
    printf "\n$(date) - TOK - Libsignal already installed, skipping." | tee -a $LOG
else
    curl -fsOJL \
    https://cdn.conversejs.org/3rdparty/libsignal-protocol.min.js || \
    (printf "\n$(date) - ERR - Updating libsignal-protocol-javascript failed." | \
    tee -a $LOG)
    cp libsignal*.js $WWWDIR/dist/
fi

tar xzf *.tgz
cp -rf package/dist  $WWWDIR/
sed "s/fullscreen\.html/index\.html/g" package/manifest.json &gt; $WWWDIR/manifest.json
chown $WWWUSER:$WWWUSER -R $WWWDIR/
chmod 755 -R $WWWDIR/
rm -rf $TEMPDIR
printf "\n$(date) - TOK - Done." | tee -a $LOG
</pre>
<p>Ex&eacute;cutez ce fichier pour gagner du temps dans l'<a
href="#xmpp-guide-confpkgs">&eacute;tape 6</a>, vous n'aurez pas &agrave;
cr&eacute;er le <samp>$WWWDIR</samp>.

<h3 id="xmpp-guide-certs"><a href="#xmpp-guide-certs">5. Installation des
certificats</a></h3>


<p>On va ensuite lancer certbot pour g&eacute;n&eacute;rer des certificats.
Je pars du principe que vous avez configur&eacute; les entr&eacute;es de
type A pour <samp>exemple.fr</samp>, <samp>chat.exemple.fr</samp>
et <samp>f.exemple.fr</samp> dans votre zone DNS:
<pre>certbot certonly --agree-tos --nginx --deploy-hook "prosodyctl --root cert import /etc/letsencrypt/live" -d chat.exemple.fr -d exemple.fr -d f.exemple.fr -d salons.exemple.fr </pre>
<p>Une fois que cette commande s'ex&eacute;cute avec succ&eacute;s, des
dossiers correspondants aux domaines demand&eacute;s devrait
appara&icirc;tre dans <samp>/etc/letsencrypt/live/</samp>.
<br><br>

<h3 id="xmpp-guide-confpkgs"><a href="#xmpp-guide-confpkgs">6. Configuration des
paquets</a></h3>

<p>Le moment est venu! On va t&acirc;ter &acirc; prosody et sa
configuration.<br>
Ouvrez le fichier <samp>/usr/lib/prosody/net/http/server.lua</samp>, on va simplifier la
connexion entre l'interface HTTP de prosody (BOSH) et nginx.<br>
Dans le
fichier, trouver la ligne suivante:
<pre>
headers = { date = date_header, connection = response_conn_header };
</pre>
<p>et rempla&ccedil;ez la par:
<pre>
headers = { date = date_header, connection = response_conn_header, 
            access_control_allow_origin = "exemple.fr" };
-- si 'exemple.fr' ne r&eacute;sout pas le soucis de connexion, mettez
-- un '*' &agrave; la place. Pour rappel, c'est l'adresse du serveur XMPP
-- qui faut mettre, et non celle du domaine.
</pre><br>

<p>Ensuite, on va s'occuper du script qui permettra d'envoyer des fichiers
&agrave; d'autres utilisateurs. Ex&eacute;cutez ceci:
<pre>
mkdir -p /var/www/upload
chown www-data:www-data /var/www/upload # l'utilisateur de nginx peut
                                        # diff&eacute;rer selon la distrib, faites gaffe
mkdir -p /usr/local/lib/perl
wget -O /usr/local/lib/perl/upload.pm https://raw.githubusercontent.com/weiss/ngx_http_upload/master/upload.pm
</pre>
<p>Ouvrez le fichier <samp>upload.pm</samp>, cherchez un bout de texte
ressemblant &agrave; <samp>my $external_secret = 'it-is-secret';</samp>
et changez le <samp>it-is-secret</samp> par un mot de passe fort, de
pr&eacute;f&egrave;rence sans apostrophe ou antislash pour &eacute;viter
que le programme en Perl plantouille quand on va tout d&eacute;marrer.<br>
Notez-vous ce mot de passe sur un bout de papier, on va en avoir besoin
derechef.<br><br>

<p>Passons &agrave; la configuration de prosody: &eacute;ditez le fichier
 <samp>/etc/prosody/prosody.cfg.lua</samp> avec les informations
suivantes:
<pre>
admins = { "vous@exemple.fr" }

-- For more information see: https://prosody.im/doc/libevent
-- use_libevent = true

plugin_paths = { "/usr/lib/prosody/modules" }

modules_enabled = {

    -- Generally required
    "roster"; -- Allow users to have a roster. Recommended ;)
    "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
    "tls"; -- Add support for secure TLS on c2s/s2s connections
    "dialback"; -- s2s dialback support
    "disco"; -- Service discovery

    -- Not essential, but recommended
    "carbons"; -- Keep multiple clients in sync
    "carbons_copies";
    "carbons_copies_adhoc";
    "pep"; -- Enables users to publish their avatar, mood, activity, playing music and more
    "private"; -- Private XML storage (for room bookmarks, etc.)
    "blocklist"; -- Allow users to block communications with other users
    "vcard4"; -- User profiles (stored in PEP)
    "vcard_legacy"; -- Conversion between legacy vCard and PEP Avatar, vcard
    "smacks";
    "bookmarks"; -- vieux module mais compatible avec la
    -- majorit&eacute; des clients XMPP contrairement
    -- &agrave; bookmarks2
    --"bookmarks2";
    "presence"; -- voir l'&eacute;tat de l'utilisateur (en ligne, hors
    -- ligne, etc...)
    "offline";

    -- Nice to have
    "version"; -- Replies to server version requests
    "uptime"; -- Report how long server has been running
    "time"; -- Let others know the time here on this server
    "ping"; -- Replies to XMPP pings with pongs
    "register"; -- Allow users to register on this server using a client and change passwords
    "mam"; -- Store messages in an archive and allow users to access it
    "csi";
    "csi_simple"; -- Simple Mobile optimizations
    "csi_battery_saver";
    "vjud"; -- recherche d'utilisateurs dans les salons

    -- Admin interfaces
    "admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands

    -- HTTP modules
    "bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
    "websocket"; -- XMPP over WebSockets

    -- Other specific functionality
    "posix"; -- POSIX functionality, sends server to background, enables syslog, etc.
    "limits"; -- Enable bandwidth limiting for XMPP connections
    "groups"; -- Shared roster support
    "server_contact_info"; -- Publish contact information for this service
    "announce"; -- Send announcement to all online users
    "welcome"; -- Welcome users who register accounts
    "watchregistrations"; -- Alert admins of registrations
    "motd"; -- Send a message to users when they log in
    --"legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
    --"proxy65"; -- Enables a file transfer proxy service which clients behind NAT can use
}

-- These modules are auto-loaded, but should you want
-- to disable them then uncomment them here:
modules_disabled = {
    -- "offline"; -- Store offline messages
    -- "c2s"; -- Handle client connections
    -- "s2s"; -- Handle server-to-server connections
}

motd_text = [[Bonjour &agrave; tous ! Bienvenue sur mon serveur XMPP. Clavardez heureux !]]
welcome_message = "C'est ta premi&egrave;re connexion, $username. Bienvenue &agrave; toi."

daemonize = false;
pidfile = "/run/prosody/prosody.pid";
trusted_proxies = { "127.0.0.1", "::1" }

-- Force certificate authentication for server-to-server connections
c2s_require_encryption = true -- chiffrement requis pour connexion client &agrave; serveur
s2s_require_encryption = true -- chiffrement requis pour connexion entre serveurs
s2s_secure_auth = true 
authentication = "internal_hashed"

-- mam settings
archive_expires_after = "never" -- historique permanent des chats

log = {
    -- Log files (change 'info' to 'debug' for debug logs):
    info = "/var/log/prosody/prosody.log";
    error = "/var/log/prosody/prosody.err";
    -- Syslog:
    { levels = { "error" }; to = "syslog";  };
}

-- http and certificate shenanigans
certificates = "certs"

-- Include "conf.d/*.cfg.lua"

legacy_ssl_ports =  { 5223 }
-- http_ports =  { 5280 }
-- http_interface = { "*" }
-- https_ports = { 5281 }
-- https_interfaces { "*" }


cross_domain_bosh = { "https://chat.exemple.fr" }
cross_domain_websocket = { "https://chat.exemple.fr" }
consider_bosh_secure = true
consider_websocket_secure = true
allow_registration = true -- n&eacute;cessaire pour mod_invites
registration_invite_only = true -- inscription autoris&eacute; seulement avec les invitations
vjud_mode = "opt-in" -- l'utilisateur doit consentir pour que la recherche vjud 
                     -- le fasse remonter dans les r&eacute;sultats.

-- https://prosody.im/security/advisory_20210512/
gc = {
    speed = 500;
}
c2s_stanza_size_limit = 256 * 1024
s2s_stanza_size_limit = 512 * 1024

limits = {
    c2s = {
        rate = "10kb/s";
    };
    s2sin = {
        rate = "3kb/s";
    };
}
-- https://prosody.im/security/advisory_20210512/

ssl = { 
    key = "certs/exemple.fr.key";
    certificate = "certs/exemple.fr.crt";
}

VirtualHost "exemple.fr"
    invites_page = "https://chat.exemple.fr/invite?{invite.token}"
    webchat_url = "https://chat.exemple.fr/"
    http_external_url = "https://chat.exemple.fr/"
    invite_expiry = 86400 * 7 -- 7 jours avant qu'un lien d'invitation expire
    http_paths = {
        invites_page = "/invite";
        invites_register_web = "/register";
    }

    modules_enabled = {
        "invites";
        "invites_adhoc";
        "invites_page";
        "invites_register";
        "invites_register_web";
        "http_libjs";
    }

    contact_info = {
        abuse = { "mailto:vous@exemple.fr", "xmpp:vous@exemple.fr" };
        admin = { "mailto:vous@exemple.fr", "xmpp:vous@exemple.fr" };
        security = { "mailto:vous@exemple.fr", "xmpp:vous@exemple.fr" };
        support = { "mailto:vous@exemple.fr", "xmpp:vous@exemple.fr" };
    };

    https_certificate = "certs/exemple.fr.crt";
    ssl = { 
        key = "certs/exemple.fr.key";
        certificate = "certs/exemple.fr.crt";
    }

    Component "f.exemple.fr" "http_upload_external"
        http_upload_external_base_url = "https://f.exemple.fr/"
        http_upload_external_secret = "its-a-secret"
        http_upload_external_file_size_limit = 104857600 -- limite de &agrave; 100Mo pour les envois de pjs
        ssl = { 
            key = "certs/f.exemple.fr.key";
            certificate = "certs/f.exemple.fr.crt";
        }

    Component "salons.exemple.fr" "muc"
        name = "Salons (chatrooms) chez exemple.fr"
        modules_enabled = { "muc_mam", "vcard_muc" }
        muc_room_default_language = "fr"
        muc_log_expires_after = "never" -- histo permanent des groupes de
                                        -- chats
        log_all_rooms = true
        muc_log_by_default = true
        muc_log_presences = false
        restrict_room_creation = "admin" -- seul l'admin peut cr&eacute;er des salons
        ssl = { 
            key = "certs/salons.exemple.fr.key";
            certificate = "certs/salons.exemple.fr.crt";
        }
</pre>
<p>Oui, il faut rempla&ccedil;er <u><samp>its-a-secret</samp></u> par le
mot de passe que vous avez not&eacute; tout &agrave; l'heure.<br>
Certains auront aussi remarqu&eacute; qu'on a d&eacute;fini un utilisateur
administrateur au d&eacute;but du fichier de config,
<u>vous@exemple.fr</u>. On va donc cr&eacute;er l'utilisateur avec la
commande:
<pre>
prosodyctl check # &ccedil;a va v&eacute;rifier si y'a des soucis dans la configuration
prosodyctl adduser vous@exemple.fr
</pre><br>

<p>Cr&eacute;ez le fichier
<samp>/var/www/chat.exemple.fr/</samp> avec le texte suivant:
<pre>
&lt;!DOCTYPE html&gt;
&lt;html class="no-js" lang="en"&gt;
    &lt;head&gt;
        &lt;title&gt;Converse&lt;/title&gt;
        &lt;meta charset="utf-8"/&gt;
        &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"/&gt;
        &lt;meta name="description" content="Converse XMPP/Jabber Chat"/&gt;
        &lt;meta name="keywords" content="xmpp chat webchat converse.js" /&gt;
        &lt;link rel="manifest" href="/manifest.json"&gt;
        &lt;link type="text/css" rel="stylesheet" media="screen" href="/dist/converse.min.css" /&gt;
        &lt;script src="/dist/libsignal-protocol.min.js"&gt;&lt;/script&gt;
        &lt;script src="/dist/converse.min.js"&gt;&lt;/script&gt;
    &lt;/head&gt;
    &lt;body class="converse-fullscreen"&gt;
        &lt;noscript&gt;You need to enable JavaScript to run the Converse.js chat app.&lt;/noscript&gt;
        &lt;div id="conversejs-bg"&gt;&lt;/div&gt;
            &lt;script&gt;
                /*
                @licstart
                This is free and unencumbered software released into the public domain.

                Anyone is free to copy, modify, publish, use, compile, sell, or
                distribute this software, either in source code form or as a compiled
                binary, for any purpose, commercial or non-commercial, and by any
                means.

                In jurisdictions that recognize copyright laws, the author or authors
                of this software dedicate any and all copyright interest in the
                software to the public domain. We make this dedication for the benefit
                of the public at large and to the detriment of our heirs and
                successors. We intend this dedication to be an overt act of
                relinquishment in perpetuity of all present and future rights to this
                software under copyright law.

                THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
                EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
                MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
                IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
                OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
                ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
                OTHER DEALINGS IN THE SOFTWARE.

                For more information, please refer to &lt;http://unlicense.org/&gt;
                @licend
                */
                converse.initialize({
                    auto_away: 300, //absent au bout de 5minutes
                    auto_list_rooms: true,
                    auto_reconnect: true,
                    auto_xa: 600, //absence prolong&eacute;e au bout de 10minutes
                    bosh_service_url: 'https://chat.exemple.fr/http-bind/',
                    csi_waiting_time: 60,
                    enable_smacks: true,
                    i18n: 'fr', // pour avoir l'interface en fran&ccedil;ais
                    locked_domain: exemple.fr, // on verouille le domaine autoris&eacute;&agrave; se connecter
                    message_archiving: 'always',
                    persistent_store: 'IndexedDB', // jcbrand a dit qu'en 8.0.0 
                    play_sounds: true,
                    // ça va aller plus vite avec l'IndexedDB
                    theme: 'concord',
                    view_mode: 'fullscreen',
                    websocket_url: 'wss://chat.exemple.fr/xmpp-websocket',
                });
            &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre><br>

<p>C'est presque la fin de ce guide ! On va maintenant cr&eacute;er les
fichiers de configuration nginx. <br>
Cr&eacute;ons <samp>/etc/nginx/sites-enabled/exemple.fr.conf</samp> pour
commencer:
<pre>
server {
    listen 80;
    server_name exemple.fr;

    location / {
        return 301 https://$host$uri;
    }
}

server {
    listen 443 ssl;
    server_nam  exemple.fr;
    ssl_certificate /etc/letsencrypt/live/exemple.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/exemple.fr/privkey.pem;
}
</pre><br>

<p>Ensuite, cr&eacute;ez
<samp>/etc/nginx/sites-enabled/f.exemple.fr.conf</samp>, ce sera pour le
composant
qui g&eacute;rera les pi&egrave;ces jointes:
<pre>
perl_modules /usr/local/lib/perl; # Path to upload.pm.
perl_require upload.pm;

server {
    listen 80;
    server_name f.exemple.fr;
    location / {
        return 301 https://$host$request_uri;	
    }
}

server {
    # Specify directives such as "listen", "server_name", and TLS-related
    # settings for the "server" that handles the uploads. 
    listen 443 ssl http2;
    server_name f.exemple.fr;

    ssl_certificate /etc/letsencrypt/live/f.exemple.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/f.exemple.fr/privkey.pem; 
    # Uploaded files will be stored below the "root" directory. To minimize
    # disk I/O, make sure the specified path is on the same file system as
    # the directory used by Nginx to store temporary files holding request
    # bodies ("client_body_temp_path", often some directory below /var).
    root /var/www/upload;
    index ;
    # Specify this "location" block (if you don't use "/", see below):
    location / {
        perl upload::handle;
    }

    # Upload file size limit (default: 1m), also specified in your XMPP
    # server's upload module configuration (see below):
    client_max_body_size 100m;
}
</pre>
<p>Ex&eacute;cutez <samp>nginx -t</samp> pour tester la configuration. Si
aucune erreur n'est d&eacute;tect&eacute;e, cr&eacute;er le fichier
<samp>/etc/nginx/sites-enabled/chat.exemple.fr.conf</samp>:
<pre>
server {
    listen 80;
    server_name chat.exemple.fr;

    location / {
        return 301 https://$host$uri;
    }
}

server {
    listen 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/chat.exemple.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chat.exemple.fr/privkey.pem;
    root /var/www/chat.exemple.fr;
    index ;

    # XMPP BOSH
    location ^~ /http-bind {
        proxy_pass https://exemple.fr:5281/http-bind;
        proxy_http_version 1.1;
        proxy_set_header Host exemple.fr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        tcp_nodelay on; 
    }

    # XMPP HTTP-Upload
    location ^~ /upload {
        proxy_pass https://f.exemple.fr; proxy_http_version 1.1;
        proxy_set_header Host exemple.fr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_buffering off;
        tcp_nodelay on; 
    }

    # XMPP Websockets
    location /xmpp-websocket {
        proxy_pass http://exemple.fr:5280/xmpp-websocket;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 900s;
    }

    # XMPP Account invite
    location ^~ /invite {
        proxy_pass https://exemple.fr:5281/invite;
        proxy_http_version 1.1;
        proxy_set_header Host exemple.fr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_buffering off;
        tcp_nodelay on; 
    }

    # XMPP account register
    location ^~ /register {
        proxy_pass https://exemple.fr:5281/register;
        proxy_http_version 1.1;
        proxy_set_header Host exemple.fr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_buffering off;
        tcp_nodelay on; 
    }

    # sur mon vps debian j'ai eu besoin de &ccedil;a pour
    # que les pages d'invitation soit bien
    # format&eacute;es
    location = /share/bootstrap4/css/bootstrap.min.css {
        alias /usr/lib/nodejs/bootstrap/dist/css/bootstrap.min.css; 
    }

    location = /share/jquery/jquery.min.js {
        alias /usr/lib/nodejs/jquery/dist/jquery.min.js;
    }

    location = /share/bootstrap4/js/bootstrap.min.js {
        alias /usr/lib/nodejs/bootstrap/dist/js/bootstrap.min.js;
    }

}
</pre>
<p>Ex&eacute;cutez de nouveau <samp>nginx -t</samp> pour d&eacute;tecter
d'&eacute;ventuels probl&egrave;mes de configuration. Une fois que tout
est OK, ajoutez la ligne <samp>127.0.0.1 exemple.fr</samp>
dans le fichier <samp>/etc/hosts</samp>.<br>
Red&eacute;marrez le serveur Prosody et Nginx:
<pre>
systemctl start prosody nginx
# ou
prosodyctl start &amp;&amp; nginx -s reload
</pre><br>

<h3 id="xmpp-guide-con"><a
href="#xmpp-guide-con">7. Connexion &agrave; l'interface web:</a></h3>
<p>Rendez-vous maintenant sur la page web du chat: pour notre
guide &ccedil;a serait <a
href="https://chat.exemple.fr">https://chat.exemple.fr</a>
, adaptez avec ce que vous avez.<br>
Vous devriez voir quelque chose comme &ccedil;a:<br>
<a href="/img/conversejs_login.png"><img
src="/img/conversejs_login.png" alt="capture d'&eacute;cran montrant la page de connexion de Converse.js"></a>

<p><b>Petite astuce</b>: si vous voulez vous connecter avec l'utilisateur
<u><samp>vous@exemple.fr</samp></u> vous pouvez omettre la partie droite
de votre adresse, comme ceci:<br>
<a href="/img/conversejs_logintrick.png"><img
src="/img/conversejs_logintrick.png" alt="Capture d'&eacute;cran montrant le mot de passe et identifiant
pr&eacute;remplis, avec le JID n'ayant pas la partie de gauche grâce àl'attribut locked_domain"></a>

<p>C'est gr&acirc;ce &agrave; la configuration de
<samp><a
href="https://conversejs.org/docs/html/configuration.html?highlight=locked_domain#locked-domain"
target="_blank" rel="noopener">locked_domain</a></samp> lors de l'initialisation de Converse.js.<br>
Une fois connect&eacute;, l'interface ressemblera a ceci:<br>
<a href="/img/conversejs_main.png"><img
src="/img/conversejs_main.png" alt="interface principale de Converse.js apr&eacute;s connexion"></a>

<p>Vous pouvez alors commencer &agrave; utiliser XMPP et rejoindre ou
cr&eacute;er des salons, ajouter des contacts et bien s&ucirc;r discuter depuis
cette interface web !<br><br>

<h3 id="xmpp-guide-genlinks"><a href="#xmpp-guide-genlinks">8.
G&eacute;n&eacute;ration des liens d'invitation</a></h3>

<p>La chose qui nous int&eacute;resse surtout c'est la cr&eacute;ation
de liens d'invitation accessible depuis le Web.<br>
Pour ce faire, cliquez gauche sur la roue dent&eacute;e en haut &agrave; gauche
&agrave; c&ocirc;t&eacute; de votre nom, cliquez sur <u>Commandes</u>.
Dans le champ <u>"Sur quelle entit&eacute; voulez-vous lancer des
commandes?"</u> rentrez le nom de votre serveur XMPP, puis cliquez sur
<u>"Lister les commandes disponibles"</u>. Vous devez avoir quelque chose
de similaire &agrave; ceci:<br>
<a href="/img/conversejs_adhoc1.png"><img
src="/img/conversejs_adhoc1.png" alt="liste des commandes d'administrations du serveur XMPP - Partie 1" ></a><br>

<p>Descendez un peu jusqu'&agrave; voir <u>"Create new contact invite"</u>
et cliquez dessus:<br>
<a href="/img/conversejs_adhoc2.png"><img
src="/img/conversejs_adhoc2.png" alt="liste des commandes d'administrations du serveur XMPP - Partie 2"></a><br>
Une invitation s'est cr&eacute;&eacute;e ! Vous pouvez alors copier le texte
contenu dans <u>"Invite web page"</u> et l'envoyer &agrave; l'un de vos amis,
proches, etc...<br>
Une fois ouvert, le lien am&egrave;ne sur une page de ce type:<br>
<a href="/img/conversejs_invitepage.png"><img
src="/img/conversejs_invitepage.png" alt="la page d'invitation apr&egrave;s avoir cliqu&eacute;
sur le lien"></a><br>
<p>La page d&eacute;tecte automatiquement votre plateforme et vous propose
des applications XMPP natives en fonction. Dans le cas ou la plateforme
est un smartphone, &ccedil;a am&eacute;nera sur la page de
t&eacute;l&eacute;chargement de l'application puis ouvrira celle-ci tout
en continuant l'inscription.<br>
Le lien entour&eacute; de rouge
en bas avec le texte <u>"register an account manually"</u> permet de
s'inscrire via un formulaire web. Pratique pour juste cr&eacute;er le
compte et le tester plus tard. Voici &agrave; quoi &ccedil;a
ressemble:<br>
<a href="/img/conversejs_register1.png"><img
src="/img/conversejs_register1.png" alt="la page de cr&eacute;ation de compte par le web"></a><br>
<p>Vous pouvez voir que j'ai commenc&eacute; a remplir le formulaire: une
fois l'inscription envoy&eacute;e en cliquant sur le bouton
<u>"Submit"</u>, vous serez accueilli par l'&eacute;cran
suivant:<br>
<a href="/img/conversejs_register2.png"><img
src="/img/conversejs_register2.png" alt="la page de cr&eacute;ation de compte par le web
compl&eacute;t&eacute;e et faisant un r&eacute;capitulatif des informations d'inscription"></a><br>
<p>Une page vous confirmant votre inscription s'affiche, avec la
possibilit&eacute; de montrer de nouveau le mot de passe saisie lors de
l'inscription ou cas o&ugrave; (le bouton <u>"Show"</u>).<br>
Le bouton ento&ucirc;r&eacute; de rouge, <u>"Log in via web"</u>,
permettra
&agrave; l'utilisateur inscrit de se connecter &agrave; l'interface web
configur&eacute;e pendant ce tutoriel, et il vous aura en tant que
contact.<br>
<a href="/img/conversejs_chatting.png"><img
src="/img/conversejs_chatting.png" alt="deux personnes ayant une conversation sur converse.js. Un des deux
envoie une image anim&eacute;e (un GIF) d'un alien qui dance."></a><br>


<h3 id="xmpp-guide-remarks"><a href="#xmpp-guide-remarks">9. Remarques</a></h3>
<p>Le guide se finit ici! Je reviendrais pour corriger quelques fautes,
&eacute;tourderies et oublis si j'en aper&ccedil;ois.
J'ai des remarques &agrave; faire sur le logiciel:
<ul style="list-style:disclosure-closed">
    <li>Les messages chiffr&eacute;s OMEMO ne semblent pas lisibles entres
    clients Converse.js. L'envoyeur peut lire son message OMEMO, mais si
    le destinataire utilise uniquement converse.js, il y a de fortes
    chances qu'il voit un message du type <u>"Ceci est un message chiffr&eacute;
    avec OMEMO, que votre client ne semble pas prendre en charge..."</u>.
    Des clients tel que Gajim ou Dino n'ont pas de soucis de ce
    c&ocirc;t&eacute; l&agrave; d'apr&eacute;s mon exp&eacute;rience. J'ai
    peut-&ecirc;tre aussi une erreur de configuration...</li>
    <li>Je vous conseille d'utilisateur un seul navigateur pour
    Converse.js si vous aimez avoir un historique des messages consistant.</li>
    <li>Le chiffrement des pi&egrave;ces jointes n'est pas encore
    impl&eacute;ment&eacute; (source: @jcbrand dans le salon
    discuss@conference.conversejs.org).</li>
    <li>Si vous voulez traduire en fran&ccedil;ais les pages
    d'inscriptions, je vous invite &agrave; regarder le code source des
    modules <samp>mod_invites_pages</samp>, <samp>mod_register_web</samp>
    et <samp>mod_register_apps</samp>.
</ul>

<h3 id="xmpp-guide-docs"><a href="#xmpp-guide-docs">10.
Documentations</a></h3>
<p>Ces liens m'ont bien aid&eacute;:
    <ul style="list-style:square">
        <li><b>Converse.js</b>: <a
        href="https://conversejs.org/docs/html/" target="_blank"
        rel="noopener">G&eacute;n&eacute;ral</a>, <a
        href="https://conversejs.org/docs/html/configuration.html#configuration-settings"
        target="_blank"
        rel="noopener">param&eacute;trage et initialisation</a><br>
        &nbsp;&nbsp;&nbsp;&nbsp;Lire le code source de la page <a
        href="https://inverse.chat" target="_blank" rel="noopener">https://inverse.chat</a>

        </li>
        <li><b>Prosody</b>: <a
        href="https://prosody.im/doc" target="_blank" rel="noopener">G&eacute;n&eacute;ral</a>, <a
        href="https://prosody.im/doc/setting_up_bosh" target="_blank"
        rel="noopener">BOSH+Nginx</a>,
        <a href="https://prosody.im/doc/websocket" target="_blank"
        rel="noopener">Websockets+Nginx</a>,
        <a href="https://modules.prosody.im/xeps.html" target="_blank"
        rel="noopener">Liens XEPs &lt;=&gt;
        modules</a>, le <a
        href="https://modules.prosody.im/mod_invites.html" target="_blank"
        rel="noopener">module d'inscription via invitation</a>, le <a
        href="https://modules.prosody.im/mod_http_upload_external.html"
        target="_blank" rel="noopener">module d'envoi de fichiers via
        script externe</a> et l'impl&eacute;mentation d'Holger (<a
        href="https://github.com/weiss/ngx_http_upload" target="_blank"
        rel="noopener">upload.pm</a>).</li>
    </ul>

<h3 id="xmpp-guide-thanks"><a href="#xmpp-guide-thanks">11.
Remerciements</a></h3>
<p>Tout ceci n'aurait pas &eacute;t&eacute; possible sans les logiciels
libres et leurs collaborateurs. Merci &agrave; vous.<br>
Plus sp&eacute;cifiquement:
<ol style="list-style:square">
    <li><a href="https://blog.laxu.de">laxu.de</a>, l'auteur de <a
    href="https://blog.laxu.de/2018/09/08/conversejs-prosody/">
    https://blog.laxu.de/2018/09/08/conversejs-prosody/</a>, pour le patch de
    <samp>net/http/server.lua</samp> et les bouts de configuration nginx</li>
    <li><a href="https://qorg11.net/">qorg</a> pour son guide sur XMPP, plus
    particuli&egrave;rement l'"HTTP upload"
    (<a
    href="https://kill-9.xyz/guides/xmpp_server" target="_blank"
    rel="noopener">https://kill-9.xyz/guides/xmpp_server</a>)</li> 
    <li> <a
    href="https://wiki.xmpp.org/web/Jan-Carel_Brand_Application_2021"
    target="_blank" rel="noopener">jcbrand</a>, l'auteur et
    d&eacute;veloppeur principal de <a
    href="https://conversejs.org/" target="_blank"
    rel="noopener">Converse.js</a>. Tr&egrave;s r&eacute;actif aux
    questions concernant XMPP et Converse.js dans le salon <a
    href="xmpp:discuss@conference.conversejs.org?join">discuss@conference.conversejs.org</a>.</li>
    <li><a href="xmpp:holger@jabber.fu-berlin.de?message">Holger Weiß</a>,
    d&eacute;veloppeur travaillant sur le serveur XMPP ejabberd et admin du salon
    <a
    href="xmpp:ejabberd@conference.process-one.net?join">ejabberd@conference.process-one.net</a>
    qui a pris de son temps pour me d&eacute;panner (<a
    href="https://partage.les-miquelots.net/blog/un-rappel-lorsque-vous-mettez-en-place-un-serveur-xmpp-avec-prosody.html">le
    probl&egrave;me en question</a>).</li>
</ol><br>

<p>&Agrave; bient&ocirc;t, passez une excellente journ&eacute;e et si vous
avez des questions, remarques, suggestions ou am&eacute;liorations
&agrave; me faire part, n'h&eacute;sitez pas &agrave; me contacter via
mail ou XMPP &agrave; l'adresse <u>lionel ( @ ) les-miquelots ( . )
net</u>.
]]></description>
</item>






<item>
<title>Un rappel lorsque vous mettez en place un serveur XMPP avec Prosody</title>
<guid>http://partage.les-miquelots.net/blog/2021/#un-rappel-lorsque-vous-mettez-en-place-un-serveur-xmpp-avec-prosody</guid>
<pubDate>Wed, 03 Mar 2021 15:56:27 +0100</pubDate>
<description><![CDATA[
<p>Si vous activez le <b>mod_http_upload_external</b>, faites bien attention de ne pas avoir de règle de redirection du traffic dans vos iptables. Sinon, l'envoi de fichiers ne marchera pas et rien n'apparaitra dans les logs du serveur web, de prosody ou de l'application qui est sensé gérer le téléversement de fichiers. On parle de règles de ce style:</p>
<pre>-A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 22067</pre>
<p>Ce genre de bourde n'est pas visible via <code>iptables -L</code>. Faîtes dégueuler la pure configuration grâce à un <code>iptables-save | less</code>.</p><br>

<p>Un grand merci à Alacer et <a href="https://holger.userpage.fu-berlin.de/">Holger Weiß</a> du salon <u>ejabberd@conference.process-one.net</u> qui m'ont bien aiguillé!</p>
]]></description>
</item>










<item>
<title>Traduction du serveur ActivityPub Honk en français !</title>
<guid>http://partage.les-miquelots.net/blog/2021/#traduction-du-serveur-activitypub-honk-en-francais</guid>
<pubDate>Sat, 20 Feb 2021 20:11:01 +0100</pubDate>
<description><![CDATA[
<p>Bonjour à tous et à toutes,<br>

J'ai conçu un module de traduction pour le logiciel <a
href="https://humungus.tedunangst.com/r/honk">Honk</a>. La première
traduction a être ajoutée est le français, donc c'est pour ça que je fais
ce billet de blog. <br>
Le code source du module est disponible ici: <a
href="https://git.les-miquelots.net/honk_custom/about/">i18n.go</a>. Le
module est en grande partie fini, je suis au stage où je fais quelques
ajustements. Vous pouvez me contacter pour moi pour des corrections, je
vous mentionnerai avec grand plaisir.
Klaxonnez copieusement et avec entrain sur le Fédiverse ! Et en bon français
bien sûr.
<br>
Voici à quoi ressemblera l'interface si Honk est compilé avec mon module i18n.go :<br>
<video muted controls width="50%" src="/img/honk_i18n.mp4"></video>
</p>
]]></description>
</item>










<item>
<title>Astuce: Certbot rouspète 'Please choose an account' lors d'une --dry-run</title>
<guid>http://partage.les-miquelots.net/blog/2021/#astuce-certbot-rouspete-please-choose-an-account-lors-dune-dryrun</guid>
<pubDate>Thu, 04 Feb 2021 17:02:42 +0100</pubDate>
<description><![CDATA[
<p>Si <code>certbot renew --dry-run</code> vous pond quelque chose comme
ceci lors de l'exécution:</p><br>

<figure>
<pre>
[...]
ERROR:certbot._internal.renewal:Failed to renew certificate mondomaine.fr with error: Missing command line flag or config entry for this setting:
Please choose an account
Choices: ['localhost@2020-12-08T14:10:30Z (4b7c)', 'packer-output-a2505a21-0328-42a3-b2ec-69a768d7bf78.localdomain@2020-12-17T11:11:07Z (a0fe)']
[...]
</pre>
<figcaption>Un extrait de
/var/log/letsencrypt/letsencrypt.log</figcaption>
</figure>

<p>Alors il suffit de supprimer le ou les dossier(s) où
<code>acme-staging</code> figure dans le nom de fichier dans le répertoire
<code>/etc/letsencrypt/accounts/</code>. Dans mon cas, la commande qui a
résolu le problème a été:</p><br>

<pre>
rm -rf /etc/letsencrypt/accounts/acme-staging-v02.api.letsencrypt.org
certbot renew --dry-run
</pre>

<p>On peut le généraliser comme ceci: <code>rm -rf
/etc/letsencrypt/accounts/acme-staging*</code></p>
]]></description>
</item>


<item>
<title>Faire marcher Pi-hole et votre Livebox V2 ensemble.</title>
<guid>http://partage.les-miquelots.net/blog/2020/#faire-marcher-pihole-et-votre-livebox-v2-ensemble</guid>
<pubDate>Thu, 31 Dec 2020 19:41:40 +0100</pubDate>
<description><![CDATA[
<p>Bonjour à tous,
<br>
J'ai bien galéré pour faire marcher pihole sur un vieux pc
avec une livebox v2 en tant que routeur parce que celle-ci ne permet pas
de changer les DNS directement. Voici comment faire, étape par étape:
<ul>
    <li>Branchez directement l'appareil faisant tourner Pihole sur votre
    box.</li>
    <li>Récupérez et notez-vous sur un bout de papier l'adresse IP de
    l'ordinateur faisant tourner Pihole.<code>ifconfig eth0</code> sous 
    Linux, <code>ipconfig</code> sous Windows.</li>
    <li>Allez sur l'interface de votre box
    (<u>http://livebox.home/</u>|<u>http://192.168.1.1/</u>),
    connectez-vous en tant qu'admin => Configuration avancée => Onglet
    DHCP.</li>
    <li>Attendez un peu, l'IP notée du Pihole devait apparaître dans le
    tableau "Adresse IP dynamiquea" en bas de page. Une fois apparue notez son nom et définissez là en
    tant qu'adresse IP statique via le tableau "Adresse IP statique".
    Ne touchez pas aux informations préremplies.</li>
    <li>Accédez à l'interface DHCP de Pihole via votre navigateur
    :<u>http://pi.hole/admin/settings.php?tab=piholedhcp</u>. Si ça ne
    marche pas, remplaçez pi.hole par l'adresse IP notée plus tôt. Cochez
    <i>"DHCP server enabled"</i> et dans la section <i>"Range of IP addresses to
    hand out"</i>, remplir <i>"From"</i> par l'addresse IP de début
    (<b>doit</b> exclure l'addresse IP de la machine Pihole) et
    <i>"To"</i> par
    l'addresse IP de fin. Ne pas encore sauvegarder les paramètres!!</li>
    <li>Basculez sur la page de votre livebox et désactivez le serveur
    DHCP.</li>
    <li>Basculez de nouveau sur la page d'admin DHCP du Pihole et
    sauvegarder les paramètres de la page DHCP.</li>
    <li>(optionnel) Définissez une adresse IP pour votre Pihole: sous
    Linux, <code>ip address change x/24 ethx</code> où x est une
    adresse IP classe C privée libre (forme 192.168.1.XXX) et eth0
    l'interface Ethernet branchée directement sur la box. Voir en bas de
    cette page pour plus d'infos<sup><a href="#ipstatic">[1]</a></sup>.</li>
</ul>
</p>

<p>Il sera probablement nécessaire de déconnecter et reconnecter vos
équipements connectés en WiFi. Dorénavant, les requêtes DNS devrait passer
par le Pihole ! Moins de pubs pour tout le monde à la maison.</p>
<br>

<p><sup><a id="ipstatic" href="#ipstatic">[1]</a></sup>L'addresse IP
donnée via l'interface de la box à un bail, ce qui veut dire qu'au bout
d'une certaine durée (de ce que j'ai vu et senti: 1 jour) la machine n'en
tiendra plus compte.<br>
Plus d'IP = plus reconnu sous le réseau et vu que
c'est le Pi-hole qui s'occupe du DHCP ET du DNS, ça veut échec de la
connexion au réseau pour les autres équipements.<br>
Voici donc ci-dessous un script (pour Linux) sur la machine Pihole permettant de mettre
à jour son IP. À exécuter toutes les heures grâce à <code>crontab</code>
pour éviter de le faire en manuel.
</p>
<pre>
#!/bin/sh
ip address change x.x.x.x/24 dev eth0 # remplacez x.x.x.x par l'adresse IP
notée de la Pihole
ip route add default via 192.168.1.1 dev eth0 # 192.168.1.1 est la
passerelle, c'est à dire la box qui nous donne l'accés à internet.
</pre>
]]></description>
</item>


<item>
<title>Extrait d'une config client ssh pour un admin gitolite</title>
<guid>http://partage.les-miquelots.net/blog/2020/#extrait-dune-config-client-ssh-pour-un-admin-gitolite</guid>
<pubDate>Thu, 24 Dec 2020 23:44:12 +0100</pubDate>
<description><![CDATA[


<p><br>tl;dr: l'option Hostname dans la config client ssh est bien
pratique quand on a plusieurs clef secrète pour le même utilisateur sur le
serveur distant.<br>
Salut totu le monde,</p>

<p>Ça me servira de pense-bête et j'espère que
ça aidera quelqu'un dans le futur. <br>
Voici le soucis: vous venez d'installer gitolite et cgit sur votre serveur
web mais il faut jongler avec les clefs secrètes pour soit:

<ul>
    <li>Accéder au serveur normalement via SSH. On peut utiliser le shell.</li>
    <li>Administrer gitolite via le push du repo
    <code>gitolite-admin</code></li>
    <li>Pousser du code sur le serveur en tant qu'utilisateur normal du système
    gitolite</li>
</ul>
</p>

<p>Un moyen que j'ai appris est la l'option <code>Hostname</code> dans les
blocs <code>Hosts</code> de votre config ssh client
(<code>~/.ssh/config</code> pour rappel). J'ai quelque chose qui ressemble
à ça de mon côté:
</p>

<pre>
Host admin_gitolite
    Hostname git.nomdedomaine.com
    IdentityFile ~/.ssh/admin_gitolite
    User gitolite

Host utilisateur_gitolite
    Hostname git.nomdedomaine.com
    IdentityFile ~/.ssh/utilisateur_gitolite
    User gitolite

Host serveurweb
    Hostname git.nomdedomaine.com
    IdentityFile ~/.ssh/serveurweb
    User utilnormal
</pre>

<p>Donc si vous renommer l'URL de rapatriement de votre répertoire
d'administration de gitolite en
<code>ssh://admin_gitolite:/gitolite-admin</code>, ssh le comprendra et
demandera le mot de passe pour la clé secrète
<code>~/.ssh/admin_gitolite</code> lors du push.
C'est le même principe pour <code>utilisateur_gitolite</code> sauf que
le mot de passe pour la clé secrète
<code>~/.ssh/utilisateur_gitolite</code> sera demandée.
<br>Enfin, exécuter <code>ssh serveurweb</code> permettra d'accéder tout
simplement à l'interpréteur de commande de l'utilisateur
<code>utilnormal</code> sur la machine avec le nom d'hôte
<i>git.nomdedomaine.com</i>.</p>

<p>C'est tout ce que j'ai à dire, bonnes fêtes et bon Noël à vous tous !
🎄🎄🎄 </p>
]]></description>
</item>


<item>
<title>Passage à cgit</title>
<guid>http://partage.les-miquelots.net/blog/2020/#passage-a-cgit</guid>
<pubDate>Tue, 22 Dec 2020 17:20:01 +0100</pubDate>
<description><![CDATA[
<p>Salut tout le monde,</p>

<p>    J'avais l'habitude de faire des tarballs de mes logiciels
mais je vais laisser cgit le faire maintenant.
C'est la raison pour laquelle il n'y a plus le tableau de mes projets
sur la page d'accueil du site.<br>

Dorénavant, vous pouvez retrouvez mes projets sur <a href="https://git.les-miquelots.net/">mon git</a>.</p>
]]></description>
</item>


<item>
<title>Dépanner le serveur CUPS et l'impression de documents sous Arch Linux 🖨️💯</title>
<guid>http://partage.les-miquelots.net/blog/2020/#depanner-le-serveur-cups-et-limpression-de-documents-sous-arch-linux</guid>
<pubDate>Fri, 30 Oct 2020 12:44:16 +0100</pubDate>
<description><![CDATA[
<p>Si un beau matin vous n'arrivez plus à imprimer des documents
via <code>lp</code> ou que <code>system-config-printer</code> n'affiche plus
les imprimantes configurées et que <a href="http://localhost:631"
target="_blank" >l'interface
web locale d'administration de CUPS</a> vous <span style="color:red">404 Not
Found</span> dans la face ou bien encore ce message maudit apparaît dans la
sortie de <code>journalctl -xe</code>:</p>
<pre>The unit org.cups.cupsd.service has entered the 'failed' state with result 'protocol'</pre><br>
<p>Il est alors fort probable que le fichier
<u><code>/etc/cups/cupsd.conf</code></u> soit mal formé (pour moi en
tout cas du code HTML avait remplacé tout le fichier !).
La solution est d'exécuter ceci:</p>
<pre>su -c 'cp /etc/cups/cupsd.conf.O /etc/cups/cupsd.conf'</pre>
<br>
<p>Il se peut que ça ne soit pas un O mais 'default' dans certains cas, ici j'ai
testé avec un CUPS 2.3.3 sous Arch.</p>

<p>Merci et sûrement à bientôt, les imprimantes vont bien chauffer avec les
autorisations de déplacements dérogatoires.</p>
]]></description>
</item>




<item>
<title>Aspire A31732 v104 sous Archlinux: test et constat</title>
<guid>http://partage.les-miquelots.net/blog/2020/#aspire-a31732-v104-sous-archlinux-test-et-constat</guid>
<pubDate>Thu, 10 Dec 2020 16:40:12 +0100</pubDate>
<description><![CDATA[
<p>Bonjour à tous,</p>
<br>
<p>Voici les caractéristiques basiques du système (nombre de paquets variant
selon votre installation):
<img  src="/img/neofetch.png" alt="neofetch sous
archlinux avec un Aspire A317-32 V1.04"/>
</p>
<br>
<p>J'étais avant sur un Notebook d'ASUS et disons que tout ne marchait pas
direct (son, microphone, bluetooth, touche <kbd>Fn</kbd>+), il fallait
creuser/attendre.</p>
<br>
<p>Avec le Aspire, l'installation d'ArchLinux (version d'août 2020) c'est bien
passé. Le wifi, microphone, bluetooth, écran et son marche bien (en
téléchargeant les paquets <code>linux-firmware</code> et
<code>alsa-firmware</code>, même si je pense que ce dernier n'est pas
forcément nécessaire, voir la section suivante).</p>

<p>Une chose à noter pour le son: le pilote c'est <code>snd-hda-intel</code>.
La chose que j'ai fait c'est d'ajouter <code>options snd-hda-intel model=auto</code> dans le fichier
<u><code>/etc/modprobe.d/alba-base.conf</code></u> et <code>autospawn =
yes</code> dans <u><code>~/.config/pulse/client.conf</code></u>, comme ça le serveur
pulseaudio se démarre tout seul si une appli demande/envoie du son (coucou
<code>pavucontrol</code>).
</p>
]]></description>
</item>


<item>
<title>Retrouver le nom des comptes créés avec prosodyctl</title>
<guid>http://partage.les-miquelots.net/blog/2020/#retrouver-le-nom-des-comptes-crees-avec-prosodyctl</guid>
<pubDate>Fri, 11 Sep 2020 17:42:22 +0200</pubDate>
<description><![CDATA[
<p>Salut à tous! Si comme moi vous avez une instance <a
href="https://jitsi.org" title="site offi jitsi" target="_blank">Jitsi</a> et
que vous ne vous souvenez plus des utilisateurs créé, voici une astuce pour
les lister car <tt>prosodyctl</tt> n'est pas capable de le faire de base.</p>

<p>Exécutez ceci:
<code>ls /var/lib/prosody/*/accounts|grep .dat|sed s/'.dat'//g</code>
<img src="/img/jitsi-comptes-ls.png" alt="capture
d'écran de la méthode utilisant 'ls'" title="capture d'écran de la méthode
utilisant 'ls'"/></p>

<p>Si vous avez plusieurs domaines, la méthode suivante est meilleure (si vous
vous débrouillez bien en anglais, regardez <a
href="https://prosody-users.narkive.com/0fEHWYcL/list-of-users#post3"
title="méthodes décrites par 
Jan 'Arsimael' Schneeberger ">cette réponse dans une liste de diffusion dédiée
à prosody</a> pour plus de détails):<br>
<code>
curl -OJL http://prosody.im/files/mod_listusers.lua <br>
chmod 755 mod_listusers.lua <br>
mv mod_listusers.lua /usr/lib/prosody/modules/ <br>
</code>
<img src="/img/jitsi-comptes-mod_listusers.png" alt="capture d'écran de la méthode utilisant 'mod_listusers'"
title="capture d'écran de la méthode utilisant 'mod_listusers'"/></p>

<p>Maintenant, exécuter <code>prosodyctl mod_listusers</code> devrait retourner
les comptes créés comme avec la première méthode mais suivi de leur domaine
respectif.
<br>
Merci beaucoup à Jan "Arsimael" Schneeberger en tout cas, ça m'a bien
dépanné</p>.
]]></description>
</item>




<item>
<title>Faire une entrée de menu grub pour KeytoolEfi</title>
<guid>http://partage.les-miquelots.net/blog/2020/#faire-un-entree-de-menu-grub-pour-keytoolefi</guid>
<pubDate>Thu, 10 Dec 2020 17:00:43 +0100</pubDate>
<description><![CDATA[
<p>J'ai bien galéré pour complété la partie <a
href="https://gist.github.com/huntrar/e42aee630bee3295b2c671d098c81268#set-or-append-the-new-keys"
title="partie d'un tuto sur l'insertion des clés db/KEK/PK dans le
micrologiciel d'un BIOS">de l'insertion des clés</a> dans un BIOS pour
profiter du Secure Boot avec GRUB & linux.</p>
<br>
<p>Vu que le BIOS de ma machine proposait de <i>nettoyer</i> les clés mais pas
d'options pour en <i>insérer</i>, il faut passer par une tierce-partie, ici
KeyTool.efi (ce fichier sera installé avec le paquet <code>efitools</code>
sous arch, peut-être le même cas pour d'autres distrib).</p>

<p>Trêve de bavardages, voici à quoi ressemble 
<code><u>/etc/grub.d/40_custom</u></code> après avoir copié KeyTool.efi dans
<code><u>/efi/EFI/arch/KeyTool.efi</u></code>. N'oubliez pas de remplaçer
1234-5678 par l'UUID de votre partition contenant le répertoire
<code>/efi</code>:</p>
<br>
<pre>
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry "KeyTool unsigned" {
    load_video
    set gfxpayload=keep
    insmod part_gpt
    insmod ext2
    insmod fat
    insmod chain
    search --no-floppy --fs-uuid --set=root 1234-5678
    chainloader /efi/arch/KeyTool.efi
}
</pre>
]]></description>
</item>


<item>
<title>🆒 Comment avoir des émojis colorées dans les programmes st,dmenu,dwm,slstatus sur Archlinux 👌</title>
<guid>https://partage.les-miquelots.net/blog/2020/#comment-avoir-des-emojis-colorees-dans-les-programmes-stdmenudwmslstatus-sur-archlinux</guid>
<pubDate>Tue, 08 Sep 2020 19:49:16 +0200</pubDate>
<description><![CDATA[
<br>
<p>J'utilisais slstatus/dwm/st et dmenu depuis un bon bout de temps, et je ne
comprenais pas pourquoi certaines émojis s'affichait correctement, d'autres en
noir et blanc. Ça cassait la "consistance".</p>

<p>La bonne réponse bien sûr est que je m'y suis mal pris. Je vais vous
expliquer comment faire afin de vous éviter moults pertes de cheveux et prises
de têtes. </p>
<br>

<ol>
    <li>S'assurer d'avoir <code>fakeroot</code> ou <code>sudo</code>
    d'installé, vu que l'on va compiler des paquets depuis l'AUR grâce à
    <code>makepkg -s</code> .</li>

    <li>Téléchargez et compilez la version patchée de libxft par
    Maxime Coste: <code><a
    href="https://aur.archlinux.org/packages/libxft-bgra-git">libxft-bgra-git</a></code>.<br>
    Pour l'installer exécutez les
    commandes suivantes: <br>
    <code>
    curl -OJL
    https://aur.archlinux.org/cgit/aur.git/snapshot/libxft-bgra-git.tar.gz<br>
    tar xvzf libxft-bgra-git.tar.gz<br>
    cd libxft-bgra-git/<br>
    makepkg -s<br>
    pacman -U
    libxft-bgra-git*.pkg.tar.zst</code><br>
    Si on vous informe d'un conflit avec
    <code>libxft</code>, foncez quand même.</li>

    <li>Choisissez ensuite une police de caractères ayant des émojis. Il y en
    a plusieurs (<code>noto-fonts-emoji</code>,<code>ttf-joypixels</code> par
    exemple), pour ma part j'ai choisi <code><a
    href="https://aur.archlinux.org/packages/ttf-twemoji">ttf-twemoji</a></code>. Si vous
    l'avez vous aussi choisie, n'oubliez pas de
    copier <code>75-twemoji.conf</code> dans le répertoire
    <code>/etc/fonts/conf.d</code>.<br>
    Exécutez <br>
    <code>pacman -U
    ttf-twemoji*.pkg.tar.xz</code><br>
    dans le répertoire de
    <code>ttf-twemoji</code> afin d'installer la police de caractères après sa
    compilation.</li>

    <li>N'oubliez pas de commenter ou supprimer les lignes 142 à 146 dans le fichier
    <code>drw.c</code> du code source de dwm et dmenu quand vous les
    recompilez. Sans ça, les émojis
    ne s'afficheront pas ou pas correctement.
    </li>

    <li>Tout est bon ! Vous pouvez maitenant tester tout ça grâce àun 
    simple script affichant une liste d'émojis :
    <br>
    <code>
    curl -OJL
    https://github.com/LukeSmithxyz/voidrice/raw/master/.local/share/larbs/emoji<br>
    mv emoji ~/.local/share/emojis <br>
    cat ~/.local/share/emojis | dmenu -i -b -l 5
    </code></li>
</ol>
<br>
<p>Merci à <a href="https://lukesmith.xyz">Luke Smith</a> et <a
href="https://unicode.org">Unicode</a> pour la liste d'émojis et la
standardisation des émojis, respectivement. Très <span
style="font-size:150%">🆒</span>.</p>
]]></description>
</item>

</channel>
</rss>

