My Own Memory Hole

Scanner Epson WF-2865 en WiFi sous Debian/Raspbian

Si l'imprimante de mon multifonction Epson WorkForce WF-2865 connecté en WiFi ne m'a guère posé problème, l'utilisation du scanner a été plus délicate...

On commence par installer sane :

sudo apt install sane sane-utils

On édite le fichier /etc/sane.d/dll.conf :

sudo nano /etc/sane.d/dll.conf

et on décommente la ligne du pilote epson2.

Pour l'étape suivante, on va avoir besoin de connaître l'adresse de notre imprimante au sein de notre réseau ; pour ce faire, on utilise l'utilitaire nmap qu'il convient d'installer :

sudo apt install nmap

On peut ensuite, pour effectuer un scan rapide, lancer la commande suivante :

sudo nmap -sn 192.168.1.0/24

et on obtient, entre autres :

[...]
Nmap scan report for 192.168.1.12
Host is up (-0.17s latency).
MAC Address: 38:9D:92:29:1C:FC (Seiko Epson)
[...]

Nous pouvons désormais éditer le ficier /etc/sane.d/epson2.conf :

sudo nano /etc/sane.d/epson2.conf

en modifiant la fin du fichier de la sorte :

#net autodiscovery
net 192.168.1.12

On se rend ensuite sur le site d'Epson pour récupérer le logiciel ImageScan ainsi que les pilotes pour notre architecture.

Par exemple :

wget https://download2.ebz.epson.net/imagescanv3/common/deb/arm/imagescan-bundle-common-3.65.0.arm.deb.tar.gz
tar xvzf imagescan-bundle-common-3.65.0.arm.deb.tar.gz
cd imagescan-bundle-common-3.65.0.arm.deb/
sudo ./install.sh

On ouvre ensuite le fichier /etc/imagescan/imagescan.conf :

sudo nano /etc/imagescan/imagescan.conf 

et on le modifie pour obtenir cela :

[devices]

myscanner.udi    = esci:networkscan://192.168.1.12:1865
myscanner.vendor = Epson
myscanner.model  = WF2865

