yannstatic/static/feed.xml
2024-10-31 20:18:37 +01:00

5008 lines
313 KiB
XML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr"><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://static.rnmkcy.eu/feed.xml" rel="self" type="application/atom+xml" /><link href="https://static.rnmkcy.eu/" rel="alternate" type="text/html" hreflang="fr" /><updated>2024-10-31T20:08:43+01:00</updated><id>https://static.rnmkcy.eu/feed.xml</id><title type="html">YannStatic</title><subtitle>Expérimentations et tests
</subtitle><entry><title type="html">Réseau NetworkManager - nmcli</title><link href="https://static.rnmkcy.eu/2024/10/31/NetworkManager-nmcli.html" rel="alternate" type="text/html" title="Réseau NetworkManager - nmcli" /><published>2024-10-31T00:00:00+01:00</published><updated>2024-10-31T00:00:00+01:00</updated><id>https://static.rnmkcy.eu/2024/10/31/NetworkManager-nmcli</id><content type="html" xml:base="https://static.rnmkcy.eu/2024/10/31/NetworkManager-nmcli.html"><![CDATA[*nmcli (NetworkManager Command Line Interface) est une interface de ligne de commande du gestionnaire de réseau Linux.*
## nmcli
Article original : [nmcli : configurer le réseau NetworkManager sur Linux (Debian, Ubuntu, …)](https://www.malekal.com/nmcli-configurer-reseau-networkmanager-linux/)
### Interfaces réseau
lister les connexions réseau
nmcli connection show
![](/images/nmcli-pc01.png)
Puis pour afficher la configuration dune interface réseau, saisissez la commande suivante en spécifiant le nom de la connexion réseau obtenue précédemment.
nmcli connection show "bridge0"
![](/images/nmcli-pc02.png)
Vous pouvez aussi utiliser cette commande pour obtenir des informations sur les interfaces réseaux.
nmcli -p device show
![](/images/nmcli-pc03.png)
![](/images/nmcli-pc03a.png)
### Configurer le réseau avec nmcli
**Ajouter une connexion réseau**
`sudo nmcli connection add type <type-reseau> ifname <nom-connexion>`
**Modifier une connexion réseau existante**
Avec nmcli, on peut apporter des ajustements et des configurations à une connexion réseau existante, comme basculer entre les configurations statiques et DHCP
`sudo nmcli connection modify <connection-id> <parameter> <value>`
les configurations que nous pouvons ajouter et modifier une connexion à laide de nmcli.
Tout dabord, nous allons créer un nouveau profil de connexion, par exemple sous le nom “gl-inet”
nmcli connection add con-name gl-inet ifname enp3s0f1 type ethernet
On obtient la sortie suivante
Connexion « gl-inet » (afec2e60-eb76-476c-8046-5ace62449019) ajoutée avec succès.
Le problème est que l'on se connecte immédiatement à cette interface qui n'est pas encore configurée
{:.warning}
Pour définir le démarrage automatique (ou pas) de la connexion réseau
nmcli connection modify gl-inet connection.autoconnect yes
nmcli connection modify gl-inet connection.autoconnect no
**Définir une adresse IPv4 statique avec un masque de sous-réseau /24**
sudo nmcli connection modify gl-inet ipv4.address 192.168.8.2/24
**Définir une adresse IPv6 statique avec un masque de sous-réseau /64** (facultatif)
sudo nmcli connection modify gl-inet ipv6.addresses 2001:db8:1::1/64
**Configurer une passerelle par défaut en IPv4 ou IPv6**
```bash
#IPv4
sudo nmcli connection modify gl-inet ipv4.gateway 192.168.8.1
#IPv6
sudo nmcli connection modify gl-inet ipv6.gateway 2001:db8:1::fffe
```
**Configurer un serveur DNS en IPv4 ou IPv6**
Pour spécifier les serveurs DNS sur votre connexion internet, utilisez ces commandes :
```bash
#IPv4
sudo nmcli connection modify gl-inet ipv4.dns "192.168.0.254"
#IPv6
nmcli connection modify gl-inet ipv6.dns "2001:db8:1::ffbb"
```
**Définir la méthode de connexion IPv4 et IPv6 en DHCP (IP automatique)**
Pour configurer votre connexion en DHCP :
```bash
#For IPv4
sudo nmcli connection modify gl-inet ipv4.method auto
#For IPv6
sudo sudo nmcli connection modify gl-inet ipv6.method auto
```
Pour que les modifications apportées prennent effet, vous devez activer le profil.
```bash
sudo nmcli connection up gl-inet
```]]></content><author><name></name></author><category term="network" /><summary type="html"><![CDATA[nmcli (NetworkManager Command Line Interface) est une interface de ligne de commande du gestionnaire de réseau Linux.]]></summary></entry><entry><title type="html">Lenovo Serveur MySpeed</title><link href="https://static.rnmkcy.eu/2024/10/29/Lenovo_Serveur_MySpeed.html" rel="alternate" type="text/html" title="Lenovo Serveur MySpeed" /><published>2024-10-29T00:00:00+01:00</published><updated>2024-10-29T00:00:00+01:00</updated><id>https://static.rnmkcy.eu/2024/10/29/Lenovo_Serveur_MySpeed</id><content type="html" xml:base="https://static.rnmkcy.eu/2024/10/29/Lenovo_Serveur_MySpeed.html"><![CDATA[## MySpeed
![](/images/MySpeed.png){:height="80"}
<https://github.com/gnmyt/myspeed>
### Analyse vitesse internet
MySpeed est un logiciel d'analyse de test de vitesse qui enregistre votre vitesse internet pendant 30 jours.
Caractéristiques
* 📊 MySpeed génère des statistiques claires sur la vitesse, le ping, et plus encore.
* ⏰ MySpeed automatise les tests de vitesse et vous permet de définir le temps entre les tests à l'aide d'expressions Cron.
* 🗄️ Ajouter plusieurs serveurs directement à une instance MySpeed
* 🩺 Configurez des contrôles de santé pour vous notifier par email, Signal, WhatsApp ou Telegram en cas d'erreurs ou de temps d'arrêt
* 📆 Les résultats des tests peuvent être stockés jusqu'à 30 jours
* 🔥 Prise en charge de Prometheus et Grafana
* 🗳️ Choisissez entre les serveurs de test de vitesse Ookla, LibreSpeed et Cloudflare
* 💁 En savoir plus sur MySpeed sur [notre site web](https://myspeed.dev/)
### Installer MySpeed
Prérequis
```bash
# debian
sudo apt install wget curl unzip
# alpine linux
sudo apk add wget curl unzip
```
Vous n'avez besoin de faire cela que si vous n'avez pas encore installé NodeJS
```bash
curl -sSL https://deb.nodesource.com/setup_18.x | bash
sudo apt-get install nodejs -y
```
Versions installées: `node -v && npm -v`
node v20.10.0
npm 10.8.3
Créer un dossier
mkdir ~/sharenfs/rnmkcy/myspeed && cd ~/sharenfs/rnmkcy/myspeed
Télécharger la dernière version
```
wget $(curl -s https://api.github.com/repos/gnmyt/myspeed/releases/latest | grep browser_download_url | cut -d '"' -f 4)
unzip MySpeed-*.zip && rm MySpeed-*.zip
npm install
npm audit fix
```
### Proxy nginx
Créer le proxy sur le domaine `speed.rnmkcy.eu` qui écoute sur le port 5216
```
server {
listen 80;
listen [::]:80;
server_name speed.rnmkcy.eu;
# redirect all plain HTTP requests to HTTPS
return 301 https://speed.rnmkcy.eu$request_uri;
}
server {
# ipv4 listening port/protocol
listen 443 ssl http2;
# ipv6 listening port/protocol
listen [::]:443 ssl http2;
server_name speed.rnmkcy.eu;
include /etc/nginx/conf.d/security.conf.inc;
location / {
proxy_pass http://127.0.0.1:5216;
}
}
```
### Lancement MySpeed
Lancer le serveur manuellement
NODE_ENV=production node server
![](/images/alpine-MySpeed01.png)
Depuis un navigateur, ouvrir le lien https://speed.rnmkcy.eu
![](/images/alpine-MySpeed02.png)
![](/images/alpine-MySpeed03.png)
![](/images/alpine-MySpeed04.png)
![](/images/alpine-MySpeed05.png)
![](/images/alpine-MySpeed06.png)
Après lancement du test
![](/images/alpine-MySpeed07.png)
Sur le terminal
![](/images/alpine-MySpeed08.png)
### MySpeed 24/7
Créez un fichier nommé `myspeed.service` sous `/etc/systemd/system`
sudo nano /etc/systemd/system/myspeed.service
```
[Unit]
Description=MySpeed
After=network.target
[Service]
Type=simple
ExecStart=/home/leno/.nvm/versions/node/v20.10.0/bin/node server
Restart=always
User=leno
Environment=NODE_ENV=production
WorkingDirectory=/sharenfs/rnmkcy/myspeed
[Install]
WantedBy=multi-user.target
```
Enregistrer le fichier, CTRL + X, puis Y et enfin Entrée
Rechargez systemd
sudo systemctl daemon-reload
Si vous voulez que MySpeed démarre au démarrage de systemd
sudo systemctl enable myspeed --now
Vérifiez maintenant le statut de MySpeed
systemctl status myspeed
![](/images/MySpeed-service.png)
Ouvrir le lien <https://speed.rnmkcy.eu>
![](/images/MySpeed-web01.png)
![](/images/MySpeed-web02.png)
![](/images/MySpeed-web03.png)
![](/images/MySpeed-web04.png)]]></content><author><name></name></author><category term="debian" /><summary type="html"><![CDATA[MySpeed]]></summary></entry><entry><title type="html">Lenovo KVM - SearXNG Alpine Linux (alpine-searx)</title><link href="https://static.rnmkcy.eu/2024/10/22/KVM-Alpine-Linux-Docker-SearXNG.html" rel="alternate" type="text/html" title="Lenovo KVM - SearXNG Alpine Linux (alpine-searx)" /><published>2024-10-22T00:00:00+02:00</published><updated>2024-10-22T00:00:00+02:00</updated><id>https://static.rnmkcy.eu/2024/10/22/KVM-Alpine-Linux-Docker-SearXNG</id><content type="html" xml:base="https://static.rnmkcy.eu/2024/10/22/KVM-Alpine-Linux-Docker-SearXNG.html"><![CDATA[<p><em>Alpine Linux est une distribution Linux ultra-légère…</em></p>
<p><img src="/images/alpine-linux-logo.png" alt="" width="300" /></p>
<h2 id="alpine-linux">Alpine Linux</h2>
<p><em>Création machine virtuelle Alpine de type KVM avec 2 Go de RAM, 1 cœur de processeur et 5 Go de disque dur.</em></p>
<ul>
<li><a href="/2023/12/17/Installer_KVM_Kernel_Virtual_Machine_sur_un_serveur.html#création-machines-virtuelles-kvm-avec-la-commande-virsh">Création machines virtuelles KVM avec la commande virsh</a></li>
<li><a href="/2023/12/17/Installer_KVM_Kernel_Virtual_Machine_sur_un_serveur.html#accéder-aux-machines-virtuelles-kvm-via-le-client-vnc">Accéder aux machines virtuelles KVM via le client VNC</a></li>
<li><a href="https://wiki.alpinelinux.org/wiki/">Wiki Alpine Linux</a></li>
</ul>
<h3 id="créer-alpine-searx-sur-un-serveur">Créer alpine-searx sur un serveur</h3>
<p><a href="https://alpinelinux.org/downloads/">Les dernières images Alpine Linux</a></p>
<p>Création dune image virtuelle <strong>alpine-searx</strong> sous le serveur Lenovo rnmkcy.eu<br />
On se connecte sur le serveur Lenovo en SSH, puis on exécute la commande suivante pour créer une machine virtuelle Alpine avec 2 Go de RAM, 1 cœur de processeur et 5 Go de disque dur</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>virt-install <span class="se">\</span>
<span class="nt">--osinfo</span> alpinelinux3.17 <span class="se">\</span>
<span class="nt">--name</span> alpine-searx <span class="se">\</span>
<span class="nt">--memory</span> 2048 <span class="se">\</span>
<span class="nt">--vcpus</span> 1 <span class="se">\</span>
<span class="nt">--cpu</span> host <span class="se">\</span>
<span class="nt">--hvm</span> <span class="se">\</span>
<span class="nt">--disk</span> <span class="nv">path</span><span class="o">=</span>/srv/kvm/libvirt/images/alpine-searx.qcow2,format<span class="o">=</span>qcow2,size<span class="o">=</span>5 <span class="se">\</span>
<span class="nt">--cdrom</span> /srv/kvm/libvirt/boot/alpine-standard-3.20.3-x86_64.iso <span class="se">\</span>
<span class="nt">--network</span> <span class="nv">bridge</span><span class="o">=</span>br0 <span class="se">\</span>
<span class="nt">--graphics</span> vnc
</code></pre></div></div>
<p>Note: La dernière version Alpine Linux est alpinelinux3.20 au 10/07/2024 mais KVM ne connait que alpinelinux3.17 (<code class="language-plaintext highlighter-rouge">sudo virt-install --osinfo list |grep alpine</code>)</p>
<p>Après exécution dans un terminal de la commande ci dessus, on arrive sur lécran suivant<br />
<img src="/images/alpine-linux01.png" alt="" /></p>
<h3 id="configurer-alpine-searx">Configurer alpine-searx</h3>
<p>Le serveur Lenovo na pas daffichage, il faut créer un tunnel ssh depuis un poste client</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh -L 5900:127.0.0.1:5900 leno@192.168.0.215 -p 55215 -i /home/yann/.ssh/lenovo-ed25519
</code></pre></div></div>
<p>Puis lancer de ce même poste un client VNC<br />
<img src="/images/alpine-linux02.png" alt="" width="300" /><br />
la console saffiche <br />
<img src="/images/alpine-linux03.png" alt="" /></p>
<p>Une fois limage ISO lancée, on arrive à un invite de connexion. <br />
Indiquez <code class="language-plaintext highlighter-rouge">root</code> comme nom dutilisateur, aucun mot de passe ne vous sera demandé à cette étape.</p>
<p>Le système est utilisable, mais on veut linstaller, ce qui passe par la commande suivante (clavier qwerty)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>setup-alpine # saisir setup)qlpine
</code></pre></div></div>
<p>Une suite de questions :<br />
<img src="/images/alpine-linux04.png" alt="" /><br />
mot de passe root (toorrtyuiop)<br />
<img src="/images/alpine-linux05.png" alt="" /><br />
APK mirror (f) ,patienter …<br />
<img src="/images/alpine-linux06.png" alt="" /></p>
<p>user : alsearx<br />
password: MoelleEndetteSingle</p>
<p>Relever ladresse ip allouée : <code class="language-plaintext highlighter-rouge">ip a</code> &gt; 192.168.0.31<br />
Puis redémarrer : <code class="language-plaintext highlighter-rouge">reboot</code><br />
La fenêtre vnc se ferme</p>
<h3 id="explications-sur-la-procédure">Explications sur la procédure</h3>
<p><em>Normalement, vous navez rien à faire, les paramètres par défaut doivent convenir. Mais si vous le désirez, vous pouvez les modifier pour utiliser une interface particulière, une IP fixe, un serveur proxy, etc.<br />
Une soixantaine de serveurs mirroir vous seront proposés pour télécharger les paquets. Choisissez un numéro dans la liste ou demandez au système de les tester et de sélectionner le plus rapide. Vous pouvez aussi modifier le fichier des sources. Il vous faudra ensuite choisir votre serveur SSH : OpenSSH, Dropbear ou aucun.</em></p>
<p>On termine par la méthode dinstallation. Il en existe quatre :</p>
<ul>
<li>none : le système et ses données sont placés en RAM et seront perdus après le redémarrage</li>
<li>sys : le système et ses données sont placés sur un HDD/SSD</li>
<li>data : le système est placé en RAM, les données sur un HDD/SSD</li>
<li>lvm : utilisation de Logical Volume Manager, les deux choix précédents seront proposés (lvmsys, lvmdata)</li>
</ul>
<p>Si vous stockez le système en mémoire, il faudra trouver un moyen de sauvegarder la configuration. Vous pourrez le faire uniquement depuis un lecteur de disquettes (!) ou une clé USB. Une fois le système installé, vous pourrez lutiliser directement sil est placé en mémoire ou redémarrer si vous avez opté pour un stockage classique.</p>
<p>Il nest pas conseillé dutiliser directement le compte root pour les actions du quotidien.<br />
Si utilisateur non créé dans la procédure dinstallation, le créer avec son propre espace dans /home/</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>adduser alsearx
</code></pre></div></div>
<p>Vous pouvez utiliser lutilisateur pour vous connecter via SSH (impossible avec le compte root)</p>
<h3 id="connexion-alpine-searx-via-ssh">Connexion alpine-searx via SSH</h3>
<p>Sur un poste linux du réseau</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh alsearx@192.168.0.31
</code></pre></div></div>
<p>Une fois connecté ,vous pouvez accéder au “root” de manière classique avec la commande :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>su -
</code></pre></div></div>
<p>Mise à jour</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apk update
apk upgrade
<span class="c"># Vous pouvez fusionner les deux lignes avec </span>
apk <span class="nt">-U</span> upgrade
</code></pre></div></div>
<p>Editeur nano (Vous pouvez aussi opter pour vi qui est nativement présent sur le système)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apk add nano
</code></pre></div></div>
<h3 id="réseau---ip-statique">Réseau - IP statique</h3>
<p><a href="https://www.cyberciti.biz/faq/how-to-configure-static-ip-address-on-alpine-linux/">How to configure static IP address on Alpine Linux</a></p>
<p>Le fichier de configuration <code class="language-plaintext highlighter-rouge">/etc/network/interfaces</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/network/interfaces
</code></pre></div></div>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.216/24
gateway 192.168.0.254
</code></pre></div></div>
<p>Fichier de résolution dns</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/resolv.conf
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nameserver 1.1.1.1
nameserver 9.9.9.9
</code></pre></div></div>
<p>Les modifications apportées à /etc/network/interfaces peuvent être activées en exécutant</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>service networking restart
</code></pre></div></div>
<h3 id="openssh-avec-clés">OpenSSH avec clés</h3>
<p><em>Connexion ssh sur un autre port avec un jeu de clés</em></p>
<p>Générer une paire de clé sur lordinateur de bureau PC1<br />
Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) pour une liaison SSH avec le serveur.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/vm-alpine-searx
</code></pre></div></div>
<p>Copier la clé publique <code class="language-plaintext highlighter-rouge">cat ~/.ssh/vm-alpine-searx.pub</code> dans le presse-papier</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBQu0LRiDjPM7BJAfjECl22fnEchVuxnw38RV2IJs0+l yann@yann-pc1
</code></pre></div></div>
<p>On se connecte sur la machine virtuelle alpine linux “ttrss alpine-searx”</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh alsearx@192.168.0.216
</code></pre></div></div>
<p>Créer le répertoire et ouvrir nouveau fichier</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir -p $HOME/.ssh/
nano $HOME/.ssh/authorized_keys
</code></pre></div></div>
<p>Coller le contenu du presse-papier , sauver le fichier et sortir</p>
<p>Modifier les droits</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chmod 600 $HOME/.ssh/authorized_keys
</code></pre></div></div>
<p>Passer en mode su</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>su -
</code></pre></div></div>
<p>Modifier la configuration serveur SSH</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/ssh/sshd_config
</code></pre></div></div>
<p>Modifier</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Port = 55216
PasswordAuthentication no
</code></pre></div></div>
<p>Relancer le serveur</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>service sshd restart
</code></pre></div></div>
<p>Test connexion</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh -p 55216 -i ~/.ssh/vm-alpine-searx alsearx@192.168.0.216
</code></pre></div></div>
<h3 id="sudo">sudo</h3>
<p>Passer en root</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>su -
</code></pre></div></div>
<p>Editer la configuration des dépôts</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/apk/repositories
</code></pre></div></div>
<p>Trouvez maintenant la ligne qui se termine dans /community Ensuite, retirez le # au début de la ligne. Le fichier résultant devrait ressembler à ceci</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#/media/cdrom/apks
http://alpinelinux.mirrors.ovh.net/v3.20/main
http://alpinelinux.mirrors.ovh.net/v3.20/community
</code></pre></div></div>
<p>Mise à jour des dépôts</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apk update
</code></pre></div></div>
<p>Installer sudo</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apk add sudo
</code></pre></div></div>
<p>Pas de mot de passe sudo pour lutilisateur alouest</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "alsearx ALL=(ALL) NOPASSWD: ALL" &gt;&gt; /etc/sudoers
</code></pre></div></div>
<h2 id="docker">Docker</h2>
<p><img src="/images/docker-logo-a.png" alt="" /></p>
<h3 id="installer-docker-sur-alpine-linux">Installer docker sur Alpine Linux</h3>
<p><a href="https://geekscircuit.com/install-docker-docker-compose-on-alpine-linux/">Install docker &amp; docker-compose on Alpine Linux</a></p>
<p>Passer en root</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>su -
</code></pre></div></div>
<p>Editer la configuration des dépôts</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/apk/repositories
</code></pre></div></div>
<p>Trouvez maintenant la ligne qui se termine dans /community Ensuite, retirez le # au début de la ligne. Le fichier résultant devrait ressembler à ceci</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#/media/cdrom/apks
http://alpinelinux.mirrors.ovh.net/v3.20/main
http://alpinelinux.mirrors.ovh.net/v3.20/community
</code></pre></div></div>
<p>Installer docker et docker-compose</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apk update
apk add docker docker-compose
</code></pre></div></div>
<p>Activer autostart sur boot en utilisant</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rc-update add docker default
</code></pre></div></div>
<p>puis vous pouvez lancer le service docker en utilisant la commande</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/init.d/docker start
<span class="c"># ou</span>
service docker start
</code></pre></div></div>
<h2 id="searxng">SearxNG</h2>
<p><em><a href="https://docs.searxng.org/">SearXNG</a> est un métamoteur qui recherche ses informations à travers plusieurs moteurs de recherche généralistes</em></p>
<h3 id="image-docker">Image docker</h3>
<p>Si vous prévoyez de construire et de maintenir une image Docker par vous-même, assurez-vous que Docker est installé. Sous Linux, noubliez pas dajouter votre utilisateur au groupe Docker (déconnectez-vous et reconnectez-vous pour que votre appartenance au groupe soit réévaluée) :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo adduser $USER docker
</code></pre></div></div>
<p>Limage docker est basée sur git://Dockerfile et disponible sur searxng/searxng @dockerhub. Lutilisation de limage docker est assez simple, par exemple vous pouvez extraire limage searxng/searxng @dockerhub et déployer une instance locale en utilisant docker run:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir </span>YannSearXNG
<span class="nb">cd </span>YannSearXNG
<span class="nb">export </span><span class="nv">PORT</span><span class="o">=</span>8080
docker pull searxng/searxng
</code></pre></div></div>
<p>Pour avoir un démarrage automatique au boot : <code class="language-plaintext highlighter-rouge">--restart=always --name restart_always</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd ~/YannSearXNG
export PORT=8080
docker run -d -p ${PORT}:8080 \
--restart=always \
--name searxng \
-v "${PWD}/searxng:/etc/searxng" \
-e "BASE_URL=http://localhost:$PORT/" \
-e "INSTANCE_NAME=YannSearXNG" \
searxng/searxng
</code></pre></div></div>
<p>Sans démarrage auto…</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> ~/YannSearXNG
<span class="nb">export </span><span class="nv">PORT</span><span class="o">=</span>8080
docker run <span class="nt">--rm</span> <span class="se">\</span>
<span class="nt">-d</span> <span class="nt">-p</span> <span class="k">${</span><span class="nv">PORT</span><span class="k">}</span>:8080 <span class="se">\</span>
<span class="nt">-v</span> <span class="s2">"</span><span class="k">${</span><span class="nv">PWD</span><span class="k">}</span><span class="s2">/searxng:/etc/searxng"</span> <span class="se">\</span>
<span class="nt">-e</span> <span class="s2">"BASE_URL=http://localhost:</span><span class="nv">$PORT</span><span class="s2">/"</span> <span class="se">\</span>
<span class="nt">-e</span> <span class="s2">"INSTANCE_NAME=YannSearXNG"</span> <span class="se">\</span>
searxng/searxng
</code></pre></div></div>
<p>Les variables denvironnement <code class="language-plaintext highlighter-rouge">UWSGI_WORKERS</code> et <code class="language-plaintext highlighter-rouge">UWSGI_THREADS</code> remplacent le nombre par défaut de processus UWSGI et de threads UWSGI spécifiés dans le fichier <code class="language-plaintext highlighter-rouge">/etc/searxng/uwsgi.ini</code>.</p>
<p>Ouvrez votre navigateur WEB et visitez lURL :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>xdg-open http://192.168.0.216:8080
</code></pre></div></div>
<h3 id="paramétrage-searxng">Paramétrage searxng</h3>
<p>Dans ${PWD}/searxng, vous trouverez <code class="language-plaintext highlighter-rouge">settings.yml</code> et <code class="language-plaintext highlighter-rouge">uwsgi.ini</code>. Vous pouvez modifier ces fichiers selon vos besoins</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># résultat sur un nouvel onglet
sudo sed -i -e "s/\# results_on_new_tab: false/results_on_new_tab\: true/g" $HOME/YannSearXNG/searxng/settings.yml
</code></pre></div></div>
<p>Identifier le container : <code class="language-plaintext highlighter-rouge">docker ps</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
97cf004cd5d0 searxng/searxng "/sbin/tini -- /usr/…" About a minute ago Up About a minute 0.0.0.0:8080-&gt;8080/tcp, :::8080-&gt;8080/tcp searxng
</code></pre></div></div>
<p>et redémarrer limage Docker.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker container restart 97cf004cd5d0
</code></pre></div></div>
<h3 id="mise-à-jour-automatique">Mise à jour automatique</h3>
<p><em>Les stratégies pour automatiser le processus de mise à jour des conteneurs Docker lorsque leurs images de base sont mises à jour. Nous examinerons des scripts Bash personnalisés et des outils tiers tels que Watchtower, qui offrent un éventail de solutions(<a href="https://www.baeldung.com/ops/docker-container-auto-update-newest-base-images">Auto-Update Docker Containers for Latest Base Images</a>)</em></p>
<p>Watchtower est un outil open-source qui automatise le processus de mise à jour des conteneurs Docker. Il interroge le registre Docker pour vérifier les mises à jour des images à partir desquelles les conteneurs ont été initialement instanciés.<br />
Supposons que Watchtower détecte quune image a été mise à jour. Dans ce cas, elle arrête le conteneur exécutant limage périmée, extrait la nouvelle image du registre Docker et démarre un nouveau conteneur avec les mêmes configurations que le précédent. Cela garantit que nos conteneurs exécutent toujours la dernière version de limage de base sans intervention manuelle.</p>
<p><strong>Exécution du conteneur Watchtower</strong><br />
Paramètres</p>
<ul>
<li>fixer lintervalle à 86400 secondes, ce qui demande à Watchtower de vérifier les mises à jour une fois par jour<br />
Le paramètre <code class="language-plaintext highlighter-rouge">--schedule</code> prend comme valeur une expression crontab. Sinon, le paramètre <code class="language-plaintext highlighter-rouge">--interval</code> peut-être utilisé pour définir le nombre de secondes entre chaque vérification.<br />
<code class="language-plaintext highlighter-rouge">--schedule "0 0 4 * * *"</code><br />
<code class="language-plaintext highlighter-rouge">--interval 86400</code><br />
Cela permet de trouver un équilibre entre limmédiateté et la consommation des ressources du système.</li>
<li>Pour configurer les notifications par courriel, nous pouvons configurer les variables denvironnement et exécuter Watchtower:</li>
</ul>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> -e WATCHTOWER_NOTIFICATIONS=email \
-e WATCHTOWER_NOTIFICATION_EMAIL_FROM=your-email@example.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_TO=target-email@example.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=your-email@example.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=your-email-password \
</code></pre></div></div>
<p>nous devons dabord lancer le conteneur Watchtower lui-même en exécutant une commande Docker :</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">-d</span> <span class="se">\</span>
<span class="nt">--name</span> watchtower <span class="se">\</span>
<span class="nt">-v</span> /var/run/docker.sock:/var/run/docker.sock <span class="se">\</span>
<span class="nt">-e</span> <span class="nv">WATCHTOWER_NOTIFICATIONS</span><span class="o">=</span>email <span class="se">\</span>
<span class="nt">-e</span> <span class="nv">WATCHTOWER_NOTIFICATION_EMAIL_FROM</span><span class="o">=</span>your-email@example.com <span class="se">\</span>
<span class="nt">-e</span> <span class="nv">WATCHTOWER_NOTIFICATION_EMAIL_TO</span><span class="o">=</span>target-email@example.com <span class="se">\</span>
<span class="nt">-e</span> <span class="nv">WATCHTOWER_NOTIFICATION_EMAIL_SERVER</span><span class="o">=</span>smtp.example.com <span class="se">\</span>
<span class="nt">-e</span> <span class="nv">WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT</span><span class="o">=</span>587 <span class="se">\</span>
<span class="nt">-e</span> <span class="nv">WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER</span><span class="o">=</span>your-email@example.com <span class="se">\</span>
<span class="nt">-e</span> <span class="nv">WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD</span><span class="o">=</span>your-email-password <span class="se">\</span>
containrrr/watchtower <span class="se">\</span>
<span class="nt">--schedule</span> <span class="s2">"0 0 4 * * *"</span>
</code></pre></div></div>
<p>Ainsi, nous exécutons Watchtower en mode détaché, ce qui lui donne accès au <strong>socket Docker</strong>, qui est nécessaire à Watchtower pour surveiller et mettre à jour les conteneurs.<br />
Notre sortie montre lidentifiant unique du conteneur Watchtower qui sexécute maintenant en arrière-plan.<br />
<code class="language-plaintext highlighter-rouge">694862e2a2a6fbf61da8e7336fca4b4bac5f45c459024d5338224007c8838c5c</code></p>
<p>Voir journal : <code class="language-plaintext highlighter-rouge">docker logs watchtower</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>time="2024-10-22T13:19:49Z" level=info msg="Watchtower 1.7.1"
time="2024-10-22T13:19:49Z" level=info msg="Using notifications: smtp"
time="2024-10-22T13:19:49Z" level=info msg="Checking all containers (except explicitly disabled with label)"
time="2024-10-22T13:19:49Z" level=info msg="Scheduling first run: 2024-10-23 04:00:00 +0000 UTC"
time="2024-10-22T13:19:49Z" level=info msg="Note that the first check will be performed in 14 hours, 40 minutes, 10 seconds"
</code></pre></div></div>
<h3 id="commandes-docker">Commandes docker</h3>
<p>Utilisez la commande <code class="language-plaintext highlighter-rouge">container ls</code> pour lister les conteneurs en cours dexécution, ajoutez le drapeau <code class="language-plaintext highlighter-rouge">-a</code> pour lister les conteneurs éteints également. La commande <code class="language-plaintext highlighter-rouge">container stop</code> permet darrêter un conteneur en cours dexécution. Pour se débarrasser dun conteneur, utilisez la commande <code class="language-plaintext highlighter-rouge">container rm</code>:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>localhost:~/YannSearXNG$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e8557899b8e9 searxng/searxng "/sbin/tini -- /usr/…" About a minute ago Up About a minute 0.0.0.0:8080-&gt;8080/tcp, :::8080-&gt;8080/tcp nice_chaplygin
</code></pre></div></div>
<p>Si vous nutilisez plus Docker et que vous souhaitez vous débarrasser de tous les conteneurs et images, utilisez la commande prune suivante :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker stop $(docker ps -aq) # stop all containers
docker system prune # make some housekeeping
docker rmi -f $(docker images -q) # drop all images
</code></pre></div></div>
<p><strong>Mise à jour automatique du container</strong><br />
Watchtower est un outil open-source permettant dautomatiser ces mises à jour. Il se présente sous la forme dune image Docker à lancer très simplement</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run \
--name watchtower \
--volume /var/run/docker.sock:/var/run/docker.sock \
--detach \
v2tec/watchtower \
--interval "30"
</code></pre></div></div>
<p>Le paramètre <code class="language-plaintext highlighter-rouge">--volume</code> est obligatoire pour que Watchtower puisse communiquer avec le démon Docker sur le système hôte.</p>
<h3 id="proxy-nginx-searxrnmkcyeu">Proxy nginx searx.rnmkcy.eu</h3>
<p>Sur le serveur Lenovo rnmkcy.eu, créer un proxy pour SearXNG <code class="language-plaintext highlighter-rouge">/etc/nginx/conf.d/searx.rnmkcy.eu.conf</code></p>
<div class="language-nginx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">server</span> <span class="p">{</span>
<span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
<span class="kn">listen</span> <span class="s">[::]:80</span><span class="p">;</span>
<span class="kn">server_name</span> <span class="s">searx.rnmkcy.eu</span><span class="p">;</span>
<span class="c1"># redirect all plain HTTP requests to HTTPS</span>
<span class="kn">return</span> <span class="mi">301</span> <span class="s">https://searx.rnmkcy.eu</span><span class="nv">$request_uri</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">server</span> <span class="p">{</span>
<span class="c1"># ipv4 listening port/protocol</span>
<span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
<span class="c1"># ipv6 listening port/protocol</span>
<span class="kn">listen</span> <span class="s">[::]:443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
<span class="kn">server_name</span> <span class="s">searx.rnmkcy.eu</span><span class="p">;</span>
<span class="kn">include</span> <span class="n">/etc/nginx/conf.d/security.conf.inc</span><span class="p">;</span>
<span class="kn">location</span> <span class="n">/</span> <span class="p">{</span>
<span class="kn">proxy_pass</span> <span class="s">http://192.168.0.216:8080</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Recharger nginx</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl reload nginx
</code></pre></div></div>
<p>Ouvrir le lien <a href="https://searx.rnmkcy.eu">https://searx.rnmkcy.eu</a></p>
<p><img src="/images/searx.rnmkcy.eu.png" alt="" width="500" /></p>]]></content><author><name></name></author><category term="virtuel" /><summary type="html"><![CDATA[Alpine Linux est une distribution Linux ultra-légère…]]></summary></entry><entry><title type="html">Cartographie</title><link href="https://static.rnmkcy.eu/2024/10/14/OSM_Python.html" rel="alternate" type="text/html" title="Cartographie" /><published>2024-10-14T00:00:00+02:00</published><updated>2024-10-14T00:00:00+02:00</updated><id>https://static.rnmkcy.eu/2024/10/14/OSM_Python</id><content type="html" xml:base="https://static.rnmkcy.eu/2024/10/14/OSM_Python.html"><![CDATA[<h2 id="cartographie-python">Cartographie python</h2>
<p><em>virtualenv est un outil utilisé pour créer un espace de travail isolé pour une application Python. Il présente divers avantages tels que la possibilité dinstaller des modules localement, dexporter un environnement de travail et dexécuter un programme Python dans cet environnement</em></p>
<h3 id="osmscripts">OsmScripts</h3>
<p><em>Python 3.3+ est livré avec un module appelé venv.</em></p>
<p><code class="language-plaintext highlighter-rouge">$HOME/media</code> identique <code class="language-plaintext highlighter-rouge">/srv/media</code></p>
<p><strong>Environnement python</strong></p>
<p>Créer un dossier <code class="language-plaintext highlighter-rouge">osm_python</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> <span class="nv">$HOME</span>/media/osm-new/osm_python
<span class="nb">cd</span> <span class="nv">$HOME</span>/media/osm-new/osm_python
</code></pre></div></div>
<p>Pour créer un environnement, utilisez la commande <code class="language-plaintext highlighter-rouge">python -m venv &lt;environment name&gt;</code>
Créer un environnement pour lapplication</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 -m venv OsmScripts
</code></pre></div></div>
<p>activer lenvironnement virtuel</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>source OsmScripts/bin/activate
</code></pre></div></div>
<p>On arrive sur un prompt : <code class="language-plaintext highlighter-rouge">(OsmScripts) [yann@pc1 osm_python]$</code></p>
<p>Mettre à jour pip dans lenvironnement</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python -m pip install --upgrade pip
</code></pre></div></div>
<p><img src="/images/OsmScripts03.png" alt="" /></p>
<p><strong>Installer des paquets à laide de pip</strong><br />
<a href="https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/">Install packages in a virtual environment using pip and venv</a></p>
<p>Lorsque votre environnement virtuel est activé, vous pouvez installer des paquets. Utilisez la commande pip install pour installer des paquets.Par exemple, installons la bibliothèque Requests à partir de lindex des paquets Python (PyPI) : <code class="language-plaintext highlighter-rouge">python3 -m pip install requests</code></p>
<p>Rechercher et installer les paquets <code class="language-plaintext highlighter-rouge">gpxpy</code> et <code class="language-plaintext highlighter-rouge">geopy</code> sur <a href="https://pypi.org/">https://pypi.org/</a> qui sont utilisés dans le projet</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>gpxpy
pip <span class="nb">install </span>geopy
</code></pre></div></div>
<p><strong>Wing Personal projet OsmScripts</strong><br />
Dans le dossier <code class="language-plaintext highlighter-rouge">$HOME/media/osm-new</code></p>
<p>Projet &gt; Nouveau projet<br />
<img src="/images/wp001.png" alt="" />{width=”400”}<br />
<img src="/images/wp002.png" alt="" />{width=”400”}<br />
<img src="/images/wp003.png" alt="" />{width=”500”}<br />
<img src="/images/wp004.png" alt="" />{width=”400”}</p>
<p>Projet : <code class="language-plaintext highlighter-rouge">$HOME/media/osm-new/osm_python/OsmScripts.wpr</code><br />
Structure</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[yann@pc1 ~]$ tree -L 2 -d /srv/media/osm-new/
/srv/media/osm-new/
├── archives
├── css
│ └── images
├── file
│ ├── photos
│ └── tmp
├── fonts
├── images
├── js
└── osm_python
└── OsmScripts
</code></pre></div></div>
<p><strong>Le script python</strong><br />
Le script python <code class="language-plaintext highlighter-rouge">$HOME/media/osm-new/osm_python/OsmScripts/tracesgpxnew.py</code></p>
<details>
<summary><b>Etendre Réduire</b></summary>
<figure class="highlight"><pre><code class="language-python" data-lang="python">
<span class="c1">#!/usr/bin/python
# -*- coding: utf-8 -*-
</span>
<span class="sh">"""</span><span class="s">
tracesgpxnew.py
Créé le 10 juin 2021
Modifié le 14 octobre 2024
</span><span class="sh">"""</span>
<span class="kn">import</span> <span class="n">pdb</span>
<span class="kn">import</span> <span class="n">sys</span> <span class="k">as</span> <span class="n">mod_sys</span>
<span class="kn">import</span> <span class="n">logging</span> <span class="k">as</span> <span class="n">mod_logging</span>
<span class="kn">import</span> <span class="n">math</span> <span class="k">as</span> <span class="n">mod_math</span>
<span class="kn">import</span> <span class="n">gpxpy</span> <span class="k">as</span> <span class="n">mod_gpxpy</span>
<span class="kn">import</span> <span class="n">os</span><span class="p">,</span> <span class="n">fnmatch</span>
<span class="kn">import</span> <span class="n">sys</span>
<span class="kn">import</span> <span class="n">shutil</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">from</span> <span class="n">xml.dom</span> <span class="kn">import</span> <span class="n">minidom</span>
<span class="kn">import</span> <span class="n">datetime</span>
<span class="kn">import</span> <span class="n">calendar</span>
<span class="kn">import</span> <span class="n">geopy.geocoders</span>
<span class="kn">from</span> <span class="n">geopy.geocoders</span> <span class="kn">import</span> <span class="n">Nominatim</span>
<span class="k">def</span> <span class="nf">format_time</span><span class="p">(</span><span class="n">time_s</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">time_s</span><span class="p">:</span>
<span class="k">return</span> <span class="sh">'</span><span class="s">n/a</span><span class="sh">'</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">minutes</span> <span class="o">=</span> <span class="n">mod_math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="n">time_s</span> <span class="o">/</span> <span class="mf">60.</span><span class="p">)</span>
<span class="n">hours</span> <span class="o">=</span> <span class="n">mod_math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="n">minutes</span> <span class="o">/</span> <span class="mf">60.</span><span class="p">)</span>
<span class="k">return</span> <span class="sh">'</span><span class="s">%s:%s:%s</span><span class="sh">'</span> <span class="o">%</span> <span class="p">(</span><span class="nf">str</span><span class="p">(</span><span class="nf">int</span><span class="p">(</span><span class="n">hours</span><span class="p">)).</span><span class="nf">zfill</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span> <span class="nf">str</span><span class="p">(</span><span class="nf">int</span><span class="p">(</span><span class="n">minutes</span> <span class="o">%</span> <span class="mi">60</span><span class="p">)).</span><span class="nf">zfill</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span> <span class="nf">str</span><span class="p">(</span><span class="nf">int</span><span class="p">(</span><span class="n">time_s</span> <span class="o">%</span> <span class="mi">60</span><span class="p">)).</span><span class="nf">zfill</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">format_date</span><span class="p">(</span><span class="n">date_s</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">date_s</span><span class="p">:</span>
<span class="k">return</span> <span class="sh">'</span><span class="s">n/a</span><span class="sh">'</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1">#start_time.strftime("%d %b %Y")
</span> <span class="k">return</span> <span class="sh">'</span><span class="s">%s</span><span class="sh">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">date_s</span><span class="p">.</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">"</span><span class="s">%d %b %Y</span><span class="sh">"</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">format_heure</span><span class="p">(</span><span class="n">heure_s</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">heure_s</span><span class="p">:</span>
<span class="k">return</span> <span class="sh">'</span><span class="s">n/a</span><span class="sh">'</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1">#start_time.strftime("%H:%M:%S")
</span> <span class="k">return</span> <span class="sh">'</span><span class="s">%s</span><span class="sh">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">heure_s</span><span class="p">.</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">"</span><span class="s">%H:%M:%S</span><span class="sh">"</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">format_long_length</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
<span class="k">return</span> <span class="sh">'</span><span class="s">{:.3f}km</span><span class="sh">'</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">length</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">format_long_length_num</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
<span class="k">return</span> <span class="sh">'</span><span class="s">{:.3f}</span><span class="sh">'</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">length</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">format_short_length</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
<span class="k">return</span> <span class="sh">'</span><span class="s">{:.2f}m</span><span class="sh">'</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">length</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">format_short_length_num</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
<span class="k">return</span> <span class="sh">'</span><span class="s">{:.2f}</span><span class="sh">'</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">length</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">format_speed</span><span class="p">(</span><span class="n">speed</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">speed</span><span class="p">:</span>
<span class="n">speed</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1">#return '{:.2f}m/s = {:.2f}km/h'.format(speed, speed * 3600. / 1000.)
</span> <span class="k">return</span> <span class="sh">'</span><span class="s">{:.2f}km/h</span><span class="sh">'</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">speed</span> <span class="o">*</span> <span class="mf">3600.</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">format_speed_num</span><span class="p">(</span><span class="n">speed</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">speed</span><span class="p">:</span>
<span class="n">speed</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1">#return '{:.2f}m/s = {:.2f}km/h'.format(speed, speed * 3600. / 1000.)
</span> <span class="k">return</span> <span class="sh">'</span><span class="s">{:.2f}</span><span class="sh">'</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">speed</span> <span class="o">*</span> <span class="mf">3600.</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">quelJour</span><span class="p">(</span><span class="n">date</span><span class="p">):</span>
<span class="n">jour</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="nf">strptime</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="sh">'</span><span class="s">%d %m %Y</span><span class="sh">'</span><span class="p">).</span><span class="nf">weekday</span><span class="p">()</span>
<span class="nf">return </span><span class="p">(</span><span class="n">calendar</span><span class="p">.</span><span class="n">day_name</span><span class="p">[</span><span class="n">jour</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">nblignes</span><span class="p">(</span><span class="n">nf</span><span class="p">):</span>
<span class="c1">#
</span> <span class="k">return</span> <span class="nf">len</span><span class="p">(</span><span class="nf">open</span><span class="p">(</span><span class="n">nf</span><span class="p">).</span><span class="nf">readlines</span><span class="p">(</span> <span class="p">))</span>
<span class="k">def</span> <span class="nf">print_gpx_part_info</span><span class="p">(</span><span class="n">gpx_part</span><span class="p">,</span><span class="n">jsTraces</span><span class="p">,</span><span class="n">dataTraces</span><span class="p">,</span><span class="n">fichier</span><span class="p">,</span><span class="n">dataIndex</span><span class="p">):</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">gpx_part</span><span class="p">.</span><span class="n">tracks</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">segments</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">points</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">gpx_part</span><span class="p">.</span><span class="n">tracks</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">segments</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">points</span>
<span class="n">lati</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">latitude</span>
<span class="n">longi</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">longitude</span>
<span class="c1"># Nominatim
</span> <span class="n">geopy</span><span class="p">.</span><span class="n">geocoders</span><span class="p">.</span><span class="n">options</span><span class="p">.</span><span class="n">default_user_agent</span> <span class="o">=</span> <span class="sh">'</span><span class="s">gxinforep</span><span class="sh">'</span>
<span class="n">geopy</span><span class="p">.</span><span class="n">geocoders</span><span class="p">.</span><span class="n">options</span><span class="p">.</span><span class="n">default_timeout</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">geolocator</span> <span class="o">=</span> <span class="nc">Nominatim</span><span class="p">()</span>
<span class="n">location</span> <span class="o">=</span> <span class="n">geolocator</span><span class="p">.</span><span class="nf">reverse</span><span class="p">(</span><span class="nf">str</span><span class="p">(</span><span class="n">lati</span><span class="p">)</span> <span class="o">+</span> <span class="sh">"</span><span class="s">,</span><span class="sh">"</span> <span class="o">+</span> <span class="nf">str</span><span class="p">(</span><span class="n">longi</span><span class="p">))</span>
<span class="n">y</span><span class="o">=</span><span class="n">location</span><span class="p">.</span><span class="n">address</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">"</span><span class="s">,</span><span class="sh">"</span><span class="p">)</span>
<span class="n">z</span><span class="o">=</span><span class="mi">0</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">y</span><span class="p">:</span>
<span class="n">z</span><span class="o">=</span><span class="n">z</span><span class="o">+</span><span class="mi">1</span>
<span class="n">nom</span><span class="o">=</span><span class="n">y</span><span class="p">[</span><span class="n">z</span><span class="o">-</span><span class="mi">8</span><span class="p">]</span> <span class="o">+</span> <span class="sh">'</span><span class="s"> </span><span class="sh">'</span> <span class="o">+</span> <span class="n">y</span><span class="p">[</span><span class="n">z</span><span class="o">-</span><span class="mi">7</span><span class="p">]</span> <span class="o">+</span> <span class="sh">'</span><span class="s"> </span><span class="sh">'</span> <span class="o">+</span> <span class="n">y</span><span class="p">[</span><span class="n">z</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span>
<span class="n">lieu</span><span class="o">=</span><span class="n">y</span><span class="p">[</span><span class="n">z</span><span class="o">-</span><span class="mi">8</span><span class="p">].</span><span class="nf">strip</span><span class="p">()</span>
<span class="n">commune</span><span class="o">=</span><span class="n">y</span><span class="p">[</span><span class="n">z</span><span class="o">-</span><span class="mi">7</span><span class="p">].</span><span class="nf">strip</span><span class="p">()</span>
<span class="n">cposte</span><span class="o">=</span><span class="n">y</span><span class="p">[</span><span class="n">z</span><span class="o">-</span><span class="mi">2</span><span class="p">].</span><span class="nf">strip</span><span class="p">()</span>
<span class="n">length_2d</span> <span class="o">=</span> <span class="n">gpx_part</span><span class="p">.</span><span class="nf">length_2d</span><span class="p">()</span>
<span class="n">moving_time</span><span class="p">,</span> <span class="n">stopped_time</span><span class="p">,</span> <span class="n">moving_distance</span><span class="p">,</span> <span class="n">stopped_distance</span><span class="p">,</span> <span class="n">max_speed</span> <span class="o">=</span> <span class="n">gpx_part</span><span class="p">.</span><span class="nf">get_moving_data</span><span class="p">()</span>
<span class="n">uphill</span><span class="p">,</span> <span class="n">downhill</span> <span class="o">=</span> <span class="n">gpx_part</span><span class="p">.</span><span class="nf">get_uphill_downhill</span><span class="p">()</span>
<span class="n">start_time</span><span class="p">,</span> <span class="n">end_time</span> <span class="o">=</span> <span class="n">gpx_part</span><span class="p">.</span><span class="nf">get_time_bounds</span><span class="p">()</span>
<span class="n">vmoy</span><span class="o">=</span><span class="p">(</span><span class="nf">format_speed</span><span class="p">(</span><span class="n">moving_distance</span> <span class="o">/</span> <span class="n">moving_time</span><span class="p">)</span> <span class="k">if</span> <span class="n">moving_time</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="sh">"</span><span class="s">?</span><span class="sh">"</span><span class="p">)</span>
<span class="n">vmoy_num</span><span class="o">=</span><span class="p">(</span><span class="nf">format_speed_num</span><span class="p">(</span><span class="n">moving_distance</span> <span class="o">/</span> <span class="n">moving_time</span><span class="p">)</span> <span class="k">if</span> <span class="n">moving_time</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="sh">"</span><span class="s">?</span><span class="sh">"</span><span class="p">)</span>
<span class="c1"># les randonnées du dimanche sont par défaut privées
</span> <span class="c1"># si dimanche (Sunday) --&gt; private sinon public
</span> <span class="n">privpub</span> <span class="o">=</span> <span class="sh">"</span><span class="s">public</span><span class="sh">"</span>
<span class="k">if</span> <span class="nf">quelJour</span><span class="p">(</span><span class="n">start_time</span><span class="p">.</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">"</span><span class="s">%d %m %Y</span><span class="sh">"</span><span class="p">))</span> <span class="o">==</span> <span class="sh">"</span><span class="s">Sunday</span><span class="sh">"</span><span class="p">:</span>
<span class="n">privpub</span> <span class="o">=</span> <span class="sh">"</span><span class="s">private</span><span class="sh">"</span>
<span class="c1"># latitude longitude lieu commune cp distance vitesse niveau jour gpx indexation
</span> <span class="c1"># { genre: 'Rap', band: 'Migos', albums: 2},
</span> <span class="n">jsTraces</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="sh">'</span><span class="s">{</span><span class="se">\n</span><span class="s"> </span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="s">: </span><span class="sh">'</span> <span class="o">+</span> <span class="nf">str</span><span class="p">(</span><span class="n">dataIndex</span><span class="p">)</span> <span class="o">+</span> <span class="sh">'</span><span class="s">,</span><span class="sh">"</span><span class="s">latitude</span><span class="sh">"</span><span class="s">: </span><span class="sh">'</span> <span class="o">+</span> <span class="nf">str</span><span class="p">(</span><span class="n">lati</span><span class="p">)</span> <span class="o">+</span> <span class="sh">'</span><span class="s">, </span><span class="sh">"</span><span class="s">longitude</span><span class="sh">"</span><span class="s">: </span><span class="sh">'</span> <span class="o">+</span> <span class="nf">str</span><span class="p">(</span><span class="n">longi</span><span class="p">)</span> <span class="o">+</span> <span class="sh">'</span><span class="s">, </span><span class="sh">"</span><span class="s">lieu</span><span class="sh">"</span><span class="s">: </span><span class="sh">"'</span> <span class="o">+</span> <span class="n">lieu</span> \
<span class="o">+</span> <span class="sh">'"</span><span class="s">, </span><span class="sh">"</span><span class="s">commune</span><span class="sh">"</span><span class="s">: </span><span class="sh">"'</span> <span class="o">+</span> <span class="n">commune</span> <span class="o">+</span> <span class="sh">'"</span><span class="s">, </span><span class="sh">"</span><span class="s">cp</span><span class="sh">"</span><span class="s">: </span><span class="sh">"'</span> <span class="o">+</span> <span class="n">cposte</span> <span class="o">+</span> <span class="sh">'"</span><span class="s">, </span><span class="sh">"</span><span class="s">distance</span><span class="sh">"</span><span class="s">: </span><span class="sh">"'</span> <span class="o">+</span> <span class="nf">format_long_length_num</span><span class="p">(</span><span class="n">length_2d</span><span class="p">)</span> \
<span class="o">+</span> <span class="sh">'"</span><span class="s">, </span><span class="sh">"</span><span class="s">vitesse</span><span class="sh">"</span><span class="s">: </span><span class="sh">"'</span> <span class="o">+</span> <span class="n">vmoy_num</span> <span class="o">+</span> <span class="sh">'"</span><span class="s">, </span><span class="sh">"</span><span class="s">niveau</span><span class="sh">"</span><span class="s">: </span><span class="sh">"'</span> <span class="o">+</span> <span class="nf">format_short_length_num</span><span class="p">(</span><span class="n">uphill</span><span class="p">)</span> \
<span class="o">+</span> <span class="sh">'"</span><span class="s">, </span><span class="sh">"</span><span class="s">jour</span><span class="sh">"</span><span class="s">: </span><span class="sh">"'</span> <span class="o">+</span> <span class="n">start_time</span><span class="p">.</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">"</span><span class="s">%Y-%m-%d</span><span class="sh">"</span><span class="p">)</span> <span class="o">+</span> <span class="sh">'"</span><span class="s">, </span><span class="sh">"</span><span class="s">gpx</span><span class="sh">"</span><span class="s">: </span><span class="sh">"'</span> <span class="o">+</span> <span class="n">fichier</span> <span class="o">+</span> <span class="sh">'"</span><span class="se">\n</span><span class="s">}</span><span class="sh">'</span><span class="p">)</span>
<span class="c1">#
</span> <span class="k">if</span> <span class="n">dataIndex</span> <span class="o">==</span> <span class="n">initial_count</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">jsTraces</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="sh">'</span><span class="se">\n</span><span class="sh">'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">jsTraces</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="sh">'</span><span class="s">,</span><span class="se">\n</span><span class="sh">'</span><span class="p">)</span>
<span class="n">dataChaine</span><span class="o">=</span><span class="sh">'</span><span class="s">[</span><span class="sh">'</span> <span class="o">+</span> <span class="nf">str</span><span class="p">(</span><span class="n">lati</span><span class="p">)</span> <span class="o">+</span> <span class="sh">'</span><span class="s">,</span><span class="sh">'</span> <span class="o">+</span> <span class="nf">str</span><span class="p">(</span><span class="n">longi</span><span class="p">)</span> <span class="o">+</span> <span class="sh">'</span><span class="s">,</span><span class="sh">"'</span> <span class="o">+</span> <span class="n">lieu</span> <span class="o">+</span> <span class="sh">'"</span><span class="s">,</span><span class="sh">"'</span> <span class="o">+</span> <span class="n">commune</span> <span class="o">+</span> <span class="sh">'"</span><span class="s">,</span><span class="sh">"'</span> <span class="o">+</span> <span class="n">cposte</span> <span class="o">+</span> <span class="sh">'"</span><span class="s">,</span><span class="sh">"'</span> <span class="o">+</span> <span class="nf">format_long_length_num</span><span class="p">(</span><span class="n">length_2d</span><span class="p">)</span> <span class="o">+</span> <span class="sh">'"</span><span class="s">,</span><span class="sh">"'</span> <span class="o">+</span> <span class="n">vmoy_num</span> \
<span class="o">+</span> <span class="sh">'"</span><span class="s">,</span><span class="sh">"'</span> <span class="o">+</span> <span class="nf">format_short_length_num</span><span class="p">(</span><span class="n">uphill</span><span class="p">)</span> <span class="o">+</span> <span class="sh">'"</span><span class="s">,</span><span class="sh">"'</span> <span class="o">+</span> <span class="n">start_time</span><span class="p">.</span><span class="nf">strftime</span><span class="p">(</span><span class="sh">"</span><span class="s">%Y-%m-%d</span><span class="sh">"</span><span class="p">)</span> <span class="o">+</span> <span class="sh">'"</span><span class="s">,</span><span class="sh">"'</span> <span class="o">+</span> <span class="n">fichier</span> <span class="o">+</span> <span class="sh">'"</span><span class="s">,</span><span class="sh">'</span> <span class="o">+</span> <span class="nf">str</span><span class="p">(</span><span class="n">dataIndex</span><span class="p">)</span> <span class="o">+</span> <span class="sh">'</span><span class="s">],</span><span class="se">\n</span><span class="sh">'</span>
<span class="n">dataTraces</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="n">dataChaine</span><span class="p">)</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">'</span><span class="s">__main__</span><span class="sh">'</span><span class="p">:</span>
<span class="c1"># Le dossier qui contient les traces gpx
</span> <span class="n">dossier</span><span class="o">=</span><span class="n">os</span><span class="p">.</span><span class="nf">getcwd</span><span class="p">()</span><span class="o">+</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span>
<span class="c1"># on teste si arguments
</span> <span class="k">if</span> <span class="nf">len</span><span class="p">(</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span> <span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">for</span> <span class="n">strParam</span> <span class="ow">in</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="n">dossier</span><span class="o">=</span><span class="n">strParam</span><span class="o">+</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span>
<span class="c1"># parsing folder
</span> <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Dossier gpx: </span><span class="sh">"</span> <span class="o">+</span> <span class="n">dossier</span><span class="p">)</span>
<span class="c1"># ---------------
</span> <span class="c1"># le nom du fichier sans extension : ztest ou traces
</span> <span class="n">NomSansExt</span> <span class="o">=</span> <span class="sh">"</span><span class="s">tracestableau</span><span class="sh">"</span>
<span class="n">jsonFile</span><span class="o">=</span> <span class="n">dossier</span> <span class="o">+</span> <span class="n">NomSansExt</span> <span class="o">+</span> <span class="sh">"</span><span class="s">.json</span><span class="sh">"</span>
<span class="n">jsonFileExist</span> <span class="o">=</span> <span class="bp">False</span>
<span class="c1"># Fichier utilisé dans osm-new
</span> <span class="n">dataFile</span><span class="o">=</span> <span class="n">dossier</span> <span class="o">+</span> <span class="sh">"</span><span class="s">tracesdataset.js</span><span class="sh">"</span>
<span class="n">dataFileExist</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">if</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">exists</span><span class="p">(</span><span class="n">jsonFile</span><span class="p">):</span>
<span class="c1">#os.remove(jsonFile)
</span> <span class="n">jsonFileExist</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">if</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">exists</span><span class="p">(</span><span class="n">dataFile</span><span class="p">):</span>
<span class="c1">#os.remove(dataFile)
</span> <span class="n">dataFileExist</span> <span class="o">=</span> <span class="bp">True</span>
<span class="c1"># Les fichiers gpx à traiter sont dans /tmp
</span> <span class="n">listOfFiles</span> <span class="o">=</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="nf">listdir</span><span class="p">(</span><span class="n">dossier</span> <span class="o">+</span> <span class="sh">'</span><span class="s">tmp/</span><span class="sh">'</span><span class="p">))</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="sh">"</span><span class="s">*.gpx</span><span class="sh">"</span>
<span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">listOfFiles</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">pas de fichier à traiter</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">quit</span><span class="p">()</span>
<span class="c1"># Nb fichiers
</span> <span class="n">initial_count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="nb">dir</span> <span class="o">=</span> <span class="n">dossier</span> <span class="o">+</span> <span class="sh">'</span><span class="s">tmp/</span><span class="sh">'</span>
<span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">os</span><span class="p">.</span><span class="nf">listdir</span><span class="p">(</span><span class="nb">dir</span><span class="p">):</span>
<span class="k">if</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">isfile</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="nb">dir</span><span class="p">,</span> <span class="n">path</span><span class="p">)):</span>
<span class="n">initial_count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Nombre de fichiers: </span><span class="sh">"</span> <span class="o">+</span> <span class="nf">str</span><span class="p">(</span><span class="n">initial_count</span><span class="p">))</span>
<span class="c1"># Traitement du fichier jsonFile suivant existance ou pas
</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">jsonFileExist</span><span class="p">:</span>
<span class="n">jsTraces</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="n">jsonFile</span><span class="p">,</span> <span class="sh">"</span><span class="s">a+</span><span class="sh">"</span><span class="p">)</span>
<span class="n">jsTraces</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="sh">"</span><span class="s">[</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1">#supprimer la dernière ligne du fichier jsonFile
</span> <span class="n">os</span><span class="p">.</span><span class="nf">system</span><span class="p">(</span><span class="sh">'</span><span class="s">sed -i </span><span class="sh">"</span><span class="s">$ d</span><span class="sh">"</span><span class="s"> {0}</span><span class="sh">'</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">jsonFile</span><span class="p">))</span>
<span class="n">jsTraces</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="n">jsonFile</span><span class="p">,</span> <span class="sh">"</span><span class="s">a+</span><span class="sh">"</span><span class="p">)</span>
<span class="c1"># Traitement du fichier dataFile suivant existance ou pas
</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">dataFileExist</span><span class="p">:</span>
<span class="n">dataIndex</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">dataTraces</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="n">dataFile</span><span class="p">,</span> <span class="sh">"</span><span class="s">a+</span><span class="sh">"</span><span class="p">)</span>
<span class="n">dataTraces</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="sh">"</span><span class="s">var addressPoints = [</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># fichier existe , nombre de lignes
</span> <span class="n">dataIndex</span> <span class="o">=</span> <span class="nf">nblignes</span><span class="p">(</span><span class="n">dataFile</span><span class="p">)</span> <span class="o">-</span> <span class="mi">2</span>
<span class="c1">#supprimer la dernière ligne du fichier dataFile
</span> <span class="n">os</span><span class="p">.</span><span class="nf">system</span><span class="p">(</span><span class="sh">'</span><span class="s">sed -i </span><span class="sh">"</span><span class="s">$ d</span><span class="sh">"</span><span class="s"> {0}</span><span class="sh">'</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">dataFile</span><span class="p">))</span>
<span class="n">dataTraces</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="n">dataFile</span><span class="p">,</span> <span class="sh">"</span><span class="s">a+</span><span class="sh">"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">fichier</span> <span class="ow">in</span> <span class="n">listOfFiles</span><span class="p">:</span>
<span class="k">if</span> <span class="n">fnmatch</span><span class="p">.</span><span class="nf">fnmatch</span><span class="p">(</span><span class="n">fichier</span><span class="p">,</span> <span class="n">pattern</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">gpx : %s</span><span class="sh">'</span> <span class="o">%</span> <span class="n">fichier</span><span class="p">)</span>
<span class="n">gpx</span> <span class="o">=</span> <span class="n">mod_gpxpy</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="nf">open</span><span class="p">(</span><span class="n">dossier</span> <span class="o">+</span><span class="sh">'</span><span class="s">tmp/</span><span class="sh">'</span> <span class="o">+</span> <span class="n">fichier</span><span class="p">))</span>
<span class="nf">print_gpx_part_info</span><span class="p">(</span><span class="n">gpx</span><span class="p">,</span><span class="n">jsTraces</span><span class="p">,</span><span class="n">dataTraces</span><span class="p">,</span><span class="n">fichier</span><span class="p">,</span><span class="n">dataIndex</span><span class="p">)</span>
<span class="c1"># Déplacer le fichier gpx après traitement:
</span> <span class="n">shutil</span><span class="p">.</span><span class="nf">move</span><span class="p">(</span><span class="n">dossier</span> <span class="o">+</span><span class="sh">'</span><span class="s">tmp/</span><span class="sh">'</span> <span class="o">+</span> <span class="n">fichier</span><span class="p">,</span> <span class="n">dossier</span> <span class="o">+</span> <span class="n">fichier</span><span class="p">)</span>
<span class="c1"># Incrémenter l'index:
</span> <span class="n">dataIndex</span> <span class="o">=</span> <span class="n">dataIndex</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">mod_logging</span><span class="p">.</span><span class="nf">exception</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Error processing %s</span><span class="sh">'</span> <span class="o">%</span> <span class="n">dossier</span> <span class="o">+</span><span class="sh">'</span><span class="s">/</span><span class="sh">'</span> <span class="o">+</span> <span class="n">fichier</span><span class="p">)</span>
<span class="n">mod_sys</span><span class="p">.</span><span class="nf">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Ecriture fichier </span><span class="sh">'</span> <span class="o">+</span> <span class="n">jsonFile</span><span class="p">)</span>
<span class="n">jsTraces</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="sh">'</span><span class="s">]</span><span class="sh">'</span><span class="p">)</span>
<span class="n">jsTraces</span><span class="p">.</span><span class="nf">close</span><span class="p">()</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Ecriture fichier </span><span class="sh">'</span> <span class="o">+</span> <span class="n">dataFile</span><span class="p">)</span>
<span class="n">dataTraces</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="sh">'</span><span class="s">];</span><span class="sh">'</span><span class="p">)</span>
<span class="n">dataTraces</span><span class="p">.</span><span class="nf">close</span><span class="p">()</span></code></pre></figure>
</details>
<h3 id="utilisation-tracesgpxnewpy">Utilisation tracesgpxnew.py</h3>
<p>Le lancement du script tient compte de lenvironnement python, du chemin complet du script et du paramètre dossier qui contiendra le(s) fichiers gpx</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/srv/media/osm-new/osm_python/OsmScripts/bin/python /srv/media/osm-new/osm_python/OsmScripts/tracesgpxnew.py /srv/media/osm-new/file
</code></pre></div></div>
<h3 id="synchronisation-distante">Synchronisation distante</h3>
<p>Après intégration des nouveaux fichiers gpx par le script python, faire une mise à jour des dossiers distants par rsync</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nb">echo</span> <span class="s2">"-----------------------------------------------
Synchro osm-new avec xoyize.xyz"</span>
rsync <span class="nt">-avz</span> <span class="nt">--delete</span> <span class="nt">--exclude</span> <span class="s1">'archives'</span> <span class="nt">--exclude</span> <span class="s1">'osm_python'</span> <span class="nt">--rsync-path</span><span class="o">=</span><span class="s2">"sudo rsync"</span> <span class="nt">-e</span> <span class="s2">"ssh -p 55249 -i /home/yann/.ssh/xoyize-ed25519 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"</span> /srv/media/osm-new yako@xoyize.xyz:/home/yunohost.multimedia/share/Divers/
<span class="nb">echo</span> <span class="s2">"-----------------------------------------------
Synchro osm-new avec nfs sharenfs/multimedia/Divers/osm-new"</span>
rsync <span class="nt">-avz</span> <span class="nt">--delete</span> <span class="nt">--exclude</span> <span class="s1">'archives'</span> <span class="nt">--exclude</span> <span class="s1">'osm_python'</span> /srv/media/osm-new /home/yann/sharenfs/multimedia/Divers/
<span class="nb">exit</span>
</code></pre></div></div>
<p>Exécuter <code class="language-plaintext highlighter-rouge">sh /srv/media/osm-new/osm-new-synchro.sh</code></p>
<h3 id="alias-local-tracesgpx">Alias local tracesgpx</h3>
<p>Alias tracesgpx dans <code class="language-plaintext highlighter-rouge">.bashrc</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">alias </span><span class="nv">tracesgpx</span><span class="o">=</span><span class="s2">"/srv/media/osm-new/osm_python/OsmScripts/bin/python /srv/media/osm-new/osm_python/OsmScripts/tracesgpxnew.py /srv/media/osm-new/file"</span>
</code></pre></div></div>
<p>Ajout synchronisation à lalias tracesgpx dans <code class="language-plaintext highlighter-rouge">.bashrc</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">alias </span><span class="nv">tracesgpx</span><span class="o">=</span><span class="s2">"/srv/media/osm-new/osm_python/OsmScripts/bin/python /srv/media/osm-new/osm_python/OsmScripts/tracesgpxnew.py /srv/media/osm-new/file; sh /srv/media/osm-new/osm-new-synchro.sh"</span>
</code></pre></div></div>]]></content><author><name></name></author><category term="cartographie" /><summary type="html"><![CDATA[Cartographie python]]></summary></entry><entry><title type="html">PC1 - Endeavour Neo XFCE sur partition LVM chiffrée</title><link href="https://static.rnmkcy.eu/2024/10/07/PC1-EndeavourOS-XFCE-nvme_2To-LVM-Chiffre.html" rel="alternate" type="text/html" title="PC1 - Endeavour Neo XFCE sur partition LVM chiffrée" /><published>2024-10-07T00:00:00+02:00</published><updated>2024-10-07T00:00:00+02:00</updated><id>https://static.rnmkcy.eu/2024/10/07/PC1-EndeavourOS-XFCE-nvme_2To-LVM-Chiffre</id><content type="html" xml:base="https://static.rnmkcy.eu/2024/10/07/PC1-EndeavourOS-XFCE-nvme_2To-LVM-Chiffre.html"><![CDATA[<p><em>EndeavourOS est une distribution GNU/Linux basée sur Arch Linux</em></p>
<ul>
<li><a href="/2023/01/20/Description_materiel_minitour_PC1.html">Description matériel mini tour PC1</a></li>
</ul>
<p><img src="/images/yannick.drawio.png" alt="" /></p>
<ul>
<li><strong>LVM/LUKS</strong>, flexibilité de partitionnement en utilisant LVM dans une seule partition cryptée LUKS.
<ul>
<li><u>Avantages</u>:
<ul>
<li>partitionnement simple avec connaissance de LVM</li>
<li>Une seule clé nécessaire pour déverrouiller tous les volumes (p. ex. installation facile de récupération de disque)</li>
<li>Mise en page du volume non visible lorsque verrouillé</li>
<li>Méthode la plus facile pour permettre la <a href="https://wiki.archlinux.org/title/Dm-crypt/Swap_encryption#With_suspend-to-disk_support">suspension du disque</a></li>
</ul>
</li>
<li><u>Inconvénients</u>:
<ul>
<li>LVM ajoute une couche de mappage supplémentaire et un “hook”</li>
<li>Moins utile, si un volume doit recevoir une clé séparée</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><code class="language-plaintext warning highlighter-rouge">Installer une distribution EndeavourOS chiffrée sur une partition LVM est impossible avec l'outil "Calamarès"</code></p>
<h2 id="endeavouros-temporaire">EndeavourOS temporaire</h2>
<p><em>Pour une installation EndavourOS LVM/LUKS, il faut passer par une installation temporaire</em></p>
<h3 id="création-eos-usb-live">Création Eos USB Live</h3>
<p><em>Création dune clé USB EndeavourOS bootable</em></p>
<p>Dans un terminal linux<br />
Télécharger le dernier fichier iSO : <a href="https://endeavouros.com/latest-release/">https://endeavouros.com/latest-release/</a><br />
<strong>EndeavourOS_Endeavour_neo-2024.09.22.iso</strong></p>
<p>Vérifier checksum</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sha512sum</span> <span class="nt">-c</span> EndeavourOS_Endeavour_neo-2024.09.22.iso.sha512sum
</code></pre></div></div>
<p>Résultat de la commande ci dessus après quelques minutes<br />
<em>EndeavourOS_Endeavour_neo-2024.09.22.iso: Réussi</em></p>
<p>Créer la clé bootable<br />
Pour savoir sur quel périphérique, connecter la clé sur un port USB dun ordinateur et lancer la commande <code class="language-plaintext highlighter-rouge">sudo dmesg</code> ou <code class="language-plaintext highlighter-rouge">lsblk</code><br />
Dans le cas présent , le périphérique USB est <strong>/dev/sdc</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo dd </span><span class="k">if</span><span class="o">=</span>EndeavourOS_Endeavour_neo-2024.09.22.iso <span class="nv">of</span><span class="o">=</span>/dev/sdc <span class="nv">bs</span><span class="o">=</span>4M <span class="nt">--progress</span>
</code></pre></div></div>
<h3 id="démarrer-sur-eos-usb-live">Démarrer sur Eos USB Live</h3>
<p>Insérer la clé USB EndeavourOS, redémarrer la machine, sur Eos live<br />
Démarrage avec la clé USB insérée dans le Mini tour PC1 et appui sur F8 pour un accès au menu <br />
Choisir <code class="language-plaintext highlighter-rouge">UEFI: KingstonDataTraveler 2.0PMAP (3820MB)</code></p>
<p>Vous arrivez sur la page de sélection<br />
<img src="/images/endos0001.png" alt="" width="400" /><br />
Valider le choix par défaut</p>
<ol>
<li>basculer en FR</li>
<li>ouvrir un terminal</li>
</ol>
<p><img src="/images/eos-lvm-luks01.png" alt="" width="600" /></p>
<p><code class="language-plaintext warning highlighter-rouge">Clavier QWERTY!!!</code></p>
<p><img src="/images/eos-lvm-luks01a.png" alt="" width="600" /><br />
1 &gt; System Settings &gt; Keyboard<br />
Remove Us… <br />
Apply</p>
<p>On va se connecter en SSH</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ip a # relever adresse IP
sudo systemctl start sshd
passwd liveuser # changer le mot de passe liveuser --&gt; rtyuiop
sudo firewall-cmd --zone=public --add-port=22/tcp
</code></pre></div></div>
<p>Se connecter depuis un poste sur le même réseau: <code class="language-plaintext highlighter-rouge">ssh liveuser@adresse_IP</code></p>
<h3 id="partionnement">Partionnement</h3>
<p>en mode su</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo -s
</code></pre></div></div>
<p>Le disque : <code class="language-plaintext highlighter-rouge">lsblk</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme0n1 259:0 0 1,9T 0 disk
</code></pre></div></div>
<p>On partitionne un disque en 3 avec <code class="language-plaintext highlighter-rouge">gdisk</code></p>
<ul>
<li>Partition 1 : 512M EFI (code ef00) système de fichier FAT32</li>
<li>Partition 2 : 1895G LVM (code 8e00) système de fichier EXT4</li>
<li>Partition restante pour Installation temporaire</li>
</ul>
<p>Zapper le disque,</p>
<p>(<strong>Attention</strong> Ceci effacera de manière irréversible toutes les données de votre disque, veuillez sauvegarder toutes les données importantes) :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sgdisk --zap-all /dev/nvme0n1
</code></pre></div></div>
<p>Partitionnement du disque NVME 2To GPT + LVM<br />
Créer une table de partition GPT à laide de la commande <code class="language-plaintext highlighter-rouge">sgdisk</code> :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sgdisk --clear --new=1:0:+512MiB --typecode=1:ef00 --new=2:0:+1885G --typecode=2:8e00 /dev/nvme0n1
</code></pre></div></div>
<p>Format la partition EFI</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkfs.fat -F32 /dev/nvme0n1p1
</code></pre></div></div>
<h3 id="installer-eos-xfce">Installer Eos XFCE</h3>
<p>Utilisation de Calamarès, cliquer sur <strong>Démarrer linstallateur</strong><br />
Installation “en ligne”<br />
Bureau: XFCE4<br />
Paquets : Tout sauf LTS Kernel
Chargeur: systemd-boot<br />
Partitions:<br />
<img src="/images/endos0007n.png" alt="" width="600" /><br />
Utilisateur: yann<br />
Ordi: PC1<br />
mot passe utilisateur identique admin<br />
Résumé:<br />
<img src="/images/eos-lvm-luks03.png" alt="" width="600" /><br />
Cliquer sur <strong>Installer</strong></p>
<p><img src="/images/eos-lvm-luks04.png" alt="" width="600" /><br />
Linstallation est terminée, cliquer “Redémarrer maintenant” et sur <strong>Terminé</strong></p>
<h3 id="créer-nouveau-système">Créer nouveau système</h3>
<p><code class="language-plaintext info highlighter-rouge">Clé USB Eos Live insérée, redémarrer dans l'environnement Live-Cd</code></p>
<p><code class="language-plaintext warning highlighter-rouge">Clavier QWERTY!!!</code><br />
Ouvrir un terminal<br />
Créer un accès sur la machine via SSH depuis un poste distant<br />
Lancer le service : <code class="language-plaintext highlighter-rouge">sudo systemctl start sshd</code><br />
Ouvrir le port 22 firewall: <code class="language-plaintext highlighter-rouge">sudo firewall-cmd --zone=public --add-port=22/tcp</code><br />
Créer un mot de passe à liveuser : <code class="language-plaintext highlighter-rouge">passwd liveuser</code> &gt; rtyuiop
Relever ladresse ip de la machine : <code class="language-plaintext highlighter-rouge">ip a</code></p>
<p><strong>Déchiffrer système temporaire</strong></p>
<p>Le système temporaire chiffré <code class="language-plaintext highlighter-rouge">/dev/nvme0n1p3</code></p>
<p>Dans lenvironnement live-CD, ouvrez un Terminal ,basculez en mode su et tapez (ou marquez et copiez la ligne avec ctrl-c et collez dans le terminal avec shift-ctrl-v ) …</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksOpen /dev/nvme0n1p3 crypttemp <span class="c"># saisir la phrase mot de passe de l'installation</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> /media/crypttemp
mount /dev/mapper/crypttemp /media/crypttemp
</code></pre></div></div>
<p>Nos données dinstallation temporaires sont désormais accessibles sous <code class="language-plaintext highlighter-rouge">/media/crypttemp</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bin boot dev efi etc home lib lib64 lost+found mnt opt proc root run sbin srv sys tmp usr var
</code></pre></div></div>
<p><strong>Créer nouveau système</strong></p>
<p>Chiffrer la partition /dev/nvme0n1p2,saisir la passphrase définitive</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksFormat <span class="nt">--type</span> luks2 /dev/nvme0n1p2
</code></pre></div></div>
<p>Une demande de confirmation est exigée</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>WARNING!
========
This will overwrite data on /dev/nvme0n1p2 irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/nvme0n1p2:
Verify passphrase:
</code></pre></div></div>
<p>Choisissez un mot de passe sécurisé ( <a href="https://xkcd.com/936/">https://xkcd.com/936/</a> )</p>
<p>Ouvrir le nouveau système chiffré</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksOpen /dev/nvme0n1p2 crypt
<span class="c"># Enter passphrase for /dev/nvme0n1p2:</span>
pvcreate /dev/mapper/crypt
<span class="c"># Physical volume "/dev/mapper/crypt" successfully created.</span>
vgcreate vg0 /dev/mapper/crypt
<span class="c"># Volume group "vg0" successfully created</span>
</code></pre></div></div>
<p>Une bonne taille de départ pour le volume racine (lvroot) est denviron 30 Go. Si vous envisagez dutiliser ultérieurement un fichier déchange résidant sur root, vous devez en tenir compte.<br />
Le redimensionnement ultérieur des volumes est assez facile, alors ny réfléchissez pas trop.<br />
Vous pouvez attribuer tout lespace libre restant au volume daccueil,<br />
<code class="language-plaintext highlighter-rouge">lvcreate --extents 100%FREE vg0 -n lvhome</code><br />
mais pour augmenter les volumes plus tard et pour les instantanés , il faut de lespace vide à lintérieur du groupe de volumes, donc je choisis généralement une taille pour lvhome qui laisse environ 30 Go despace inutilisé global dans le volume groupe (en supposant un lecteur de 500 Go, par exemple 500 0,512 40 430 = 29,488)</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 40G root dont 8 swapfile</span>
lvcreate <span class="nt">-L</span> 40G vg0 <span class="nt">-n</span> lvroot <span class="c"># Logical volume "lvroot" created.</span>
lvcreate <span class="nt">-L</span> 150G vg0 <span class="nt">-n</span> lvhome <span class="c"># Logical volume "lvhome" created.</span>
lvcreate <span class="nt">-L</span> 300G vg0 <span class="nt">-n</span> lvmedia <span class="c"># Logical volume "lvmedia" created.</span>
<span class="c">#lvcreate -l 100%FREE vg0 -n lvhome # Logical volume "lvhome" created.</span>
</code></pre></div></div>
<p>Créez un système de fichiers ext4 sur les volumes logiques.</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkfs.ext4 <span class="nt">-L</span> root /dev/mapper/vg0-lvroot
mkfs.ext4 <span class="nt">-L</span> home /dev/mapper/vg0-lvhome
mkfs.ext4 <span class="nt">-L</span> home /dev/mapper/vg0-lvmedia
</code></pre></div></div>
<h3 id="montage-sur-mnt">Montage sur “mnt”</h3>
<p>Monter le nouveau système sur <code class="language-plaintext highlighter-rouge">/mnt</code> pour les systèmes UEFI</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mount /dev/mapper/vg0-lvroot /mnt
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/home
mount /dev/mapper/vg0-lvhome /mnt/home
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/efi
mount /dev/nvme0n1p1 /mnt/efi
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsblk
</code></pre></div></div>
<p>devrait maintenant fournir une sortie similaire à la suivante (ignorez les tailles, celles-ci proviennent dune installation de test) …</p>
<p>pour les systèmes UEFI :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme0n1 259:0 0 1.9T 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /mnt/efi
├─nvme0n1p2 259:2 0 1.8T 0 part
│ └─crypt 254:3 0 1.8T 0 crypt
│ ├─vg0-lvroot 254:4 0 40G 0 lvm /mnt
│ ├─vg0-lvhome 254:5 0 150G 0 lvm /mnt/home
│ └─vg0-lvmedia 254:6 0 300G 0 lvm
└─nvme0n1p3 259:3 0 22.2G 0 part
└─crypttemp 254:2 0 22.2G 0 crypt /media/crypttemp
</code></pre></div></div>
<h3 id="cloner-système-temporaire">Cloner système temporaire</h3>
<p>pour remplir les nouveaux points de montage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rsync -avA /media/crypttemp/ /mnt
</code></pre></div></div>
<p><em>Veuillez patienter quelques minutes</em></p>
<h3 id="démonter-système-temporaire">Démonter système temporaire</h3>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>umount /media/crypttemp
cryptsetup luksClose crypttemp
</code></pre></div></div>
<p>lsblk</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme0n1 259:0 0 1.9T 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /mnt/efi
├─nvme0n1p2 259:2 0 1.8T 0 part
│ └─crypt 254:3 0 1.8T 0 crypt
│ ├─vg0-lvroot 254:4 0 40G 0 lvm /mnt
│ ├─vg0-lvhome 254:5 0 150G 0 lvm /mnt/home
│ └─vg0-lvmedia 254:6 0 300G 0 lvm
└─nvme0n1p3 259:3 0 22.2G 0 part
</code></pre></div></div>
<h3 id="configurer-crypttab">Configurer “crypttab”</h3>
<p>Configuration <code class="language-plaintext highlighter-rouge">/etc/crypttab</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksUUID /dev/nvme0n1p2
</code></pre></div></div>
<p>renvoie <strong>5fa90f9d-ac40-4c70-8f58-730a423ce76b</strong><br />
Votre UUID sera différent, alors <u>**assurez-vous d'utiliser votre UUID à l'étape suivante !**</u></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /mnt/etc/crypttab
</code></pre></div></div>
<p>contient une ligne non commentée commençant par <code class="language-plaintext highlighter-rouge">luks-</code>…<br />
Remplacez cette ligne par la suivante ; <u>**n'oubliez pas d' utiliser votre UUID**</u></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptlvm UUID=5fa90f9d-ac40-4c70-8f58-730a423ce76b none luks
</code></pre></div></div>
<p>Sauvegarder et quitter.</p>
<h3 id="basculer-en-chroot">Basculer en chroot</h3>
<p>Passer en chroot</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>arch-chroot /mnt
</code></pre></div></div>
<p>le prompt <code class="language-plaintext highlighter-rouge">[root@EndeavourOS /]#</code></p>
<h3 id="configurer-fstab">Configurer “fstab”</h3>
<p>Configurer /etc/fstab</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/mapper/vg0-lvroot
</code></pre></div></div>
<p>renvoie lUUID du volume racine : <strong>04b9e250-1fcd-485b-989f-e753c89bf60f</strong>.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/mapper/vg0-lvhome
</code></pre></div></div>
<p>renvoie lUUID du volume daccueil : <strong>c35a3f8b-583b-4952-9ceb-f9a19194fa6c</strong>.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/fstab
</code></pre></div></div>
<p>contient une ligne commençant par <code class="language-plaintext highlighter-rouge">/dev/mapper/luks-</code>…<br />
<strong>Supprimez</strong> cette ligne et ajoutez ce qui suit (<u>**n'oubliez pas d' utiliser vos UUID**</u>)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>UUID=04b9e250-1fcd-485b-989f-e753c89bf60f / ext4 noatime 0 0
UUID=c35a3f8b-583b-4952-9ceb-f9a19194fa6c /home ext4 noatime 0 0
</code></pre></div></div>
<p>Sauvegarder et quitter.</p>
<h3 id="options-du-noyau">Options du noyau</h3>
<p>Dans <strong>systemd-boot</strong>, vous éditez le fichier dentrée approprié qui se trouve sur votre partition EFI dans le répertoire <code class="language-plaintext highlighter-rouge">loader/entries</code><br />
Chaque entrée est une option de démarrage dans le menu et chacune a une ligne appelée options. Vous pouvez modifier ces entrées directement, mais ces changements peuvent être écrasés lors de linstallation ou de la mise à jour de paquets.</p>
<p>UUID de /dev/nvme0n1p2 : <code class="language-plaintext highlighter-rouge">blkid -s UUID -o value /dev/nvme0n1p2</code></p>
<p>Pour effectuer les changements, au lieu de modifier les entrées, modifiez le fichier <code class="language-plaintext highlighter-rouge">/etc/kernel/cmdline</code> qui est un fichier dune ligne contenant une liste doptions du noyau.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/kernel/cmdline
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme_load=YES nowatchdog rw rd.luks.uuid=5fa90f9d-ac40-4c70-8f58-730a423ce76b root=/dev/mapper/vg0-lvroot
</code></pre></div></div>
<p>Exécutez ensuite <code class="language-plaintext highlighter-rouge">sudo reinstall-kernels</code> qui remplira les entrées et régénérera les initrds.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>reinstall-kernels
</code></pre></div></div>
<h3 id="sortie-chroot">Sortie chroot</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>exit
umount -R /mnt
</code></pre></div></div>
<p>Oter la clé USB , redémarrer</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>reboot
</code></pre></div></div>
<p><code class="language-plaintext info highlighter-rouge">FINI! Vous devriez maintenant avoir un système LVMonLUKS fonctionnel avec un volume logique séparé pour /home</code></p>
<h2 id="endeavouros-chiffré-lvmluks">EndeavourOS chiffré LVM/LUKS</h2>
<h3 id="premier-démarrage">Premier démarrage</h3>
<p>La partition est chiffrée<br />
<img src="/images/eos-lvm-luks05.png" alt="" /><br />
Au message “Please enter passphrase for disk endeavouros…”, saisir la phrase mot de passe pour déchiffrer le disque</p>
<h4 id="activation-ssh">Activation SSH</h4>
<p>Activer et lancer le service</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl enable sshd --now
</code></pre></div></div>
<p>Autoriser ssh</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>firewall-cmd <span class="nt">--zone</span><span class="o">=</span>public <span class="nt">--add-port</span><span class="o">=</span>22/tcp
</code></pre></div></div>
<p>Relever adresse : <code class="language-plaintext highlighter-rouge">ip a</code> &gt; 192.168.0.37</p>
<p>Se connecter depuis un poste sur le même réseau: <code class="language-plaintext highlighter-rouge">ssh yann@192.168.0.37</code></p>
<h4 id="accès-sudo">Accès sudo</h4>
<p>Modifier sudoers pour accès sudo sans mot de passe à lutilisateur yano</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>su # mot de passe root identique utilisateur
echo "yann ALL=(ALL) NOPASSWD: ALL" &gt;&gt; /etc/sudoers.d/20-yann
exit # sortie su
</code></pre></div></div>
<h4 id="historique-de-la-ligne-de-commande">Historique de la ligne de commande</h4>
<p>Ajoutez la recherche dhistorique de la ligne de commande au terminal<br />
Se connecter en utilisateur<br />
Tapez un début de commande précédent, puis utilisez shift + up (flèche haut) pour rechercher lhistorique filtré avec le début de la commande.</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Global, tout utilisateur</span>
<span class="nb">echo</span> <span class="s1">'"\e[1;2A": history-search-backward'</span> | <span class="nb">sudo tee</span> <span class="nt">-a</span> /etc/inputrc
<span class="nb">echo</span> <span class="s1">'"\e[1;2B": history-search-forward'</span> | <span class="nb">sudo tee</span> <span class="nt">-a</span> /etc/inputrc
</code></pre></div></div>
<h4 id="unités-disques">Unités disques</h4>
<p>Liste : <code class="language-plaintext highlighter-rouge">lsblk</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 111,8G 0 disk
└─sda1 8:1 0 111,8G 0 part
└─ssd--120-lv120 254:1 0 111,8G 0 lvm
sdb 8:16 0 476,9G 0 disk
└─sdb1 8:17 0 476,9G 0 part
└─ssd--512-virtuel 254:0 0 476,9G 0 lvm
nvme0n1 259:0 0 1,9T 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /efi
├─nvme0n1p2 259:2 0 1,8T 0 part
│ └─cryptlvm 254:2 0 1,8T 0 crypt
│ ├─vg0-lvroot 254:3 0 40G 0 lvm /
│ ├─vg0-lvhome 254:4 0 150G 0 lvm /home
│ └─vg0-lvmedia 254:5 0 300G 0 lvm
└─nvme0n1p3 259:3 0 22,2G 0 part
</code></pre></div></div>
<p>Créer les points de montage</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo mkdir</span> <span class="nt">-p</span> /srv/media
<span class="nb">sudo chown</span> <span class="nv">$USER</span>:<span class="nv">$USER</span> /srv/media
<span class="nb">sudo mkdir</span> <span class="nt">-p</span> /mnt/<span class="o">{</span>ssd,sharenfs,FreeUSB2To<span class="o">}</span>
<span class="nb">sudo chown</span> <span class="nv">$USER</span>:<span class="nv">$USER</span> /mnt/<span class="o">{</span>ssd,sharenfs,FreeUSB2To<span class="o">}</span>
<span class="nb">sudo mkdir</span> <span class="nt">-p</span> /virtuel
<span class="nb">sudo chown</span> <span class="nv">$USER</span>:<span class="nv">$USER</span> /virtuel
</code></pre></div></div>
<p>Relever les UUID des unités : <code class="language-plaintext highlighter-rouge">sudo blkid</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/dev/mapper/ssd--120-lv120: UUID="6b48e98c-9b85-461b-9371-040765aae682" BLOCK_SIZE="4096" TYPE="ext4"
/dev/nvme0n1p3: UUID="1a64bf47-fa14-4c9f-b8c4-7c3484f60e94" TYPE="crypto_LUKS" PARTLABEL="endeavouros" PARTUUID="22e5c948-0f32-44d2-9040-cde9534e34e7"
/dev/nvme0n1p1: UUID="E522-8D8D" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="114324a5-4aa7-4ee5-a57e-8568ac5f2f74"
/dev/nvme0n1p2: UUID="5fa90f9d-ac40-4c70-8f58-730a423ce76b" TYPE="crypto_LUKS" PARTUUID="c9640813-16da-4fde-87f6-98a5620e7b72"
/dev/sdb1: UUID="AYko64-7Ysg-IK1P-2hCq-9MUo-VjQl-4NOuWY" TYPE="LVM2_member" PARTUUID="19dd6163-01"
/dev/mapper/vg0-lvhome: LABEL="home" UUID="c35a3f8b-583b-4952-9ceb-f9a19194fa6c" BLOCK_SIZE="4096" TYPE="ext4"
/dev/mapper/cryptlvm: UUID="LwRekN-16qI-L1Nf-WfEY-OLgo-rd3A-XTE3Fg" TYPE="LVM2_member"
/dev/mapper/ssd--512-virtuel: UUID="84bc1aa9-23ac-4530-b861-bc33171b7b42" BLOCK_SIZE="4096" TYPE="ext4"
/dev/sda1: UUID="o2NaLz-2Biv-Dx3C-LYJD-vuyp-1Ogl-Oa4Iu2" TYPE="LVM2_member" PARTLABEL="Linux LVM" PARTUUID="3eee16e4-fe68-42bf-861a-cd9e46d22805"
/dev/mapper/vg0-lvmedia: LABEL="home" UUID="0e48444f-104c-4ba0-8b55-5d38ea0583ee" BLOCK_SIZE="4096" TYPE="ext4"
/dev/mapper/vg0-lvroot: LABEL="root" UUID="04b9e250-1fcd-485b-989f-e753c89bf60f" BLOCK_SIZE="4096" TYPE="ext4"
</code></pre></div></div>
<p>Ajout au fichier <code class="language-plaintext highlighter-rouge">/etc/fstab</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># /dev/mapper/vg0-lvmedia
UUID=0e48444f-104c-4ba0-8b55-5d38ea0583ee /srv/media ext4 rw,relatime 0 2
# /dev/mapper/ssd--512-virtuel
UUID=84bc1aa9-23ac-4530-b861-bc33171b7b42 /virtuel ext4 defaults 0 2
# /dev/mapper/ssd--120-lv120
UUID=6b48e98c-9b85-461b-9371-040765aae682 /mnt/ssd ext4 defaults 0 2
</code></pre></div></div>
<p>Recharger et monter les unités</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl daemon-reload
sudo mount -a
</code></pre></div></div>
<p><strong>Restauration des données /srv/data</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo</span> <span class="nt">-s</span>
rsync <span class="nt">-avA</span> /mnt/ssd/lvmedia/ /srv/media
</code></pre></div></div>
<p>Les dossiers musicyan et dplus sont ailleurs</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> /srv/media/<span class="o">{</span>musicyan,dplus<span class="o">}</span>
<span class="nb">sudo</span> <span class="nt">-s</span>
rsync <span class="nt">-avA</span> /virtuel/musicyan/<span class="k">*</span> /srv/media/musicyan/
rsync <span class="nt">-avA</span> /virtuel/dplus/<span class="k">*</span> /srv/media/dplus/
</code></pre></div></div>
<p>Suppression des dossiers de sauvegardes</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo rm</span> <span class="nt">-r</span> /mnt/ssd/lvmedia
<span class="nb">sudo rm</span> <span class="nt">-r</span> /virtuel/<span class="o">{</span>musicyan,dplus<span class="o">}</span>
</code></pre></div></div>
<h3 id="mise-à-jour-système">Mise à jour Système</h3>
<p>Mode terminal</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -Syu
</code></pre></div></div>
<p>Mode graphique<br />
<img src="/images/plasma-kde01.png" alt="" /></p>
<h3 id="réseau">Réseau</h3>
<ul>
<li><a href="https://docs.redhat.com/fr/documentation/red_hat_enterprise_linux/9/html/configuring_and_managing_networking/configuring-a-network-bridge_configuring-and-managing-networking#configuring-a-network-bridge-by-using-nmcli_configuring-a-network-bridge">Réseau - Doc RedHat</a></li>
<li><a href="/2024/10/31/NetworkManager-nmcli.html">Réseau NetworkManager - nmcli</a></li>
</ul>
<h4 id="interface-pont-bridge">Interface pont (bridge)</h4>
<p><strong>Créer une interface de pont</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmcli connection add type bridge con-name bridge0 ifname bridge0
</code></pre></div></div>
<p><em>Connexion « bridge0 » (c692299c-5076-4b84-adfb-913e154ebf46) ajoutée avec succès.</em></p>
<p>Affichez les interfaces réseau et notez les noms des interfaces que vous souhaitez ajouter au pont</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmcli device status
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>DEVICE TYPE STATE CONNECTION
enp0s31f6 ethernet connecté eth_enp0s31f6
bridge0 bridge connexion (obtention de la configuration IP) bridge0
lo loopback connecté (en externe) lo
wg0-mullvad wireguard connecté (en externe) wg0-mullvad
enp3s0f0 ethernet déconnecté --
enp3s0f1 ethernet indisponible --
</code></pre></div></div>
<p><strong>Attribuer les interfaces au pont.</strong><br />
<em>Si les interfaces que vous souhaitez affecter au pont ne sont pas configurées, créez de nouveaux profils de connexion pour elles</em></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp3s0f0 master bridge0
</code></pre></div></div>
<p><em>Connexion « bridge0-port1 » (34425bb4-3d61-4e6c-81c1-6f76ffe78539) ajoutée avec succès.</em></p>
<p><strong>Paramétrage pont</strong></p>
<ul>
<li>Utiliser le DHCP, <u>aucune action n'est nécessaire</u></li>
<li>Définir une adresse IPv4 statique, un masque de réseau, une passerelle par défaut pour la connexion bridge0 :<br />
<code class="language-plaintext highlighter-rouge">nmcli connection modify bridge0 ipv4.addresses '192.168.10.2/24' ipv4.gateway '192.168.10.1' ipv4.method manual</code></li>
<li>Désactiver ipv6 : <code class="language-plaintext highlighter-rouge">nmcli connection modify bridge0 ipv6.method disabled</code></li>
</ul>
<p>Activer la connexion pont</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmcli connection up bridge0
</code></pre></div></div>
<p><em>Connexion activée (controller waiting for ports) (Chemin D-Bus actif : /org/freedesktop/NetworkManager/ActiveConnection/6)</em></p>
<p>Vérifiez que les ports sont connectés et que la colonne CONNECTION affiche le nom de connexion du port</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmcli device
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>DEVICE TYPE STATE CONNECTION
enp0s31f6 ethernet connecté eth_enp0s31f6
bridge0 bridge connecté bridge0
enp3s0f0 ethernet connecté bridge0-port1
lo loopback connecté (en externe) lo
enp3s0f1 ethernet indisponible --
</code></pre></div></div>
<h4 id="priorité-réseau">Priorité réseau</h4>
<p>Lordinateur de bureau PC1 a 3 cartes réseau</p>
<p class="info">Souvent, les périphériques intégrés disposent de plusieurs interfaces réseau disponibles simultanément, comme les routeurs réseau dotés dinterfaces filaires et sans fil. Ces périphériques doivent pouvoir sélectionner automatiquement une interface réseau préférée. Pour y parvenir sur une machine Linux, chaque interface possède une valeur métrique qui indique le coût dutilisation de linterface. (<a href="https://www.baeldung.com/linux/change-network-routing-metric">Changing the Network Routing Metric Permanently</a>)</p>
<p><code class="language-plaintext warning highlighter-rouge">La connexion au réseau 192.168.0.0/24 via NetworkManager ne se fait pas correctement car il peut se connecter au réseau 192.168.10.0/24</code></p>
<p>Il faut donner la priorité au réseau 192.168.0.0/24</p>
<p>Commande <code class="language-plaintext highlighter-rouge">nmcli device</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>enp0s31f6 ethernet connecté eth_enp0s31f6
bridge0 bridge connecté bridge0
enp3s0f0 ethernet connecté bridge0-port1
...
</code></pre></div></div>
<p><strong>Obtenir la valeur métrique</strong><br />
Obtenons la valeur métrique initiale de nos interfaces réseau.<br />
Pour cela, nous utilisons la commande suivante</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ip route
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>default via 192.168.0.254 dev enp0s31f6 proto static metric 100
default via 192.168.10.1 dev bridge0 proto static metric 425
...
</code></pre></div></div>
<p>Il sagit de la table de routage pour les interfaces enp0s31f6 et bridge0<br />
A la fin de chaque ligne, nous pouvons voir une valeur métrique</p>
<p><strong>Modifier la valeur métrique</strong><br />
Commande nmcli pour modifier la valeur métrique de l interface</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nmcli connection modify 'eth_enp0s31f6' ipv4.route-metric 10
</code></pre></div></div>
<p>Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)</p>
<p>La connexion avec une nouvelle valeur métrique est désormais active.<br />
Si nous vérifions la table de routage, nous devrions pouvoir voir la nouvelle valeur métrique</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ip route
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>default via 192.168.0.254 dev enp0s31f6 proto static metric 10
default via 192.168.10.1 dev bridge0 proto static metric 425
...
</code></pre></div></div>
<p>L interface <strong>enp0s31f6</strong> a désormais une valeur métrique de 10</p>
<h3 id="partage-disque">Partage disque</h3>
<p><a href="/2022/08/03/Partage_disque_externe_USB_sur_Freebox.html">Partage disque externe USB sur Freebox</a></p>
<h4 id="disque-freebox-partagé-freeusb2to">Disque freebox partagé FreeUSB2To</h4>
<p><strong>FreeBox</strong><br />
HDD Mobile 2To connecté en USB sur la freebox<br />
Nom de partage : FreeUSB2To + EXT4 + vérification après formatage<br />
Partage windows activé : yannfreebox + mot de passe</p>
<p><strong>PC1</strong><br />
Partage linux samba : <code class="language-plaintext highlighter-rouge">sudo pacman -S cifs-utils</code> Installé par défaut <br />
Point de montage : <code class="language-plaintext highlighter-rouge">sudo mkdir -p /mnt/FreeUSB2To</code> <br />
Lien : <code class="language-plaintext highlighter-rouge">sudo ln -s /mnt/FreeUSB2To $HOME/FreeUSB2To</code></p>
<p>Credential : <code class="language-plaintext highlighter-rouge">/root/.smbcredentials</code> avec 2 lignes<br />
username=XXXXXX<br />
password=XXXXXX</p>
<p>Droits</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo chown</span> <span class="nt">-R</span> root:root /root/.smbcredentials
<span class="nb">sudo chmod</span> <span class="nt">-R</span> 600 /root/.smbcredentials
</code></pre></div></div>
<p>Les fichiers systèmes</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># /etc/systemd/system/mnt-FreeUSB2To.mount
[Unit]
Description=cifs mount script
Requires=network-online.target
After=network-online.service
[Mount]
What=//192.168.0.254/FreeUSB2To
Where=/mnt/FreeUSB2To
Options=credentials=/root/.smbcredentials,rw,uid=1000,gid=1000,vers=3.0
Type=cifs
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/mnt-FreeUSB2To.automount
[Unit]
Description=cifs mount script
Requires=network-online.target
After=network-online.service
[Automount]
Where=/mnt/FreeUSB2To
TimeoutIdleSec=10
[Install]
WantedBy=multi-user.target
</code></pre></div></div>
<p>Activation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl enable mnt-FreeUSB2To.automount --now
</code></pre></div></div>
<h4 id="partage-avec-lenovo-serveur-nfs">Partage avec Lenovo serveur NFS</h4>
<p><strong>PC1</strong><br />
Points de montage : <code class="language-plaintext highlighter-rouge">sudo mkdir -p /mnt/sharenfs</code> <br />
Lien : <code class="language-plaintext highlighter-rouge">sudo ln -s /mnt/sharenfs $HOME/sharenfs</code></p>
<p>Ajouter les points de montage du serveur nfs au fichier <code class="language-plaintext highlighter-rouge">/etc/fstab</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Les montage NFS du serveur lenovo 192.168.0.215
192.168.0.215:/sharenfs /mnt/sharenfs nfs4 nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10s,rsize=8192,wsize=8192 0 0
</code></pre></div></div>
<p>Rechargement et montage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl daemon-reload &amp;&amp; sudo mount -a
</code></pre></div></div>
<p>Points de montage : <code class="language-plaintext highlighter-rouge">sudo mkdir -p /mnt/nfs-ssd</code> <br />
Lien : <code class="language-plaintext highlighter-rouge">sudo ln -s /mnt/nfs-ssd $HOME/nfs-ssd</code></p>
<p>Ajouter les points de montage du serveur nfs au fichier <code class="language-plaintext highlighter-rouge">/etc/fstab</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>192.168.0.215:/mnt/nfs-ssd /mnt/nfs-ssd nfs4 nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10s,rsize=8192,wsize=8192 0 0
</code></pre></div></div>
<p>Rechargement et montage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl daemon-reload &amp;&amp; sudo mount -a
</code></pre></div></div>
<h4 id="dossiers-et-liens">Dossiers et Liens</h4>
<p>Les dossiers et <strong>Liens sur les autres unités</strong> et les dossiers <code class="language-plaintext highlighter-rouge">.keepassx</code> , <code class="language-plaintext highlighter-rouge">Notes</code> , <code class="language-plaintext highlighter-rouge">scripts</code> <code class="language-plaintext highlighter-rouge">statique/images</code> et <code class="language-plaintext highlighter-rouge">statique/_posts</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir -p /srv/media/{Notes,statique}
sudo mkdir -p /srv/media/statique/{images,_posts}
sudo ln -s /srv/media $HOME/media
sudo mkdir -p /virtuel
sudo ln -s /virtuel $HOME/virtuel
mkdir -p ~/{.ssh,.keepassx}
sudo mkdir -p /mnt/sharenfs/scripts
sudo chown $USER:$USER -R /mnt/sharenfs/scripts
</code></pre></div></div>
<p>Créer liens sharenfs</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ln</span> <span class="nt">-s</span> /mnt/sharenfs/pc1/.borg <span class="nv">$HOME</span>/Private/.borg
<span class="nb">ln</span> <span class="nt">-s</span> /mnt/sharenfs/scripts <span class="nv">$HOME</span>/scripts
</code></pre></div></div>
<p><strong>Liens “statique” et “Notes”</strong><br />
les liens pour la rédaction des posts markdown et le dossier des fichiers</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Lien pour affichage des images avec éditeur Retext</span>
<span class="nb">sudo ln</span> <span class="nt">-s</span> /srv/media/statique/images /images
<span class="c"># Lien pour les fichiers autres</span>
<span class="nb">sudo ln</span> <span class="nt">-s</span> /srv/media/statique/files /files
</code></pre></div></div>
<p><strong>Dossiers Documents et Musique</strong><br />
Supprimer les dossiers par défaut Documents et Musique et créer des liens</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># suppression Documents et Musique
sudo rm -r $HOME/Documents
sudo rm -r $HOME/Musique
#Création des liens
sudo ln -s /srv/media/Documents $HOME/Documents
sudo ln -s /mnt/sharenfs/Musique $HOME/Musique
</code></pre></div></div>
<h3 id="mise-à-jour-endeavouros">Mise à jour EndeavourOS</h3>
<p><strong>Mode graphique</strong></p>
<p><img src="/images/eos-cassini-009.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-009a.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-009c.png" alt="" width="300" /></p>
<p><img src="/images/eos-cassini-010.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-010a.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-010b.png" alt="" width="300" /></p>
<p><img src="/images/eos-cassini-011.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-011a.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-011b.png" alt="" width="300" /><br />
<img src="/images/eos-cassini-011c.png" alt="" width="400" /></p>
<p><strong>Résumé</strong></p>
<p><img src="/images/eos-welcome.png" alt="" /></p>
<h3 id="paramètres-xfce">Paramètres XFCE</h3>
<p>On déplace le <strong>tableau de bord</strong> du bas vers le haut de lécran<br />
Gestion des 2 écrans</p>
<ul>
<li>Sharp en primaire</li>
</ul>
<p>Modification du <strong>tableau de bord</strong> , clic-droit → Tableau de bord → Préférences de tableau de bord → Eléments</p>
<p>Affichage date et heure<br />
<img src="/images/eos-cassini-012.png" alt="" /><br />
ou <strong>format personnalisé</strong> dans <strong>Horloge</strong> : <code class="language-plaintext highlighter-rouge">%e %b %Y %R</code></p>
<p>Gestionnaire dalimentation<br />
<img src="/images/alimentation01.png" alt="" width="400" /><br />
<img src="/images/alimentation02.png" alt="" width="400" /></p>
<p>Supprimer icône alimentation dans la barre des tâches<br />
<img src="/images/alimentation03.png" alt="" /></p>
<p>Apparence<br />
<img src="/images/apparence.png" alt="" width="300" /><img src="/images/apparence-icones.png" alt="" width="300" /></p>
<p>Economiseur décran<br />
<img src="/images/economiseur01.png" alt="" width="400" /><br />
<img src="/images/economiseur02.png" alt="" width="400" /></p>
<p>Deux cartes réseau sont installés<br />
<img src="/images/reseau01.png" alt="" width="400" /><br />
<img src="/images/reseau02.png" alt="" width="400" /><br />
<img src="/images/reseau03.png" alt="" width="400" /></p>
<h3 id="lightdm">LightDM</h3>
<p><em>Utilise <code class="language-plaintext highlighter-rouge">lightdm-slick-greeter</code> Un greeter basé sur GTK plus axé sur lapparence que <code class="language-plaintext highlighter-rouge">lightdm-gtk-greeter</code></em></p>
<p>Les paramètres sont dans le fichier <code class="language-plaintext highlighter-rouge">/etc/lightdm/slick-greeter.conf</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Greeter]
background=/srv/media/dplus/images/Fonds/wp2618258.jpg
draw-user-backgrounds=false
draw-grid=false
theme-name=Arc-Dark
icon-theme-name=Qogir
cursor-theme-name=Qogir
cursor-theme-size=16
show-a11y=false
show-power=false
background-color=#000000
</code></pre></div></div>
<p>Démarre auto ou pas de la session, modifier le fichier <code class="language-plaintext highlighter-rouge">/etc/lightdm/lightdm.conf</code> , (début ligne sans ou avec commentaire <code class="language-plaintext highlighter-rouge">#</code>)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /etc/lightdm/lightdm.conf
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Seat:*]
autologin-user=yann
</code></pre></div></div>
<p>Ecran principal pour la fenêtre de connexion : <a href="/2023/08/02/EndeavourOS_XFCE_-_Environnements_de_bureau_LightDM.html">EndeavourOS XFCE - LightDM sur les systèmes multi-affichages</a></p>
<p>Si vous changez limage de fond, il désactiver draw-grid</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>background=/usr/share/endeavouros/backgrounds/light_sky_stars_85555_1366x768_yano.jpg
draw-grid=false
</code></pre></div></div>
<h3 id="déverrouillage-des-volumes-luks2">Déverrouillage des volumes LUKS2</h3>
<p>Description</p>
<ul>
<li>Slot 0 pour le déverrouillage du volume par saisie dune phrase mot de passe.</li>
<li>Slot 1 ,2 et 3 pour le déverrouillage par des clés avec un appui sur une touche.</li>
<li>Slot 4 - Ajout dune phrase mot de passe pour le recovery (OPTION)</li>
</ul>
<p>Au final nous aurons 4 “slot” utilisés</p>
<p>Installer librairie libfido2 pour la prise en charge des clés Yubico et SoloKeys</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S libfido2
</code></pre></div></div>
<h4 id="enroler-clé-usb-yubikey-5-nfc">Enroler clé USB YubiKey 5 NFC</h4>
<p><img src="/images/yubikey5nfc.png" alt="" height="150" /></p>
<p>Vérifier que la YubiKey est insérée dans un port USB</p>
<p>Lister et enroler la yubikey</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemd-cryptenroll --fido2-device=list
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PATH MANUFACTURER PRODUCT
/dev/hidraw5 Yubico YubiKey OTP+FIDO+CCID
</code></pre></div></div>
<p>Enroler la clé pour le déverrouillage du disque chiffré nvme0n1p2</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemd-cryptenroll --fido2-device=auto /dev/nvme0n1p2
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🔐 Please enter current passphrase for disk /dev/nvme0n1p2: *********************
Requested to lock with PIN, but FIDO2 device /dev/hidraw5 does not support it, disabling.
Initializing FIDO2 credential on security token.
👆 (Hint: This might require confirmation of user presence on security token.)
Generating secret key on FIDO2 security token.
👆 In order to allow secret key generation, please confirm presence on security token.
New FIDO2 token enrolled as key slot 1.
</code></pre></div></div>
<p class="info">Le <strong>Y</strong> de la clé se met à clignoter , il suffit de poser son doigt sur lemplacement du <strong>Y</strong> pour le déverrouillage</p>
<p>Retirer la première clé et répéter lopération ci-dessus pour les autres clés</p>
<h4 id="enroler-une-passphrase-de-recouvrement-option">Enroler une passphrase de recouvrement (OPTION)</h4>
<p>Les jetons et puces de sécurité FIDO2, PKCS#11 et TPM2 sassocient bien avec les clés de recouvrement : puisque vous navez plus besoin de taper votre mot de passe tous les jours, il est logique de vous en débarrasser et denregistrer à la place une clé de recouvrement à forte entropie que vous imprimez ou scannez hors écran et conservez dans un endroit physique sûr.<br />
Voici comment procéder :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemd-cryptenroll --recovery-key /dev/nvme0n1p2
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🔐 Please enter current passphrase for disk /dev/nvme0n1p2: ***********
A secret recovery key has been generated for this volume:
🔐 vbcrnbjn-vkrkihte-rctbufne-nlihihjl-tegudteu-rkjthcgd-hvhuvgik-rugeregh
Please save this secret recovery key at a secure location. It may be used to
regain access to the volume if the other configured access credentials have
been lost or forgotten. The recovery key may be entered in place of a password
whenever authentication is requested.
New recovery key enrolled as key slot 3.
</code></pre></div></div>
<p>Cette opération génère une clé, lenregistre dans le volume LUKS2, laffiche à lécran et génère un code QR que vous pouvez scanner en dehors de lécran si vous le souhaitez.<br />
La clé possède la plus grande entropie et peut être saisie partout où vous pouvez saisir une phrase dauthentification.<br />
Cest pourquoi il nest pas nécessaire de modifier le fichier /etc/crypttab pour que la clé de récupération fonctionne.</p>
<h4 id="enroler-une-clé-usb-solokeys-optionnel">Enroler une clé USB SoloKeys (OPTIONNEL)</h4>
<p><img src="/images/solokeys.png" alt="" /></p>
<p>Lister la clé</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemd-cryptenroll --fido2-device=list
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PATH MANUFACTURER PRODUCT
/dev/hidraw4 SoloKeys Solo 4.1.5
</code></pre></div></div>
<p>Ajout de la solokeys</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemd-cryptenroll --fido2-device=auto /dev/nvme0n1p2
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🔐 Please enter current passphrase for disk /dev/nvme0n1p2: ***********
Requested to lock with PIN, but FIDO2 device /dev/hidraw1 does not support it, disabling.
Initializing FIDO2 credential on security token.
👆 (Hint: This might require confirmation of user presence on security token.)
Generating secret key on FIDO2 security token.
👆 In order to allow secret key generation, please confirm presence on security token.
New FIDO2 token enrolled as key slot 3.
</code></pre></div></div>
<p class="info">Lors du boot , le <strong>S</strong> de la SoloKeys passe au ROUGE et il suffit dappuyer sur le voyant pour quil repasse au vert afin de lancer le processus de déchiffrement et finir le démarrage</p>
<h4 id="prise-en-charge-yubikey-et-solokey">Prise en charge YubiKey et SoloKey</h4>
<p>Les options timeout de <a href="https://www.man7.org/linux/man-pages/man5/crypttab.5.html">crypttab</a></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>timeout=
Spécifie le délai d'attente pour la demande d'un mot de passe. Si aucune unité
n'est spécifiée, l'unité utilisée est la seconde. Les unités prises en charge sont s, ms, us,
min, h, d. Un délai de 0 permet d'attendre indéfiniment (valeur par défaut).
token-timeout=
Spécifie le temps d'attente maximum pour que les dispositifs de sécurité configurés (c'est-à-dire FIDO2, PKCS#11, TPM2) apparaissent.
configurés (c'est-à-dire FIDO2, PKCS#11, TPM2). Prend une valeur
en secondes (mais d'autres unités de temps peuvent être spécifiées,
voir systemd.time(7) pour les formats supportés). La valeur par défaut est 30s.
Une fois le délai spécifié écoulé, l'authentification par
mot de passe est tentée. Notez que ce délai s'applique à
l'attente de l'apparition du dispositif de sécurité - il ne s'applique pas
ne s'applique pas à la demande de code PIN pour le dispositif (le cas échéant)
ou autre. Passez 0 pour désactiver le délai et attendre indéfiniment.
</code></pre></div></div>
<p>Configurer /etc/crypttab pour la prise en charge des clés</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /etc/crypttab
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># &lt;name&gt; &lt;device&gt; &lt;password&gt; &lt;options&gt;
#cryptlvm UUID=5fa90f9d-ac40-4c70-8f58-730a423ce76b /crypto_keyfile.bin luks
cryptlvm UUID=5fa90f9d-ac40-4c70-8f58-730a423ce76b - fido2-device=auto,token-timeout=20s
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">token-timeout=20s</code> &gt; Si aucune clé nest connectée , le mot de passe devra être saisi après 20 secondes de délai</p>
<p>Sauvegarder et quitter.</p>
<p>Réinitialiser</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo reinstall-kernels
</code></pre></div></div>
<p><code class="language-plaintext info highlighter-rouge">Redémarrer la machine</code></p>
<h4 id="plymouth---processus-de-démarrage-graphique">Plymouth - Processus de démarrage graphique</h4>
<p><a href="/2023/10/14/Plymouth_Processus_de_demarrage_graphique.html">Plymouth - Processus de démarrage graphique</a></p>
<h3 id="installation-paquets">Installation Paquets</h3>
<p>On commence par tout ce qui est graphique : gimp, cups (gestion de limprimante) et hplip (si vous avez une imprimante scanner Hewlett Packard). Le paquet python-pyqt5 est indispensable pour linterface graphique de HPLIP+scan. Webkigtk2 étant indispensable pour la lecture de laide en ligne de Gimp. outil rsync, Retext éditeur markdown, firefox fr, thunderbird, libreoffice, gdisk, bluefish, <strong>Double Commander</strong> , <strong>Menulibre</strong> pour la gestion des menus , outils android clementine</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay <span class="nt">-S</span> cups system-config-printer gimp hplip libreoffice-fresh-fr thunderbird-i18n-fr jq figlet p7zip tmux calibre retext bluefish gedit doublecmd-gtk2 terminator filezilla minicom zenity android-tools yt-dlp qrencode zbar xclip nmap jre-openjdk-headless openbsd-netcat borg xterm gparted tigervnc xournalpp qbittorrent ldns strawberry
<span class="c"># Autres avec compilation</span>
yay <span class="nt">-S</span> freetube-bin signal-desktop xsane
<span class="c"># Gestion des menus du bureau, construction du paquet avant installation</span>
yay <span class="nt">-S</span> menulibre
</code></pre></div></div>
<ul>
<li><strong>System-config-printer</strong> est une interface graphique écrite en Python et qui utilise Gtk+ pour configurer un serveur CUPS. Son but premier est de configurer le système dimpression sur lhôte local, mais il peut également configurer une imprimante distante.</li>
<li><strong>HPLIP</strong> est un ensemble de pilotes pour limpression sous GNU / Linux des imprimantes Hewlett Packard.</li>
<li><strong>FIGlet</strong> est un logiciel qui crée des bannières textuelles dans différentes polices décriture</li>
<li><strong>Jq</strong> est un programme qui permet de filtrer, découper, transformer et grouper des données JSON facilement.</li>
<li><strong>p7zip</strong> est le portage en ligne de commande Unix de 7-Zip, un archiveur de fichier qui compresse avec des gros ratios de compression.</li>
<li><strong>Tmux</strong> est un outil qui permet dexploiter plusieurs terminaux au sein dun seul affichage.</li>
<li><strong>calibre</strong> est un logiciel gratuit et open source qui vous permet de gérer, convertir et synchroniser vos livres numériques.</li>
<li><strong>ReText</strong> est multiplateforme et écrit en Python. Il permet déditer des documents au balisage léger, en particulier le Markdown, et peut afficher le rendu HTML, en écran partagé</li>
<li><strong>Bluefish</strong> est un éditeur de texte dédié à la programmation informatique. Il se distingue notamment par ses nombreux outils et par la longue liste de langages de développement compatibles.</li>
<li><strong>Double Commander</strong> est un gestionnaire de fichiers multiplateforme au source ouvert avec deux panneaux côte à côte.</li>
<li><strong>Terminator</strong> est un terminal virtuel qui a la particularité de permettre de partager la fenêtre selon vos envies et ainsi organiser plus simplement vos différentes fenêtres.</li>
<li><strong>FileZilla</strong> est un logiciel qui vous permet de transférer des fichiers entre votre ordinateur et un serveur distant. Il est compatible avec Windows, Mac, Linux et les protocoles FTP, FTPS et SFTP.</li>
<li><strong>Minicom</strong> est un programme de contrôle de modem et démulation de terminal pour les Unix-like. Il permet de configurer des équipements réseaux via leur port console, comme les routeurs Cisco.</li>
<li><strong>Zenity</strong> est un outil qui permet dafficher des boîtes de dialogue GTK+ depuis la ligne de commandes ou au travers de scripts shell</li>
<li><strong>Android SDK Platform-Tools</strong> (ADB) est loutil officiel de Google qui permet dutiliser les commandes ADB sur les appareils Android.</li>
<li><strong>yt-dlp</strong>, script écrit en Python, est un logiciel open source qui permet de télécharger des vidéos à partir de plusieurs sites de partage de vidéos, notamment YouTube</li>
<li><strong>Qrencode</strong> est une bibliothèque rapide et compacte pour lencodage de données en QR Code, un symbole 2D qui peut être scanné par un téléphone portable</li>
<li><strong>ZBar</strong> est un logiciel de lecture de codes-barres à partir de diverses sources, telles que les flux vidéo, les fichiers dimages et les capteurs dintensité brute. Il prend en charge de nombreuses symbologies courantes, dispose dune mise en œuvre souple et en couches et dun code de petite taille, et convient à une utilisation embarquée.</li>
<li><strong>Xournal</strong> est un outil open source permettant dannoter des fichiers PDF. Il prend en charge la saisie au stylo, à la souris et au clavier. Il est couramment utilisé, avec Xournal++, pour ajouter des annotations et des signatures électroniques aux fichiers PDF, en particulier sur les ordinateurs de bureau Linux.</li>
<li><strong>TigerVNC</strong> (de langlais, « Tiger Virtual Network Computing ») est un système pour le partage de bureau graphique vous permettant de contrôler dautres ordinateurs à distance.</li>
<li><strong>Borg Backup</strong> (Borg en abrégé) est un programme de sauvegarde incrémentielle en ligne de commande.</li>
<li><strong>qBittorrent</strong> est un client Bittorrent gratuit et fiable qui vous permet de télécharger et de partager des fichiers via le protocole BitTorrent</li>
<li><strong>Xclip</strong> Cette application permet dutiliser le presse-papier en ligne de commande. Elle permet notamment de rediriger la sortie standard dune commande directement vers le presse-papier, afin de pouvoir sen servir immédiatement.</li>
<li><strong>ldns</strong> est une bibliothèque DNS rapide avec le but de simplifier la programmation DNS et pour permettre aux développeurs de facilement créer des programmes qui soient conformes aux RFC actuelles et aux brouillons Internet.</li>
<li><strong>Nmap</strong> (« Network Mapper ») est un outil open source dexploration réseau et daudit de sécurité. Il a été conçu pour rapidement scanner de grands réseaux, mais il fonctionne aussi très bien sur une cible unique.</li>
<li><strong>GParted</strong> est une application de gestion et dorganisation de partitions distribuée sous licence libre GPLv2. Elle permet de créer, deffacer et de modifier les partitions de vos disques durs, clés USB, cartes SD, etc.</li>
<li><strong>openbsd-netcat</strong> Lutilitaire nc (ou netcat) est utilisé pour tout ce qui concerne TCP, UDP ou les sockets du domaine UNIX. Il peut ouvrir des connexions TCP, envoyer des paquets UDP, écouter sur des ports TCP et UDP arbitraires, effectuer un balayage des ports et gérer à la fois IPv4 et IPv6.</li>
<li><strong>xterm</strong> est lémulateur de terminal standard pour lenvironnement graphique X Window System. Un utilisateur peut disposer de plusieurs instances de xterm simultanément dans le même écran, chacune dentre elles offrant des entrées/sorties indépendantes pour les processus qui sy exécutent</li>
<li><strong>Strawberry Music Player</strong> excelle par la richesse de ses fonctionnalités. Outre la lecture de musique, lutilisateur peut créer et gérer des playlists, organiser aisément sa collection selon divers critères, et même éditer les tags des pistes audio.</li>
<li><strong>FreeTube</strong> est un client privé multiplateforme qui vous permet de regarder YouTube sur votre ordinateur en toute tranquillité.</li>
<li><strong>Signal</strong>, léquivalent libre de WhatsApp. Signal est une application de messagerie similaire à WhatsApp, mais étant plus indépendante. Elle permet aux utilisateurs de se transmettre des messages, des photos, des vidéos et des documents. La transmission des messages est chiffrée de bout en bout.</li>
<li><strong>XSane</strong> a été conçu pour lacquisition dimages avec votre scanner. Vous pouvez scanner un fichier, faire une photocopie, créer un fax, créer un courriel, et enfin démarrer xSane à partir de GIMP avec un greffon spécifique.</li>
<li><strong>MenuLibre</strong> est un éditeur de menu pour les environnements de bureau tels que Budgie, LXDE (Lubuntu), XFCE (Xubuntu), et également GNOME ou Unity.</li>
</ul>
<h3 id="retext">ReText</h3>
<p>Fichier de configuration <code class="language-plaintext highlighter-rouge">~/.config/ReText project/ReText.conf</code></p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[<span class="n">General</span>]
<span class="n">appStyleSheet</span>=/<span class="n">home</span>/<span class="n">yann</span>/.<span class="n">config</span>/<span class="n">ReText</span> <span class="n">project</span>/<span class="n">retext</span>.<span class="n">qss</span>
<span class="n">defaultPreviewState</span>=<span class="n">normal</span>-<span class="n">preview</span>
<span class="n">recentFileList</span>=
<span class="n">styleSheet</span>=/<span class="n">home</span>/<span class="n">yann</span>/.<span class="n">config</span>/<span class="n">ReText</span> <span class="n">project</span>/<span class="n">retext</span>.<span class="n">css</span>
<span class="n">useWebEngine</span>=<span class="n">true</span>
<span class="n">useWebKit</span>=<span class="n">true</span>
</code></pre></div></div>
<p>Les fichiers retext.css et retext.qss</p>
<details>
<summary><b>Etendre Réduire retext.css</b></summary>
<figure class="highlight"><pre><code class="language-css" data-lang="css">
<span class="nt">body</span> <span class="p">{</span>
<span class="nl">font-family</span><span class="p">:</span> <span class="n">Helvetica</span><span class="p">,</span> <span class="n">Arial</span><span class="p">,</span> <span class="nb">sans-serif</span><span class="p">;</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">15px</span><span class="p">;</span>
<span class="nl">line-height</span><span class="p">:</span> <span class="m">1.3</span><span class="p">;</span>
<span class="nl">color</span><span class="p">:</span> <span class="m">#f6e6cc</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">700px</span><span class="p">;</span>
<span class="nl">margin</span><span class="p">:</span> <span class="nb">auto</span><span class="p">;</span>
<span class="c">/*background: #27221a;*/</span>
<span class="nl">background</span><span class="p">:</span> <span class="m">#121212</span><span class="p">;</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">relative</span><span class="p">;</span>
<span class="nl">padding</span><span class="p">:</span> <span class="m">0</span> <span class="m">30px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">body</span><span class="o">&gt;</span><span class="nd">:first-child</span>
<span class="p">{</span>
<span class="nl">margin-top</span><span class="p">:</span><span class="m">0</span><span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">img</span> <span class="p">{</span>
<span class="nl">max-width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">table</span> <span class="p">{</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
<span class="nl">border-collapse</span><span class="p">:</span> <span class="nb">collapse</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">th</span> <span class="p">{</span>
<span class="nl">background-color</span><span class="p">:</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0.3</span><span class="p">);</span>
<span class="p">}</span>
<span class="nt">table</span><span class="o">,</span> <span class="nt">th</span><span class="o">,</span> <span class="nt">td</span> <span class="p">{</span>
<span class="nl">padding</span><span class="p">:</span> <span class="m">5px</span><span class="p">;</span>
<span class="nl">border</span><span class="p">:</span> <span class="m">1px</span> <span class="nb">solid</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0.3</span><span class="p">);</span>
<span class="nl">border-radius</span><span class="p">:</span> <span class="m">0.4em</span><span class="p">;</span>
<span class="nl">-moz-border-radius</span><span class="p">:</span> <span class="m">0.4em</span><span class="p">;</span>
<span class="nl">-webkit-border-radius</span><span class="p">:</span> <span class="m">0.4em</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">tr</span><span class="nd">:nth-child</span><span class="o">(</span><span class="nt">even</span><span class="o">)</span> <span class="p">{</span>
<span class="nl">background-color</span><span class="p">:</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0.3</span><span class="p">);</span>
<span class="p">}</span>
<span class="nt">p</span><span class="o">,</span> <span class="nt">ul</span><span class="o">,</span> <span class="nt">ol</span><span class="o">,</span> <span class="nt">dl</span><span class="o">,</span> <span class="nt">table</span><span class="o">,</span> <span class="nt">pre</span> <span class="p">{</span>
<span class="nl">margin-bottom</span><span class="p">:</span> <span class="m">1em</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">ul</span> <span class="p">{</span>
<span class="nl">margin-left</span><span class="p">:</span> <span class="m">20px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span> <span class="p">{</span>
<span class="nl">text-decoration</span><span class="p">:</span> <span class="nb">none</span><span class="p">;</span>
<span class="nl">cursor</span><span class="p">:</span> <span class="nb">pointer</span><span class="p">;</span>
<span class="nl">color</span><span class="p">:</span> <span class="m">#ba832c</span><span class="p">;</span>
<span class="nl">font-weight</span><span class="p">:</span> <span class="nb">bold</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="nd">:focus</span> <span class="p">{</span>
<span class="nl">outline</span><span class="p">:</span> <span class="m">1px</span> <span class="nb">dotted</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span><span class="nd">:visited</span> <span class="p">{}</span>
<span class="nt">a</span><span class="nd">:hover</span><span class="o">,</span> <span class="nt">a</span><span class="nd">:focus</span> <span class="p">{</span>
<span class="nl">color</span><span class="p">:</span> <span class="m">#d3a459</span><span class="p">;</span>
<span class="nl">text-decoration</span><span class="p">:</span> <span class="nb">none</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span> <span class="o">*,</span> <span class="nt">button</span> <span class="o">*</span> <span class="p">{</span>
<span class="nl">cursor</span><span class="p">:</span> <span class="nb">pointer</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">hr</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="nb">none</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">small</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">90%</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">input</span><span class="o">,</span> <span class="nt">select</span><span class="o">,</span> <span class="nt">button</span><span class="o">,</span> <span class="nt">textarea</span><span class="o">,</span> <span class="nt">option</span> <span class="p">{</span>
<span class="nl">font-family</span><span class="p">:</span> <span class="n">Arial</span><span class="p">,</span> <span class="s1">"Lucida Grande"</span><span class="p">,</span> <span class="s1">"Lucida Sans Unicode"</span><span class="p">,</span> <span class="n">Arial</span><span class="p">,</span> <span class="n">Verdana</span><span class="p">,</span> <span class="nb">sans-serif</span><span class="p">;</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">button</span><span class="o">,</span> <span class="nt">label</span><span class="o">,</span> <span class="nt">select</span><span class="o">,</span> <span class="nt">option</span><span class="o">,</span> <span class="nt">input</span><span class="o">[</span><span class="nt">type</span><span class="o">=</span><span class="nt">submit</span><span class="o">]</span> <span class="p">{</span>
<span class="nl">cursor</span><span class="p">:</span> <span class="nb">pointer</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">sup</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">80%</span><span class="p">;</span>
<span class="nl">line-height</span><span class="p">:</span> <span class="m">1</span><span class="p">;</span>
<span class="nl">vertical-align</span><span class="p">:</span> <span class="nb">super</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">h1</span><span class="o">,</span> <span class="nt">h2</span><span class="o">,</span> <span class="nt">h3</span><span class="o">,</span> <span class="nt">h4</span><span class="o">,</span> <span class="nt">h5</span><span class="o">,</span> <span class="nt">h6</span> <span class="p">{</span>
<span class="nl">line-height</span><span class="p">:</span> <span class="m">1.1</span><span class="p">;</span>
<span class="nl">font-family</span><span class="p">:</span> <span class="n">Baskerville</span><span class="p">,</span> <span class="s1">"Goudy Old Style"</span><span class="p">,</span> <span class="s1">"Palatino"</span><span class="p">,</span> <span class="s1">"Book Antiqua"</span><span class="p">,</span> <span class="nb">serif</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">h1</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">24pt</span><span class="p">;</span>
<span class="nl">margin</span><span class="p">:</span> <span class="m">1em</span> <span class="m">0</span> <span class="m">0.1em</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">h2</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">22pt</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">h3</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">20pt</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">h4</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">18pt</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">h5</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">16pt</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">h6</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">14pt</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">h1</span> <span class="nt">a</span><span class="o">,</span> <span class="nt">h1</span> <span class="nt">a</span><span class="nd">:hover</span> <span class="p">{</span>
<span class="nl">color</span><span class="p">:</span> <span class="m">#d7af72</span><span class="p">;</span>
<span class="nl">font-weight</span><span class="p">:</span> <span class="nb">normal</span><span class="p">;</span>
<span class="nl">text-decoration</span><span class="p">:</span> <span class="nb">none</span><span class="p">;</span>
<span class="p">}</span>
<span class="nd">::selection</span> <span class="p">{</span>
<span class="nl">background</span><span class="p">:</span> <span class="m">#745626</span><span class="p">;</span>
<span class="p">}</span>
<span class="nd">::-moz-selection</span> <span class="p">{</span>
<span class="nl">background</span><span class="p">:</span> <span class="m">#745626</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">pre</span> <span class="p">{</span>
<span class="nl">background</span><span class="p">:</span> <span class="m">#1B1812</span><span class="p">;</span>
<span class="nl">color</span><span class="p">:</span> <span class="m">#fff</span><span class="p">;</span>
<span class="nl">padding</span><span class="p">:</span> <span class="m">8px</span> <span class="m">10px</span><span class="p">;</span>
<span class="nl">overflow-x</span><span class="p">:</span> <span class="nb">hidden</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">pre</span> <span class="nt">code</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">10pt</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>
</details>
<p>Fichier retext.qss</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">QTextEdit</span> <span class="p">{</span>
<span class="nl">color</span><span class="p">:</span> <span class="no">black</span><span class="p">;</span>
<span class="nl">background-color</span><span class="p">:</span> <span class="no">white</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<h3 id="tmux">Tmux</h3>
<details>
<summary><b>Etendre Réduire fichier de configuration "~/.tmux.conf"</b></summary>
<figure class="highlight"><pre><code class="language-text" data-lang="text">
#Configuration de tmux
#Origine : http://denisrosenkranz.com
#Yannick juin 2017
# Copier/Coller par la souris se fait avec la touche "Shift" appuyée
##################################
#Changements des raccourcis claviers
##################################
#On change Control +b par Control +x
#set -g prefix C-x
#unbind C-b
#bind C-x send-prefix
#On utilise control + flèches pour naviguer entre les terminaux
bind-key -n C-right next
bind-key -n C-left prev
#on utilise alt + flèches our naviguer entre les panels
bind-key -n M-left select-pane -L
bind-key -n M-right select-pane -R
bind-key -n M-up select-pane -U
bind-key -n M-down select-pane -D
#On change les raccourcis pour faire du split vertical et horizontal
#On utilise la touche "|" (pipe) pour faire un split vertical
bind | split-window -h
#Et la touche "-" pour faire un split horizontal
bind - split-window -v
##################################
#Changements pratiques
##################################
#On permet l'utilisation de la souris pour changer de terminal et de panel
set -g mouse on
# Sélection zone par clic gauche souris (texte sélectionné sur fond jaune)
# Après relachement du clic , le texte sélectionné est copié dans le presse-papier
# Le fond jaune disparaît
set-option -s set-clipboard off
# For emacs copy mode bindings
# Il faut installer l'utilitaire 'xclip' (sudo pacman -S xclip)
bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"
#Les fenêtres commencent par 1 et non par 0
set -g base-index 1
##################################
#Changements visuels
##################################
#On met les panneaux non actif en gris
#set -g pane-border-fg colour244
#set -g pane-border-bg default
#On met le panneau actif en rouge
#set -g pane-active-border-fg colour124
#set -g pane-active-border-bg default
#On met la barre de status en gris
set -g status-fg colour235
set -g status-bg colour250
#set -g status-attr dim
# On surligne les fenêtres actives dans la barre de status en gris foncés
#set-window-option -g window-status-current-fg colour15
#set-window-option -g window-status-current-bg colour0</code></pre></figure>
</details>
<h3 id="minicom">Minicom</h3>
<p>Paramétrage de lapplication terminale <strong>minicom</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> sudo minicom -s
</code></pre></div></div>
<blockquote>
<p>Seul les paramètres à modifier sont cités</p>
</blockquote>
<p>Configuration du port série<br />
<img src="/images/minicom01.png" alt="" /><br />
A - Port série : <strong>/dev/ttyUSB0</strong> <br />
F - Contrôle de flux matériel : <strong>Non</strong><br />
<img src="/images/minicom02.png" alt="" /><br />
Echap<br />
Enregistrer config. sous dfl<br />
<img src="/images/minicom03.png" alt="" /><br />
Sortir de Minicom</p>
<h3 id="flameshot-copie-écran">Flameshot (copie écran)</h3>
<p><strong>Copie écran (flameshot)</strong><br />
<strong><a href="https://github.com/lupoDharkael/flameshot">Flameshot</a></strong> cest un peu THE TOOL pour faire des captures décrans</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S flameshot
</code></pre></div></div>
<p>Lancer lapplication XFCE Flameshot et licône est visible dans la barre des tâches<br />
<img src="/images/flameshot_e6230-1a.png" alt="" width="300" /></p>
<p>Paramétrage de flameshot, clic droit sur icône , Configuration <br />
<img src="/images/flameshot_e6230-1b.png" alt="" width="300" /><br />
Paramétrage de flameshot<br />
<img src="/images/flameshot01.png" alt="" width="300" /></p>
<h3 id="scrpy-émulation-android">scrpy émulation android</h3>
<p>Utilise adb et le port USB</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S scrcpy
</code></pre></div></div>
<h3 id="client-nextcloud">Client Nextcloud</h3>
<p>Installation client nextcloud</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S nextcloud-client libgnome-keyring gnome-keyring
</code></pre></div></div>
<p>Démarrer le client nextcloud , après avoir renseigné lurl ,login et mot de passe pour la connexion</p>
<p>Trousseau de clé avec mot de passe idem connexion utilisateur</p>
<p>Paramétrage</p>
<ul>
<li>Menu → Lancer <strong>Client de synchronisation nextcloud</strong></li>
<li>Adresse du serveur : <a href="https://cloud.xoyaz.xyz">https://cloud.xoyaz.xyz</a><br />
<img src="/images/nextcloud_xfce01.png" alt="" width="300" /></li>
<li>Nom dutilisateur : yann</li>
<li>Mot de passe : xxxxx<br />
<img src="/images/nextcloud_xfce02.png" alt="" width="200" /><br />
<img src="/images/nextcloud_xfce03.png" alt="" width="300" /><br />
<img src="/images/nextcloud_xfce04.png" alt="" width="200" /></li>
<li>Sauter les dossiers à synchroniser, Ignorer la configuration des dossiers</li>
<li>Trousseau de clés = mot de passe connexion utilisateur<br />
<img src="/images/nextcloud_xfce05.png" alt="" width="400" /></li>
<li>Paramètres nextcloud<br />
<img src="/images/e6230-nextcloud-a.png" alt="" width="400" /></li>
</ul>
<p>Saisir les différents dossiers à synhroniser<br />
<img src="/images/e6230-nextcloud.png" alt="" width="400" /></p>
<p>Au prochain redémarrage, il faudra confirmer le mot de passe du trousseau</p>
<h3 id="gestion-mot-de-passe-keepassxc">Gestion mot de passe (keepassxc)</h3>
<p><img src="/images/KeePassXC.png" alt="" width="50" /><br />
Ajouter une synchronisation de dossier nextcloud : /home/yann/.keepassx (local) → Home/.keepasx (serveur)</p>
<p>Installer keepassxc</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S keepassxc
</code></pre></div></div>
<p>Ajouter aux favoris “KeepassXC” et lancer lapplication → <strong>Ouvrir une base de données existante</strong><br />
Base de données &gt; Ouvrir une base de données (afficher les fichiers cachés) : <strong>~/.keepassx/yannick_xc.kdbx</strong> &gt; Ouvrir<br />
<img src="/images/e6230-keepassx01.png" alt="" width="400" /></p>
<p><strong>Affichage → Thème</strong> : Sombre<br />
<strong>Affichage → Mode compact</strong> , un redémarrage de lapplication est nécessaire</p>
<p>Déverrouillage avec clé matérielle</p>
<h3 id="sshfs-facultatif">SSHFS (facultatif)</h3>
<p><img src="/images/sshfs-logo.png" alt="" width="50" /><br />
<em>SSHFS sert à monter sur son système de fichier, un autre système de fichier distant, à travers une connexion SSH, le tout avec des droits utilisateur.</em></p>
<p>Installer paquet SSHFS</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S sshfs
</code></pre></div></div>
<p class="warning">sshfs est installé par défaut sur la distribution EndeavourOS</p>
<p>Création des partages utilisés par sshfs (facultatif)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir -p $HOME/vps/{borgbackup,lxc,vdb,xoyaz.xyz,xoyize.xyz}
</code></pre></div></div>
<p>Exemple de montage manuel<br />
<code class="language-plaintext highlighter-rouge">sshfs -oIdentityFile=&lt;clé privée&gt; utilisateur@domaine.tld:&lt;dossier distant&gt; &lt;dossier local&gt; -C -p &lt;port si dfférent de 22&gt;</code></p>
<h3 id="gestionnaire-de-fichiers">Gestionnaire de fichiers</h3>
<p><em>Double Commander est un gestionnaire de fichiers open source multiplateforme avec deux panneaux côte à côte. Il sinspire de Total Commander</em></p>
<p>Application GTK</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S doublecmd-gtk2
</code></pre></div></div>
<p>Les paramètres sont stockés dans le dossier <code class="language-plaintext highlighter-rouge">~/.config/doublecmd</code></p>
<h3 id="thunderbird">Thunderbird</h3>
<p>Lancer thunderbird à louverture de session xfce<br />
Paramètres → Session et démarrage → Démarrage automatique dapplication<br />
<img src="/images/thunderbird01a.png" alt="" width="300" /></p>
<p>Ajouter thunderbird aux favoris et lancer</p>
<h3 id="bashrc-alias">bashrc alias</h3>
<p>Dans le fichier ~/.bashrc</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>alias
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>alias ls='ls --color=auto'
alias ll='ls -lav --ignore=..' # show long listing of all except ".."
alias l='ls -lav --ignore=.?*' # show long listing but no hidden dotfiles except "."
alias aide='xdg-open https://static.rnmkcy.eu/aide-jekyll-text-theme.html#autres-styles'
alias android='/home/yann/virtuel/KVM/bliss.sh'
alias audio='yt-dlp --extract-audio --audio-format m4a --audio-quality 0 --output "~/Musique/%(title)s.%(ext)s"'
alias audiomp3='yt-dlp --extract-audio --audio-format mp3 --audio-quality 0 --output "~/Musique/%(title)s.%(ext)s"'
alias borglist='/home/yann/scripts/borglist.sh'
alias calibreraz='adb -s CNBT80D20191101145 shell -x rm /sdcard/Document/metadata.calibre'
alias certok='/home/yann/scripts/ssl-cert-check'
alias compress='/home/yann/scripts/compress'
alias dnsleak='/home/yann/scripts/dnsleaktest.py'
alias findh='cat /home/yann/scripts/findhelp.txt'
alias homer="ssh bookvm@192.168.0.225 -p 55215 -i /home/yann/.ssh/vm-debian12 '/home/bookvm/homer/remoh.py'"
alias iceyanwg="sh /mnt/sharenfs/pc1/scripts/wgiceyan.sh"
alias ipleak='curl https://ipv4.ipleak.net/json/'
alias l='ls -lav --ignore=.?*'
alias ll='ls -lav --ignore=..'
alias ls='ls --color=auto'
alias mediasync='/home/yann/scripts/sav-yann-media.sh'
alias mediajour='/usr/bin/journalctl --no-pager -t sauvegardes --since today'
alias nmapl='sudo nmap -T4 -sP 192.168.0.0/24'
alias odt2html='/home/yann/scripts/_odt2html+index'
alias odtprivate='/home/yann/scripts/_odt2html+index_private'
alias orphelin='sudo pacman -Rsn $(pacman -Qdtq)'
alias otp='/home/yann/scripts/generer-code-2fa-vers-presse-papier-toutes-les-30s.sh'
alias ovh="ssh leno@192.168.0.215 -p 55215 -i /home/yann/.ssh/lenovo-ed25519 'cd /home/leno/ovh_api/; /home/leno/ovh_api/ApiOvh/bin/python domain.py xoyize.xyz cinay.eu xoyaz.xyz ouestline.xyz rnmkcy.eu yanfi.net icevps.xyz xoyize.net iceyan.xyz; cd /home/leno'"
alias rename='/home/yann/scripts/remplacer-les-espaces-accents-dans-une-expression.sh'
alias service='systemctl --type=service'
alias sshm='/home/yann/scripts/ssh-manager.sh'
alias ssl='/home/yann/scripts/ssl-cert-check'
alias static='cd /home/yann/media/yannstatic; /home/yann/.rbenv/shims/bundle exec jekyll build -d /home/yann/media/yannstatic/static; cd ~'
alias status='/home/yann/scripts/status.sh'
alias synchro='journalctl --user -u media_yannstatic_site.service --no-pager --since today'
alias toc='/home/yann/scripts/toc/toc.sh'
alias tocplus='/home/yann/scripts/toc/tocplus.sh'
alias tracesgpx="ssh bookvm@192.168.0.225 -p 55215 -i /home/yann/.ssh/vm-debian12 'tracesgpxnew /home/bookvm/media/osm-new/file'"
alias traduc='/usr/local/bin/trans'
alias vncasus='sh /home/yann/scripts/vncasus.sh'
alias vncdell='sh /home/yann/scripts/vncdell.sh'
alias vncmarina='sh /home/yann/scripts/vncmarina.sh'
alias wgiceyan='sh /home/yann/scripts/wgiceyan.sh'
alias x96='adb connect 192.168.0.22:5555'
alias youtube='yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" --output "~/Vidéos/%(title)s.%(ext)s" --ignore-errors'
</code></pre></div></div>
<p>nous rechargeons le fichier pour appliquer les modifications</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>source ~/.bashrc
</code></pre></div></div>
<h3 id="imprimante-et-scanner">Imprimante et scanner</h3>
<p>Prérequis , paquets <strong>cups cups-filters cups-pdf system-config-printer hplip installés</strong> (Pilotes HP pour DeskJet, OfficeJet, Photosmart, Business Inkjet et quelques modèles de LaserJet aussi bien quun certain nombre dimprimantes Brother)…</p>
<p>Installer graphiquement limprimante<br />
<img src="/images/hp7510-00.png" alt="" width="300" /><br />
<img src="/images/hp7510-01.png" alt="" /><br />
<img src="/images/hp7510-02.png" alt="" /></p>
<p class="warning"><img src="/images/hp7510-03.png" alt="" width="300" /><br />
Pour contourner le problème , éditer le fichier <code class="language-plaintext highlighter-rouge">/etc/nsswitch.conf</code><br />
Ajouter <code class="language-plaintext highlighter-rouge">mdns_minimal [NOTFOUND=return]</code> avant <code class="language-plaintext highlighter-rouge">resolve</code> <br />
<code class="language-plaintext highlighter-rouge">hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns</code></p>
<p>Après correctif<br />
<img src="/images/hp7510-04.png" alt="" width="300" /></p>
<p>Avec cups : http://localhost:631/<br />
<img src="/images/hp_cups.png" alt="" /></p>
<p>Installation du scanner<br />
Coté logiciel il vous faudra <strong>sane</strong> et son interface graphique <strong>xsane</strong>, ainsi quéventuellement xsane-gimp le plugin pour gimp.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S xsane xsane-gimp
</code></pre></div></div>
<p>Vérifier si le scaner est reconnu : <code class="language-plaintext highlighter-rouge">sudo scanimage -L</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>device `escl:https://192.168.0.24:443' is a HP OfficeJet 7510 series [C22036] platen,adf scanner
device `hpaio:/net/officejet_7510_series?ip=192.168.0.24&amp;queue=false' is a Hewlett-Packard officejet_7510_series all-in-one
</code></pre></div></div>
<p>Test scan, placer un original pour photocopie</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>scanimage --device hpaio:/net/officejet_7510_series?ip=192.168.0.24 --format=png &gt; test.png
</code></pre></div></div>
<h3 id="navigateur-floorp">Navigateur Floorp</h3>
<p><em>Floorp est un navigateur basé sur Firefox qui bloque les traceurs malveillants, offre une mise en page flexible et personnalisable, et ne collecte pas les données des utilisateurs. Découvrez ses fonctionnalités, ses thèmes, ses mises à jour et son code source ouvert.</em></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S floorp-bin
</code></pre></div></div>
<h3 id="application-mullvad">Application Mullvad</h3>
<ul>
<li><a href="/2024/09/14/Mullvad-2024.html#archlinux-mullvad">Archlinux Mullvad</a></li>
<li><a href="/htmldoc/Utilisation application VPN Mullvad.html">Utilisation application VPN Mullvad</a></li>
</ul>
<h3 id="générateur-site-statique">Générateur site statique</h3>
<p><em>Ensemble dapplications basé sur ruby et jekyll qui permet la génération de site statique à partir de fichiers markdown</em></p>
<p>Installation sur archlinux</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S ruby ruby-erb base-devel
</code></pre></div></div>
<p>Pour ne pas installer les paquets RubyGems (appelés gems) en tant quutilisateur root. A la place, mettez en place un répertoire dinstallation de gem pour votre compte utilisateur.</p>
<p>Les commandes suivantes ajoutent des variables denvironnement à votre fichier ~/.bashrc pour configurer le chemin dinstallation des gems</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s1">'# Install Ruby Gems to ~/gems'</span> <span class="o">&gt;&gt;</span> ~/.bashrc
<span class="nb">echo</span> <span class="s1">'export GEM_HOME="$HOME/gems"'</span> <span class="o">&gt;&gt;</span> ~/.bashrc
<span class="nb">echo</span> <span class="s1">'export PATH="$HOME/gems/bin:$PATH"'</span> <span class="o">&gt;&gt;</span> ~/.bashrc
<span class="nb">source</span> ~/.bashrc
</code></pre></div></div>
<p>Puis, installer Jekyll et Bundler</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gem install jekyll bundler
</code></pre></div></div>
<p>Les versions installées<br />
<img src="/images/version-ruby-jekyll.png" alt="" /></p>
<p>Suite installation &gt; <a href="/2024/07/13/Archlinux_Ruby_Jekyll_site_statique.html#yannstatic">yannstatic - générateur site statique</a></p>
<h3 id="ntfy">Ntfy</h3>
<p><em>Ntfy, qui se prononce “notify”, est un service de notification ultra léger, permettant denvoyer des messages vers un smartphone ou un ordinateur via de simples scripts, sans besoin de compte et totalement gratuitement !</em></p>
<p><a href="/2024/02/22/Ntfy.html">Ntfy service de notification</a></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S ntfy-bin
</code></pre></div></div>
<h3 id="freetuxtv">FreeTuxTv</h3>
<p><em>FreetuxTV est une application qui permet de regarder et enregistrer facilement les chaînes de télévision sous GNU/Linux et les chaînes de télévision de votre fournisseur daccès internet.</em></p>
<p>En mode su</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "192.168.0.254 mafreebox.freebox.fr" &gt;&gt; /etc/hosts
</code></pre></div></div>
<p>Installation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S freetuxtv
</code></pre></div></div>
<p>Paramétrage du parefeu firewalld (<a href="https://forums.fedora-fr.org/d/59161-configuration-de-firewalld-pour-le-multicast-vlc-freebox-de-chez-free">Configuration de firewalld pour le multicast VLC freebox</a>)</p>
<p>Créer les services <strong>/etc/firewalld/services//mafreebox.xml</strong> et <strong>/etc/firewalld/services//vlc.xml</strong> pour firewalld</p>
<p><strong>mafreebox.xml</strong></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="nt">&lt;service&gt;</span>
<span class="nt">&lt;short&gt;</span>mafreebox<span class="nt">&lt;/short&gt;</span>
<span class="nt">&lt;description&gt;</span>Permission pour mafreebox et vlc<span class="nt">&lt;/description&gt;</span>
<span class="nt">&lt;port</span> <span class="na">protocol=</span><span class="s">"udp"</span> <span class="na">port=</span><span class="s">""</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/service&gt;</span>
</code></pre></div></div>
<p><strong>vlc.xml</strong></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="nt">&lt;service&gt;</span>
<span class="nt">&lt;short&gt;</span>vlc2<span class="nt">&lt;/short&gt;</span>
<span class="nt">&lt;description&gt;</span>Permission pour mafreebox et vlc<span class="nt">&lt;/description&gt;</span>
<span class="nt">&lt;port</span> <span class="na">protocol=</span><span class="s">"udp"</span> <span class="na">port=</span><span class="s">"15947"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;destination</span> <span class="na">ipv4=</span><span class="s">"228.67.43.91"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/service&gt;</span>
</code></pre></div></div>
<p>Les ajouter à la <strong>zone public</strong> pour rendre ces règles permanentes</p>
<p>/etc/firewalld/zones/public.xml</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="nt">&lt;zone&gt;</span>
<span class="nt">&lt;short&gt;</span>Public<span class="nt">&lt;/short&gt;</span>
<span class="nt">&lt;description&gt;</span>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.<span class="nt">&lt;/description&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"ssh"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"dhcpv6-client"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"ipp-client"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"mdns"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"ipp"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"mafreebox"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"vlc"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;forward/&gt;</span>
<span class="nt">&lt;/zone&gt;</span>
</code></pre></div></div>
<p>Recharger le parefeu</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>firewall-cmd --reload
</code></pre></div></div>
<h2 id="virtuel-qemu-kvm-vmm">Virtuel QEMU KVM VMM</h2>
<h3 id="installation-virt-manager">Installation Virt-Manager</h3>
<ol>
<li><a href="/2023/05/31/EndeavourOS-Virt-Manager_Complete_Edition.html#installation-simplifiée">Virt-Manager Complete Edition - Installation simplifiée</a></li>
<li><a href="/2023/12/17/Installer_KVM_Kernel_Virtual_Machine_sur_un_serveur.html#accés-aux-machines-virtuelles-kvm-distantes-via-virt-manager">Accés aux machines virtuelles KVM distantes via virt-manager</a></li>
<li><a href="/2023/05/31/EndeavourOS-Virt-Manager_Complete_Edition.html#pont-réseau-virtuel-host-bridge">Pont réseau virtuel “host-bridge”</a><br />
<img src="/images/host-bridge-br0.png" alt="" width="400" /></li>
<li>Gestionnaire de machine virtuelles, activer “xml editing”<br />
<img src="/images/xml-editing.png" alt="" width="400" /></li>
<li>Restaurer les configurations de VM<br />
<code class="language-plaintext highlighter-rouge">sudo cp ~/virtuel/etc-libvirt-qemu/*.xml /etc/libvirt/qemu/</code></li>
</ol>
<p><strong>Déclarer le pont (bridge) à KVM</strong>
Créer un fichier de définition de réseau au format XML : <code class="language-plaintext highlighter-rouge">nano router-tenda.xml</code></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;network&gt;</span>
<span class="nt">&lt;name&gt;</span>router-tenda<span class="nt">&lt;/name&gt;</span>
<span class="nt">&lt;forward</span> <span class="na">mode=</span><span class="s">"bridge"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;bridge</span> <span class="na">name=</span><span class="s">"bridge0"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;/network&gt;</span>
</code></pre></div></div>
<p>Appliquer la configuration :</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>virsh net-define router-tenda.xml <span class="c"># -&gt; Réseau host-tenda défini depuis router-tenda.xml</span>
<span class="nb">sudo </span>virsh net-start router-tenda <span class="c"># -&gt; Réseau router-tenda démarré</span>
<span class="nb">sudo </span>virsh net-autostart router-tenda <span class="c"># -&gt; Réseau router-tenda marqué en démarrage automatique</span>
</code></pre></div></div>
<p>Vérification</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo virsh net-list --all
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Nom État Démarrage automatique Persistant
-------------------------------------------------------------
router-tenda actif oui oui
</code></pre></div></div>
<p>La structure libvirt</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Les configurations xml
[root@pc1 yann]# tree -L 2 /etc/libvirt/qemu
/etc/libvirt/qemu
├── autostart
│   └── vm-debian12.xml -&gt; /etc/libvirt/qemu/vm-debian12.xml
├── EndeavourOS.xml
├── networks
│   ├── autostart
│   ├── default.xml
│   └── router-tenda.xml
└── win11.xml
# les images sous KVM
[yann@pc1 ~]$ tree -L 2 ~/virtuel/
/home/yann/virtuel/
├── eos
│   └── eos-chiffre_luks_backup.bin
├── KVM
│   ├── eos-lvm-luks-1.qcow2
│   └── wineleven.qcow2
├── KVM_SAV
│   ├── etc-libvirt-qemu
│   └── images_qcow2
└── nspawn
└── nspbullseye
</code></pre></div></div>
<h2 id="développement">Développement</h2>
<h3 id="wing-personal-python-ide">Wing personal python IDE</h3>
<p><strong>Wing personal python IDE</strong> → <a href="https://wingware.com/downloads/wing-personal">Téléchargement</a></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Décompression de la version téléchargée
tar xjvf wing-personal-10.0.6.0-linux-x64.tar.bz2
# Passage en root
sudo -s
# Lancement procédure installation
cd wing-personal-10.0.6.0-linux-x64
./wing-install.py
</code></pre></div></div>
<p>Déroulement de la commande</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Where do you want to install the support files for Wing Personal (default
= /usr/local/lib/wing-personal9)?
/usr/local/lib/wing-personal9 does not exist, create it (y/N)? y
Where do you want to install links to the Wing Personal startup scripts
(default = /usr/local/bin)?
[...]
Writing file-list.txt
Icon/menu install returned err=0
Done installing. Make sure that /usr/local/bin is in your path and type
"wing-personal9" to start Wing Personal.
</code></pre></div></div>
<p>Effacer les fichiers</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Suppression dossier et fichier
cd ..
rm -rf wing-personal*
# sortie root
exit
</code></pre></div></div>
<h3 id="go-et-nodejs">Go et NodeJS</h3>
<p>Archlinux Go</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S go
go version
</code></pre></div></div>
<p><em>go version go1.23.2 linux/amd64</em></p>
<p>Archlinux Node.js npm</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S nodejs npm
node --version &amp;&amp; npm --version
</code></pre></div></div>
<p><em>v22.9.0</em><br />
<em>10.8.3</em></p>
<p>NVM, également appelé « Node Version Manager », est un outil utilisé pour installer et gérer plusieurs versions de Node.js sur le système.<br />
Installer la dernière version de NVM à laide de la commande suivante</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
source ~/.bashrc
</code></pre></div></div>
<p>Vérifier</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvm --version
</code></pre></div></div>
<p><em>0.39.2</em></p>
<p><strong>Installer Node.js avec NVM</strong><br />
Pour lister toutes les versions disponibles Node.js</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvm list-remote
</code></pre></div></div>
<p>Vous obtiendrez une liste de toutes les versions</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> v20.17.0 (LTS: Iron)
v20.18.0 (Latest LTS: Iron)
v22.2.0
v22.3.0
v22.4.0
v22.4.1
v22.5.0
v22.5.1
v22.6.0
v22.7.0
v22.8.0
v22.9.0
</code></pre></div></div>
<p>Pour installer la dernière version de Node.js<br />
<code class="language-plaintext highlighter-rouge">nvm install node</code></p>
<p>Pour installer la dernière version stable de Node.js<br />
<code class="language-plaintext highlighter-rouge">nvm install --lts</code></p>
<p>Pour installer une version spécifique de Node.js<br />
<code class="language-plaintext highlighter-rouge">nvm install 18.10.0</code></p>
<p>Pour lister toutes les versions installées de Node.js<br />
<code class="language-plaintext highlighter-rouge">nvm ls</code></p>
<p>Pour modifier la version Node.js par défaut à 19.0.0<br />
<code class="language-plaintext highlighter-rouge">nvm utilisation 19.0.0</code></p>
<h3 id="dbeaver">Dbeaver</h3>
<p><em>DBeaver est basé sur le framework Eclipse, il est open source et il supporte plusieurs types de serveurs de bases de données comme : MySQL, SQLite, DB2, PostgreSQL, Oracle…</em></p>
<p>Version java si installé : <code class="language-plaintext highlighter-rouge">java --version</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openjdk 22.0.2 2024-07-16
OpenJDK Runtime Environment (build 22.0.2+9)
OpenJDK 64-Bit Server VM (build 22.0.2+9, mixed mode, sharing)
</code></pre></div></div>
<p>Installation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S dbeaver
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Sync Explicit (1): dbeaver-24.2.1-1
résolution des dépendances…
:: Il y a 6 fournisseurs disponibles pour java-runtime&gt;=17 :
:: Dépôt extra
1) jdk-openjdk 2) jdk17-openjdk 3) jdk21-openjdk 4) jre-openjdk 5) jre17-openjdk 6) jre21-openjdk
Entrer un nombre (par défaut, 1 est sélectionné): 4
recherche des conflits entre paquets…
:: jre-openjdk - 22.0.2.u9-1 et jre-openjdk-headless - 22.0.2.u9-1 sont en conflit. Supprimer jre-openjdk-headless ? [o/N] o
</code></pre></div></div>
<h3 id="mariadb">MariaDB</h3>
<p><a href="/2019/02/09/MariaDB-sur-Debian-Stretch.html#archlinux">MariaDB archlinux</a></p>
<p>Résumé des commandes en mode su</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman <span class="nt">-S</span> mariadb
mysql_install_db <span class="nt">--user</span><span class="o">=</span>mysql <span class="nt">--basedir</span><span class="o">=</span>/usr <span class="nt">--datadir</span><span class="o">=</span>/var/lib/mysql
systemctl <span class="nb">enable </span>mariadb <span class="nt">--now</span>
systemctl status <span class="nt">--no-pager</span> <span class="nt">--full</span> mariadb <span class="nt">--full</span>
</code></pre></div></div>
<p>Sécuriser</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mysql_secure_installation
</code></pre></div></div>
<h3 id="postgresql">PostgreSQL</h3>
<ul>
<li><a href="https://linuxgenie.net/install-postgresql-psql-arch-linux/">How to Install PostgreSQL (psql) on Arch Linux</a></li>
<li><a href="https://www.postgresqltutorial.com/postgresql-cheat-sheet/">PostgreSQL Cheat Sheet</a></li>
<li><a href="https://public.dalibo.com/exports/formation/manuels/modules/i1/i1.handout.html">Sauvegarde et restauration</a></li>
</ul>
<p>Installation sur archlinux
yay -S postgresql</p>
<p>Relever version <code class="language-plaintext highlighter-rouge">postgres --version</code><br />
<em>postgres (PostgreSQL) 16.3</em></p>
<p><strong>Configurer le serveur PostgreSQL</strong></p>
<p>Pour configurer le serveur PostgreSQL sur Arch Linux, vous devez installer le paquetage Postgresql. Ensuite, vous pouvez démarrer le service en initialisant le cluster de base de données. Vous pouvez définir un mot de passe pour le super-utilisateur et créer des bases de données et des tables.<br />
Comme nous avons déjà installé PostgreSQL, nous devons maintenant le configurer. Pour cela, passez dabord à lutilisateur Postgres avec cette commande :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo -iu postgres
</code></pre></div></div>
<p>Prompt : <code class="language-plaintext highlighter-rouge">[postgres@pc1 ~]$</code></p>
<p>initialiser le répertoire pour les données.<br />
PostgreSQL stockera ses données dans ce répertoire. Vous pouvez utiliser lemplacement par défaut <code class="language-plaintext highlighter-rouge">/var/lib/postgres/data</code> ou en choisir un autre.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>initdb --locale $LANG -E UTF8 -D '/var/lib/postgres/data/'
</code></pre></div></div>
<p><img src="/images/postgresql01.png" alt="" /></p>
<p>Démarrer et activer PostgreSQL</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl enable postgresql --now
</code></pre></div></div>
<p>Vérifier : <code class="language-plaintext highlighter-rouge">systemctl status postgresql</code><br />
<img src="/images/postgresql03.png" alt="" /></p>
<p>Pour accéder</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>psql -U postgres
</code></pre></div></div>
<p>Pour importer une base SQL</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Créer une base
psql -U postgres -c "CREATE DATABASE ttrss"
# Importer
psql -U postgres ttrss &lt; nom_fichier.sql
</code></pre></div></div>
<p><strong>OPTIONS</strong><br />
Vous pouvez également activer les sommes de contrôle des données pour renforcer lintégrité des données en ajoutant largument <code class="language-plaintext highlighter-rouge">--data-checksums</code> à la commande précédente. Pour savoir si les sommes de contrôle des données sont activées, exécutez la commande suivante :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo -iu postgres
psql --tuples-only -c "SHOW data_checksums"
</code></pre></div></div>
<p><img src="/images/postgresql02.png" alt="" /></p>
<p>Pour initialiser le répertoire de données avec les sommes de contrôle activées</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>initdb --locale $LANG -E UTF8 -D '/var/lib/postgres/data/' --data-checksums
</code></pre></div></div>
<p>Cela créera un nouveau répertoire de données dans <code class="language-plaintext highlighter-rouge">/var/lib/postgres/data/</code> avec la locale et lencodage spécifiés. De plus, il effectue une vérification de la somme de contrôle des données pour chaque page écrite sur le disque. Cela permet de détecter les corruptions de données causées par un matériel défectueux.</p>
<p>Vous pouvez également modifier les méthodes dauthentification pour les connexions locales et distantes en ajoutant largument ci-dessous à la commande précédente :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>--auth-local=peer --auth-host=scram-sha-256
</code></pre></div></div>
<p>La méthode par défaut est la confiance, ce qui signifie que nimporte qui sur lhôte peut se connecter en tant quutilisateur de la base de données. Cette méthode nétant pas très sûre, vous pouvez en utiliser une autre.</p>
<h2 id="maintenance">Maintenance</h2>
<h3 id="sauvegardes-locales">Sauvegardes locales</h3>
<p><a href="/2021/05/28/Sauvegardes_locales_avec_systemd_utilisateur_service_et_timer.html">Sauvegardes locales avec systemd utilisateur service et timer</a></p>
<p>La sauvegarde démarre 3 minutes après la mise sous tension de PC1</p>
<p>Les logs : <code class="language-plaintext highlighter-rouge">journalctl --user -u savyann.service</code><br />
Liste des timers : <code class="language-plaintext highlighter-rouge">systemctl --user list-timers --all</code></p>
<h3 id="pacman-hooks">Pacman Hooks</h3>
<ul>
<li><a href="https://github.com/endeavouros-team/PKGBUILDS/tree/master/eos-hooks">Pacman hooks for setting up certain system identification files of EndeavourOS (eos-hooks)</a></li>
<li><a href="https://github.com/Strykar/pacman-hooks">Pacman hooks</a></li>
</ul>
<p><strong>Liste paquets installés</strong><br />
<em>Ce hook sauvegardera une liste de vos paquets natifs et étrangers (AUR) installés. Cela garantit que vous aurez toujours une liste à jour de tous vos paquets que vous pourrez réinstaller.</em></p>
<p>Prérequis pour la création du hook et des scripts, créez des sous-répertoires</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir -p /etc/pacman.d/{hooks,hooks.bin}
</code></pre></div></div>
<p>Créez le hook</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /etc/pacman.d/hooks/50-pacman-list.hook
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#/etc/pacman.d/hooks/50-pacman-list.hook
[Trigger]
Type = Package
Operation = Install
Operation = Upgrade
Operation = Remove
Target = *
[Action]
Description = Création liste des paquets installés
When = PostTransaction
Exec = /bin/sh -c '/usr/bin/pacman -Qqe &gt; /mnt/sharenfs/pc1/PC1_eos_pkg_list.txt'
</code></pre></div></div>
<p>Pour installer des paquets depuis une sauvegarde antérieure de la liste des paquets, tout en ne réinstallant pas ceux qui sont déjà installés et à jour, lancer:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S --needed - &lt; PC1_eos_pkg_list.txt
sudo pacman -S --needed $(comm -12 &lt;(pacman -Slq | sort) &lt;(sort pkglist.txt))
</code></pre></div></div>
<h3 id="changer-nvme-ou-ssd-chiffré">Changer Nvme ou SSD chiffré</h3>
<p>Remplacer M.2 2280 NVMe 1To par une 2To<br />
<img src="/images/ssd_Fikwot_FN501_Pro.png" alt="" /></p>
<p>Boot sur usb live EndeavourOS</p>
<p>Passer en mode su</p>
<p>Les partitions du disque chiffré nvme0n1</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme0n1 259:0 0 931.5G 0 disk
├─nvme0n1p1 259:1 0 512M 0 part
├─nvme0n1p2 259:2 0 920G 0 part
│ └─crypttemp 254:3 0 920G 0 crypt
│ ├─vg0-lvroot 254:4 0 70G 0 lvm
│ ├─vg0-lvhome 254:5 0 120G 0 lvm
│ └─vg0-lvmedia 254:6 0 600G 0 lvm
└─nvme0n1p3 259:3 0 11G 0 part
</code></pre></div></div>
<p>Déchiffrer la partition nvme0n1p2</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksOpen /dev/nvme0n1p2 crypttemp
</code></pre></div></div>
<p>Créer et monter le système à sauvegarder sur /media</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> <span class="nt">-p</span> /media
<span class="nb">mkdir</span> <span class="nt">-p</span> /media/home
<span class="nb">mkdir</span> <span class="nt">-p</span> /media/efi
mount /dev/vg0/lvroot /media
mount /dev/vg0/lvhome /media/home
mount /dev/nvme0n1p1 /media/efi
</code></pre></div></div>
<p>Monter le système qui va recevoir la sauvegarde</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mount /dev/vg-nas-one/sav /mnt
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/pc1
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/pc1/efi
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/pc1/home
</code></pre></div></div>
<p>Sauvegarder le système actuel (racine,home et efi)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rsync -avA /media/ /mnt/pc1
</code></pre></div></div>
<p>Patienter plusieurs minutes, suivant la taille</p>
<p>Arrêter la machine PC1</p>
<p>Remplacer la carte SSD M2<br />
Redémarrer la machine sur un USB Live EndeavourOS</p>
<p>Zapper le nouveau disque SSD M.2</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sgdisk --zap-all /dev/nvme0n1
</code></pre></div></div>
<p>Partitionnement du disque NVME 2To GPT + LVM</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gdisk /dev/nvme0n1
</code></pre></div></div>
<p>Créer 2 partitions<br />
Partition 1 : 512M EFI (code ef00) système de fichier FAT32<br />
Partition 2 : le reste LVM (code 8e00) système de fichier EXT4</p>
<p>Formater partition EFI</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkfs.fat -F32 /dev/nvme0n1p1
</code></pre></div></div>
<p>Chiffrer la partition /dev/nvme0n1p2</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksFormat --type luks2 /dev/nvme0n1p2
</code></pre></div></div>
<p>Ouvrir la partition chiffrée</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksOpen /dev/nvme0n1p2 crypt
</code></pre></div></div>
<p>Créer LVM</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pvcreate /dev/mapper/crypt
vgcreate vg0 /dev/mapper/crypt
</code></pre></div></div>
<p>Créer les volumes</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lvcreate <span class="nt">-L</span> 60G vg0 <span class="nt">-n</span> lvroot <span class="c"># Logical volume "lvroot" created.</span>
lvcreate <span class="nt">-L</span> 120G vg0 <span class="nt">-n</span> lvhome <span class="c"># Logical volume "lvhome" created.</span>
</code></pre></div></div>
<p>Système de fichier</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkfs.ext4 <span class="nt">-L</span> root /dev/mapper/vg0-lvroot
mkfs.ext4 <span class="nt">-L</span> home /dev/mapper/vg0-lvhome
</code></pre></div></div>
<p>Monter le nouveau système sur /mnt</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mount /dev/mapper/vg0-lvroot /mnt
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/home
mount /dev/mapper/vg0-lvhome /mnt/home
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/efi
mount /dev/nvme0n1p1 /mnt/efi
</code></pre></div></div>
<p>Monter la sauvegarde sur media</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mount /dev/vg-nas-one/sav /media
</code></pre></div></div>
<p>Restaurer le système</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rsync -avA /media/pc1/ /mnt
</code></pre></div></div>
<p>Patienter plusieurs minutes, suivant la taille</p>
<p>Création volume logique LVM media et montage</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lvcreate <span class="nt">-L</span> 800G vg0 <span class="nt">-n</span> lvmedia
mkfs.ext4 <span class="nt">-L</span> media /dev/mapper/vg0-lvmedia
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/srv/media
mount /dev/vg0/lvmedia /mnt/srv/media
</code></pre></div></div>
<p>Restaurer la sauvegarde multimedia</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rsync -avA /media/pc1_20240201/media/srv/media/ /mnt/srv/media
</code></pre></div></div>
<p>Démonter le système de sauvegarde</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>umount /media
</code></pre></div></div>
<p>Ajouter un fichier de clé existant LUKS</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksAddKey /dev/nvme0n1p2 /mnt/crypto_keyfile.bin
</code></pre></div></div>
<p>Il faut saisir le phrase mot de passe</p>
<p>Configuration /etc/crypttab</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksUUID /dev/nvme0n1p2
</code></pre></div></div>
<p>Renvoie UUID ae37e59d-35f7-4920-8428-be8be8d15243</p>
<p>Modifier /mnt/etc/crypttab</p>
<p>Contenu</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># &lt;name&gt; &lt;device&gt; &lt;password&gt; &lt;options&gt;
cryptlvm UUID=ae37e59d-35f7-4920-8428-be8be8d15243 /crypto_keyfile.bin luks
</code></pre></div></div>
<p>Passer en chroot</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>arch-chroot /mnt
</code></pre></div></div>
<p>Relever les UUID</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/mapper/vg0-lvroot
</code></pre></div></div>
<p>renvoie lUUID du volume racine : 2a6cab35-6c52-4382-9aee-06a376a8acc0</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/mapper/vg0-lvhome
</code></pre></div></div>
<p>renvoie lUUID du volume daccueil : b4e52069-a8c9-459e-b39f-6ac1b682b0d6</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/mapper/vg0-lvmedia
</code></pre></div></div>
<p>renvoie lUUID du volume media : 1ca4bfc7-3d31-4859-aeb3-656214fab490</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/nvme0n1p1
</code></pre></div></div>
<p>renvoie lUUID du volume media : E5E4-A4AE</p>
<p>Configurer /etc/fstab</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/fstab
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>UUID=E5E4-A4AE /efi vfat defaults,noatime 0 2
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
UUID=2a6cab35-6c52-4382-9aee-06a376a8acc0 / ext4 defaults,acl,noatime,discard 0 0
UUID=b4e52069-a8c9-459e-b39f-6ac1b682b0d6 /home ext4 defaults,acl,noatime,discard 0 0
/swapfile none swap defaults,pri=-2 0 0
# /dev/mapper/vg0-lvmedia
UUID=86a7c58c-8f30-42e2-bd39-d1ae7464c837 /srv/media ext4 rw,relatime 0 2
# /dev/mapper/ssd--512-virtuel
UUID=84bc1aa9-23ac-4530-b861-bc33171b7b42 /virtuel ext4 defaults 0 2
# /dev/mapper/vg--nas--one-sav
UUID=c5b9eefc-1daa-4a0d-8a72-6169b3c8c91f /sauvegardes ext4 defaults 0 2
# /dev/vg-nas-one/iso - Volume logique 200G du disque 4To
UUID=58f4b6c7-3811-41d5-9964-f47ac32375f6 /iso ext4 defaults 0 2
</code></pre></div></div>
<p>options du noyau</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid <span class="nt">-s</span> UUID <span class="nt">-o</span> value /dev/nvme0n1p2 <span class="c"># --&gt; ae37e59d-35f7-4920-8428-be8be8d15243</span>
</code></pre></div></div>
<p>Modifier /etc/kernel/cmdline</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/kernel/cmdline
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme_load=YES nowatchdog rw rd.luks.uuid=ae37e59d-35f7-4920-8428-be8be8d15243 root=/dev/mapper/vg0-lvroot
</code></pre></div></div>
<p>Réinstaller noyau</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>reinstall-kernels
</code></pre></div></div>
<p>Sortie du chroot , retirer la clé USB Live et reboot de la machine</p>
<h3 id="mise-à-jour--si-erreur-de-paquet-ou-signature-pgp">Mise à jour , si erreur de paquet ou signature PGP</h3>
<p>En cas derreur de paquet ou signature PGP</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S endeavouros-keyring archlinux-keyring
</code></pre></div></div>
<p><code class="language-plaintext info highlighter-rouge">Redémarrer la machine</code></p>
<h3 id="etat-des-lieux">Etat des lieux</h3>
<p>Ajouter un alias dans le fichier <code class="language-plaintext highlighter-rouge">~/.bashrc</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>alias etat='$HOME/scripts/etat_des_lieux.sh'
</code></pre></div></div>
<p>Recharger et exécuter</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>source ~/.bashrc
etat
</code></pre></div></div>
<h3 id="ajout-disque-lvm">Ajout disque LVM</h3>
<p>Exemple disque SSD 120Go</p>
<p>Disque sda</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsblk
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 111,8G 0 disk
</code></pre></div></div>
<p><strong>gdisk</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo gdisk /dev/sda
</code></pre></div></div>
<p>o : nouvelle partion dos<br />
n : nouvelle partition typt LVM 8e00</p>
<p>Format fichier ext4</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkfs.ext4 /dev/sda1
</code></pre></div></div>
<p><strong>LVM</strong> (Logical Volume Manager, ou gestionnaire de volumes logiques en français) permet la création et la gestion de volumes logiques sous Linux. Lutilisation de volumes logiques remplace en quelque sorte le partitionnement des disques.</p>
<p>Volume physique : <code class="language-plaintext highlighter-rouge">sudo pvcreate /dev/sda1</code><br />
GroupevVolumes : <code class="language-plaintext highlighter-rouge">sudo vgcreate ssd-120 /dev/sda1</code><br />
Volume logique : <code class="language-plaintext highlighter-rouge">sudo lvcreate -n lv120 -l +100%FREE ssd-120</code><br />
Fichier ext4 : <code class="language-plaintext highlighter-rouge">sudo mkfs.ext4 /dev/ssd-120/lv120</code></p>
<p>Relever UUID <code class="language-plaintext highlighter-rouge">sudo blkid |grep lv120</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/dev/mapper/ssd--120-lv120: UUID="6b48e98c-9b85-461b-9371-040765aae682" BLOCK_SIZE="4096" TYPE="ext4"
</code></pre></div></div>
<p>Création point de montage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir -p /mnt/ssd
</code></pre></div></div>
<p>Ajouter les lignes suivantes au fichier <strong>/etc/fstab</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># /dev/mapper/ssd--120-lv120
UUID=6b48e98c-9b85-461b-9371-040765aae682 /mnt/ssd ext4 defaults 0 2
</code></pre></div></div>
<p>Rechargement et montage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl daemon-reload
sudo mount -a
</code></pre></div></div>
<p>Vérification : <code class="language-plaintext highlighter-rouge">df -h /mnt/ssd/</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/mapper/ssd--120-lv120 110G 2,1M 104G 1% /mnt/ssd
</code></pre></div></div>
<p>Droits en écriture à lutilisateur</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo chown $USER:$USER /mnt/ssd/
</code></pre></div></div>
<h3 id="synchro-serveurs">Synchro serveurs</h3>
<p><strong>Dossier “BiblioCalibre”</strong></p>
<p class="info">Le but est de synchroniser le dossier <strong>/srv/media/BiblioCalibre</strong> avec le(s) serveur(s) web distant(s)<br />
Avec les unités de chemin, vous pouvez surveiller les fichiers et les répertoires pour certains événements. Si un événement spécifique se produit, une unité de service est exécutée, et elle porte généralement le même nom que lunité de chemin</p>
<p>Nous allons surveiller dans le dossier <em>/srv/media/BiblioCalibre/</em> toute modification du fichier <strong>metadata.db</strong> qui entrainera lexécution dun script</p>
<p>Dans le répertoire systemd utilisateur nous créons une unité de cheminement <strong>media_BiblioCalibre_site.path</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano ~/.config/systemd/user/media_BiblioCalibre_site.path
</code></pre></div></div>
<div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[Unit]</span>
<span class="py">Description</span><span class="p">=</span><span class="s">Surveiller metadata.db pour les changements</span>
<span class="nn">[Path]</span>
<span class="py">PathChanged</span><span class="p">=</span><span class="s">/srv/media/BiblioCalibre/metadata.db</span>
<span class="py">Unit</span><span class="p">=</span><span class="s">media_BiblioCalibre_site.service</span>
<span class="nn">[Install]</span>
<span class="py">WantedBy</span><span class="p">=</span><span class="s">default.target</span>
</code></pre></div></div>
<p>Dans la section <code class="language-plaintext highlighter-rouge">[Path]</code>, <code class="language-plaintext highlighter-rouge">PathChanged=</code> indique le chemin absolu du fichier à surveiller, tandis que <code class="language-plaintext highlighter-rouge">Unit=</code> indique lunité de service à exécuter si le fichier change. Cette unité (<strong>media_BiblioCalibre_site.path</strong>) doit être lancée lorsque le système est en mode multi-utilisateur.</p>
<p>Ensuite, nous créons lunité de service correspondante, <strong>media_BiblioCalibre_site.service</strong>, dans le répertoire <code class="language-plaintext highlighter-rouge">~/.config/systemd/user/</code> <br />
Si le fichier <strong>metadata.db</strong> change (cest-à-dire quil est à la fois écrit et fermé), lunité de service suivante sera appelée pour exécuter le script spécifié :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano ~/.config/systemd/user/media_BiblioCalibre_site.service
</code></pre></div></div>
<div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[Unit]</span>
<span class="py">Description</span><span class="p">=</span><span class="s">"Exécute le script si metadata.db a été modifié."</span>
<span class="nn">[Service]</span>
<span class="py">ExecStart</span><span class="p">=</span><span class="s">/mnt/sharenfs/scripts/media_BiblioCalibre_site.sh</span>
<span class="nn">[Install]</span>
<span class="py">WantedBy</span><span class="p">=</span><span class="s">default.target</span>
</code></pre></div></div>
<p>Le script <code class="language-plaintext highlighter-rouge">media_BiblioCalibre_site.sh</code> lance une synchronisation locale distante via rsync ssh</p>
<details>
<summary><b>Etendre Réduire media_BiblioCalibre_site.sh</b></summary>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#!/bin/bash</span>
<span class="c">#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</span>
<span class="c"># Modification mode rsync suivant serveur distant</span>
<span class="c">#</span>
<span class="c"># Chaque modification du fichier metadata.db dans le dossier local /srv/media/BiblioCalibre </span>
<span class="c"># déclenche une synchronisation du dossier local avec le dossier distant '/sharenfs/multimedia/eBook/BiblioCalibre' </span>
<span class="c"># des serveurs VPS Yunohost</span>
<span class="c"># le dossier local est également sauvegardé dans le dossier 'backup/datayan/static' de la boîte de stockage</span>
<span class="c">#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</span>
<span class="c"># Fonction pour tester si le serveur est présent</span>
<span class="c"># Host=$1 et Port=$2</span>
<span class="c"># Réponse $?=0 -&gt; OK $?=1 -&gt; NOK</span>
host_ok <span class="o">()</span> <span class="o">{</span>
nc <span class="nt">-4</span> <span class="nt">-d</span> <span class="nt">-z</span> <span class="nt">-w</span> 1 <span class="nv">$1</span> <span class="nv">$2</span> &amp;&gt; /dev/null
<span class="o">}</span>
synchro <span class="o">()</span> <span class="o">{</span>
<span class="c"># Synchronisation locale distante du dossier _site</span>
host_ok <span class="nv">$SERVER</span> <span class="nv">$PORT</span>
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$?</span> <span class="o">==</span> 0 <span class="o">]]</span>
<span class="k">then
</span><span class="nb">echo</span> <span class="s1">'rsync -avz --progress --stats --human-readable --delete -e "ssh -p '</span><span class="nv">$PORT</span><span class="s1">' -i '</span><span class="nv">$PRIVKEY</span><span class="s1">'" '</span><span class="nv">$REPLOC</span><span class="s1">' '</span><span class="nv">$USERDIS</span><span class="s1">':'</span><span class="nv">$REPDIS</span><span class="s1">'/eBook/'</span>
rsync <span class="nt">-avz</span> <span class="nt">--progress</span> <span class="nt">--stats</span> <span class="nt">--human-readable</span> <span class="nt">--delete</span> <span class="nt">--rsync-path</span><span class="o">=</span><span class="s2">"</span><span class="nv">$RSYNCMOD</span><span class="s2">"</span> <span class="nt">-e</span> <span class="s2">"ssh -p </span><span class="nv">$PORT</span><span class="s2"> -i </span><span class="nv">$PRIVKEY</span><span class="s2">"</span> <span class="nv">$REPLOC</span> <span class="nv">$USERDIS</span>:<span class="nv">$REPDIS</span>/eBook/ <span class="o">&gt;</span> /dev/null
<span class="c"># Analyse résultat de la commande rsync</span>
<span class="k">if</span> <span class="o">[</span> <span class="o">!</span> <span class="nv">$?</span> <span class="nt">-eq</span> 0 <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="c">#echo "Synchro $REPLOC avec $SERVER -&gt; OK" | systemd-cat -t BiblioCalibre -p info </span>
<span class="c">#echo "Synchro $REPLOC avec $SERVER -&gt; OK"</span>
<span class="c">#else </span>
<span class="nb">echo</span> <span class="s2">"Synchro </span><span class="nv">$REPLOC</span><span class="s2"> avec </span><span class="nv">$SERVER</span><span class="s2"> -&gt; ERREUR"</span> | systemd-cat <span class="nt">-t</span> BiblioCalibre <span class="nt">-p</span> emerg
<span class="c">#echo "Synchro $REPLOC avec $SERVER -&gt; ERREUR"</span>
<span class="k">fi
else
</span><span class="nb">echo</span> <span class="s2">"Site </span><span class="nv">$SERVER</span><span class="s2"> port </span><span class="nv">$PORT</span><span class="s2"> Inaccessible !"</span> | systemd-cat <span class="nt">-t</span> BiblioCalibre <span class="nt">-p</span> emerg
<span class="c">#echo "Site $SERVER port $PORT Inaccessible !"</span>
<span class="k">fi</span>
<span class="o">}</span>
<span class="c">#*******************************************************************</span>
<span class="c">#</span>
<span class="c"># DEPART SCRIPT</span>
<span class="c">#</span>
<span class="c">#*******************************************************************</span>
<span class="c"># Tester la présence du fichier des serveurs distants</span>
<span class="k">if</span> <span class="o">[</span> <span class="o">!</span> <span class="nt">-f</span> /home/yann/scripts/serveurs.csv <span class="o">]</span><span class="p">;</span> <span class="k">then
</span><span class="nb">echo</span> <span class="s2">"Fichier serveurs.csv inexistant!"</span> | systemd-cat <span class="nt">-t</span> BiblioCalibre <span class="nt">-p</span> emerg
<span class="nb">exit </span>1
<span class="k">fi</span>
<span class="c"># Mesure temps exécution</span>
<span class="nv">begin</span><span class="o">=</span><span class="si">$(</span><span class="nb">date</span> +<span class="s2">"%s"</span><span class="si">)</span>
<span class="nb">echo</span> <span class="s2">"***DEPART*** Exécution script </span><span class="nv">$0</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"***DEPART*** Exécution script </span><span class="nv">$0</span><span class="s2">"</span> | systemd-cat <span class="nt">-t</span> BiblioCalibre <span class="nt">-p</span> info
<span class="c">#echo "Exécution script $0"</span>
<span class="c"># Dossier local</span>
<span class="nv">REPLOC</span><span class="o">=</span><span class="s2">"/srv/media/BiblioCalibre"</span>
<span class="c"># Synchro serveurs</span>
<span class="k">while </span><span class="nv">IFS</span><span class="o">=</span><span class="s2">","</span> <span class="nb">read</span> <span class="nt">-r</span> SERVER REPDIS USERDIS PORT PRIVKEY RSYNCMOD LOCAL
<span class="k">do</span>
<span class="c">#echo " $SERVER $REPDIS $USERDIS $PORT $PRIVKEY $RSYNCMOD $LOCAL"</span>
<span class="k">if</span> <span class="o">[[</span> <span class="s2">"</span><span class="nv">$SERVER</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"rnmkcy.eu"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
</span>synchro
<span class="nb">echo</span> <span class="s2">"ssh </span><span class="nv">$USERDIS</span><span class="s2"> -p </span><span class="nv">$PORT</span><span class="s2"> -i </span><span class="nv">$PRIVKEY</span><span class="s2"> 'sudo systemctl restart calibreweb'"</span>
ssh <span class="nv">$USERDIS</span> <span class="nt">-p</span> <span class="nv">$PORT</span> <span class="nt">-i</span> <span class="nv">$PRIVKEY</span> <span class="s1">'sudo systemctl restart calibreweb'</span>
<span class="k">fi
done</span> &lt; &lt;<span class="o">(</span><span class="nb">tail</span> <span class="nt">-n</span> +2 /home/yann/scripts/serveurs.csv<span class="o">)</span>
<span class="c"># Calcul et affichage temps exécution</span>
<span class="nv">termin</span><span class="o">=</span><span class="si">$(</span><span class="nb">date</span> +<span class="s2">"%s"</span><span class="si">)</span>
<span class="nv">difftimelps</span><span class="o">=</span><span class="k">$((</span><span class="nv">$termin</span><span class="o">-</span><span class="nv">$begin</span><span class="k">))</span>
<span class="nb">echo</span> <span class="s2">"***FIN*** </span><span class="nv">$0</span><span class="s2"> exécuté en </span><span class="k">$((</span><span class="nv">$difftimelps</span> <span class="o">/</span> <span class="m">60</span><span class="k">))</span><span class="s2"> mn </span><span class="k">$((</span><span class="nv">$difftimelps</span> <span class="o">%</span> <span class="m">60</span><span class="k">))</span><span class="s2"> s"</span> | systemd-cat <span class="nt">-t</span> BiblioCalibre <span class="nt">-p</span> info
<span class="nb">echo</span> <span class="s2">"***FIN*** </span><span class="nv">$0</span><span class="s2"> exécuté en </span><span class="k">$((</span><span class="nv">$difftimelps</span> <span class="o">/</span> <span class="m">60</span><span class="k">))</span><span class="s2"> mn </span><span class="k">$((</span><span class="nv">$difftimelps</span> <span class="o">%</span> <span class="m">60</span><span class="k">))</span><span class="s2"> s"</span>
<span class="nb">exit </span>0</code></pre></figure>
</details>
<p>Activer et lancer</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl --user enable media_BiblioCalibre_site.path --now
</code></pre></div></div>
<p>Voir le fichier journal</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>journalctl --user -f -u media_BiblioCalibre_site.service
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>juin 06 09:39:32 yann-pc1 systemd[1537]: Started "Exécute le script si metadata.db a été modifié.".
juin 06 09:39:32 yann-pc1 media_BiblioCalibre_site.sh[11100]: ***DEPART*** Exécution script /home/yann/scripts/media_BiblioCalibre_site.sh
juin 06 09:39:32 yann-pc1 media_BiblioCalibre_site.sh[11100]: rsync -avz --progress --stats --human-readable --delete -e "ssh -p 55215 -i /home/yann/.ssh/lenovo-ed25519" /srv/media/BiblioCalibre leno@192.168.0.215:/sharenfs/multimedia/Divers/
juin 06 09:39:33 yann-pc1 media_BiblioCalibre_site.sh[11100]: ***FIN*** /home/yann/scripts/media_BiblioCalibre_site.sh exécuté en 0 mn 1 s
juin 06 09:44:40 yann-pc1 systemd[1537]: Started "Exécute le script si metadata.db a été modifié.".
juin 06 09:44:40 yann-pc1 media_BiblioCalibre_site.sh[11278]: ***DEPART*** Exécution script /home/yann/scripts/media_BiblioCalibre_site.sh
juin 06 09:44:40 yann-pc1 media_BiblioCalibre_site.sh[11278]: rsync -avz --progress --stats --human-readable --delete -e "ssh -p 55215 -i /home/yann/.ssh/lenovo-ed25519" /srv/media/BiblioCalibre leno@192.168.0.215:/sharenfs/multimedia/Divers/
juin 06 09:44:41 yann-pc1 media_BiblioCalibre_site.sh[11278]: ssh leno@192.168.0.215 -p 55215 -i /home/yann/.ssh/lenovo-ed25519 'sudo systemctl restart calibreweb'
juin 06 09:44:42 yann-pc1 media_BiblioCalibre_site.sh[11278]: ***FIN*** /home/yann/scripts/media_BiblioCalibre_site.sh exécuté en 0 mn 2 s
</code></pre></div></div>
<p>On peut créer un accès graphique sur le poste archlinux</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/.local/share/applications/suivi_BiblioCalibre_site.desktop
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Desktop Entry]
Version=1.1
Type=Application
Name=Synchro BiblioCalibre
Comment=synchro site rnmkcy.eu
Icon=xterm-color_48x48
Exec=xterm -rv -geometry 250x30+10+50 -T suivi_BiblioCalibre_site -e 'journalctl --user -u media_BiblioCalibre_site.service --no-pager; read -p "Touche Entrée pour sortir..."'
Actions=
Categories=Utility;
Path=
Terminal=false
StartupNotify=false
</code></pre></div></div>]]></content><author><name></name></author><category term="archlinux" /><category term="chiffrement" /><summary type="html"><![CDATA[EndeavourOS est une distribution GNU/Linux basée sur Arch Linux]]></summary></entry><entry><title type="html">Moteur de routage (BRouter) + Visualisation et édition traces gpx (gpx.studio)</title><link href="https://static.rnmkcy.eu/2024/10/01/Visualisation_et_edition_des_traces_gpx_studio.html" rel="alternate" type="text/html" title="Moteur de routage (BRouter) + Visualisation et édition traces gpx (gpx.studio)" /><published>2024-10-01T00:00:00+02:00</published><updated>2024-10-01T00:00:00+02:00</updated><id>https://static.rnmkcy.eu/2024/10/01/Visualisation_et_edition_des_traces_gpx_studio</id><content type="html" xml:base="https://static.rnmkcy.eu/2024/10/01/Visualisation_et_edition_des_traces_gpx_studio.html"><![CDATA[<p><em>Tracer des itinéaires à laide du moteur de routage BRouter. Visualiser, éditer et créer des traces gpx avec un fork de lapplication web <a href="https://gpx.studio">https://gpx.studio</a></em></p>
<h2 id="brouter">BRouter</h2>
<p><img src="/images/routing-map-logo.png" alt="" /><br />
<em>BRouter est un moteur de routage conçu pour calculer des itinéraires optimaux en utilisant OpenStreetMap et des données délévation.<br />
Comme alternative à la <a href="https://brouter.de/brouter-web/">version en ligne</a>, le serveur autonome de BRouter peut également être exécuté localement (<a href="https://github.com/nrenner/brouter-web">https://github.com/nrenner/brouter-web</a>).</em></p>
<h3 id="prérequis">Prérequis</h3>
<p>Installer java</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install default-jre
</code></pre></div></div>
<p>Version : <code class="language-plaintext highlighter-rouge">java --version</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openjdk 17.0.12 2024-07-16
OpenJDK Runtime Environment (build 17.0.12+7-Debian-2deb12u1)
OpenJDK 64-Bit Server VM (build 17.0.12+7-Debian-2deb12u1, mixed mode, sharing)
</code></pre></div></div>
<h3 id="procédure-installation">Procédure installation</h3>
<p>Télécharger et décompresser la dernière archive autonome (<code class="language-plaintext highlighter-rouge">brouter-web-standalone.&lt;version&gt;.zip</code>) à partir de <a href="https://github.com/nrenner/brouter-web/releases">https://github.com/nrenner/brouter-web/releases</a>, par exemple pour Linux (remplacez <code class="language-plaintext highlighter-rouge">~/opt/</code> par votre répertoire dinstallation préféré et <code class="language-plaintext highlighter-rouge">0.11.0</code> par la dernière version) :</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo mkdir</span> <span class="nt">-p</span> /opt/brouter
<span class="nb">sudo chown</span> <span class="nv">$USER</span>:<span class="nv">$USER</span> /opt/brouter
<span class="nb">cd</span> /opt/brouter
wget https://github.com/nrenner/brouter-web/releases/download/0.18.1/brouter-web-standalone.0.18.1.zip
unzip brouter-web-standalone.0.18.1.zip
<span class="nb">rm </span>brouter-web-standalone.0.18.1.zip
</code></pre></div></div>
<h3 id="données-rd5">Données rd5</h3>
<p>Télécharger un ou plusieurs fichiers de données rd5 depuis le <a href="https://brouter.de/brouter/segments4/">download directory</a> ou le <a href="https://umap.openstreetmap.de/de/map/brouter-rd5-grid_9438">grid map</a> dans le répertoire <code class="language-plaintext highlighter-rouge">/opt/segments4</code>.<br />
<img src="/images/brouter01.png" alt="" /></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wget -P /opt/brouter/segments4 https://brouter.de/brouter/segments4/W5_N45.rd5
wget -P /opt/brouter/segments4 https://brouter.de/brouter/segments4/E0_N50.rd5
wget -P /opt/brouter/segments4 https://brouter.de/brouter/segments4/E0_N45.rd5
wget -P /opt/brouter/segments4 https://brouter.de/brouter/segments4/E5_N45.rd5
wget -P /opt/brouter/segments4 https://brouter.de/brouter/segments4/E5_N40.rd5
wget -P /opt/brouter/segments4 https://brouter.de/brouter/segments4/E0_N40.rd5
wget -P /opt/brouter/segments4 https://brouter.de/brouter/segments4/W5_N40.rd5
</code></pre></div></div>
<p>Veuillez patienter quelques minutes…</p>
<h3 id="le-script-de-lancement">Le script de lancement</h3>
<p>Création dun script <code class="language-plaintext highlighter-rouge">/opt/brouter/srv.sh</code> , Port découte 11955</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/sh</span>
<span class="nv">BINDADDRESS</span><span class="o">=</span><span class="s2">"localhost"</span>
<span class="c"># BRouter standalone server</span>
<span class="c"># java -cp brouter.jar btools.brouter.RouteServer &lt;segmentdir&gt; &lt;profile-map&gt; &lt;customprofiledir&gt; &lt;port&gt; &lt;maxthreads&gt; [bindaddress]</span>
<span class="c"># maxRunningTime is the request timeout in seconds, set to 0 to disable timeout</span>
<span class="nv">JAVA_OPTS</span><span class="o">=</span><span class="s2">"-Xmx128M -Xms128M -Xmn8M -DmaxRunningTime=300"</span>
<span class="c"># If paths are unset, first search in locations matching the directory structure</span>
<span class="c"># as found in the official BRouter zip archive</span>
<span class="nv">CLASSPATH</span><span class="o">=</span><span class="k">${</span><span class="nv">CLASSPATH</span><span class="k">:-</span><span class="s2">"/opt/brouter/brouter.jar"</span><span class="k">}</span>
<span class="nv">SEGMENTSPATH</span><span class="o">=</span><span class="k">${</span><span class="nv">SEGMENTSPATH</span><span class="k">:-</span><span class="s2">"/opt/brouter/segments4"</span><span class="k">}</span>
<span class="nv">PROFILESPATH</span><span class="o">=</span><span class="k">${</span><span class="nv">PROFILESPATH</span><span class="k">:-</span><span class="s2">"/opt/brouter/profiles2"</span><span class="k">}</span>
<span class="nv">CUSTOMPROFILESPATH</span><span class="o">=</span><span class="k">${</span><span class="nv">CUSTOMPROFILESPATH</span><span class="k">:-</span><span class="s2">"/opt/brouter/customprofiles"</span><span class="k">}</span>
java <span class="nv">$JAVA_OPTS</span> <span class="nt">-cp</span> <span class="nv">$CLASSPATH</span> btools.server.RouteServer <span class="s2">"</span><span class="nv">$SEGMENTSPATH</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$PROFILESPATH</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$CUSTOMPROFILESPATH</span><span class="s2">"</span> 11955 1 <span class="nv">$BINDADDRESS</span>
</code></pre></div></div>
<p>Le rendre exécutable</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chmod +x /opt/brouter/srv.sh
</code></pre></div></div>
<h3 id="systemd-service-brouter">Systemd service brouter</h3>
<p>Créer un service brouter</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /etc/systemd/system/brouter.service
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Unit]
Description=brouter server
[Service]
Type=exec
User=leno
WorkingDirectory=/opt/brouter
ExecStart=sh /opt/brouter/srv.sh
[Install]
WantedBy=multi-user.target
</code></pre></div></div>
<p>Recharger , activer et lancer le service <strong>brouter</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl daemon-reload
<span class="nb">sudo </span>systemctl <span class="nb">enable </span>brouter <span class="nt">--now</span>
</code></pre></div></div>
<p>Vérifier : <code class="language-plaintext highlighter-rouge">systemctl status brouter</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>● brouter.service - brouter server
Loaded: loaded (/etc/systemd/system/brouter.service; enabled; preset: enabled)
Active: active (running) since Wed 2024-10-02 13:40:18 CEST; 32s ago
Main PID: 283776 (sh)
Tasks: 20 (limit: 14161)
Memory: 28.5M
CPU: 247ms
CGroup: /system.slice/brouter.service
├─283776 sh /opt/brouter/srv.sh
└─283778 java -Xmx128M -Xms128M -Xmn8M -DmaxRunningTime=300 -cp /opt/brouter/brouter.jar btools.server.RouteServer /opt/brouter/segments4 /opt/brouter/profiles2 /opt/brouter/customprofiles 11955 1 localhost
oct. 02 13:40:18 rnmkcy.eu systemd[1]: Starting brouter.service - brouter server...
oct. 02 13:40:18 rnmkcy.eu systemd[1]: Started brouter.service - brouter server.
oct. 02 13:40:18 rnmkcy.eu sh[283778]: BRouter 1.6.3 / 21122021
</code></pre></div></div>
<h3 id="proxy-nginx">Proxy nginx</h3>
<p>Proxy nginx <strong>brouter</strong> <code class="language-plaintext highlighter-rouge">/etc/nginx/conf.d/routeur.rnmkcy.eu.conf</code></p>
<div class="language-nginx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">server</span> <span class="p">{</span>
<span class="c1"># ipv4 listening port/protocol</span>
<span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
<span class="c1"># ipv6 listening port/protocol</span>
<span class="kn">listen</span> <span class="s">[::]:443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
<span class="kn">server_name</span> <span class="s">routeur.rnmkcy.eu</span><span class="p">;</span>
<span class="kn">include</span> <span class="n">/etc/nginx/conf.d/security.conf.inc</span><span class="p">;</span>
<span class="kn">location</span> <span class="n">/</span> <span class="p">{</span>
<span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:11955</span> <span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Vérification et rechargement nginx</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>nginx <span class="nt">-t</span>
<span class="nb">sudo </span>systemctl reload nginx
</code></pre></div></div>
<h2 id="gpxstudio">gpx.studio</h2>
<p><img src="/images/gpxstudio-logo.png" alt="" width="200" /><br />
<a href="https://github.com/gpxstudio">https://github.com/gpxstudio</a></p>
<p>Cloner dans /sharenfs/rnmkcy/</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd /sharenfs/rnmkcy/
git clone https://github.com/gpxstudio/gpx.studio.git
</code></pre></div></div>
<p>Le code est divisé en deux parties:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">gpx</code>: une bibliothèque de typescript pour parser et manipuler des fichiers GPX,</li>
<li><code class="language-plaintext highlighter-rouge">site web</code>: le site lui-même, qui est une application <a href="https://kit.svelte.dev/">SvelteKit</a>.</li>
</ul>
<p>Vous aurez besoin de <a href="https://nodejs.org/">Node.js</a> pour construire et exécuter ces deux parties.</p>
<h3 id="construction-bibliothèque-gpx">Construction bibliothèque gpx</h3>
<p><strong>Construction bibliothèque gpx</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd </span>gpx.studio/gpx
npm <span class="nb">install
</span>npm run build
</code></pre></div></div>
<p>Pour pouvoir charger la carte, vous devrez créer votre propre <a href="https://account.mapbox.com/auth/signup" target="_blank">Mapbox access token</a> et le stocker dans un fichier <code class="language-plaintext highlighter-rouge">.env</code> dans le répertoire <code class="language-plaintext highlighter-rouge">website</code>.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd ../website
echo "PUBLIC_MAPBOX_TOKEN={YOUR_MAPBOX_TOKEN}" &gt;&gt; .env
npm install
</code></pre></div></div>
<h3 id="mode-production">Mode production</h3>
<p><strong>Les modifications des sources “website” avant construction</strong> <br />
Dossier <code class="language-plaintext highlighter-rouge">/sharenfs/rnmkcy/gpx.studio/website/src</code></p>
<p>Avant toute modification de la zone “website/src”, effectuer une sauvegarde des sources</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> <span class="nv">$HOME</span>/FreeUSB2To/rnmkcy.eu/sauvegardes/gpx_website_src
rsync <span class="nt">-av</span> /sharenfs/rnmkcy/gpx.studio/website/src <span class="nv">$HOME</span>/FreeUSB2To/rnmkcy.eu/sauvegardes/gpx_website_src
</code></pre></div></div>
<p>Les pages par défaut en fr</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find /sharenfs/rnmkcy/gpx.studio/website/src/ <span class="nt">-name</span> <span class="s2">"*"</span> <span class="nt">-type</span> f <span class="nt">-exec</span> <span class="nb">sed</span> <span class="nt">-i</span> <span class="s2">"s#'en'#'fr'#g"</span> <span class="o">{}</span> <span class="se">\;</span>
</code></pre></div></div>
<p>Remplacer <strong>gpx.studio</strong> par <strong>gpx.rnmkcy.eu</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find /sharenfs/rnmkcy/gpx.studio/website/src/ <span class="nt">-name</span> <span class="s2">"*"</span> <span class="nt">-type</span> f <span class="nt">-exec</span> <span class="nb">sed</span> <span class="nt">-i</span> <span class="s2">"s#gpx.studio#gpx.rnmkcy.eu#g"</span> <span class="o">{}</span> <span class="se">\;</span>
</code></pre></div></div>
<p>Modifier Export.svelte</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> &lt;div style="display: none"
class="w-full flex flex-row items-center justify-center gap-4 border rounded-md p-2 bg-secondary"
&gt;
&lt;span&gt;⚠️&lt;/span&gt;
&lt;span class="max-w-[80%] text-sm"&gt;
{$_('menu.support_message')}
&lt;/span&gt;
&lt;Button class="bg-support grow" href="https://ko-fi.com/gpxstudio" target="_blank"&gt;
{$_('menu.support_button')}
&lt;span class="ml-2"&gt;🙏&lt;/span&gt;
&lt;/Button&gt;
&lt;/div&gt;
&lt;div class="w-full flex flex-row flex-wrap gap-2"&gt;
&lt;Button
variant="outline"
class="grow"
on:click={() =&gt; {
if ($exportState === ExportState.SELECTION) {
exportSelectedFiles(exclude);
} else if ($exportState === ExportState.ALL) {
exportAllFiles(exclude);
}
open = false;
$exportState = ExportState.NONE;
}}
&gt;
&lt;Download size="16" class="mr-1" /&gt;
{#if $fileObservers.size === 1 || ($exportState === ExportState.SELECTION &amp;&amp; $selection.size === 1)}
{$_('menu.download_file')}
{:else}
{$_('menu.download_files')}
{/if}
&lt;/Button&gt;
&lt;/div&gt;
</code></pre></div></div>
<p>Menu.svelte , supprimer button</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> &lt;Button
variant="ghost"
href="https://ko-fi.com/gpxstudio"
target="_blank"
class="cursor-default h-fit rounded-sm font-bold text-support hover:text-support px-3 py-0.5"
aria-label={$_('menu.donate')}
&gt;
&lt;HeartHandshake size="18" class="md:hidden" /&gt;
&lt;span class="hidden md:flex flex-row items-center"&gt;
{$_('menu.donate')}
&lt;Heart size="16" class="ml-1" fill="rgb(var(--support))" /&gt;
&lt;/span&gt;
&lt;/Button&gt;
</code></pre></div></div>
<p><strong>Utilisation avec BRouter</strong><br />
Il faut modifier ladresse de routing ligne 50 fichier <code class="language-plaintext highlighter-rouge">Routing.ts</code><br />
<code class="language-plaintext highlighter-rouge">let url = </code>https://routing.gpx.studio?lonlats=$…….`<br />
Remplacer “https://routing.gpx.studio” par “https://routeur.rnmkcy.eu”</p>
<p>Fichier: <code class="language-plaintext highlighter-rouge">/sharenfs/rnmkcy/gpx.studio/website/src/lib/components/toolbar/tools/routing/Routing.ts</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># fichier /sharenfs/rnmkcy/gpx.studio/website/src/lib/components/toolbar/tools/routing/Routing.ts
# ligne 11
export const brouterProfiles: { [key: string]: string } = {
bike: 'trekking',
racing_bike: 'fastbike',
foot: 'hiking-beta',
water: 'river',
railway: 'rail'
};
#ligne 47
let url = `https://routeur.rnmkcy.eu?lonlats=${points.map(point =&gt; `${point.lon.toFixed(8)},${point.lat.toFixed(8)}`).join('|')}&amp;profile=${brouterProfile + (privateRoads ? '-private' : '')}&amp;format=geojson&amp;alternativeidx=0`;
# On supprime '-private'
let url = `https://routeur.rnmkcy.eu?lonlats=${points.map(point =&gt; `${point.lon.toFixed(8)},${point.lat.toFixed(8)}`).join('|')}&amp;profile=${brouterProfile + (privateRoads ? '' : '')}&amp;format=geojson&amp;alternativeidx=0`;
</code></pre></div></div>
<p><strong>Construire le site</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /sharenfs/rnmkcy/gpx.studio/website
<span class="nb">echo</span> <span class="s2">"PUBLIC_MAPBOX_TOKEN={YOUR_MAPBOX_TOKEN}"</span> <span class="o">&gt;&gt;</span> .env
npm <span class="nb">install
export </span><span class="nv">NODE_OPTIONS</span><span class="o">=</span><span class="nt">--max-old-space-size</span><span class="o">=</span>4096
npm run build
</code></pre></div></div>
<p>En cas derreur du type:<br />
<code class="language-plaintext highlighter-rouge">FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory</code><br />
Solution : <code class="language-plaintext highlighter-rouge">export NODE_OPTIONS=--max-old-space-size=4096</code><br />
<a href="https://geekflare.com/fix-javascript-heap-out-of-memory-error/">Solved: How to Fix “JavaScript Heap Out of Memory Error” </a></p>
<h3 id="gpxrnmkcyeu">gpx.rnmkcy.eu</h3>
<p>Après la construction on copie le dossier <code class="language-plaintext highlighter-rouge">build</code> sous <code class="language-plaintext highlighter-rouge">/var/www/gpx</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo cp</span> <span class="nt">-r</span> /sharenfs/rnmkcy/gpx.studio/website/build /var/www/gpx.studio
<span class="c"># les droits</span>
<span class="nb">sudo chown </span>www-data:www-data <span class="nt">-R</span> /var/www/gpx.studio
</code></pre></div></div>
<p>Le site est accessible dans le dossier <code class="language-plaintext highlighter-rouge">/sharenfs/rnmkcy/gpx.studio/website/build/</code><br />
Configuration nginx <code class="language-plaintext highlighter-rouge">/etc/nginx/conf.d/gpx.rnmkcy.eu.conf</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name gpx.rnmkcy.eu;
include /etc/nginx/conf.d/security.conf.inc;
root /var/www/gpx.studio/;
location / {
index index.html;
}
}
</code></pre></div></div>
<p>Vérifier et recharger nginx</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nginx -t
sudo systemctl reload nginx
</code></pre></div></div>
<p>Accès par le lien <a href="https://gpx.rnmkcy.eu">https://gpx.rnmkcy.eu</a><br />
<img src="/images/gpx.studio01a.png" alt="" /></p>
<h3 id="reconstruction">Reconstruction</h3>
<p>Après modification des sources, exécution du script <code class="language-plaintext highlighter-rouge">rebuild</code></p>
<p>Création script <code class="language-plaintext highlighter-rouge">/usr/local/bin/rebuild</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /usr/local/bin/rebuild
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nb">echo</span> <span class="s2">"Départ exécution script"</span>
<span class="c"># Construction</span>
<span class="nb">cd</span> /sharenfs/rnmkcy/gpx.studio/website
<span class="nb">rm</span> <span class="nt">-r</span> build/ <span class="c"># si existant</span>
<span class="nb">export </span><span class="nv">NODE_OPTIONS</span><span class="o">=</span><span class="nt">--max-old-space-size</span><span class="o">=</span>4096
npm run build
<span class="c"># Mise à jour site nginx</span>
<span class="nb">sudo rm</span> <span class="nt">-r</span> /var/www/gpx.studio
<span class="nb">sudo cp</span> <span class="nt">-r</span> /sharenfs/rnmkcy/gpx.studio/website/build /var/www/gpx.studio
<span class="nb">sudo chown </span>www-data:www-data <span class="nt">-R</span> /var/www/gpx.studio
<span class="c"># Recharger nginx</span>
<span class="nb">sudo </span>systemctl reload nginx
<span class="nb">echo</span> <span class="s2">"Fin exécution script"</span>
</code></pre></div></div>
<p>Droits en exécution</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo chmod +x /usr/local/bin/rebuild
</code></pre></div></div>
<h2 id="crédits">Crédits</h2>
<p>Ce projet utilise les projets open source suivants:</p>
<ul>
<li>Développement :
<ul>
<li><a href="https://github.com/sveltejs/svelte">Svelte</a> and <a href="https://github.com/sveltejs/kit">SvelteKit</a> — seamless development experience</li>
<li><a href="https://github.com/pngwn/MDsveX">MDsveX</a> — permettant une documentation basée sur Markdown</li>
<li><a href="https://github.com/kaisermann/svelte-i18n">svelte-i18n</a> - localisation facile</li>
</ul>
</li>
<li>Design:
<ul>
<li><a href="https://github.com/huntabyte/shadcn-svelte">shadcn-svelte</a> — beaux composants</li>
<li><a href="https://github.com/lucide-icons/lucide/tree/main/packages/lucide-svelte">lucide-svelte</a> — belles icônes</li>
<li><a href="https://github.com/tailwindlabs/tailwindcss">tailwindcss</a> - un style facile</li>
<li><a href="https://github.com/chartjs/Chart.js">Chart.js</a> — graphiques magnifiques et rapides</li>
</ul>
</li>
<li>Logique :
<ul>
<li><a href="https://github.com/immerjs/immer">immer</a> — gestion complexe de l ' État</li>
<li><a href="https://github.com/dexie/Dexie.js">Dexie.js</a> — IndexedDB wrapper</li>
<li><a href="https://github.com/NaturalIntelligence/fast-xml-parser">fast-xml-parser</a> — Fast GPX file parsing</li>
<li><a href="https://github.com/SortableJS/Sortable">SortableJS</a> — créant un arbre de fichiers triable</li>
</ul>
</li>
<li>Mapping:
<ul>
<li><a href="https://github.com/mapbox/mapbox-gl-js">Mapbox GL JS</a> — cartes interactives magnifiques et rapides</li>
<li><a href="https://github.com/abrensch/brouter">brouter</a> — Moteur de routage</li>
<li><a href="https://www.openstreetmap.org">OpenStreetMap</a> — map data used by Mapbox and brouter</li>
</ul>
</li>
<li>Recherche :
<ul>
<li><a href="https://github.com/algolia/docsearch">DocSearch</a> — moteur de recherche de la documentation</li>
</ul>
</li>
</ul>
<h2 id="annexe">Annexe</h2>
<h3 id="gpxstudio-mode-dev">gpx.studio mode dev</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm run dev
</code></pre></div></div>
<p>Le serveur est accessible sur le lien <a href="http://localhost:5173/">http://localhost:5173/</a>, q pour sortir</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt; website@0.0.1 dev
&gt; vite dev
Forced re-optimization of dependencies
VITE v5.4.8 ready in 1305 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h + enter to show help
Browserslist: caniuse-lite is outdated. Please run:
npx update-browserslist-db@latest
Why you should do it regularly: https://github.com/browserslist/update-db#readme
</code></pre></div></div>
<p>Lexécution a lieu sur un serveur, utilisation de SSH tunneling, sur un poste ayant un accès SSH, ouvrir un terminal et exécuter la commande suivante</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh <span class="nt">-L</span> 9500:localhost:5173 leno@192.168.0.215 <span class="nt">-p</span> 55215 <span class="nt">-i</span> /home/yann/.ssh/lenovo-ed25519
</code></pre></div></div>
<p>Puis ouvrir le lien suivant dans un navigateur : localhost:9500</p>]]></content><author><name></name></author><category term="cartographie" /><summary type="html"><![CDATA[Tracer des itinéaires à laide du moteur de routage BRouter. Visualiser, éditer et créer des traces gpx avec un fork de lapplication web https://gpx.studio]]></summary></entry><entry><title type="html">Visualisation et édition des traces gpx (gpxstudio.github.io)</title><link href="https://static.rnmkcy.eu/2024/09/30/Visualisation_et_edition_des_traces_gpx.html" rel="alternate" type="text/html" title="Visualisation et édition des traces gpx (gpxstudio.github.io)" /><published>2024-09-30T00:00:00+02:00</published><updated>2024-09-30T00:00:00+02:00</updated><id>https://static.rnmkcy.eu/2024/09/30/Visualisation_et_edition_des_traces_gpx</id><content type="html" xml:base="https://static.rnmkcy.eu/2024/09/30/Visualisation_et_edition_des_traces_gpx.html"><![CDATA[<p><em>Affichez, éditez et créez des fichiers GPX en ligne avec des outils avancés de planification et de traitement de fichiers, de magnifiques cartes et des visualisations de données détaillées</em></p>
<h2 id="gpxrnmkcyeu">gpx.rnmkcy.eu</h2>
<p><img src="/images/gpxstudio-logo.png" alt="" width="300" /><br />
<a href="https://github.com/gpxstudio">https://github.com/gpxstudio</a></p>
<p>Création dossier</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir -p /sharenfs/rnmkcy/
sudo chown $USER:$USER -R /sharenfs/rnmkcy
</code></pre></div></div>
<p>Aller dans le dossier</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd /sharenfs/rnmkcy/
</code></pre></div></div>
<h3 id="cloner-gpxstudiogithubio">Cloner gpxstudio.github.io</h3>
<p>Dépôt source</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/gpxstudio/gpxstudio.github.io.git
</code></pre></div></div>
<p>Modifier la clé API <strong>mapbox</strong> ainsi que <strong>routing_url</strong> dans le fichier <code class="language-plaintext highlighter-rouge">/sharenfs/rnmkcy/gpxstudio.github.io/res/config.json</code></p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"mapbox"</span><span class="p">:</span><span class="w"> </span><span class="s2">"pk.cG1yZTNwcnJ3MzkifQ.YZnNs9sZDBjcjkzZXJ4bHZ1GlvIiwiYSI6ImNrdTowYkn-xmoUszyIOIDYw"</span><span class="p">,</span><span class="w">
</span><span class="nl">"mapbox_dev"</span><span class="p">:</span><span class="w"> </span><span class="s2">"pk.eyJ1IjoiZ3B4c3R1ZGlvIiwiYSI6ImNrdHVoM2pjNTBodmUycG1yZTNwcnJ3MzkifQ.YZnNs9s9oCQPzoXAWs_SLg"</span><span class="p">,</span><span class="w">
</span><span class="nl">"routing_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://routeur.rnmkcy.eu"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Le fichier index.html</p>
<p>Le fichier layers</p>
<p>/sharenfs/rnmkcy/gpxstudio.github.io/js/layers.js<br />
/sharenfs/rnmkcy/gpxstudio.github.io/js/buttons.js</p>
<h3 id="configuration-nginx">Configuration nginx</h3>
<p>Configuration nginx site <a href="https://gpx.rnmkcy.eu">https://gpx.rnmkcy.eu</a></p>
<div class="language-nginx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">server</span> <span class="p">{</span>
<span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
<span class="kn">listen</span> <span class="s">[::]:443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
<span class="kn">server_name</span> <span class="s">gpx.rnmkcy.eu</span><span class="p">;</span>
<span class="kn">include</span> <span class="n">/etc/nginx/conf.d/security.conf.inc</span><span class="p">;</span>
<span class="kn">root</span> <span class="n">/sharenfs/rnmkcy/gpxstudio.github.io/</span><span class="p">;</span>
<span class="kn">location</span> <span class="n">/</span> <span class="p">{</span>
<span class="kn">index</span> <span class="s">index.html</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Recharger</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl reload nginx
</code></pre></div></div>
<p><img src="/images/gpxstudio001.png" alt="" width="600" /><br />
<a href="https://gpx.exemple.fr/l/fr/">https://gpx.exemple.fr/l/fr/</a></p>
<h3 id="afficher-les-autres-cartes">Afficher les autres cartes</h3>
<p>Pour afficher les autres cartes<br />
<img src="/images/gpxstudio002.png" alt="" /></p>
<h3 id="brouter-web">brouter-web</h3>
<p><a href="https://github.com/nrenner/brouter-web">https://github.com/nrenner/brouter-web</a></p>
<p><em>Comme alternative à la <a href="https://brouter.de/brouter-web/">version en ligne</a>, le serveur autonome de BRouter peut également être exécuté sur votre bureau local.</em></p>
<p><strong>Prérequis:</strong><br />
Installer java</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install default-jre
</code></pre></div></div>
<p>Version : <code class="language-plaintext highlighter-rouge">java --version</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openjdk 17.0.12 2024-07-16
OpenJDK Runtime Environment (build 17.0.12+7-Debian-2deb12u1)
OpenJDK 64-Bit Server VM (build 17.0.12+7-Debian-2deb12u1, mixed mode, sharing)
</code></pre></div></div>
<p><strong>Dossier</strong><br />
Créer le dossier <code class="language-plaintext highlighter-rouge">brouter</code> dans <code class="language-plaintext highlighter-rouge">/sharenfs/rnmkcy/gpxstudio.github.io/</code></p>
<p><strong>Procédure</strong></p>
<ol>
<li>
<p>téléchargez et décompressez la dernière archive autonome (<code class="language-plaintext highlighter-rouge">brouter-web-standalone.&lt;version&gt;.zip</code>) à partir de https://github.com/nrenner/brouter-web/releases, par exemple pour Linux (remplacez <code class="language-plaintext highlighter-rouge">~/opt/</code> par votre répertoire dinstallation préféré et <code class="language-plaintext highlighter-rouge">0.11.0</code> par la dernière version) :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> mkdir -p /sharenfs/rnmkcy/gpxstudio.github.io/brouter
cd /sharenfs/rnmkcy/gpxstudio.github.io/brouter
wget https://github.com/nrenner/brouter-web/releases/download/0.11.0/brouter-web-standalone.0.11.0.zip
unzip brouter-web-standalone.0.11.0.zip
rm brouter-web-standalone.0.11.0.zip
</code></pre></div> </div>
</li>
<li>
<p>téléchargez un ou plusieurs fichiers de données rd5 depuis le <a href="https://brouter.de/brouter/segments4/">download directory</a> ou le <a href="https://umap.openstreetmap.de/de/map/brouter-rd5-grid_9438">grid map</a> dans le répertoire <code class="language-plaintext highlighter-rouge">segments4</code>.</p>
</li>
</ol>
<p><img src="/images/brouter01.png" alt="" /><br />
<a href="https://brouter.de/brouter/segments4/W5_N45.rd5">https://brouter.de/brouter/segments4/W5_N45.rd5</a></p>
<p>La structure</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/sharenfs/rnmkcy/gpxstudio.github.io/brouter
.
├── brouter.jar
├── brouter-web
├── brouter-web-standalone.0.11.0.zip
├── customprofiles
├── profile_developers_guide.txt
├── profiles2
├── run.sh
├── segments4
├── srv.sh
└── standalone
</code></pre></div></div>
<p>Les dossiers</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>leno@rnmkcy:/sharenfs/rnmkcy/gpxstudio.github.io/brouter$ ls
brouter.jar customprofiles run.sh standalone
brouter-web profile_developers_guide.txt segments4
profiles2 srv.sh
leno@rnmkcy:/sharenfs/rnmkcy/gpxstudio.github.io/brouter$ ls segments4/
W5_N45.rd5
leno@rnmkcy:/sharenfs/rnmkcy/gpxstudio.github.io/brouter$ ls profiles2/
car-eco.brf Hiking-Alpine-SAC6.brf shortest.brf
car-fast.brf Hiking-Alpine-SAC6-private.brf trekking.brf
car-vario.brf hiking-beta.brf trekking-ignore-cr.brf
dummy.brf lookups.dat trekking-noferries.brf
fastbike-asia-pacific.brf moped.brf trekking-nosteps.brf
fastbike.brf rail.brf trekking-steep.brf
fastbike-lowtraffic.brf river.brf vm-forum-liegerad-schnell.brf
fastbike-verylowtraffic.brf safety.brf vm-forum-velomobil-schnell.brf
</code></pre></div></div>
<h3 id="brouter-server">brouter-server</h3>
<p>Le bash <code class="language-plaintext highlighter-rouge">/sharenfs/rnmkcy/gpxstudio.github.io/brouter/srv.sh</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/sh</span>
<span class="nv">BINDADDRESS</span><span class="o">=</span><span class="s2">"localhost"</span>
<span class="c"># BRouter standalone server</span>
<span class="c"># java -cp brouter.jar btools.brouter.RouteServer &lt;segmentdir&gt; &lt;profile-map&gt; &lt;customprofiledir&gt; &lt;port&gt; &lt;maxthreads&gt; [bindaddress]</span>
<span class="c"># maxRunningTime is the request timeout in seconds, set to 0 to disable timeout</span>
<span class="nv">JAVA_OPTS</span><span class="o">=</span><span class="s2">"-Xmx128M -Xms128M -Xmn8M -DmaxRunningTime=300"</span>
<span class="c"># If paths are unset, first search in locations matching the directory structure</span>
<span class="c"># as found in the official BRouter zip archive</span>
<span class="nv">CLASSPATH</span><span class="o">=</span><span class="k">${</span><span class="nv">CLASSPATH</span><span class="k">:-</span><span class="s2">"/sharenfs/rnmkcy/gpxstudio.github.io/brouter/brouter.jar"</span><span class="k">}</span>
<span class="nv">SEGMENTSPATH</span><span class="o">=</span><span class="k">${</span><span class="nv">SEGMENTSPATH</span><span class="k">:-</span><span class="s2">"/sharenfs/rnmkcy/gpxstudio.github.io/brouter/segments4"</span><span class="k">}</span>
<span class="nv">PROFILESPATH</span><span class="o">=</span><span class="k">${</span><span class="nv">PROFILESPATH</span><span class="k">:-</span><span class="s2">"/sharenfs/rnmkcy/gpxstudio.github.io/brouter/profiles2"</span><span class="k">}</span>
<span class="nv">CUSTOMPROFILESPATH</span><span class="o">=</span><span class="k">${</span><span class="nv">CUSTOMPROFILESPATH</span><span class="k">:-</span><span class="s2">"/sharenfs/rnmkcy/gpxstudio.github.io/brouter/customprofiles"</span><span class="k">}</span>
java <span class="nv">$JAVA_OPTS</span> <span class="nt">-cp</span> <span class="nv">$CLASSPATH</span> btools.server.RouteServer <span class="s2">"</span><span class="nv">$SEGMENTSPATH</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$PROFILESPATH</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$CUSTOMPROFILESPATH</span><span class="s2">"</span> 17777 1 <span class="nv">$BINDADDRESS</span>
</code></pre></div></div>
<p>Créer un service brouter</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /etc/systemd/system/brouter.service
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Unit]
Description=brouter server
[Service]
Type=exec
User=leno
WorkingDirectory=/sharenfs/rnmkcy/gpxstudio.github.io/brouter
ExecStart=sh /sharenfs/rnmkcy/gpxstudio.github.io/brouter/srv.sh
[Install]
WantedBy=multi-user.target
</code></pre></div></div>
<p>Recharger , activer et lancer le service <strong>brouter</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl daemon-reload
<span class="nb">sudo </span>systemctl <span class="nb">enable </span>brouter <span class="nt">--now</span>
</code></pre></div></div>
<p>Serveur web <strong>brouter</strong> : <a href="https://routeur.rnmkcy.eu">https://routeur.rnmkcy.eu</a></p>
<div class="language-nginx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">server</span> <span class="p">{</span>
<span class="c1"># ipv4 listening port/protocol</span>
<span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
<span class="c1"># ipv6 listening port/protocol</span>
<span class="kn">listen</span> <span class="s">[::]:443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
<span class="kn">server_name</span> <span class="s">routeur.rnmkcy.eu</span><span class="p">;</span>
<span class="kn">include</span> <span class="n">/etc/nginx/conf.d/security.conf.inc</span><span class="p">;</span>
<span class="kn">location</span> <span class="n">/</span> <span class="p">{</span>
<span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:17777</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Vérifier et recharger nginx</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>nginx <span class="nt">-t</span>
<span class="nb">sudo </span>systemctl reload nginx
</code></pre></div></div>
<p>Le site <a href="https://gpx.rnmkcy.eu">https://gpx.rnmkcy.eu</a> est opérationnel</p>]]></content><author><name></name></author><category term="cartographie" /><summary type="html"><![CDATA[Affichez, éditez et créez des fichiers GPX en ligne avec des outils avancés de planification et de traitement de fichiers, de magnifiques cartes et des visualisations de données détaillées]]></summary></entry><entry><title type="html">VSCodium, éditeur de code source multiplateforme et multi langage</title><link href="https://static.rnmkcy.eu/2024/09/24/VSCodium.html" rel="alternate" type="text/html" title="VSCodium, éditeur de code source multiplateforme et multi langage" /><published>2024-09-24T00:00:00+02:00</published><updated>2024-09-24T00:00:00+02:00</updated><id>https://static.rnmkcy.eu/2024/09/24/VSCodium</id><content type="html" xml:base="https://static.rnmkcy.eu/2024/09/24/VSCodium.html"><![CDATA[<p><em>VSCodium, lalternative open source à Microsoft Visual Studio Code</em></p>
<h2 id="vscodium">VSCodium</h2>
<p><img src="/images/vscodium-logo.png" alt="" height="100" /></p>
<h3 id="prérequis">Prérequis</h3>
<p>Installation sur archlinux <code class="language-plaintext highlighter-rouge">yay -S vscodium-bin</code> pose problème de dépendances installées par une autre application.<br />
Installation de VSCodium se fera par <strong>flatpak</strong></p>
<p>Installer flatpak sur archlinux</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S flatpak
</code></pre></div></div>
<h3 id="installation-via-flatpak">Installation via flatpak</h3>
<p><a href="https://linuxcapable.com/install-vscodium-on-ubuntu-linux/">How to Install VSCodium on Ubuntu 24.04, 22.04, or 20.04</a></p>
<p><strong>Installer VSCodium via la commande Flatpak</strong><br />
Avec le dépôt Flathub, nous pouvons passer à linstallation de VSCodium. Cela implique la commande flatpak install. Pour démarrer le déploiement de VSCodium, utilisez la commande suivante :</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>flatpak <span class="nb">install </span>flathub com.vscodium.codium <span class="nt">-y</span>
</code></pre></div></div>
<p>Cette commande récupère VSCodium directement depuis Flathub et assure une installation optimale sur votre système.</p>
<h3 id="méthode-cli-pour-lancer-vscodium">Méthode CLI pour lancer VSCodium</h3>
<p>Pour ceux qui préfèrent une interaction rapide avec le terminal, utilisez la commande suivante pour lancer VSCodium</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>flatpak run com.vscodium.codium
</code></pre></div></div>
<p>Si vous voulez lancer <code class="language-plaintext highlighter-rouge">codium /path/to/file</code> du terminal hôte, ajoutez simplement ceci
dans le fichier bashrc</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">alias </span><span class="nv">codium</span><span class="o">=</span><span class="s2">"flatpak run com.vscodium.codium "</span>
</code></pre></div></div>
<h3 id="fichier-de-bureau-desktop">Fichier de bureau (.desktop)</h3>
<p>Créer un fichier bureau <code class="language-plaintext highlighter-rouge">~/.local/share/applications/com.vscodium.codium.desktop</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Desktop Entry]
Version=1.1
Type=Application
Name=VSCodium
GenericName=Editeur de code source multiplateforme et multi langage
Comment=Gestionnaire de bases de données universel et Client SQL.
Icon=vscodium
Exec=/usr/bin/flatpak run com.vscodium.codium
Categories=Development;IDE;
</code></pre></div></div>
<h3 id="mise-à-jour-vscodium">Mise à jour VSCodium</h3>
<p>Pour maintenir VSCodium à jour, vous devez régulièrement vérifier la présence de mises à jour. Linux rend ce processus relativement simple.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>flatpak update
</code></pre></div></div>
<p>Les commandes ci-dessus vérifieront en bloc les mises à jour de VSCodium et de tous les paquets installés à laide du gestionnaire de paquets de votre choix.</p>
<h3 id="supprimer-vscodium">Supprimer VSCodium</h3>
<p>Pour les installations Flatpak de VSCodium, exécutez la commande suivante pour supprimer le logiciel :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>flatpak uninstall com.vscodium.codium
</code></pre></div></div>
<h2 id="utilisation">Utilisation</h2>
<h3 id="première-utilisation-de-vscodium">Première utilisation de VSCodium</h3>
<p>Pour mettre VSCodium en français</p>
<ol>
<li>Menu <code class="language-plaintext highlighter-rouge">View&gt;Command Palet</code> (ou <code class="language-plaintext highlighter-rouge">Ctrl+Maj+P</code>).</li>
<li>Saisir <code class="language-plaintext highlighter-rouge">Configure Display Language</code> dans la zone de recherche qui sest ouverte, puis valider.</li>
<li>Choisir <code class="language-plaintext highlighter-rouge">français</code> puis Cliquez sur le bouton <code class="language-plaintext highlighter-rouge">Restart</code> qui est alors proposé.</li>
</ol>
<p><img src="/images/vscodium00.png" alt="" /><br />
<img src="/images/vscodium00a.png" alt="" /><br />
<img src="/images/vscodium00b.png" alt="" /><br />
<img src="/images/vscodium00c.png" alt="" /></p>
<h3 id="python">Python</h3>
<p>A gauche, dans la rubrique “Extension” (ou Ctrl+Maj+X), installer lextension Python (de léditeur ms-python avec comme descriptif : IntelliSense (Pylance), Linting, Debugging (multi-threaded, remote), code formatting, …)<br />
<img src="/images/vscodium01.png" alt="" /></p>
<p>Aller dans le menu <code class="language-plaintext highlighter-rouge">Affichage&gt;Palette de commandes...</code> (ou Ctrl+Maj+P).</p>
<p>Saisir <code class="language-plaintext highlighter-rouge">Python: Select Interpreter</code> dans la zone de recherche qui sest ouverte, puis valider.<br />
<img src="/images/vscodium02.png" alt="" /></p>
<p>Choisir à présent linterpréteur (ex : Python 3.11)
<img src="/images/vscodium03.png" alt="" /></p>
<p>Menu <code class="language-plaintext highlighter-rouge">Fichier&gt;Nouveau fichier...</code>, saisir main.py puis appuyer sur la touche Entrée.<br />
Choisir toujours le même dossier, par exemple : <code class="language-plaintext highlighter-rouge">~/media/devel/vscodium/</code> puis valider.</p>
<p>Saisir le code source dun premier programme simple, comme :<br />
<code class="language-plaintext highlighter-rouge">print("Bonjour !")</code><br />
puis cliquer sur le bouton dexécution (de forme triangulaire : Run Python File) en haut à droite.<br />
<img src="/images/vscodium04.png" alt="" /><br />
Cela devrait afficher en bas de lécran le Terminal, avec le texte “Bonjour !”.<br />
<img src="/images/vscodium05.png" alt="" /></p>
<h3 id="markdown">Markdown</h3>
<p><a href="https://humanize.me/nerd/vscode-vscodium.html">Astuces pour VSCodium</a></p>
<p><strong>Changer la couleur des titres Markdown</strong></p>
<p>Quand on commence à créer des fichiers Markdown à la pelle, on a un peu tendance à voir ses yeux couler sur son clavier, notamment à cause des titres de niveau 1, de niveau 2, de niveau 3, etc., qui, par défaut, ont tous la même couleur ! Faut-il installer une extension pour changer ça ? Non !</p>
<p>Ouvrir les préférences (raccourci <code class="language-plaintext highlighter-rouge">Ctrl + ,</code> <br />
<img src="/images/vscodium06.png" alt="" /></p>
<p>Dans la barre de recherche, cherche <code class="language-plaintext highlighter-rouge">editor.tokenColorCustomizations</code><br />
Clic sur “Modifier dans settings.json”<br />
Là, VSCode tas prérempli le paramètre :<br />
<img src="/images/vscodium07.png" alt="" /></p>
<p>Tu peux alors remplacer ces 5 lignes par cette nouvelle configuration, qui va appliquer des couleurs sur tes titres Markdown de niveaux 2, 3 et 4 :</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"editor.tokenColorCustomizations"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"textMateRules"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"heading.2.markdown entity.name.section.markdown, heading.2.markdown punctuation.definition.heading.markdown"</span><span class="p">,</span><span class="w">
</span><span class="nl">"settings"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"foreground"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#FF6B6B"</span><span class="p">,</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"heading.3.markdown entity.name.section.markdown, heading.3.markdown punctuation.definition.heading.markdown"</span><span class="p">,</span><span class="w">
</span><span class="nl">"settings"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"foreground"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#FABE28"</span><span class="p">,</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"heading.4.markdown entity.name.section.markdown, heading.4.markdown punctuation.definition.heading.markdown"</span><span class="p">,</span><span class="w">
</span><span class="nl">"settings"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"foreground"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#4ECDC4"</span><span class="p">,</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Sauvegarder<br />
<img src="/images/vscodium08.png" alt="" /></p>
<p>Résultat<br />
<img src="/images/vscodium09.png" alt="" /></p>]]></content><author><name></name></author><category term="application" /><summary type="html"><![CDATA[VSCodium, lalternative open source à Microsoft Visual Studio Code]]></summary></entry><entry><title type="html">Serveur vpn wireguard</title><link href="https://static.rnmkcy.eu/2024/09/15/Ubound_Wireguard_Wg-Web.html" rel="alternate" type="text/html" title="Serveur vpn wireguard" /><published>2024-09-15T00:00:00+02:00</published><updated>2024-09-15T00:00:00+02:00</updated><id>https://static.rnmkcy.eu/2024/09/15/Ubound_Wireguard_Wg-Web</id><content type="html" xml:base="https://static.rnmkcy.eu/2024/09/15/Ubound_Wireguard_Wg-Web.html"><![CDATA[<p><em>WireGuard est un serveur VPN à code source ouvert, gratuit, moderne et rapide, doté dun chiffrement de pointe. Il est plus rapide et plus simple que lIPSec et lOpenVPN. Il est associé à Unbound qui améliore le DNS et à un parefeu UFW pour la sécurité.</em></p>
<h2 id="unbound">Unbound</h2>
<p><img src="/images/unbound-250.png" alt="" width="100" /></p>
<p><em>Un problème majeur avec beaucoup de configurations VPN/Wireguard est que le DNS nest pas suffisant. Cela finit par une fuite de connexion client et de détails demplacement (test via le site <a href="http://ipleak.net/">http://ipleak.net/</a></em></p>
<p class="info">Pour linstallation complète <strong>Unbound</strong> qui ajoute la mise à jour des serveurs “racine”, le blocage des publicités et des DMP (Data Management Platforms), voir lien <a href="/2018/04/27/unbound-resolveur-DNS.html">Résolveur DNS Unbound</a></p>
<p>Nous allons sécuriser le trafic DNS avec la solution <strong>unbound</strong> qui offre les caractéristiques suivantes</p>
<ul>
<li>Léger et rapide</li>
<li>Facile à installer et à configurer</li>
<li>Orienté sécurité</li>
<li>Prise en charge DNSSEC</li>
</ul>
<p>Nous allons le configurer de manière à contrer les fuites DNS, les attaques plus sophistiquées comme la fausse configuration de proxy, les routeurs escrocs et toutes sortes dattaques MITM sur HTTPS et autres protocoles.</p>
<p>Nous installons unbound sur le serveur</p>
<p>ATTENTION : Le programme <strong>resolvconf</strong> est en général seulement nécessaire quand un système a plusieurs programmes qui ont besoin de modifier de façon dynamique les informations sur les serveurs de noms de domaine. Sur un système simple où les serveurs de noms de domaine ne changent pas souvent ou bien ne sont modifiés que par un programme, le <u>fichier de configuration **resolv.conf** est suffisant</u>.<br />
Il faut installer <strong>resolvconf</strong>, sinon on a une erreur <strong>unbound-resolvconf</strong><br />
Une fois le paquet « <strong>resolvconf</strong> » installé, <u>il ne faut plus modifier le fichier</u> « <strong>/etc/resolv.conf</strong> », car le contenu de celui-ci sera automatiquement géré et remplacé par <strong>resolvconf</strong></p>
<p>Installation des outils dns, des paquets Unbound et resolv :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install unbound resolvconf -y
</code></pre></div></div>
<p>Ajout dun fichier de configuration <strong>unbound-wg.conf</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /etc/unbound/unbound.conf.d/unbound-wg.conf
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>server:
# ne rien enregistrer dans les journaux hormis les erreurs
verbosity: 0
# n'écouter que sur l'interface locale en IPv4
# unbound nécessite d'être relancé si modifié
interface: 127.0.0.1
port: 53
# refuser tout le monde sauf les connexions locales (pas forcément
# nécessaire vu que le serveur n'écoute que sur la boucle locale en IPv4)
access-control: 0.0.0.0/0 refuse
access-control: 127.0.0.1/32 allow
# par défaut, unbound ne log pas les requêtes ni les réponses
# on peut le rappeler au cas où
log-queries: no
log-replies: no
# imposer la QNAME minimisation (RFC 7816)
# Pour mieux protéger la vie privée
qname-minimisation: yes
# même si le serveur faisant autorité ne le veut pas
# après discussion, il est possible que cette option ne soit
# pas recommandée dans le cadre d'un résolveur ouvert
qname-minimisation-strict: yes
</code></pre></div></div>
<p>Vérifier la validité du fichier de configuration avec la commande
suivante :</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>unbound-checkconf /etc/unbound/unbound.conf.d/unbound-wg.conf
</code></pre></div></div>
<p><em>unbound-checkconf: no errors in /etc/unbound/unbound.conf.d/unbound-wg.conf</em></p>
<p>Toutes les règles disponibles sont détaillées dans le manuel <code class="language-plaintext highlighter-rouge">man 5 unbound.conf</code> ou <a href="https://nlnetlabs.nl/documentation/unbound/unbound.conf/">dans le manuel en ligne</a>.</p>
<p>Démarrer le résolveur.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl start unbound.service
</code></pre></div></div>
<p>Sassurer que tout fonctionne bien à laide de la commande
<code class="language-plaintext highlighter-rouge">dig</code> disponible dans le paquet <code class="language-plaintext highlighter-rouge">bind9-dnsutils</code> ou <code class="language-plaintext highlighter-rouge">dnsutils</code>. Pour cela il
suffit de spécifier ladresse de notre résolveur, ici <code class="language-plaintext highlighter-rouge">127.0.0.1</code> ou <code class="language-plaintext highlighter-rouge">::1</code> et
deffectuer une requête DNS. Ici on demande à Unbound de récupérer
lenregistrement <code class="language-plaintext highlighter-rouge">AAAA</code> associé au nom de domaine <code class="language-plaintext highlighter-rouge">afnic.fr</code>.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dig @127.0.0.1 A afnic.fr
</code></pre></div></div>
<p>Résultat commande</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>; &lt;&lt;&gt;&gt; DiG 9.18.28-1~deb12u2-Debian &lt;&lt;&gt;&gt; @127.0.0.1 A afnic.fr
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 37353
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;afnic.fr. IN A
;; ANSWER SECTION:
afnic.fr. 600 IN A 51.178.83.21
;; Query time: 232 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Sun Sep 15 14:53:14 GMT 2024
;; MSG SIZE rcvd: 53
</code></pre></div></div>
<p>Une réponse est bien renvoyée. Le résolveur fonctionne.Vérifier que tout est opérationnel en IPv4, et en utilisant UDP et TCP.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ dig +notcp @127.0.0.1 A afnic.fr # connexion UDP en IPv4 au résolveur
$ dig +tcp @127.0.0.1 A afnic.fr # connexion TCP en IPv4 au résolveur
</code></pre></div></div>
<p class="info">À ce stade, un résolveur Unbound est configuré en local et écoute sur le port
<code class="language-plaintext highlighter-rouge">53</code>. Il peut donc être utilisé pour résoudre toutes les requêtes en provenance
de la machine.</p>
<h2 id="parefeu-ufw">Parefeu UFW</h2>
<p>Installation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install ufw
</code></pre></div></div>
<p>Ajout des règles pour ssh et wireguard</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>ufw allow 52255/udp <span class="c"># wireguard</span>
<span class="nb">sudo </span>ufw allow 55027/tcp <span class="c"># ssh</span>
<span class="nb">sudo </span>ufw allow DNS
</code></pre></div></div>
<p>Activation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo ufw enable
</code></pre></div></div>
<p>Status <code class="language-plaintext highlighter-rouge">sudo ufw status</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Status: active
To Action From
-- ------ ----
55027/tcp ALLOW Anywhere
52255/udp ALLOW Anywhere
DNS ALLOW Anywhere
55027/tcp (v6) ALLOW Anywhere (v6)
52255/udp (v6) ALLOW Anywhere (v6)
DNS (v6) ALLOW Anywhere (v6)
</code></pre></div></div>
<p><strong>Désactiver les règles IPv6 utilisant UFW sur Linux</strong><br />
Le désactivation des règles IPv6 dans UFW est relativement facile. Ouvrez simplement le fichier de configuration UFW <code class="language-plaintext highlighter-rouge">/etc/default/ufw</code> <br />
Remplacer <code class="language-plaintext highlighter-rouge">IPV6=yes</code> par <code class="language-plaintext highlighter-rouge">IPV6=no</code><br />
Recharger : <code class="language-plaintext highlighter-rouge">sudo ufw reload</code></p>
<h2 id="wireguard">Wireguard</h2>
<p><img src="/images/wireguard_icon.png" alt="wireguard" width="50" /><br />
<em>WireGuard est un serveur VPN à code source ouvert, gratuit, moderne et rapide, doté dun chiffrement de pointe. Il est plus rapide et plus simple que lIPSec et lOpenVPN</em></p>
<p>Wireguard est dans le noyau 5.6+</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install wireguard
</code></pre></div></div>
<h3 id="autorisations">Autorisations</h3>
<p>**Autoriser le serveur Wireguard à relayer les paquets **</p>
<p>Autoriser le serveur Wireguard à relayer les paquets venant de ces clients vers linternet et de traiter les paquets retours (modifier <strong>/etc/sysctl.conf</strong>)<br />
On passe en mode su : <code class="language-plaintext highlighter-rouge">sudo -s</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sed -i 's/^#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sed -i 's/^#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=1/' /etc/sysctl.conf
sysctl -p # prise en compte immédiate
</code></pre></div></div>
<p>Résultat</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
</code></pre></div></div>
<h3 id="générer-une-paire-de-clés">Générer une paire de clés</h3>
<p>On passe en mode su : <code class="language-plaintext highlighter-rouge">sudo -s</code></p>
<p>On se positionne dans le dossier <strong>/etc/wireguard/</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd /etc/wireguard
</code></pre></div></div>
<p>WireGuard repose sur une authentification par clé publique/privée (cryptographie asymétrique), vous devez donc créer ces clés avec les sous-commandes wg genkey et wg pubkey<br />
La création de la clé privée se fait avec wg genkey et la clé publique est générée en la canalisant dans wg pubkey</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>umask 077; wg genkey | tee wg0.key | wg pubkey &gt; wg0.pub
</code></pre></div></div>
<h3 id="configuration-wg0conf">Configuration wg0.conf</h3>
<p><strong>Fichier de configuration /etc/wireguard/wg0.conf</strong></p>
<p>Récupérer le nom de la carte réseau et ladresse IP, <code class="language-plaintext highlighter-rouge">ip a</code> :<br />
carte réseau <strong>ens3</strong><br />
adresse IP <strong>91.194.161.27</strong></p>
<p>La première étape consiste à choisir une plage IPV4 privée, <a href="https://www.fakeaddresstool.com/random-ipv4-private-generator/">Random IPV4 Private Address Generator</a>, qui sera utilisée par le serveur : <strong>10.30.55.0/8</strong></p>
<p>Pour une adresse IPV6 <a href="https://www.unique-local-ipv6.com">Local IPv6 Address Generator</a> : <strong>fd27:4ae2:2ed9::/64</strong></p>
<p class="info">Les adresses locales uniques (ULA) IPv6 sont utilisées de la même manière que les adresses locales IPv4, telles que 10.0.0.0/8. Les adresses privées IPv4 ont été définies par la RFC 1918, tandis que les ULA IPv6 ont été définies par la RFC 4193. Contrairement à leur équivalent IPv4, les adresses locales IPv6 ont une partie aléatoire de 40 bits, ce qui les rend uniques. Lobjectif des adresses locales IPv6 est que si vous connectez deux réseaux IPv6 privés ensemble - tels que deux sites privés connectés par VPN - il est très peu probable que vous rencontriez des conflits dadressage.</p>
<p>Le serveur aura ladresse IP suivante: 10.30.55.1 . Il est également nécessaire de choisir un port, qui sera exposé publiquement, pour que le serveur écoute.Le port de documentation standard est généralement 51820.</p>
<p>Créer le fichier <strong>/etc/wireguard/wg0.conf</strong> serveur wg0</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/wireguard/wg0.conf
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Interface]
Address = 10.30.55.1, fd27:4ae2:2ed9::1
ListenPort = 52255
PostUp = ufw route allow in on wg0 out on ens3
PostUp = iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE; ip6tables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on ens3
PreDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE; ip6tables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
# wg0_PRIVATE_KEY
PrivateKey = 5Z........................................mk=
DNS = 10.30.55.1, fd27:4ae2:2ed9::1
</code></pre></div></div>
<p><strong>Address</strong> , fixer ladresse IP privée du serveur à lintérieur du VPN.Les adresses du réseau VPN de 10.30.55.0 à 10.30.55.255 sont fixées par le masque <strong>/24</strong> et fd27:4ae2:2ed9::1 à fd27:4ae2:2ed9::ffff sont fixées par le masque <strong>/128</strong><br />
<strong>PostUp</strong> , pour la mise en place des règles iptables de translation dadresses à lactivation du VPN (autoriser le routage des paquets réseau venant des clients vers internet)<br />
<strong>PostDown</strong> , pour la suppression des règles iptables de translation dadresses à larrêt du VPN<br />
<strong>PrivateKey</strong> , clé privée du serveur (wg0.key)<br />
<strong>DNS =</strong> Pour utiliser un pair comme serveur DNS, définissez DNS = wireguard_internal_ip_address_of_peer dans la section [Interface]. Les domaines de recherche sont également définis avec loption DNS =. Séparez toutes les valeurs dans la liste par des virgules.
<strong>AllowedIPs =</strong> Pour acheminer tout le trafic du tunnel vers un pair spécifique, ajoutez litinéraire par défaut (0.0.0.0/0 pour IPv4 et ::/0 pour IPv6) à AllowedIPs. Par exemple, AllowedIPs = 0.0.0.0/0, ::/0. wg-quick se chargera automatiquement de configurer le routage correct et fwmark [5] pour que le réseau fonctionne toujours.</p>
<p>Modifier les droits des fichiers <strong>wg0.conf</strong> (lecture uniquement par “root”)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chmod 600 /etc/wireguard/wg0.conf
</code></pre></div></div>
<h3 id="activer-wireguard">Activer wireguard</h3>
<p>Pour une activation permanente de wireguard</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl enable wg-quick@wg0.service
</code></pre></div></div>
<h3 id="modifier-unbound">Modifier unbound</h3>
<p>Modifier le fichier de configuration <strong>unbound-wg.conf</strong> pout y ajouter ladresse IP privée 10.30.55.1</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /etc/unbound/unbound.conf.d/unbound-wg.conf
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>server:
# ne rien enregistrer dans les journaux hormis les erreurs
verbosity: 0
# n'écouter que sur l'interface locale en IPv4
# unbound nécessite d'être relancé si modifié
interface: 127.0.0.1
interface: 10.30.55.1
port: 53
# refuser tout le monde sauf les connexions locales (pas forcément
# nécessaire vu que le serveur n'écoute que sur la boucle locale en IPv4)
access-control: 0.0.0.0/0 refuse
access-control: 127.0.0.1/32 allow
access-control: 10.30.55.0/24 allow
# par défaut, unbound ne log pas les requêtes ni les réponses
# on peut le rappeler au cas où
log-queries: no
log-replies: no
# imposer la QNAME minimisation (RFC 7816)
# Pour mieux protéger la vie privée
qname-minimisation: yes
# même si le serveur faisant autorité ne le veut pas
# après discussion, il est possible que cette option ne soit
# pas recommandée dans le cadre d'un résolveur ouvert
qname-minimisation-strict: yes
</code></pre></div></div>
<p>Relancer unbound</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl restart unbound
</code></pre></div></div>
<h2 id="wireguard-wg-gen-web">Wireguard wg-gen-web</h2>
<p><em>Le but est dexécuter Wg Gen Web dans un espace et WireGuard sur le système hôte.<a href="https://github.com/vx3r/wg-gen-web">wg-gen-web (original)</a></em></p>
<h3 id="caractéristiques">Caractéristiques</h3>
<ul>
<li>Libre-service et basé sur le web</li>
<li>QR-Code pour une configuration pratique du client mobile</li>
<li>Support optionnel multi-utilisateurs derrière un proxy dauthentification</li>
<li>Prise en charge de lauthentification simple</li>
<li>Zéro dépendance externe - juste un binaire unique utilisant le module noyau wireguard</li>
<li>Déploiement de binaires et de conteneurs</li>
</ul>
<h3 id="prérequis">Prérequis</h3>
<p><strong>Installer go</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> ~
wget https://go.dev/dl/go1.23.1.linux-amd64.tar.gz
<span class="nb">sudo tar</span> <span class="nt">-C</span> /usr/local <span class="nt">-xzf</span> go1.23.1.linux-amd64.tar.gz
<span class="nb">echo</span> <span class="s2">"export PATH=</span><span class="nv">$PATH</span><span class="s2">:/usr/local/go/bin"</span> <span class="o">&gt;&gt;</span> ~/.bashrc
<span class="nb">source</span> ~/.bashrc
</code></pre></div></div>
<p>Version <code class="language-plaintext highlighter-rouge">go version</code> &gt; go version go1.23.1 linux/amd64</p>
<p><strong>Installer node</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://deb.nodesource.com/setup_20.x | <span class="nb">sudo </span>bash -
<span class="nb">sudo </span>apt-get <span class="nb">install</span> <span class="nt">-y</span> nodejs
</code></pre></div></div>
<p>Versions <code class="language-plaintext highlighter-rouge">node -v &amp;&amp; npm -v</code><br />
v20.17.0<br />
10.8.2</p>
<p>Vous devez avoir WireGuard installé sur la machine qui exécute <code class="language-plaintext highlighter-rouge">wg-ui</code></p>
<h3 id="application-web">Application web</h3>
<p>Création dossier application web</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir -p /opt/appwg
</code></pre></div></div>
<p>Construction du site</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> ~/wg-webui-fr/
go mod tidy
go build <span class="nt">-o</span> wg-ui main.go
<span class="nb">cd </span>ui
<span class="nb">export </span><span class="nv">NODE_OPTIONS</span><span class="o">=</span><span class="nt">--openssl-legacy-provider</span>
<span class="nb">export </span><span class="nv">VUE_APP_API_BASE_URL</span><span class="o">=</span>http://localhost:8080/api/v1.0
npm <span class="nb">install
</span>npm run build
<span class="nb">sudo mkdir</span> <span class="nt">-p</span> /opt/appwg/ui
<span class="nb">sudo cp</span> ../wg-ui /opt/appwg
<span class="nb">sudo cp</span> <span class="nt">-r</span> dist /opt/appwg/ui/
</code></pre></div></div>
<h3 id="environnement">Environnement</h3>
<p>lautorisation à 2 facteurs nest pas utilisée, le fichier <strong>/opt/appwg/.env</strong> se résume à remplir la zone correspondante SMTP de la messagerie et désactiver lautorisation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/opt/appwg/.env
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>SERVER=127.0.0.1
PORT=8090
# Gin framework release mode
#GIN_MODE=release
GIN_MODE=debug
WG_CONF_DIR=/etc/wireguard
WG_INTERFACE_NAME=wg0.conf
SMTP_HOST=127.0.0.1
SMTP_PORT=587
SMTP_USERNAME=""
SMTP_PASSWORD=""
SMTP_FROM="wg-web-ui@wg-web-ui.xyz"
</code></pre></div></div>
<blockquote>
<p>On modifie dans <strong>/opt/appwg/.env</strong> ,le paramètre WG_CONF_DIR=./wireguard → <code class="language-plaintext highlighter-rouge">WG_CONF_DIR=/etc/wireguard</code></p>
</blockquote>
<h3 id="créer-service-wgweb">Créer service wgweb</h3>
<p>Créer un service systemd <strong>wgweb</strong> qui lance le serveur avec journalisation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /etc/systemd/system/wgweb.service
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Unit]
Description=Wireguard web
After=network.target
[Service]
Type=simple
Restart=on-failure
RestartSec=10
WorkingDirectory=/opt/appwg
ExecStart=/opt/appwg/wg-ui
[Install]
WantedBy=multi-user.target
</code></pre></div></div>
<h3 id="créer-et-configurer-serverjson">Créer et configurer server.json</h3>
<p><strong>wireguard (wg0.conf et server.json)</strong></p>
<p>Modifier les fichiers existants pour être identique au paramétrage de wireguard <strong>wg0.conf</strong> situé sous <strong>/etc/wireguard</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/wireguard/server.json
</code></pre></div></div>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"address"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="s2">"10.30.55.1"</span><span class="p">,</span><span class="w">
</span><span class="s2">"fd27:4ae2:2ed9::1"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"listenPort"</span><span class="p">:</span><span class="w"> </span><span class="mi">51820</span><span class="p">,</span><span class="w">
</span><span class="nl">"mtu"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
</span><span class="nl">"privateKey"</span><span class="p">:</span><span class="w"> </span><span class="s2">"A----------------------------------------c="</span><span class="p">,</span><span class="w">
</span><span class="nl">"publicKey"</span><span class="p">:</span><span class="w"> </span><span class="s2">"v----------------------------------------c="</span><span class="p">,</span><span class="w">
</span><span class="nl">"endpoint"</span><span class="p">:</span><span class="w"> </span><span class="s2">"91.194.161.27:52255"</span><span class="p">,</span><span class="w">
</span><span class="nl">"persistentKeepalive"</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="p">,</span><span class="w">
</span><span class="nl">"dns"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="s2">"10.30.55.1"</span><span class="p">,</span><span class="w">
</span><span class="s2">"fd27:4ae2:2ed9::1"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"allowedips"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="s2">"0.0.0.0/0"</span><span class="p">,</span><span class="w">
</span><span class="s2">"::/0"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"preUp"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">
</span><span class="nl">"postUp"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ufw route allow in on wg0 out on ens3; iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE; ip6tables -t nat -A POSTROUTING -o ens3 -j MASQUERADE"</span><span class="p">,</span><span class="w">
</span><span class="nl">"preDown"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ufw route delete allow in on wg0 out on ens3; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE; ip6tables -t nat -D POSTROUTING -o ens3 -j MASQUERADE"</span><span class="p">,</span><span class="w">
</span><span class="nl">"postDown"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">
</span><span class="nl">"updatedBy"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Yann"</span><span class="p">,</span><span class="w">
</span><span class="nl">"created"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2024-09-15T18:00:50.589913433Z"</span><span class="p">,</span><span class="w">
</span><span class="nl">"updated"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2024-09-15T18:00:50.589913433Z"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Recharger <code class="language-plaintext highlighter-rouge">systemd</code> puis démarrer le service:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl daemon-reload
sudo systemctl start wgweb.service
sudo systemctl status wgweb.service
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>● wgweb.service - Wireguard web
[...]
sept. 15 16:57:25 icevps.xyz wg-ui[14292]: [GIN-debug] Listening and serving HTTP on 127.0.0.1:8090
</code></pre></div></div>
<h3 id="démarrer-service-wireguard">Démarrer service wireguard</h3>
<p>Lancer wireguard</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl start wg-quick@wg0.service
</code></pre></div></div>
<h3 id="accès-page-web-wireguard">Accès page Web Wireguard</h3>
<p>On utilise la redirection port SSH (<a href="https://www.it-connect.fr/chapitres/tunneling-ssh/">Tunneling SSH</a>)<br />
<img src="/images/tunneling.png" alt="" /></p>
<p>Vérification,ouvrir un terminal sur le client linux qui dispose des clés ssh et lancer la commande</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh -L 9500:localhost:8090 hallmar@91.194.161.27 -p 55027 -i /home/yann/.ssh/icevps_xyz
</code></pre></div></div>
<p>Ouvrir un navigateur sur le client et saisir <code class="language-plaintext highlighter-rouge">localhost:9500</code> pour afficher le gestionnaire web de wireguard</p>
<p><img src="/images/wg-cx11-01.png" alt="wg-cx11" />
Activer le service si tout fonctionne</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl enable wgweb.service
</code></pre></div></div>
<h3 id="reconstruire-wg-web">Reconstruire wg-web</h3>
<p>On peut recompiler lapplication wg-web suite à des modifications</p>
<p>Procédure de reconstruction <code class="language-plaintext highlighter-rouge">$HOME/reconstruire.sh</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> <span class="o">&gt;</span> <span class="nv">$HOME</span>/reconstruire.sh <span class="o">&lt;&lt;</span> <span class="no">EOF</span><span class="sh">
#!/bin/bash
echo "Arrêt wgweb.service"
sudo systemctl stop wgweb.service
echo "Sauvegarde"
sudo cp /opt/appwg/.env _.env
echo "Supprimer appwg"
sudo rm -r /opt/appwg
echo "Construire wg-ui main.go"
cd </span><span class="nv">$HOME</span><span class="sh">/wg-webui-fr/
go mod tidy
go build -o wg-ui main.go
cd ui
export NODE_OPTIONS=--openssl-legacy-provider
export VUE_APP_API_BASE_URL=http://localhost:8080/api/v1.0
npm install
npm run build
sudo mkdir -p /opt/appwg/ui
sudo cp ../wg-ui /opt/appwg
sudo cp -r dist /opt/appwg/ui/
echo "Restaurer environnement"
sudo cp </span><span class="nv">$HOME</span><span class="sh">/_.env /opt/appwg/.env
echo "Démarrer le service"
sudo systemctl start wgweb.service
echo "FIN reconstruction"
</span><span class="no">EOF
</span></code></pre></div></div>
<p>La rendre exécutable</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chmod +x $HOME/reconstruire.sh
</code></pre></div></div>]]></content><author><name></name></author><category term="vpn" /><category term="wireguard" /><summary type="html"><![CDATA[WireGuard est un serveur VPN à code source ouvert, gratuit, moderne et rapide, doté dun chiffrement de pointe. Il est plus rapide et plus simple que lIPSec et lOpenVPN. Il est associé à Unbound qui améliore le DNS et à un parefeu UFW pour la sécurité.]]></summary></entry><entry><title type="html">Mullvad 2024</title><link href="https://static.rnmkcy.eu/2024/09/14/Mullvad-2024.html" rel="alternate" type="text/html" title="Mullvad 2024" /><published>2024-09-14T00:00:00+02:00</published><updated>2024-09-14T00:00:00+02:00</updated><id>https://static.rnmkcy.eu/2024/09/14/Mullvad-2024</id><content type="html" xml:base="https://static.rnmkcy.eu/2024/09/14/Mullvad-2024.html"><![CDATA[<p><em><a href="https://www.mullvad.net/fr/">Mullvad VPN/Wireguard</a> : Débits excellents en filaire et 4G, Gère IPv6, Obfuscation et protection post-quantique avec WireGuard, Confidentialité irréprochable, Vraie interface graphique pour Linux</em></p>
<h2 id="mullvad">Mullvad</h2>
<p>Mullvad VPN ne propose pas dextension pour navigateur. À défaut, le fournisseur a développé son propre navigateur en collaboration avec Tor Project, <a href="https://mullvad.net/fr/browserhttps://mullvad.net/fr/browser">Mullvad Browser</a>, disponible sur lensemble des systèmes dexploitation desktop.</p>
<p>On peut installer Mullvad sur un routeur, ce qui leur permet de profiter de la protection VPN sur tous leurs équipements connectés au réseau, contre cinq appareils autorisés en temps normal. Des explications détaillées pour plusieurs modèles sont disponibles dans un guide dédié (en anglais).</p>
<h3 id="protection-des-données-et-vie-privée">Protection des données et vie privée</h3>
<p>Le code de Mullvad VPN est open source et disponible sur GitHub.<br />
Mullvad semble être lun des VPN les plus à cheval sur lanonymat de ses utilisateurs.</p>
<h3 id="chiffrement-protocole-et-dns">Chiffrement, protocole et DNS</h3>
<p>Mullvad VPN utilise les protocoles suivants :</p>
<ul>
<li>OpenVPN TCP/UDP (Windows, macOS, Linux)</li>
<li>WireGuard (tous les systèmes dexploitation desktop et mobiles pris en charge)</li>
</ul>
<p>Concernant WireGuard, Mullvad propose quelques réglages avancés</p>
<ul>
<li>permettant de sélectionner des ports préconfigurés ou personnalisés</li>
<li>obfusquer le trafic (dissimulation du trafic VPN dans du trafic HTTPS standard via UDP sur TCP)</li>
<li>activer une protection contre les attaques quantiques (échange supplémentaire de clés résistantes aux qbits)</li>
<li>activer la prise en charge IPv6 pour les appareils dépossédés dIPv4</li>
<li>forcer les connexions multihop (trafic routé par plusieurs serveurs VPN compatibles WireGuard pour brouiller les tentatives de pistage).</li>
</ul>
<p><em>Mullvad VPN dispose de ses propres serveurs DNS pour garantir un niveau de confidentialité élevé sur Internet. En les mettant à lépreuve avec dnsleaktest.com, nous navons pas repéré de fuites. Pour le chiffrement, ce VPN utilise le standard AES (Advanced Encryption Standard) 256.</em></p>
<h3 id="streaming-vidéo">Streaming vidéo</h3>
<p>Côté streaming, il y a du mieux avec la version 2024 de Mullvad, nous avons débloqué sans problèmes les catalogues US et UK des services de SVoD Netflix et BBC.<br />
En revanche, Amazon détecte toujours lutilisation du VPN. Si vous êtes abonné à Prime Video et souhaitez poursuivre vos séries à létranger, il faudra opter pour un fournisseur concurrent de Mullvad, comme Surfshark, NordVPN ou Proton VPN.</p>
<h3 id="torrentsp2p">Torrents/P2P</h3>
<p>Mullvad VPN ne propose pas de serveurs spécifiques pour le téléchargement de fichiers torrent, mais nous navons rencontré aucune difficulté pour télécharger une image ISO dune distribution Linux en mode P2P.</p>
<h3 id="options-avancées">Options avancées</h3>
<p>De prime abord, Mullvad VPN propose peu doptions avancées et le service lui-même est assez basique. Il est toutefois possible de retrouver quelques fonctionnalités classiques</p>
<ul>
<li>le kill switch qui coupe la connexion Internet en cas de panne du VPN pour ne pas compromettre vos données</li>
<li>le split tunneling qui permet dexclure le trafic de certaines applications du tunnel VPN.</li>
<li>dans les paramètres de connexion du VPN, on découvre aussi un mode de verrouillage, sorte de kill switch très strict qui bloque toute connexion entrante et sortante lorsque le VPN est volontairement désactivé</li>
<li>un mode multihop (compatible WireGuard uniquement, sans possibilité de sélectionner manuellement les serveurs entrants et sortants)</li>
<li>des options de dissimulation du trafic et de résistance aux attaques quantiques</li>
<li>Divers bloqueurs de contenu DNS font office de bloqueurs de pub, de traqueurs, de malwares et de contrôle parental.</li>
</ul>
<p><em>Mullvad fait partie des rares services capables de fonctionner en IPv6.</em></p>
<h3 id="conclusion">Conclusion</h3>
<p>Mullvad a connu de nettes améliorations.</p>
<ul>
<li>Toujours à la pointe en matière de débits (filaires et 4G, en France et à létranger), il surpasse de loin ses concurrents et simpose comme le service VPN le plus rapide.</li>
<li>On apprécie ses engagements forts pour la confidentialité et la sécurité des données privées qui, outre les protections VPN traditionnelles, bénéficient dun soin particulier apporté par la mise à disposition de fonctionnalités avancées, peut-être trop bien cachées.</li>
<li>Si lon devait lui trouver des défauts, on insisterait principalement sur son interface manquant de flexibilité et son organisation en sous-menus trop complexe.</li>
<li>Dans lensemble, Mullvad gagnerait à être davantage connu.</li>
</ul>
<h2 id="archlinux-mullvad">Archlinux Mullvad</h2>
<ul>
<li><a href="https://mullvad.net/en/help/using-mullvad-vpn-app">Using the Mullvad VPN app</a></li>
<li><a href="/htmldoc/Utilisation application VPN Mullvad.html">Utilisation application VPN Mullvad (traduction)</a></li>
</ul>
<p>Installation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S mullvad-vpn-bin
</code></pre></div></div>
<p>Si erreur gpg</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[yano@e6230 ~]$ gpg --keyserver hkps://keys.openpgp.org --recv-keys A1198702FC3E0A09A9AE5B75D5A1D4F266DE8DDF
gpg: clef D5A1D4F266DE8DDF : clef publique « Mullvad (code signing) &lt;admin@mullvad.net&gt; » importée
gpg: Quantité totale traitée : 1
gpg: importées : 1
</code></pre></div></div>
<h4 id="paramétrage">Paramétrage</h4>
<p><img src="/images/mullvad-vpn-bin01.png" alt="" width="150" /> <img src="/images/mullvad-vpn-bin02.png" alt="" width="150" /><br />
<img src="/images/mullvad-vpn-bin03.png" alt="" width="150" /> <img src="/images/mullvad-vpn-bin04.png" alt="" width="150" /></p>]]></content><author><name></name></author><category term="vps" /><category term="wireguard" /><summary type="html"><![CDATA[Mullvad VPN/Wireguard : Débits excellents en filaire et 4G, Gère IPv6, Obfuscation et protection post-quantique avec WireGuard, Confidentialité irréprochable, Vraie interface graphique pour Linux]]></summary></entry></feed>