Désormais vous devriez voir votre scanner dans Imagescan et sane (et tous les logiciels qui s'appuient sur lui tels xsane ou Gimp) devrait trouver votre périphérique sans soucis !

Mosquitto, un broker MQTT

J'ai découvert le protocole MQTT (Message Queuing Telemetry Transport) lors de l'interfaçage de ma station météo Netatmo et du logiciel WeeWX sur mon Raspberry Pi ; il s'agit d'un protocole de messagerie de type publication-abonnement, extrêmement rapide et léger, utilisé notamment dans l'internet des objets.

Nous allons ici voir comment installer et configurer un broker, un agent MQTT, en l'occurrence Mosquitto, en nous appuyant très largement sur l'article « How to setup your own MQTT Broker » de Pat O'Brien.

Installation et premiers tests

On commence par l'installer :

sudo apt install mosquitto mosquitto-clients

Nous pouvons dès lors « jouer » un peu...
On peut commencer par vérifier la version de notre agent ou le temps écoulé depuis son lancement :

mosquitto_sub -t \$SYS/broker/version
mosquitto_sub -t \$SYS/broker/uptime

Puis commencez par ouvrir deux sessions dans votre terminal (on ne saurait trop vous conseiller d'utiliser tmux, présenté dans cet article)–: dans la première, on lance la commande mosquitto_sub -t test/# puis dans la seconde on lance mosquitto_pub -t test/test -m "Test message"...

premiers pas avec mosquitto

Configuration, accès, SSL

Il convient de préciser d'emblée que Mosquitto est très regardant sur le formatage de ses fichiers de configuration et qu'il n'accepte pas d'espace en fin de ligne.

On commence par éditer un fichier /etc/mosquitto/conf.f/conf.d/myconfig.conf :

persistence false

# mqtt
listener 1883
protocol mqtt

# websockets
listener 9001
protocol websockets

On redémarre alors Mosquitto :

sudo service mosquitto restart

Gestion des accès

Mosquitto permet de gérer topic par topic les droits de publication et d'abonnement.

On commence par générer un couple identifiant / mot de passe, ainsi :

sudo mosquitto_passwd -c /etc/mosquitto/passwd USER

puis on édite un fichier /etc/mosquitto/acl

# Autoriser l'abonnement anonyme à $SYS
topic read $SYS/#

# Autoriser l'abonnement et la publication anonymes à test 
topic test/#

# Autoriser le seul abonnement anonyme à testlecture
topic read testlecture/#

# Accès limité pour l'écriture sur testlecture
# Abonnement et publication sur secret pour USER seulement
user USER
topic write testlecture
topic secret/#

on édite ensuite le fichier /etc/mosquitto/conf.d/myconfig.conf pour qu'il ressemble à cela :

persistence false
allow_anonymous true
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/acl

# mqtt
listener 1883
protocol mqtt

# websockets
listener 9001
protocol websockets

On redémarre le service avant de vérifier avec la commande netstat que les ports déclarés sont bien ouverts :

$ sudo service mosquitto restart
$ sudo netstat -tulpn | grep 1883
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      142015/mosquitto
tcp6       0      0 :::1883                 :::*                    LISTEN      142015/mosquitto
$ sudo netstat -tulpn | grep 9001
tcp6       0      0 :::9001                 :::*                    LISTEN      142015/mosquitto

Pour le canal test, accessible sans authentification ni pour l'abonnement ni pour la publication, on vérifie avec cette commande dans notre première session :

mosquitto_sub -h localhost -p 1883 -t test/#

et dans la seconde nous lançons :

mosquitto_pub -h localhost -p 1883 -t test/1 -m "Hello topic test/1"

Le canal testlecture ne devrait être accessible anonymement qu'en lecture :

mosquitto_sub -h localhost -p 1883 -t testlecture/#

La première des deux commandes suivantes ne devrait rien renvoyer dans notre première session ; il convient en effet de s'authentifier pour publier dans ce canal :

mosquitto_pub -t testlecture/test -m "test"
mosquitto_pub -u USER -P PASSWORD -t testlecture/test -m "test"

Enfin, le canal secret nécessite de s'authentifier aussi bien pour l'abonnement que pour la publication :

mosquitto_sub -u USER -P PASSWORD -t secret/#
mosquitto_pub -u USER -P PASSWORD -t secret/test -m "test"

Certificat SSL

Il est bien évidemment possible de rendre cet agent MQTT accessible sur Internet et de le configurer pour qu'il utilise une connexion sécurisée grâce à un certificat comme ceux proposés par Let's Encrypt. Nous allons considérer ici que vous avez déjà configuré votre nom de domaine et généré le certificat, comme évoqué ici.

Ainsi, dans mon cas, vous devriez pouvoir vous abonner au canal weather produit par WeeWX et son plugin weewx-mqtt avec la commande suivante :

mosquitto_sub -h meteo.momh.fr -p 8883 --capath /etc/ssl/certs/ -t weather/#

Il convient, après avoir généré son certificat, d'éditer le fichier /etc/mosquitto/conf.d/myconfig.conf de la sorte :

# Insecure mqtt to localhost only, and secure mqtt
listener 1883 localhost
listener 8883
certfile /etc/letsencrypt/live/DOMAINE/cert.pem
cafile /etc/letsencrypt/live/DOMAINE/chain.pem
keyfile /etc/letsencrypt/live/DOMAINE/privkey.pem
protocol mqtt

# websockets
listener 9001
certfile /etc/letsencrypt/live/DOMAINE/cert.pem
cafile /etc/letsencrypt/live/DOMAINE/chain.pem
keyfile /etc/letsencrypt/live/DOMAINE/privkey.pem
protocol websockets

Après avoir redémarré le service

sudo service mosquitto restart

on peut tester ainsi, avec pour chacune de nos deux sessions, les commandes :

mosquitto_sub -h DOMAINE -p 8883 --capath /etc/ssl/certs/ -u USER -P PASSWORD -t secret/#
mosquitto_pub -h DOMAINE -p 8883 -u USER -P PASSWORD -t secret/test -m "Test message dans le canal secret"

Nous pouvons désormais utiliser notre agent MQTT avec WeeWX !

Sublime Text via SSH

Sur le client, on commence par installer via le gestionnaire de paquet le plugin RemoteSubl.

Sur le serveur, il faut installer rmate :

sudo curl -o /usr/local/bin/rmate https://raw.githubusercontent.com/aurora/rmate/master/rmate
sudo chmod +x /usr/local/bin/rmate

Depuis le client, il faut ensuite ouvrir une connection SSH avec un routage de port :

ssh -R 52698:localhost:52698 user@example.com

puis de lancer la commande :

rmate file.txt

et ce fichier doit s'ouvrir dans Sublime Text.

Auto-hébergement, DynHost OVH et certificat Let's Encrypt sous Raspbian

Ayant « associé » ma station météo Netatmo à mon Raspberry Pi grâce à WeeWX (lire ce post), je souhaite désormais rendre accessible sur Internet le site web ainsi généré. Je considère ainsi que vous avez déjà un serveur Apache fonctionnel et configuré (même si nous aborderons la création d'un VirtualHost par la suite).

DynHost et mise à jour de l'IP

Étant chez OVH, je profite de leur service DynHOST qui « permet de faire pointer un sous-domaine vers une adresse IP dynamique qui sera mise à jour dans votre zone DNS à chaque changement de celle-ci. ».

On crée notre DynHost puis on en gère les accès, en créant un nouvel identifiant. Puis, sur notre Raspberry Pi, on installe ddclient :

sudo apt install ddclient

Lors de l'installation, des écrans successifs vont nous permettre de le configurer :

  1. Fournisseur de service de DNS dynamique : Autre
  2. Protocole de mise à jour du DNS dynamique : dyndns2
  3. Serveur de DNS dynamique : www.ovh.com
  4. Mandataire HTTP : néant
  5. Identifiant : l'identifiant saisi précédemment (comprenant le nom de domaine en préfixe)
  6. Mot de passe : le mot de passe correspondant
  7. Méthode de découverte d'adresse IP : Service de découverte d'IP basée sur le web
  8. Hôtes à mettre à jour : le DynHost créé précédemment

La configuration peut se faire sinon à la main, en éditant le fichier /etc/ddclient.conf qui doit ressembler à cela :

protocol=dyndns2
server=www.ovh.com
login=DOMAINE-USER
password='PASSWORD'
DYNHOST

Redirection des ports

Ensuite, il faut se rendre dans l'interface de gestion de votre Box Internet et configurer, dans la section NAT, la redirection des port 80 et 443 vers ceux de votre Raspberry Pi (pour en connaître l'IP sur votre réseau local, utilisez la commande hostname -I).

Désormais, en saisissant l'URL de votre DynHost, vous devriez accéder à la même page que lorsque vous accédez à l'adresse localhost.

Mise en place du HTTPS

Pour ce faire, nous allons générer un certificat Let's Encrypt pour notre DynHost.

On commence par copier, dans /etc/apache2/sites-available/, le fichier 000-default.conf vers DYNHOST.conf ; par exemple :

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/meteo.momh.fr.conf

puis par le configurer pour pointer vers notre répertoire /var/www/html/weewx ou autre répertoire en fonction du ou des skin(s) que vous utilisez. Par exemple, minimalement :

<VirtualHost *:80>
        ServerName meteo.momh.fr

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/weewx

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Pour générer le certificat, nous allons utiliser certbot, qu'il convient d'installer :

sudo apt install certbot python3-certbot-apache

puis d'activer le module ssl d'Apache :

sudo a2enmode ssl
sudo systemctl restart apache2

On peut alors générer notre certificat avec la commande suivante :

sudo certbot --apache -d DynHOST

Il vous est proposé de rediriger l'éventuel traffic HTTP vers HTTPS :

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Un certificat est alors généré et un nouvel hôte virtuel est configuré dans Apache, à l'emplacement /etc/apache2/sites-available/DYNHOST-le-ssl.conf. Si vous avez choisi l'option 2, le VirtualHost présenté ci-dessus se voit modifié avec les lignes suivantes :

RewriteEngine on
RewriteCond %{SERVER_NAME} =DYNHOST
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Pour voir que tout fonctionne, on peut utiliser l'outil de test proposé par ssllabs.com.

Sublime Text & Markdown

Packages

  • MarkdownEditing : prend pleinement en charge le langage Markdown, fournit un ensemble de commandes utiles à la rédaction via la Command Palette...
  • TableEditor : non spécifique au Markdown mais permet de faciliter la création de tableaux et d'en faciliter la lecture via un mécanisme d'alignement performant ;
  • MarkdownPreview : permet de générer des aperçus au format HTML des documents en Markdown, soit via la commande Preview in Browser soit via la commande Build appelable avec le raccourci Ctrl+b ;
  • MarkdownLivePreview : scinde une fenêtre de Sublime Text et fournit un aperçu en direct de ce qui est saisi. Sublime MarkdownLivePreview
  • Pandoc : ce plugin permet de générer, à partir d'un fichier Markdown (entre autres formats), des documents PDF, Word, HTML... Il nécessite cependant de bien avoir le paquet pandoc d'installé :
    sudo apt install pandoc

Snippets et raccourcis clavier

  • guillemets français en HTML :
    <snippet>
    <content><![CDATA[
    «&#8239;${1}&#8239;»$0
    ]]></content>
    <tabTrigger>og</tabTrigger>
    <scope>text.html.markdown,text.html</scope>
    </snippet>

    ou via le raccourci clavier Alt+" :

    { "keys": ["alt+\""], "command": "insert_snippet", "args": {"contents": "«&#8239;${1}&#8239;»$0"}, "context":
        [
            { "key": "selector", "operator": "equal", "operand": "text.html.markdown,text.html" }
        ]
    },
  • espace insécable en HTML avec le raccourci clavier Ctrl+Espace :
    { "keys": ["ctrl+space"], "command": "insert_snippet", "args": {"contents": "&nbsp;$0"}, "context":
        [
            { "key": "selector", "operator": "equal", "operand": "text.html.markdown,text.html" }
        ]
    },

Configuration

Voici le contenu du fichier ~/.config/sublime-text-3/Packages/User/Markdown.sublime-settings :

{
    "color_scheme": "Packages/Monokai++/themes/Monokai++.tmTheme",
    "line_numbers": true,
    "highlight_line": true,
    "enable_table_editor": true,
}

Sublime Text & LaTeX

Packages

Snippets et raccourcis clavier

  • guillemets français :
    <snippet>
    <content><![CDATA[
    \og ${1} \fg{}$0
    ]]></content>
    <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
    <tabTrigger>og</tabTrigger>
    <!-- Optional: Set a scope to limit where the snippet will trigger -->
    <scope>text.tex.latex</scope>
    </snippet>

    ou via le raccourci clavier Alt+" 

    { "keys": ["alt+\""], "command": "insert_snippet", "args": {"contents": "\\og ${1} \\fg{}$0"}, "context":
        [
            { "key": "selector", "operator": "equal", "operand": "text.tex.latex" }
        ]
    },