Planète auto-hébergement

2018-12-08

Upload de gros fichiers vidéos sur une instance Peertube

peertube.png Quand on lit la documentation où les issues « Github » de Peertube, Chocobozzz nous indique clairement qu'il fût un temps révolu où la taille maximale d'une vidéo accepté par Peertube était de 4Gio, mais que maintenant c'est bien 8Gio qu'il est possible d'envoyer.

  • Pour le vérifier, sous Yunohost il suffit d'aller voir le fichier de config nginx dédié :
cat /etc/nginx/conf.d/peertube.makotoworkshop.org.d/peertube.conf

Et de retrouver l'information spécifiée ici :

# Hard limit, PeerTube does not support videos > 8GB
    client_max_body_size 8G;
    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    send_timeout                600;
  • Et pourtant, j'ai voulu uploader une vidéo de 5,2Gio, et de recevoir l'erreur « 500 Internal Server Error », délivrée par nginx

peertubenginx.png

  • Comme il faut toujours penser à aller voir les logs, voici ce qu'indique ce dernier > /var/log/nginx/peertube.makotoworkshop.org-error.log
2018/12/08 11:54:07 [crit] 16767#16767: *330304 pwrite() "/var/lib/nginx/body/0000032486" failed (28: No space left on device),

Visiblement le fichier vidéo est uploadé depuis mon ordi de bureau sur le serveur, dans le dossier /var/lib/nginx/body/, et si on regarde l'espace libre sur le disque, on se rend compte effectivement que ça risque pas de marcher :

Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/sda1           11G    7,1G  3,5G  68% /


Pour vérifier, j'ai ré-uploadé la vidéo et tenté de regarder en même temps dans le dossier /var/lib/nginx/body/, mais rien n’apparaît.
Pour voir quelque chose, il faut observer le démon nginx, en répérant tout d'abord son pid.

  • Donc durant d'upload, faire un top et relever le pid nginx au sommet de la liste, par exemple :
PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
16767 www-data  20   0  345480   9472   4272 S   1,3  0,5  13:07.85 nginx
  • Taper ensuite :
lsof -p 16767 | grep /var/lib/nginx/body/

Qui renvoie l'état de l'upload :

nginx   16767 www-data   85u      REG                8,1 3180183973      4917 /var/lib/nginx/body/0000032604 (deleted)

Jusqu'au dernier morceau, puis plus rien, le fichier à disparu, et le message d'erreur à retenti.

lsof -p 16767 | grep /var/lib
nginx   16767 www-data   85u      REG                8,1 3655360512      4917 /var/lib/nginx/body/0000032604 (deleted)

On voit que la taille 3655360512 arrondis en Gio donne 3,4 Gio, ce qui correspond à l'espace libre de la partition indiqué plus haut.
C'est donc confirmé, le problème à bien pour solution l'attribution de suffisamment d'espace disque libre pour permettre à ce cache de pouvoir se faire normalement.

  • Pour cela on édite la configuration nginx :
nano /etc/nginx/conf.d/peertube.makotoworkshop.org.d/peertube.conf

Pour ajouter à la fin un dossier situé sur un disque contenant suffisamment d'espace, donc au moins 8Gio :

client_body_temp_path /home/yunohost.app/peertube/storage/uploads;

Et redémarrer les serveurs pour prendre en compte ce changement :

service peertube restart
service nginx restart


  • Pour confirmer, refaire la manipulation précédente, en regardant cette fois le nouveau chemin :
lsof -p 28744 | grep /home/yunohost.app/peertube/storage/uploads

Qui renvoie alors, une fois le fichier totalement uploadé :

nginx   28744 www-data   67u      REG                8,3 5219139353  25953028 /home/yunohost.app/peertube/storage/uploads/0000000004 (deleted)

On a bien les 5,2Gio.
Peertube passe donc de la phase « Upload 100% » à la phase « Processing…», et durant ce temps la vidéo reste présente dans le dossier temporaire.
Puis Peertube passe en phase d'encodage, et le fichier est alors supprimé du dossier, la commande lsof ne renvoie plus rien.


Ressources :
- https://github.com/Chocobozzz/PeerTube/issues/1359
- https://github.com/Chocobozzz/PeerTube/issues/1423

2018-12-02

Changer la date de publication d'une vidéo Peertube

J'ai récemment crée plusieurs chaînes Peertube sur mon serveur auto-hébergé (dans ma cuisine donc hein, pas un truc loué dans une salle machine).
Plusieurs afin de cloisonner un peu les sujets des vidéos publiées, à défaut de fonctionnalité « playlist » (disponible pour bientôt), bien que le raccourci « locales » présente tout par date décroissante.
Et autant en publiant au long court, comme un blog, les vidéos sont disponibles chronologiquement, autant lorsqu'on a déjà un stock de vidéos à mettre à disposition, il peut-être utile de pouvoir anti-dater les vidéos, et ce pour deux raisons :
- Je veux lister telle vidéo avant telle autre dans la liste des vidéos locales.
- Je veux simuler la publication des vidéos de l'époque, car Peertube n'existait pas encore.

J'ai donc gratté un peu, car une telle fonctionne n'existe pas, et conclu assez rapidement qu'il me faudrait éditer la base de donnée PostgreSQL de Peertube.
peertube.png

Prérequis :

  • On a besoin du nom de la base, du nom d'utilisateur et du mot de passe associé.

En fonction du type d'installation, vous n'aurez peut-être pas eu accès à ces infos. C'est le cas avec Yunohost qui m'a permis d'installer Peertube en un click !
Il faut donc consulter le fichier production.yaml pour y lire ces infos :

cat /var/www/peertube/config/production.yaml
# Your database name will be "peertube"+database.suffix
database:
  hostname: 'localhost'
  port: 5432
  suffix: '_peertube'
  username: 'peertube'
  password: 'xxxxxxxxxxx'

Le mot de passe est en clair, j'ai mis des xxxxx à la place.

Précautions :

  • Avant de faire quoique ce soit, il est sage de sauvegarder la base de donnée.

On peut le faire avec Yunohost par la fonctionnalité de backup > app, qui fait qu'on retrouve la base sous forme de fichier texte /apps/peertube/backup/db.sql dans l'archive.
Pour le faire manuellement, l'équivalent est cette commande :

pg_dump --file peertubeBasePostgreSQL_20181201.txt -d peertube_peertube -U peertube

Il peut être intéressant d'en profiter pour faire aussi une sauvegarde dans le format custom, l'intérêt peut se révéler utile en cas de soucis particulier, comme indiqué ici.

pg_dump --format=custom --file peertubeBasePostgreSQL_20181201.dump -d peertube_peertube -U peertube


Logiciel :

Pour éditer la base, j'ai choisis le logiciel pgAdmin qui sera installé sur un poste client du réseau local, car évidemment, le serveur qui fait tourner Peertube ne dispose pas d'interface graphique.

sudo apt install pgadmin3
  • Une fois installé, via le menu « Fichier > Ajouter un serveur…» on va pourvoir renseigner les infos utiles récoltées précédemment pour se connecter à la base :

pgadmin.png

Dans « Hôte » on renseigne donc l'adresse IP locale du serveur.
À ce stade, cliquer sur « Valider » pour se connecter risque de ne pas fonctionner !

Autorisation d'accès à la base :

  • Pour autoriser l'édition de la base par un logiciel tiers, il faut éditer postgresql.conf.

Par défaut l'accès est totalement désactivé :

nano /etc/postgresql/9.6/main/postgresql.conf

J'ai laissé la première ligne telle quelle (et donc commentée), pour écrire cette seconde et permettre l'accès à toutes machines :

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
listen_addresses = '*'          # what IP address(es) to listen on;
  • Il faut ensuite autoriser l'accès à la machine cliente (sur laquelle est installé pgAdmin donc)
nano /etc/postgresql/9.6/main/pg_hba.conf

Et ajouter la ligne suivante en renseignant l'adresse IP du client :

host    all            peertube            AdresseIPClient/24            trust
  • Et enfin redémarrer postgresql :
service postgresql restart
  • Dernière chose, il faut ouvrir le port 5432 sur le firewall du serveur (c'est facile avec Yunohost, sinon avec ipTable)

Éditer la base :

  • Nous voici donc connecté, il faut maintenant se rendre sur la table « video » :

pgadmin2.png

  • Et avec un click droit sur la table « video », cliquer : « Afficher les données > Visualiser toutes les lignes ».

Une fenêtre va s'ouvrir et afficher les données de la table, à savoir toutes les vidéos, autant locale que celles des autres instances abonnées.
pgadmin3.png
Ici j'ai donc retrouvé ma première vidéo de test, et changé la date dans la colonne « publishedAT » pour la passer en 2014, ensuite je vais rafraîchir ma page Peertube et c'est instantané, la vignette de la vidéo est déplacée, et il est bien indiqué il y a 4 ans - 6 vues.

  • Voilà, c'est fait, mais c'est local pour le moment, en effet pour que cette modif se répercute sur les autres instances, il faut aussi aller éditer la vidéo sur l'interface Peertube, afin de la « mettre à jour ». Pas besoin de faire de modif, juste « Mettre à jour suffit ».

C'était facile, mais il aura fallu chercher un peu comment tout cela fonctionne, pour moi qui n'ai jamais touché à du PostgreSQL (4h en comptant la rédaction de cette documentation).

  • Astuce :

Pour retrouver facilement une vidéo, on peut en parallèle de pgAdmin ouvrir le fichier texte de sauvegarde de la base (bosser sur une copie, c'est mieux !) et faire une recherche par mot clef. Une fois la ligne retrouvée, relever le N° en début de ligne. Ce N° correspond à la première colonne « id [PK] serial » dans pgAdmin.

2018-10-12

Django database connections in background workers

Executing of a task in a background worker is similar to handling a request in a WSGI server. At the beginning the task or request must fetch a database connection and at the end it must clean it up.

Django uses signals sent at the beginning and end of a request to manage database connections. This means that task queues can do the same and be confident that background tasks get the same isolation as HTTP requests.

In Spinach this translates to:

from django.db import reset_queries, close_old_connections
from spinach import signals

@signals.job_started.connect
def job_started(*args, job=None, **kwargs):
    reset_queries()
    close_old_connections()

@signals.job_finished.connect
def job_finished(*args, job=None, **kwargs):
    close_old_connections()

2018-10-10

Testing reusable Django apps

I added a Django integration to Spinach, my Redis task queue for Python. It comes in the form of a small Django application. Naturally I wanted to write automated tests to make sure I don't break it by mistake in the future.

Since the code lives in the main Spinach repository, I didn't want to setup a full Django project just for the sake of testing. It turns out this is not needed, Django can be bootstrapped right from the test suite:

import django
import django.conf

def test_django_app():
    django.conf.settings.configure(
        INSTALLED_APPS=('spinach.contrib.spinachd',),
    )
    django.setup()

    # Start testing here

2018-10-02

Disallowing access to Django admin for non-staff users

Websites built with Django often have their own login page, making the admin login page unnecessary. Django does not provide a setting to disable the admin login page while keeping the rest of the dashboard.

A simple middleware can prevent anonymous and regular users from seeing the admin dashboard:

from django.http import Http404
from django.urls import reverse


def hide_django_admin_middleware(get_response):

    def middleware(request):
        if request.path.startswith(reverse('admin:index')):
            if not request.user.is_staff:
                raise Http404()

        return get_response(request)

return middleware

2018-09-27

Optimizing Caddy logs for Goaccess

I recently discovered Goaccess, a simple tool that generates analytics reports from web server logs.

The more information the log file contains, the better the report is. The default log format of Caddy does not record virtual hosts, user agent, referer and latency so they need to be added explicitly:

log / /var/log/caddy/access.log "{hostonly} {combined} {latency_ms}"

Goaccess can then use this extra information with:

goaccess access.log -o goaccess.html --log-format='%v %h %^[%d:%t %^] "%r" %s %b "%R" "%u" %L' --time-format='%H:%M:%S' --date-format='%d/%b/%Y'

2018-09-12

Installation de Kodi sur Lubuntu avec chiffrement

J’avais installé un mediacenter Kodi sur une très vieille machine, en 2014. L’appareil fonctionne toujours (malgré ses 10 ans d’âge), mais l’OS (basé sur Ubuntu 14.04) ne sera bientôt plus supporté, et je voulais ajouter le chiffrement du filesystem.

Choix de la distribution

J’aurais bien utilisé Kodibuntu (dérivé d’Ubuntu avec Kodi pré-packagé), mais ils ont arrêté cette distribution.

Je suis parti sur la famille Ubuntu, parce qu’elle permet d’utiliser le PPA que je connais bien. Cf https://kodi.wiki/view/HOW-TO:Install_Kodi_for_Linux.

J’ai choisi la version la plus légère d’Ubuntu Desktop : Lubuntu (avec la nouvelle « minimal install »).

Chiffrement LUKS

Via l’installeur

C’est très facile à faire depuis l’installeur Ubuntu (sauf qu’il impose d’écraser le disque entier).

Mais, dans mon cas particulier, ma vieille machine a un très vieux processeur (Pentium Core 2 duo T5550), qui n’a pas le jeu d’instructions AES-NI. Autrement dit, l’algorithme de chiffrement utilisé par défaut (AES) ne bénéficie pas d’accélération matérielle.

J’ai donc testé dessus quel algorithme est le plus rapide. En démarrant en live-USB, et en lançant :

cryptsetup benchmark

Résultat : c’est l’algorithme serpent-xts qui est le plus rapide (autour de 120Mo/s pour 256bits, en encryption comme en décryption, contre 95Mo/s pour aes-xts).

A la mano pour choisir l’algo de chiffrement

L’installeur d’Ubuntu ne permet pas de choisir l’algo de chiffrement. Donc il faut démarrer en live-USB, puis configurer les partitions en ligne de commande :

sudo cryptsetup luksFormat /dev/sda2 --cipher=serpent-xts-plain64
sudo cryptsetup luksOpen /dev/sda2 sda2_crypt
sudo pvcreate /dev/mapper/sda2_crypt
sudo vgcreate ubuntu-vg /dev/mapper/sda2_crypt
sudo lvcreate -L50G -n root ubuntu-vg
sudo lvcreate -l100%FREE -n swap_1 ubuntu-vg

(adapter la taille des deux partitions en fonction de vos besoins)

Puis lancer l’installation en utilisant ces partitions.

Ensuite, il ne faut pas redémarrer tout de suite, et configurer les partitions chiffrées et GRUB, en passant par un chroot :

sudo mount /dev/mapper/sda2_crypt /target
for d in dev proc run sys; do sudo mount --bind /$d /target/$d; done
sudo mount /dev/sda1 /target/boot
sudo chroot /target

Mettre dans /etc/crypttab :

sda2_crypt UUID=xxx non luks,discard

(en utilisant l’UUID fourni par cryptsetup luksUUID /dev/sda2)

Puis :

sudo update-initramfs -u
sudo update-grub
exit
for d in dev proc run sys boot; do sudo umount /target/$d; done

Source : https://askubuntu.com/questions/882159/specify-encryption-cipher-to-use-during-install

Et comment entrer le mot de passe depuis son canapé ?

Avant j’utilisais une wiimote comme télécommande, mais ça ne fonctionne plus depuis quelques versions de Kodi. J’ai bien une solution de bricolage pour la refaire marcher, mais ça ne permet de toutes façons pas de saisir un mot de passe au démarrage.

La solution que j’ai adoptée, c’est d’utiliser une télécommande Minix A2 Lite (https://kodi.wiki/view/MINIX_A2) qui a un clavier matériel.

J’ai utilisé le keymap ci-dessous, à mettre dans un fichier /var/lib/kodi/.kodi/userdata/keymaps/MinixA2.xml (quand ce répertoire sera créé, voir plus bas) :

<keymap>
<global>
<keyboard>
<F2>NextSubtitle</F2>
<home>AudioNextLanguage</home>
<F1>Stop</F1>
</keyboard>
</global>
</keymap>

Problème de lenteur au démarrage

Le démarrage prenait plus d’une minute, bien plus qu’avant. Après recherche, c’était un bug spécifique à mon matériel :

Dans kernel.log, on trouvait des messages :

[drm:drm_atomic_helper_wait_for_dependencies [drm_kms_helper]] *ERROR* [CRTC:41:pipe B] flip_done timed out

C’est ces timeouts qui ralentissaient le démarrage.

J’ai pu le contourner en ajoutant « video=SVIDEO-1:d » dans /etc/default/grub. Source : https://askubuntu.com/questions/893817/boot-very-slow-because-of-drm-kms-helper-errors.

Installation de Kodi

Là, c’est du classique : on ajoute le PPA https://launchpad.net/~team-xbmc/+archive/ubuntu/ppa et on installe le paquet kodi (+ certains paquets kodi-* si besoin). J’installe aussi openssh pour l’accès distant, et rsync pour les backups.

Lancement de Kodi au démarrage

Il y a des éléments dans la doc officielle : https://kodi.wiki/view/HOW-TO:HOW-TO:Autostart_Kodi_for_Linux, mais ce n’est pas toujours très clair.

Il y a plusieurs méthodes, notamment configurer un service avec systemd (sans passer par un Windows Manager), ou passer par un Window Manager (LXDE dans le cas de Lubuntu), dans lequel on le configure en autostart.

J’avais au départ une préférence pour le service systemd, mais il s’est avéré poser des problèmes de performance (affichage saccadé) et de tearing (trait horizontal visible lors des travellings) sur mon matériel. J’ai donc plutôt opté pour la solution qui passe par LXDE.

J’ai créé un user kodi avec son home dans /var/lib/kodi :

sudo apt install xinit
sudo groupadd kodi
sudo useradd -c 'kodi user' -g kodi -G audio,video -d /var/lib/kodi -s /usr/bin/nologin kodi
sudo passwd -l kodi > /dev/null
sudo mkdir -p /var/lib/kodi/.kodi
sudo chown -R kodi:kodi /var/lib/kodi/

Et configuré lightdm pour se connecter automatiquement avec ce login, en créant un fichier /etc/lightdm/lightdm.conf.d/50-autologin-kodi.conf avec le contenu suivant :

[SeatDefaults]
autologin-user=kodi

Puis on configure LXDE pour qu’il démarre Kodi dès la connexion, en créant un fichier /var/lib/kodi/.config/lxsession/Lubuntu/autostart avec le contenu suivant :

@/usr/bin/kodi

On voit brièvement passer le bureau lxde lors du démarrage : il y a peut-être moyen d’éviter ça mais j’ai pas creusé.

Réglages son et raccourcis clavier

Pour que le son sorte sur le port HDMI, il faut se connecter dans l’interface graphique de lubuntu, et choisir le profil HDMI dans la configuration du son.

Pour que les touches de réglage du son (de la télécommande ou du clavier) fonctionnent, il faut indiquer à Lubuntu de ne pas capturer ces événements. Pour cela, il faut modifier le fichier /var/lib/kodi/.config/openbox/lubuntu-rc.xml, pour y commenter les lignes de « Keybinding for Volume management » :

<!-- Keybinding for Volume management -->
<!-- Désactivé pour que ces touches soient interprétées par Kodi
<keybind key="XF86AudioRaiseVolume">
<action name="Execute">
<command>amixer -q sset Master 3%+ unmute</command>
</action>
</keybind>
<keybind key="XF86AudioLowerVolume">
<action name="Execute">
<command>amixer -q sset Master 3%- unmute</command>
</action>
</keybind>
<keybind key="XF86AudioMute">
<action name="Execute">
<command>amixer -q sset Master toggle</command>
</action>
</keybind>
-->

Réglages de l’écran

Dans le cas de mon matériel, j’ai un écran 720p, et une machine peu puissante donc il vaut mieux régler l’écran en 720p. D’autre part, il faut désactiver la sortie sur l’écran de la machine (puisqu’il n’y en a plus), et activer la sortie HDMI à la place.

Il suffit pour cela de créer un fichier /var/lib/kodi/.xprofile avec le contenu ci-dessous :

xrandr --output LVDS-1 --off
xrandr --output HDMI-1 --mode 1280x720

Désactivation des actions par défaut de LXDE

Si on branche une clé USB ou qu’on insère un CD/DVD, LXDE affiche une fenêtre pour proposer des actions possibles sur ce media. Cette fenêtre s’affiche par-dessus Kodi, ce qui surprend et est inutile (Kodi se charge du nécessaire).

On peut désactiver ce comportement, en lançant l’explorateur de fichiers, et dans le menu Edition->Préférences, il y a un onglet « Gestion des supports amovibles » : il faut y décocher l’option « Afficher les options disponibles pour les supports amovibles quand ils sont insérés »

Activation automatique d’une enceinte bluetooth

Il faut d’abord installer le module qui permet d’utiliser la sortie son en bluetooth :

sudo apt install pulseaudio-module-bluetooth

Ensuite il faut appairer l’enceinte dans le gestionnaire de bluetooth de LXDE.

Je suis tombé sur un petit piège, qui faisait que mon appareil ne détectait jamais mon enceinte : j’avais lancé au démarrage le processus qui active une wiimote comme télécommande, et qui occupait le scan bluetooth.

Autre souci : même en configurant le bluetooth pour qu’il fasse confiance à l’appareil (« trust »), il ne se reconnectait pas automatiquement après un reboot. Et c’était très contraignant de le faire manuellement à chaque fois.

Après avoir pas mal tâtonné, j’ai fini par utiliser une méthode de bourrin. J’en suis pas très fier (j’aurais aimé trouver mieux), mais ça fonctionne : lancer programmatiquement une tentative de connexion à mon enceinte toutes les 15 secondes. Pour cela, j’ai créé un script shell connecter_enceinte_bluetooth.sh qui fait la connexion :

#!/bin/bash
# Ce script essaie de connecter l'enceinte bluetooth
# Il doit etre lance en tant que root
bluetoothctl <<EOF
connect xx:xx:xx:xx:xx:xx
EOF

(il faut remplacer les xx par l’identifiant de l’appareil concerné)

Et j’ai ajouté un fichier /etc/cron.d/connecter-enceinte-bluetooth qui le lance toute les 15 secondes :

* * * * * root /var/lib/kodi/connecter_enceinte_bluetooth.sh
* * * * * root sleep 15; /var/lib/kodi/connecter_enceinte_bluetooth.sh
* * * * * root sleep 30; /var/lib/kodi/connecter_enceinte_bluetooth.sh
* * * * * root sleep 45; /var/lib/kodi/connecter_enceinte_bluetooth.sh

Configuration pour la lecture des DVDs

C’est du classique :

sudo apt install libdvd-pkg

sudo dpkg-reconfigure libdvd-pkg

Source : https://doc.ubuntu-fr.org/lire_un_dvd

2018-07-31

Le téléphone sonne fin juillet .. Et c’est pas gagné

s63

Le téléphone sonne

En cette fin d’après midi, France Inter fait un « téléphone sonne » sur les zones blanches et le très haut débit. Ça se passe par ici Enfin .. s’ils arrivent à garder un contenu en ligne quelques temps …

Je m’excuse par avance s’il traîne encore quelques fautes et autres coquilles dans mon texte, il a été écrit après une loooongue journée de boulot !

TL;DR : deux personnes avec un dossier d’éléments de langage imprimé un peu à la va vite et un membre de la FFDN qui a malgré tout plutôt bien tenu le crachoir !

Dès le début de l’émission le ton est donné, on va parler des 541 communes qui ont des problèmes d’accès à internet (sur 35000, soit 1.5%, mais on ne parle surtout pas de combien de gens ça représente, ni même de comment on a trouvé ce chiffre de 541 … sachant qu’il y en a déjà au moins 120 rien que dans mon département, je vois mal comment il ne pourrait y en avoir que 541 en France)

Bon, on est pas chiens quand même, d’après le journaliste, « il y a urgence » (vers 0:30). On apprends au passage qu’en 2000, internet c’était pour se distraire mais que maintenant on en a vraiment besoin … honhon.

Vient ensuite direct la question qui fâche (vers 0:40′) : pour qui, quoi et comment les 20 milliards du plan France THD. Bon point pour les journalistes.

Gros sujet oblige, on a un gros panel présenté tambour battant :

  • Une personne de l’ARCEP, Martine Lombard, représentant donc notre autorité de tutelle en matière de télécom
  • Une personne de la FFT, Michel Combaud, Fédération Française des Télécom « qui regroupe les opérateurs de télécommunication en france, je crois qu’il y en a une petite quinzaine » dixit le journaliste. Non, monsieur, y’en a très précisément 2679 ce 31 juillet … (vers 1:05) .. Bon, ce monsieur, en fait, c’est le DG du CSA .. Mais chuuuuut !
  • Une personne de la FFDN, Fédération French Data Network, qui serait donc une sorte de coopérative associative militante et quelques autres trucs … mais Sébastien, lui, il est au téléphone, parce qu’il a pas de patron pour lui payer le trajet et que France Inter, ils font pas de défraiement pour leurs invités, c’est rapport à l’argent, ça les arrange pas (enfin si, mais uniquement sur les trajets en taxi en Ile de France). Mais c’est cool, en Bretagne ça capte bien (sic !) (vers 1:30)

Bref, comme on peut le voir, un panel super équilibré pour un débat vachement riche et constructif.

Après ce bref plantage de décor, on enchaîne sur un premier tour de table sur le thème des objectifs et de « est-ce que vraiment va y avoir un bon haut débit pour tous en 2020″ ? (vers 2:10) :

  • La personne de l’ARCEP dit que ouais, ça le fait, et que l’ARCEP ben y vont tout faire pour que ça le fasse parceque ouais, y faut
  • La personne de la FFT dit que ouais aussi, parce qu’ils ont 10 milliard par ans pour investir et que ouais ils vont le faire
  • Et la personne de la FFDN dit qu’en fait y croit que c’est difficile mais qu’il faut voir les moyens mis à dispo mais que c’est pas la FFDN qui les mettra parce que « nous on a pas les moyens de participer malheureusement » (là dessus, je suis pas d’accord, mais on y reviendra :))

On enchaîne sur un premier appel (vers 3:55) d’un « département mal loti », le Lot (ahahah, quel humour !), avec Cora au téléphone qui apporte son témoignage en expliquant que ça risque de couper parce qu’elle n’a qu’une barre et qu’elle tient son téléphone au seul endroit maison ou ça marche. Ça fait sourire les urbains, mais c’est comme ça partout hein.

Bon, bref, Cora, elle, elle a pas pris internet (fixe, hein, une box ou un truc du genre) parce qu’elle veut pas filer 40 balles par mois à une grosse boite du CAC40 pour un truc qui marche une fois par semaine et que donc, pour ses démarches administratives, ben elle fait 5 ou 6km pour aller à la médiathèque du bled à côté sur des ordi en libre service. (vers 4:40).

Le journaliste l’enchaîne direct sur le thème « ah mais ça c’est un autre problème si vous ne voulez pas aller dans le système » .. Bah nan en fait .. elle veut juste pas payer 40 balles par mois pour un truc qui marche pas, qui plus est si c’est pour engraisser une boite qui fait déjà des benefs colossaux.

C’est la dame de l’ARCEP qui s’y colle. Je dois vous avouer que j’avais écouté jusqu’à ce moment là en début de soirée, avant d’aller dîner, et que je me suis arrêté tout net avec une furieuse envie de vomir. Du coup, j’ai fini de manger et de picoler avant de reprendre (en écrivant cet article).

La dame de l’ARCEP explique à cette chère Cora qu’elle mélange tout entre la fibre, l’adsl et le téléphone mobile, qu’avant, les zones blanches c’était que pour le téléphone mobile qui captait pas, mais que maintenant, ça va, c’est plus que 1% (ooooh le beau chiffre sorti du chapeau !) de la population qui a ce problème là (pas de bol pour Cora, fallait pas habiter là) et que maintenant, quand on dit zone blanche, c’est « beaucoup plus exigeant parce qu’on en parle dès qu’on arrive pas à accéder à internet » (vers 6:25) … C’est donc exigeant de prétendre avoir accès à internet hein. On le note. La dame dit que c’est dommage que Cora ait renoncé à internet parce qu’elle ne peut pas …

Elle enchaîne sur le pire ce sont « les gens qui ne veulent pas à accéder à internet » (vers 7:10) … Eh, on peut avoir envie de ne pas, non ? C’est si grave que ça ?

Suit une transition avec le monsieur de la FFT qui affirme (vers 7:20) que les gens réclament de la 4G partout « ou on habite et ou on travaille » alors oui, non, en fait, monsieur, les gens y voudraient juste avoir un téléphone qui marche pour l’instant. Si tu veux leur mettre de la 2 ou 3G par la même occasion, pourquoi pas, mais vraiment, pas la peine de claquer toutes tes thunes pour des antennes 4G dans les trous paumés … Mais tu le sait bien, vu que toutes les antennes 3G que les opérateurs de ta fédération démontent en zone urbaine, on les retrouve six mois plus tard perchés à 25 mètres au dessus de nos champs avec une cohortes d’élus locaux qui découpent frénétiquement du rubalise bleu blanc rouge les pieds dans du concassé même pas fini de tasser en bas des pylônes qui ont été facturés 200.000 € aux départements et aux régions et qui sont gracieusement mis à disposition des opérateurs pour l’euro symbolique annuel.

Vers 8:05, le monsieur de la FFT se lâche et reconnaît qu’internet est devenu un « bien commun ». Hihohahahah. On va devoir lui faire réviser la définition des communs, je crois !

On enchaîne directement sur la voix de la FFDN (vers 9:00), interpellée sur les solutions alternatives qui viendraient se glisser entre le merdier général actuel et le bon haut débit pour tous de 2020 (parce que bon, nous, on est tout petit, donc on change le pansement plutôt que de penser le changement, ‘voyez !), Sébastien évacue vite fait bien fait la téléphonie mobile, parce que ouais, faire de l’internet, n’importe qui peut le faire (voir ma série d’articles sur le sujet) mais pour la téléphonie mobile, faut d’abord un chéquier bien fourni, et après, on en reparle.

S’en suit une description rapide de comment on fait de l’internet dans la fédé, avec un challenge du journaliste « expliquez en 30 secondes comment ça marche », challenge accepté et réussi avec Brio (sisi, il était là !) avec, en prime, une bonne explication de pourquoi on arrive à faire globalement moins cher en maîtrisant le réseau plutôt qu’en le laissant aux mains de l’opérateur hystérique.

On prends un nouvel appel venu de l’Hérault en la personne de Ludovic, profession médicale en libéral, qui galère pour ses télétransmissions et qui est donc dans la merde avec ses 2Mbps les bons jour. Il se trouve donc contraint à une double peine, ADSL payé à fond pour un débit très faible, et connexion 4G payée elle aussi plein pot mais avec un débit très irrégulier malgré les 80 € / mois. Il est donc autour de 120 € par mois pour … de la meeeeerde.

La dame de l’ARCEP se réjouit que Ludovic ait de la 4G (mais évacue totalement le discours du monsieur qui disait que ça fluctue à mort), et embraye sur son dossier d’élément de langage en disant que fin 2020, tout le monde aura 8Mbps, sans pour autant donner un quelconque détail. Bon, le journaliste ne lui demande pas et part en boutade sur début ou fin 2020. Reste que 18 ou 30 mois, ça révolutionnera pas le monde, mais ça, j’ai l’impression que personne, dans les hautes sphères en tout cas, ne veut l’admettre.

On enchaîne sur une question web, demandant comment ça se fait qu’à Barcelone des gens étaient fibrés avant le passage à l’an 2000 … à laquelle le monsieur de la FFT répond que « non non, la France n’est pas en retard, elle a vu l’internet se développer en 2000 avec beaucoup d’investissements mais on atteint les limites, mais on a encore réinvesti depuis 10 ans dans la fibre » (vers 15:40) … honhon, vous avez investi quoi exactement ? L’argent du contribuable sur des opérations de montée en débit ? Ah non, j’suis con, vous avez investi en zone dense là ou vous pensiez que ce serait facile de rentabiliser et vous vous êtes plantés comme des otaries bourrées à la bière.

Sébastien répond pour la FFDN sur la question de savoir si le retard se résorbe. Le retard était quasi nul sur le début de l’ADSL mais on a totalement loupé le virage de la fibre parce qu’on n’a fibré que les centraux téléphoniques (donc Orange) et totalement laissé tomber le reste de la boucle locale entre le central et l’abonné final.

La dame de l’ARCEP cloture le sujet en disant que « oui, effectivement, à Lisbonne, au Portugal, y’a de la fibre partout, mais on protège beaucoup moins l’environnement, donc on accepte que la fibre passe en aérien » .. Alors, Madame, Lisbonne, c’est à 1300km de Barcelonne, qui est en Espagne et pas au Portugal. Mais vu ce qu’elle sort juste après (vers 17:20) en affirmant qu’on est en avance en terme de fibre mais en retard en terme de très haut débit … on se dit que finalement, elle a du mal à remplir elle même sa propre grille de bingo bullshit, mais vous verrez, elle se rattrape plus loin.

Nouvel appel de l’Hérault, Claude, qui attends la fibre pour 2021. 80 habitants dans la commune de Claude. Chez lui, la fibre, ce sera pour les gens qui ont « un nom de rue et un numéro de maison dans la rue ». Bon, ça, c’est parce que quand un département monte un Réseau d’Initiative Publique, une armée mexicaine passe faire un « relevé de boites aux lettres » et que si y’a pas un nom de rue et un numéro pour mettre dans la base de donnée, ben ça marche pas … Mais je ne peux pas croire (noooon, je peux pas) que c’est une condition sinequanone posée par le département .. nooonnonon, je peux pas. Claude, lui, pour envoyer des photos, il prend son téléphone et « va en ville ».

Le monsieur de la FFT répond : « ehh ben oui il faut qu’on sache ou la fibre arrive pour pouvoir la déployer, donc on recommande un plan de numérotation des habitations. Mais en France, il y a 40% des habitations qui n’en ont pas ». Alors, bon, encore un chiffre sorti du chapeau, mais si on oublie ce détail, franchement, les enfants, revoyez vos SIG (les machins ou on rentre des données géographiques), parce que ça fait pas loin de 50 ans qu’on a un bidule nommé GPS qui permet de positionner des objets dans l’espace avec, dans le pire des cas, une précision de 10 mètres. Y’a pas beaucoup d’endroit ou on trouve un trop grand nombre d’habitations pour s’y retrouver dans un rayon de 10 mètres, sauf peut être à Paris, mais là, tout le monde a un numéro et une rue. Et manifestement, même dans les immeubles de 30 étages avec 20 apparts par étages vous y arrivez, donc …

Maintenant, c’est au tour de Philippe, qui s’assure qu’on l’entends bien, avec une question à propos de l’accès mobile à internet dans les transports, parce que tu comprends, les gens, y voudraient pouvoir bosser dans le train ou bien expédier leur épluchage de compte en banque pour pouvoir être avec leurs enfants quand ils rentrent à la maison.

Alors, Philippe, cesse de te prendre pour un hamster, sors de ta roue, tu verra, tu fera moins de train, mais ça, ça reste entre nous.

Là, le journaliste tente de retourner totalement la question (ou de l’élargir, au choix), en affirmant donc, en synthèse du discours de Philippe, que la zone blanche n’est pas l’apanage de la ruralité. Wouhouuuu ! Non, en fait, la zone blanche est l’apanage de tous les endroits non commercialement rentables. La foret de Fontainebleau par exemple.

La dame de l’ARCEP rebondi donc sur le métro, soulignant que ça capte pas partout. J’ai encore fait le test hier, en allant expliquer leur métier à Nerim, effectivement, dans l’est parisien, c’est bien la merde. Par contre, sur la fin de la ligne 1, entre l’Arc de Triomphe et la Défense, pleine balle, la 4G. Probablement encore une histoire de rentabilité. A moins que …

Et elle enchaîne direct sur un site permettant de savoir quel opérateur couvre le mieux « les trains du quotidien ». Le conseil du régulateur est donc d’avoir un opérateur pour le boulot, un opérateur pour la maison et un opérateur pour le train … De mon côté, je songe à monter un groupuscule terroriste qui s’en prendrait aux roues de hamster pour les annihiler (pas d’inquiétude, on recueillera tous les hamsters et ils auront 42 câlins quotidiens chacun !)

Le journaliste part donc sur les priorités affectées (vers 22:00), demandant si c’est bien sérieux d’aller couvrir en 4G des voies ferrées quand il y a encore des gens qui n’ont pas de couverture chez eux. Le monsieur de la FFT parle donc à présent de couvrir « les trains du quotidien en 4G à hauteur de 80% d’ici 2025″ … Ouuuhhh on est bien loin du « bon débit pour tous en 2020″ là … mon petit doigt me dit qu’il manque une feuille dans le dossier d’élément de langages. Alloooo, Manu ?

Le journaliste donne la parole à Sébastien de la FFDN, lui demandant ce qu’il pense de la priorité donnée aux axes de transport … sur quoi, notre camarade signale qu’il va répondre à côté et part sur une explication du pourquoi du comment c’est la merde localement dans les couvertures à cause de la priorité donnée à l’investissement (et la subvention) privé et appel l’ARCEP (vers 24:10) une régulation du secteur pour éviter le phénomène d’investissement dans des endroits ou il y a déjà de la bonne connectivité au détriment des zones blanches. Beau recadrage !

Le journaliste donne donc naturellement la parole à la représentante de l’ARCEP, lui demandant si la rentabilité rentre en ligne de compte. Dans les quelques premiers mots de sa réponse, elle arrive à caser « zone moins dense » et « zones d’initiative privée » et « publique » … 41 point au bingo, elle l’a loupée de 1, c’est dommage !

Bon, ces zones couvriraient 80% du territoire (les publiques hein) … on ne saura pas de quel proportion de population on parle, mais on met bien les chiffres qui arrangent aux endroits qui arrangent hein (vers 25:05) … Donc à ces endroits là, ce sont les collectivités qui choisissent ce qu’elles font et dans quel ordre. Pas du tout sur les conseils ou pressions d’Orange. T’as qu’à voir, en Bourgogne Franche Comté, le réseau en question, il va être construit autour des NRA d’Orange et dans l’Yonne (je sais pas pour ailleurs), pour faire des économies, on va utiliser l’existant dans 90% des cas … dont les quatre cinquième appartiennent à Orange. Maaiiiss non, ça fera pas comme les réseaux câblés dans 20 ans, les collectivités vont pas du tout être obligées de revendre leurs réseaux (qui auront coûté 40 milliard, on note que c’est une moindre dérive budgétaire comparée à l’EPR hein) à l’euro symbolique à Orange contre la promesse qu’il sera (pas) entretenu et rénové. Non non non. Promis.

Elle rend ensuite hommage aux élus territoriaux qui jouent un rôle très important dans la résorption des zones blanches en privilégiant d’abord les zones délaissées quand il s’agit de déploiement FTTH. Bon, dans notre département, ce sont surtout (ah ben non, uniquement, en fait) les communes des élus copains du département (tous de droite) qui sont en phase 1 et 2, mais comme on sait même pas quand commence la phase 2 … oops, pardon.

Elle conclu donc (vers 25:30) en disant que ce que disait Sébastien vaut pour les zones d’initiatives privées et pas pour les 80% du reste du territoire. Bon, moi, je suis du métier depuis 20 ans, mais avec son boniment, j’avais déjà oublié ce que Sébastien avait dit. Ah oui, si, que l’investissement se concentre ou c’est rentable. Ah ben oué, Sébastien, tu t’es planté, sur 80% du territoire, c’est la mafia politique, le critère déterminant … le pognon, on s’en balance, c’est celui des citoyen et on va tout filer à Orange de toute façon. « c’est pas nous c’est la faute à l’Europe » (c).

Sébastien conclu sur le fait que les délégations données par le public aux opérateurs privées laissent souvent le choix au secteur privée dans les ordres de déploiement. Naaaan, là aussi, tu t’es planté … Le secteur public décide et oblige Orange (enfin, paie Orange pour l’obliger) à fibrer les potes. En échange, Orange, il convainc les élus de faire en sorte que les petits opérateurs soient exclus. Ça reste en famille, c’est coolos.

Le journaliste clos le débat interminable en disant que les deux sont donc d’accord pour dire bravo aux élus locaux. Pour ma part, je dis bravo à tous ceux qui ont autour ou moins de 10000 habitants à gérer. Au dessus, c’est juste mort.

On continue, vers 26:35, avec Ahmed qui témoigne à propos de la pub en ligne … alors bon je croyais qu’il s’était planté d’émission et qu’il voulait râler contre la société de consommation … eh ben non, pour lui, le fait que des gens n’aient pas internet entraîne le fait qu’ils n’aient pas la possibilité de consulter toute cette pub et donc qu’ils ratent des occasions en or de dépenser leur blé. Alors là, j’ai buggué pendant quelques secondes, mais en fait, le monsieur râle sur le fait que le réseau oublie les petits opérateurs touristiques et que donc y’en a que pour Chambord et le musée de la Magie (il habite dans le Loir et Cher). Ah, ouf, je raccroche le train, tout va bien.

Oui, Ahmed, tu paie le même prix que ton copain en ville et t’as moins bien. Il conclu sur le côté vital d’internet au même titre que l’eau, l’électricité ou les soins médicaux. Une devise assez utilisée chez nous.

Le monsieur de la FFT répond sur le côté développement économique induit par le développement du réseau. Bon, je vais encore prendre l’exemple de chez nous, on a des dingos qui fabriquent un château fort à l’ancienne (Guedelon) par chez nous. C’est LE GROS bidule touristique du coin. Eh ben … pas de téléphonie mobile et internet par satellite (uniquement pour les bureaux, pas de wifi pour les touristes) … ça les empêche pas d’avoir reçu 300.000 personnes l’année dernière hein.

Mais on peut comprendre l’agacement du monsieur. Sébastien rempile sur l’accroissement des besoins en débit, citant la loi de Nielsen.

On switch maintenant sur le new deal numérique de Jacques Mézard (ministre de la Cohésion des Territoires) (vers 32:00). La parole est à l’ARCEP, qui témoigne du dividende des fréquences, renonciation à 3 milliard d’euro de licences sur les fréquences contre l’obligation de remplacer toute la 3G pour de la 4G, couvrir le réseau routier et planter 5000 nouveaux pylônes. Bon, elle ne dit pas que ce sont nos impôts qui financent les pylônes et que ce sont les antennes 3G démontées qui sont installées dessus. Du coup, elle ne dit pas qu’en fait l’état à renoncé à louer ses fréquences contre la promesse des opérateurs de pas dépenser un radis de plus que ce qui était prévu. Mais c’est pas graaaaave.

Le monsieur de la FFT rempile en disant que c’étaient eux qui avaient proposé ce « new deal » … ben tu m’étonne, Simone.

Nouvel appel de Vincent, dans les Deux Sèvres, qui parle de montée en débit et qui parle de SR et de cuivre, affirmant que la montée en débit est déjà obsolète avant même d’avoir été installée. Il parle des boîtiers de raccordement en mode plein air sans entretient.

La dame de l’ARCEP rebondi en disant que ça montre bien que le bon choix est la fibre, qu’en gros c’est une bonne idée de la mettre partout pour avoir du mieux partout. J’ai une pensée pour Cem et ses photos de points de mutualisation en vrac. Ben oui, madame. Mettre de la fibre partout, c’est le bon plan, on est bien tous d’accord, mais pas en plantant des PM qui attire les bus et les scooter dans des endroits totalement débiles. Ça fera une bonne raison de plus pour tout revendre à Orange dans 20 ans quand ils diront, la main sur le coeur, « on vous avait bien dit que le GPON c’était une mauvaise idée et qu’il fallait faire du point à point du NRO jusqu’au domicile, maintenant, ça va re-coûter pareil .. allez, on vous le rachète 1€, de toute façon, ça passe quasiment tout par notre génie civil, ça vous fera des économies ! »

Sébastien réplique (vers 36:20) que la fibre c’est bien mais si elle est déployée jusqu’au domicile (oui, parce que le monsieur qui a téléphoné depuis les Deux Sèvres, lui, il parlait des montées en débit qu’on voit maintenant, pas de la fibre qu’on devrait peut être voir, ou pas, en 2032) et conclu sur le fait que même si elle était déployée jusqu’aux domicile, faudrait-il encore qu’elle ne soit pas verrouillée et que de petits opérateurs puissent aussi l’exploiter. Décidément, il sait bien revenir aux vrais sujets, et cause d’offre activée (vers 37:30) sans trop détailler, vu que c’est bientôt la fin de l’émission.

Un dernier appel des Hautes Alpes. Sylvie se pose des questions sur la pertinence réelle de la suppression des zones blanches. On apprends donc que les ondes (« surtout le wifi ») créent des problèmes de santé et que c’est pour ça que la dame « fait partie du collectif stop linky 05″. Bon alors je sais pas si quelqu’un lui a dit que le linky faisait pas de wifi … Mais bon, je vais pas épiloguer sur l’électrosensibilité, n’étant ni concerné ni médecin, je vois pas pourquoi je devrais avoir un avis.

La dame de l’ARCEP a l’air bien embêtée pour répondre. Du coup, elle s’évade en parlant des volontés contradictoires des gens qui voudraient de l’internet partout mais aucune antenne nulle part (c’est la même personne qui, 35 minutes plus tôt, a dit à Cora qu’elle mélangeait tout entre la fibre et le mobile, hein …)

Eh ben guess what madame, on peut fibrer toute la France sans mettre une seule antenne ! Si ! Je sais que ça a l’air dingue, mais la fibre hertzienne, c’est un concept marketing vaseux imaginé par un mec fatigué et en manque de café.

Son argument, c’est que les jeunes veulent de l’internet et que donc pour éviter d’avoir des villages de vieux, ben y faut des antennes. Moralité, Sylvie, si tu veux être peinarde sans linky et sans wifi, va falloir te construire une maison en rondin de bois en haut de ta montagne et t’aura que des vieux à 100km à la ronde. That’s life, c’est la startupnation ici, ou bien ?

Le journaliste veut finir par l’outre mer, parce que c’est que 8% des zones couvertes là bas. La dame de l’ARCEP répond qu’ils ont quand même fait 350000 mesures là bas (ça claque, hein ?) pour vérifier la qualité et pis que ben oui, en Guyane, le littoral est couvert mais que comme y’a pas un pekin au kilomètre carré dans les terres, ben c’est un peu compliqué quoi.

Parole à Sebastien pour la FFDN, qui se trouve avoir un membre à Saint Barthélémy et qu’on est tout prêt à aider qui veut se lancer à fabriquer de l’internet partout. Il aurait pu penser à dire qu’on prenait bien évidemment aussi les initiatives d’autres pays, plus on est de fous, plus on riz (marche aussi avec les pâtes et la raclette) !

Conclusion pour le monsieur de la FFT (vers 40:30) à qui le journaliste demande comment il envisage la FFDN. Il répond que c’est au client de décider ce qu’il souhaite avoir comme service et tarif. Ça tombe bien, on n’a pas de clients à la FFDN, donc tout va bien ! Il fini tout de même en disant que toute initiative de nature à combler le vide est bonne, OUF !

 

 

 

 

2018-06-17

Nethserver 7.5 est disponible

Nethserver se veut un clone de Centos 7 avec un server-manager pour les taches de gestion du serveur sur les aspects sécurité et déploiement des services.

Après un long moment de développement, de nombreuses fonctionnalités sont disponibles, en voici une présentation: (dépêche originale)

 

  • Souscription: Dépôt logiciel stable + support professionnel

Vous pouvez souscrire à un dépôt logiciel dit stable (8 jours de latence) sur le modèle de proxmox, ou souscrire à des services de support professionnels pour ceux qui désirent avoir en face un interlocuteur pouvant résoudre leurs problèmes.

suivez le guide

 

  • Rspamd

Le nouveau moteur de lutte contre le spam, brillant, moderne, adaptable…un vrai bonheur

 

  • OpenDKIM pour les emails sortants

La signature de messages électroniques sortants avec une clé DKIM augmente la confiance des autres serveurs de messagerie avec le votre. Un tutoriel est disponible  si vous désirez envoyer vos emails sans smarthost.

 

  • Gestion des mises à jour de Centos

Un nouveau panel pour le software center. Il permet de sélectionner comment NethServer configure les mises à jour automatiques.

 

  • Icaro Hotspot

L’objectif est de fournir une connectivité Internet via Wi-Fi pour les utilisateurs. Les utilisateurs sont envoyés sur un portail captif à partir duquel ils peuvent accéder au réseau en s’authentifiant via un login social, un sms ou un e-mail.

Icaro est un hotspot complet écrit dans Go et Vue.js qui utilise CoovaChilli.

 

  • Fail2ban

Fail2ban qui est un de mes modules, fait parti du cœur de NethServer :)

 

  • Sauvegarde des données: inclure les logs

Les fichiers journaux système peuvent être ajoutés dans la sauvegarde de données. Ceci  est utile lorsque le sysadmin est contraint à des règles strictes sur la stratégie de rétention des logs par la GDPR

 

  • NextCloud 13.04

 

  • Mattermost

Alternative opensource à slack, indispensable :)

 

  • NethServer HotSync
NethServer HotSync vise à réduire les temps d’arrêt en cas de panne. En utilisant hotsync, celui ci est réduit au temps nécessaire pour activer le serveur de rechange. Les utilisateurs peuvent recommencer à travailler en utilisant les données vieilles de quelques minutes avant le crash.
  • QOS améliorée

 

  • Nom de domaine avec wildcard

Permet de ne pas devoir préciser tous les sous domaines lors de la création du nom de domaine.

 

  • TLS Configuration

Vous pouvez renforcer les paramètres TLS et restreindre les attaques possibles, en contre parti les vieux clients comme XP et Internet explorer ne pourront plus utiliser vos sites internet.

 

  • Serveur de fichiers windows
Les privilèges utilisateurs des dossiers partagés windows sont maintenant gérables via l’interface Web.
  • Et beaucoup plus encore

Énormément de petite améliorations sont disponibles, toutes ne peuvent pas être retranscrites….

 

  • Téléchargez et testez

Essayez par vous même, dans Virtualbox ou directement sur un serveur, venez partager vos impressions et chercher de solutions sur

le forum de la communauté

la documentation technique

NethServer 7.5 (993MB)

Hashes

  • sha1 cdb9e302d563d5abb500286946e88e33ec81058d
  • md5 002228c20d0702b98568aff67319d5eb

Torrent

2018-06-10

Swap to RAM

Si votre ordi est lent avec de nombreux accès disque, il est possible que ce soit parce que les données auxquelles vous voulez accéder sont en Swap (sur disque dur) et non en RAM. Le temps d’accès au disque dur pouvant être horriblement long (sur un disque 2.5″ de portable ou une carte SD par exemple)

On peut avoir des information sur l’usage de la RAM et du Swap avec la commande :

free -h

Mais ca ne vous dit pas quels processus utilisent le Swap. Pour avoir cette info, vous pouvez regarder manuellement dans les fichiers /proc/PID/status. Mais cette commande fait le travail pour vous et vous donne l’info pour tous les processus par ordre croissant :

for file in /proc/*/status ; do awk '/Tgid|VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | grep kB | sort -k 3 -n

Vous pouvez forcer Linux à bouger les données du Swap en RAM. L’astuce consiste à désactiver le Swap en live (assurez vous donc d’avoir assez d’espace libre en RAM avant) et à le réactiver:

swapoff -a

On peut ensuite le réactiver si on veut :

swapon -a

Related Posts:

2018-05-24

Rspamd: un nouveau jouet pour Nethserver

Rspamd est un logiciel antispam, un concurrent en quelque sorte de spamassassin, qui n’est plus vraiment développé. Rspamd est jeune,  il apprend rapidement, extensible, en pleine mutation.

Cela en  fait un outil très intéressant pour NethServer qui propose par le biais de ses modules de pouvoir installer facilement un serveur email avec toutes les parties annexes (imap, pop3, opendkim, spf, spamassassin/rspamd, smtp relay, …).

Le tout en cliquant simplement dans le software center alors que le paramétrage de Postfix et sa sécurisation pourraient être un calvaire pour d’autres.

Pour l’instant rspamd est un module différent de la pile email habituelle, il vous faut installer les rpms : nethserver-mail2-server nethserver-mail2-filter mais la procédure est documentée et nous devons très bientôt remplacer spamassassin par rspamd.

La documentation est accessible ICI

Je peux dire nous, car avec fierté, j’ai largement contribué à créer ce module avec le soutien et l’aide de Davide Principi le lead-developer de NethServer.

La météore Nethserver

J’ai eu l’occasion de faire une conférence de présentation de la distribution Nethserver, le 18 novembre 2017 au capitole du libre. Je vous livre la présentation ainsi que la vidéo.

meteore_nethserver_20171118.odp

meteore_nethserver_20171118.pdf

 

Un grand moment pour moi, merci à tous les participants.

2018-03-15

Stocker les données de Munin sur de la mémoire flash, via tmpfs ou ramfs

Munin écrit beaucoup de données toutes les 5 minutes, ce qui n’est pas très adapté quand le filesystem est sur une carte SD ou clé USB par exemple.

Pendant longtemps, j’ai placé ces données sur une carte micro-SD dédiée (via un convertisseur USB), qui finissait par rendre l’âme au bout d’un an environ (logique : la mémoire flash n’est pas adaptée à tant d’écritures). Je faisais ça en mettant simplement des liens symboliques vers /var/cache/munin et /var/lib/munin.

Pour limiter les écritures, j’ai d’abord essayé de jouer sur le paramétrage du filesystem (ext4) pour qu’il garde longtemps les informations en cache mémoire avant écriture. Je me disais qu’en passant le paramètre « commit » à 15 minutes par exemple, ça aurait évité des écritures. Hélas, ça ne suffit pas : je suppose qu’il y a d’autres appels système « sync » qui rendent ce paramétrage peu utile.

Ensuite j’ai eu une autre idée : placer ces données dans un filesystem en RAM, et les synchroniser (programmatiquement) de temps en temps avec la carte SD. Ça a très bien fonctionné, et c’est ce que je décris ci-dessous :

Paramétrage du disque mémoire

Il faut définir la taille dont on a besoin. Avec 5 serveurs, ces données prennent actuellement 178 Mo : 7 Mo dans /var/cache/munin, et 171 Mo dans /var/lib/munin. Il y a également 14 Mo dans /var/log/munin, que j’ai préféré ne pas mettre dans le disque mémoire.

Il y a principalement deux implémentations possibles pour le disque mémoire : ramfs et tmpfs. Les exemples ci-dessous sont avec ramfs (j’expliquerai pourquoi plus bas), mais il suffit de mettre tmpfs à la place de ramfs dans le fstab pour passer de l’un à l’autre.

Dans /etc/fstab :

none /mnt/ramfsmunin ramfs defaults,size=200M,mode=755,nofail 0 0

Attention à ce que la taille soit raisonnable par rapport à la RAM de la machine (1 Go dans mon cas). Une autre précaution consiste à avoir au moins autant de swap sur la machine, pour que le kernel puisse (si besoin) déplacer des données sur disque s’il a besoin de mémoire vive. Dans mon cas, j’ai ajouté un fichier de swap sur la carte SD (déjà montée sur /mnt/usb) :

sudo dd if=/dev/zero of=/mnt/usb/swapfile bs=1024 count=200000

sudo mkswap /mnt/usb/swapfile
sudo chmod 0600 /mnt/usb/swapfile

Et configurer ce swap dans /etc/fstab :

/mnt/usb/swapfile swap swap defaults 0 0

Puis monter tous ces filesystems :

sudo mount -a

Déplacer les données dedans, et faire les liens symboliques pour que /var/cache/munin et /var/lib/munin pointent dessus.

Alimentation du disque mémoire au démarrage

Après chaque redémarrage, /mnt/ramfsmunin est vidé (ce n’est pas un filesystem persistent). Il faut donc le ré-alimenter depuis la carte SD.

J’ai donc créé un script copier_donnees_munin_sd_vers_ramfs.sh dans /root qui fait cette copie :

#!/bin/bash
mkdir -p /mnt/ramfsmunin/lib
mkdir -p /mnt/ramfsmunin/cache
chmod go+w /mnt/ramfsmunin/lib
chmod go+w /mnt/ramfsmunin/cache
rsync -a /mnt/usb/lib/munin /mnt/ramfsmunin/lib/
rsync -a /mnt/usb/cache/munin /mnt/ramfsmunin/cache/

Et on peut configurer systemd pour que ce script soit lancé à chaque redémarrage, ou plutôt à chaque fois que /mnt/ramfsmunin est monté (ce qui est encore mieux). Il suffit pour cela de créer un fichier /etc/systemd/system/copie-donnees-munin-vers-ramfs.service avec un contenu de ce type :

[Unit]
Description=Copie des données de Munin depuis la carte SD vers /mnt/ramfsmunin
Requires=mnt-usb.mount mnt-ramfsmunin.mount
After=mnt-usb.mount mnt-ramfsmunin.mount

[Service]
ExecStart=/root/copier_donnees_munin_sd_vers_ramfs.sh
ExecStop=/root/copier_donnees_munin_ramfs_vers_sd.sh

[Install]
WantedBy=mnt-ramfsmunin.mount

(adapter le nom des .mount en fonction du point de montage où sont votre carte SD et votre disque mémoire : il faut mettre le path de chaque point de montage, en remplaçant les / par des -)

Pour l’activer :

sudo systemctl enable copie-donnees-munin-vers-ramfs.service

 

Synchronisation périodique du disque mémoire avec le filesystem persistant

Pour que la carte SD ait les données lors du prochain redémarrage, il faut les y mettre de temps en temps.

J’ai fait ça avec un rsync dans l’autre sens, lancé par cron une fois par heure, via le script /root/copier_donnees_munin_ramfs_vers_sd.sh :

#!/bin/bash
rsync -a --bwlimit=500K --delete /mnt/ramfsmunin/lib/munin /mnt/usb/lib
rsync -a --bwlimit=500K --delete /mnt/ramfsmunin/cache/munin /mnt/usb/cache

Le paramètre « bwlimit » permet de ralentir la copie (à 500 Ko/s maximum). Oui, parce que ce filesystem est surveillé par munin, justement. Et s’il est sollicité un peu trop fort, on atteint un seuil de latence en écriture (si la carte SD n’est pas très rapide), qui fait que Munin m’envoie un SMS…

Le paramètre « delete » permet de supprimer de la carte SD les fichiers qui auraient disparu dans le disque mémoire : c’est utile car munin y crée des fichiers temporaires.

La ligne que j’ai rajoutée dans le crontab de root :

53 * * * * /root/copier_donnees_munin_ramfs_vers_sd.sh

(elle permet de lancer ce script à 53 minutes de chaque heure. Puisque munin tourne toutes les 5 minutes, je l’ai décalé 3 minutes après, de sorte que munin ait eu le temps de terminer, et que le script ait le temps de finir la copie avant la prochaine exécution de munin)

En cas de crash du système, je vais perdre une partie de l’historique de Munin (1h maximum), mais ce n’est pas très grave. Par contre, dans le cas d’un reboot normal, l’exécution de ce script est assurée par la ligne ExecStop du service systemd ci-dessus.

Pourquoi ramfs plutôt que tmpfs ?

Sur le papier, tmpfs a de gros avantages sur ramfs : possibilité de limiter la taille du disque, de la superviser avec df, d’utiliser le swap si le système manque de RAM.

C’est donc tmpfs que j’ai essayé en premier. Hélas, j’ai constaté un phénomène étrange, que je n’ai pas réussi à comprendre ni à résoudre : les fichiers .rrd (utilisés par Munin pour stocker les données) n’étaient pas mis à jour dans le tmpfs, alors que les fichiers .storable et .html l’étaient sans problème. Résultat : je perdais mon historique de données à chaque redémarrage.

Si le tmpfs est vide, les fichiers .rrd sont bien créés, mais jamais mis à jour. Les graphiques, eux, étaient bien mis à jour au fur est à mesure.

En changeant simplement le type de fylesystem tmpfs en ramfs dans le fstab, cela a résolu le problème. Si quelqu’un a une explication logique, je suis preneur…

Résultat

Ouf, ma carte SD se porte mieux, et il y a beaucoup moins d’I/O wait :

 

2018-03-13

Postgres on ZFS

I always thought that Copy-On-Write filesystems like ZFS or Btrfs were poor fit for databases because of the amount of in-place updates the database does.

This article from 2nd Quandrant actually shows that ZFS can work well with Postgres. The key seems to keep the default ZFS block size of 128k (unlike the usually recommended 8k) and use a fast disk for ZFS SLOG and cache.

The big advantage of running a database on a COW filesystem is the ability to take an atomic snapshot of the database at any moment easily.

2018-03-11

Docker userland proxy

I was trying to make my task queue based on Redis more resilient to network errors. Both my application and Redis use TCP keepalive to detect disconnects on long lived connections.

To do that, I was simulating network partitions by dropping traffic to/from the container Redis runs in. This is easily done by entering the Redis process network namespace and adding an iptables rule:

nsenter -t <Redis PID> --net iptables -A INPUT -j DROP

This actually worked and made my application and Redis unable to talk with each other, but not detect the disconnect if no traffic was happening (as TCP keepalive should). The reason is related to how Docker publishes ports to the host.

When publishing a port from a docker container using the default bridged network, the containerized process does not actually bind on the host. The bind is done by a Docker process called the Docker userland proxy which runs on the host as root.

When an application connects to the containerized Redis, it in fact connects to another process which forwards packets to Redis. Thus my application did not detect the disconnect because the TCP keepalive probes between it and the userland proxy were successful, only the traffic between the proxy and Redis was dropped.

2018-03-08

Glibc getpid syscall caching

Glibc used to cache the result of the getpid syscall. Because the caching did not play well, it was removed from newer versions of glibc. As a result the call got more expensive and it is even visible from Python.

Debian Jessie shipped the old glibc while Stretch has the new one without cache. Alpine uses musl libc, which apparently does not cache the syscall:

$ docker run -ti --rm python:3.6-jessie python -m timeit -s "import os" "os.getpid()"
10000000 loops, best of 3: 0.0523 usec per loop

$ docker run -ti --rm python:3.6-stretch python -m timeit -s "import os" "os.getpid()"
10000000 loops, best of 3: 0.193 usec per loop

$ docker run -ti --rm python:3.6-alpine python -m timeit -s "import os" "os.getpid()"
1000000 loops, best of 3: 0.203 usec per loop

2018-03-07

Oven clocks getting slowed down in Europe

I noticed that the clock of my kitchen oven got late, it lost about three minutes in just two weeks. It surprised me since this clock has been very accurate for two years.

I got the answer from a Hacker News thread: oven clocks often don't have a quartz but instead count how many times the tension goes to zero, assuming that at 50 Hz it reaches zero 100 times per second.

This works well when the frequency is stable, but currently Europe suffers from a deficit in energy production slowing the grid down. Thus clocks getting late.

2018-02-17

HTS Tvheadend sur Debian Stretch ARM avec programme TV, logos, et derrière un reverse-proxy

L’objectif est de pouvoir regarder la TNT depuis n’importe quel ordinateur de la maison, et depuis un mediacenter Kodi.

J’utilise pour cela HTS Tvheadend depuis déjà plusieurs années. Je le fais tourner sur mes petits serveurs ARM (Sheevaplug ou Olinuxino A20). Cette architecture complique un peu l’installation.

Et il y a quelques trucs à connaître pour la configuration des programmes TV, des logos des chaînes, et pour le faire fonctionner derrière un reverse-proxy.

Driver et firmware de la clé USB TNT

En premier lieu, il faut un appareil pour recevoir la TNT. J’utilise une vieille clé USB TNT de modèle AVerMedia AVerTV Volar Black HD. Elle est supportée par le kernel depuis longtemps, mais nécessite également un firmware propriétaire, qu’il faut déposer soit même dans /lib/firmware : /lib/firmware/dvb-usb-af9015.fw

Je ne sais plus où j’avais trouvé ce fichier initialement. On peut apparemment le trouver dans https://github.com/OpenELEC/dvb-firmware/tree/master/firmware. Ou au pire en dézippant le paquet https://packages.ubuntu.com/trusty-updates/linux-firmware-nonfree.

De manière générale, il faut suivre les instructions correspondant à votre appareil dans https://www.linuxtv.org/wiki/index.php/DVB-T_USB_Devices, et s’assurer qu’il est bien reconnu par le kernel (si le firmware n’est pas trouvé, cela affiche un message d’erreur dans les logs du kernel).

Installation sur un serveur ARM sous Debian Stretch

La difficulté, c’est que le projet ne fournit plus de paquets debian pour l’architecture ARM.

Sur Raspberry Pi

Je n’ai pas d’appareil de ce type, mais le projet tvheadend fournit des paquets tout prêts pour raspbian (de manière pas-encore-officielle, si j’ai bien compris) : cf la fin de https://tvheadend.org/projects/tvheadend/wiki/AptRepository.

Sur Olinuxino A20

Cet appareil utilise l’architecture armhf, comme les générations récentes de Raspberry Pi.

Par chance, dans le même dépôt qui fournit des paquets pour raspbian, ils fournissent également des paquets pour ubuntu en armf. J’ai testé : ils fonctionnent également sous Debian Stretch.

Il faut d’abord installer les dépendances :

sudo apt install libpcre2-8-0 dvb-apps

Puis installer le package depuis https://bintray.com/tvheadend. J’ai utilisé https://dl.bintray.com/tvheadend/deb/pool/t/tvheadend/tvheadend_4.3-1051~gade772d~xenial_armhf.deb. NB : à l’heure où j’écris ces lignes, il y a une bizarrerie dans les liens si on parcourt le répertoire https://dl.bintray.com/tvheadend/deb/pool/t/tvheadend/, qui rajoute un signe deux-points devant le nom du fichier. Il faut enlever ce signe de l’URL pour pouvoir télécharger le paquet avec wget (je l’ai fait dans le lien ci-dessus).

Sur Sheevaplug

L’architecture est armel. On ne peut pas utiliser les paquets armhf (car le processeur n’a pas d’unité de calcul en virgule flottante). Donc pas d’autre solution que de le compiler à la main

Compilation

sudo apt-get install build-essential pkg-config libssl-dev libssl1.1 libavahi-client-dev libcurl3-gnutls git realpath cmake gettext
git clone https://github.com/tvheadend/tvheadend.git
cd tvheadend
./configure --cpu=armv4t --enable-bundle
make

Attention, la compilation prend plusieurs heures sur la sheevaplug… et plante lamentablement à la fin car les 512Mo de mémoire vive ne suffisent pas.

Pour contourner le problème, il suffit d’activer du swap (temporairement), si vous n’en avez pas :

dd if=/dev/zeros of=tmpswapfile.swp bs=1M count=1000
sudo mkswap tmpswapfile.swp
sudo swapon tmpswapfile.swp

(ce swap disparaîtra au prochain reboot, et le fichier tmpswapfile.swp pourra être supprimé)

Déclaration du service

Une fois la compilation terminée, on a un exécutable, mais on veut le faire lancer automatiquement au démarrage, le faire tourner avec un compte spécifique etc.

La solution la plus simple que j’ai trouvée est d’utiliser un paquet .deb existant (prévu pour une autre architecture comme armhf, comme par exemple https://dl.bintray.com/mpmc/deb/pool/t/tvheadend/tvheadend_4.3-1039~gd1c9d1f~raspbianjessie_armhf.deb ) pour qu’il prépare tout le nécessaire : création du user hts, du répertoire de paramétrage /home/hts/.hts avec les bons droits etc. Puis le désinstaller et remettre uniquement le strict nécessaire.

Pour installer ce .deb, il faut quelques dépendances, et forcer dpkg à accepter l’architecture :

sudo apt install libavahi-client3 libavahi-common3 libc6 libdbus-1-3 libpcre3 libssl1.0.0 liburiparser1 zlib1g
sudo dpkg -i --force-architecture --force-depends tvheadend_4.3-1039~gd1c9d1f~raspbianjessie_armhf.deb

Sauvegarder les fichiers nécessaires à la configuration du service :

sudo cp /etc/default/tvheadend /etc/default/tvheadend.bak
sudo cp /lib/systemd/system/tvheadend /lib/systemd/system/tvheadend.bak

Puis supprimer le paquet (sans mettre le paramètre –purge, de sorte qu’il ne supprime pas le répertoire /home/hts) :

sudo apt remove tvheadend

Remettre les fichiers sauvegardés :

sudo mv /etc/default/tvheadend.bak /etc/default/tvheadend
sudo mv /lib/systemd/system/tvheadend.bak /lib/systemd/system/tvheadend

Puis mettre un lien symbolique vers le binaire (en remplaçant ci-dessous le répertoire par celui où vous avez fait la compilation) :

sudo ln -s /home/monuser/tvheadend/build.linux/tvheadend /usr/bin/tvheadend

(pour faire plus propre, il serait mieux de déplacer cet exécutable ailleurs : dans /var/lib/tvheadend, par exemple)

Puis activer le service :

sudo systemctl restart tvheadend
sudo systemctl enable tvheadend

Configuration

Au premier lancement (http://serveur:9981), l’assistant propose par défaut de scanner les chaînes. Il faut cocher l’option pour les mapper sur des services.

S’il ne détecte pas l’adaptateur TNT (et ne propose que de l’IPTV), retour à la case configuration du driver.

Programmes TV

En standard, tvheadend est capable de récupérer les programmes TV diffusés par la TNT. Ça marche très bien pour voir les quelques émissions qui vont suivre, mais on n’a pas le programme des jours suivants, par exemple.

Pour cela, on peut utiliser XMLTV, et un « grabber ». Historiquement, j’utilisais le tv_grab_fr mais il consomme énormément de CPU sur une sheevaplug. tv_grab_fr_kazer est bien moins gourmand.

Il faut se créer un compte sur http://kazer.org/, choisir ses chaînes, et noter son « userhash ».

sudo apt-get install xmltv-util
tv_grab_fr_kazer --configure

Cela génère un fichier ~/.xmltv/tv_grab_fr_kazer.conf . A titre d’exemple, voici le mien (pour la plupart des chaînes françaises) :

userhash=xxxxxxxxx
channel=ART1.kazer.org
channel=BFM1.kazer.org
channel=EUR2.kazer.org
channel=FRA2.kazer.org
channel=FRA3.kazer.org
channel=FRA31.kazer.org
channel=FRA4.kazer.org
channel=FRA5.kazer.org
channel=ITL1.kazer.org
channel=LAC1.kazer.org
channel=M61.kazer.org
channel=NRJ1.kazer.org
channel=NT11.kazer.org
channel=RTL2.kazer.org
channel=TF11.kazer.org
channel=W91.kazer.org
channel=GUL1.kazer.org
channel=TLM2.kazer.org
channel=FRA1.kazer.org
channel=TMC1.kazer.org
channel=DIR1.kazer.org
channel=CAN2.kazer.org
channel=LCI1.kazer.org
channel=6TER.kazer.org
channel=HD1.kazer.org
channel=LEQ1.kazer.org
channel=NOL1.kazer.org
channel=NU23.kazer.org
channel=RMC2.kazer.org

Il faut ensuite copier ce répertoire .xmltv dans /home/hts (pour que le compte hts y ait accès).

Hélas, le site kazer.org n’a quasiment plus de programmes TV depuis plusieurs mois (à part France Television).

D’ici que ce soit résolu, j’ai mis en place un contournement pour avoir au moins le programme TV du moment : demander à Kodi de le récupérer plus fréquemment depuis la TNT (une fois par heure). Dans Configuration -> Channel/EPG -> EPG Grabber -> Over-the-air grabbers, mettre le cron suivant :

# Default config (02:04 and 14:04 everyday)
# 4 2 * * *
# 4 14 * * *
# En attendant que le grabber Kazer (XMLTV) marche mieux
10 * * * *

Icônes des chaînes TV

Générer les picons en suivant les instructions de https://github.com/picons/picons-source. Il y a deux options possibles :

  • « Service Reference » va générer des fichiers dont le nom correspond à la référence TNT de la chaîne (et donc tvheadend devrait les reconnaître automatiquement)
  • « Service Name » va générer des fichiers avec des noms compréhensibles par un être humain (et il faudra les mapper manuellement avec les chaînes correspondantes)

A l’époque où j’avais généré les icônes, TvHeaded ne reconnaissait par les fichiers de type « Service Reference », donc j’avais utilise « Service Name ». Mais il est possible que ça soit réglé depuis, notamment en utilisant la valeur « Force service type to 1 » de l’option « Picon name scheme ».

Placer les icônes générés dans /home/hts/picons (par exemple)

Dans la configuration de tvheadend, dans General->Base, mettre comme picon path : file:///home/hts/picons

Si vous avez utilisé des picons de type « Service Name », il faut configurer les picons pour chaque chaîne TV, en spécifiant le nom du fichier en picon:// (ex : picon://arte.png, qui doit correspondre à un fichier /home/hts/picons/arte.png)

Dans Configuration->Channel/EPG->EPG Grabber, vérifier que « Update channel icon » n’est pas coché.

Accès derrière un reverse-proxy

L’utilisation de websockets dans tvheadend est apparue quelque part entre les versions 4.0.8 et 4.3 (avant, il faisait du polling). Si vous mettez votre tvheadend derrière un reverse-proxy, il faut le configurer pour qu’il sache faire du reverse-proxy sur les websockets de tvheadend.

Dans mon cas, c’est Apache qui fait ce reverse-proxy.

sudo a2enmod proxy_wstunnel

Et, dans la configuration du site Apache :

ProxyPass /comet/ws ws://serveur:9981/comet/ws
ProxyPassReverse /comet/ws ws://serveur:9981/comet/ws
ProxyPass / http://serveur:9981/
ProxyPassReverse / http://serveur:9981/

A la fin, il faut redémarrer Apache :

sudo systemctl restart apache2

Utilisation depuis Kodi

Il faut installer le paquet kodi-pvr-hts, puis le configurer depuis l’IHM de Kodi.

La doc officielle : http://kodi.wiki/view/Tvheadend_PVR#Connecting_Kodi_to_Tvheadend.

Utilisation depuis un navigateur web

Le bouton « Watch TV » ne fonctionne pas, probablement parce que mes serveurs n’ont pas assez de puissance pour transcoder le flux dans un format que les navigateurs savent lire (webm par exemple).

Par contre, on peut demander de regarder une chaîne, en téléchargeant un fichier .m3u. Il vaut mieux l’ouvrir avec VLC, car Totem affiche par défaut (et mal) les sous-titres.

Utilisation depuis VLC

Plutôt que de télécharger un fichier .m3u pour chaque chaîne, on peut les donner toutes d’un coup à VLC, à partir duquel on peut ensuite zapper. Il suffit de lui demander d’ouvrir un flux réseau à l’adresse http://serveur:9981/playlist/channels.

2018-02-15

Docker and writing to stdout

On a Docker container, a process writing to stdout can get blocked. The Docker daemon is responsible for consuming the stream and if the daemon cannot consume the data fast enough (during a restart for instance) calls to print or even a logger.info can pause the execution until the buffer is cleared. By default the buffer size is 64 KB.

2018-02-06

Cleaning untrusted HTML markup

RSS and Atom feeds embed HTML markup that readers should display correctly. For web based readers, just including the HTML is very dangerous since an evil feed could easily embed Javascript code.

Mozilla made bleach, a nice library that has a strict whitelist of HTML tags and attributes that can safely be used within a web page.

2018-02-04

Safely loading XML files in Python

XML is a tricky format full of unexpected behavior. The only safe way to load untrusted XML files in Python is to do it via defusedxml.

This is what I use in Atoma to safely load RSS and Atom feeds.

2018-02-01

Gracefully stop Python Docker container

Some Python libraries like Waitress or my own Spinach expect to be stopped by raising a KeyboardInterrupt. This exception is raised automatically by Python when the interpreter receives a SIGINT.

On the other hand, Docker by default sends a SIGTERM to a container and waits 10 seconds for it to stop before killing it with a SIGKILL. To gracefully stop a Python process running in Docker, KeyboardInterrupt can be raised when receiving a SIGTERM:

import signal

def handle_sigterm(*args):
    raise KeyboardInterrupt()

signal.signal(signal.SIGTERM, handle_sigterm)

2018-01-25

New Python 3 email API

In the latest releases of Python the email package was redesigned. It is now more user-friendly, making the complicated topic of emails encodings easier to approach.

For instance the old API required internationalized headers to be decoded manually:

>>> import email
>>> data = b'Subject: Asperges pour le =?utf-8?q?d=C3=A9jeuner?=\n\n'
>>> m = email.message_from_bytes(data)
>>> m['Subject']
'Asperges pour le =?utf-8?q?d=C3=A9jeuner?='

The new API takes care of this automatically:

>>> import email
>>> from email import policy
>>> data = b'Subject: Asperges pour le =?utf-8?q?d=C3=A9jeuner?=\n\n'
>>> # For backward compatibility reasons, the policy needs
>>> # to be passed explicitly to use the new API
>>> m = email.message_from_bytes(data, policy=policy.default)
>>> m['Subject']
'Asperges pour le déjeuner'

2018-01-24

CPU microcode update

The microcode running on the CPU can be updated by either flashing the BIOS or injecting the code very early on boot.

The second approach is easy on Linux: the microcode gets copied into the initramfs that is run before booting the Linux kernel. As the initramfs runs early enough on boot, it is not too late to update the CPU microcode.

The Debian wiki explains how to do that, it boils down to:

apt install intel-microcode

After a reboot the update can be confirmed in kernel logs:

CPU1 microcode updated early to revision 0x20, date = 2017-01-27

2017-12-21

Script API Ispconfig création utilisateur

Je m’occupe d’un service d’hébergement destiné aux actions politiques / citoyennes / artistiques… Le serveur était plein de chez plein, ça tournait sans que je m’en occupe trop… J’ai décroché de ces geekeries pour d’autres occupations… Mais voilà Debian 7 était en fin de support, j’ai migré, fais du ménage… du coup il y a de nouveau de la place sur le serveur donc je ré-ouvre les portes.

De ce fait j’ai automatisé une tâche qui me prenait du temps jadis : la création des comptes (même si avec Ispconfig, c’est quand même clique clique). J’ai donc accouché d’un script PHP qui utilise l’API d’ISPconfig, on y passe en paramètre :

  • Nom d’utilisateur
  • Email de l’utilisateur
  • Sous domaine souhaité (ici : cequejesouhait.zici.fr)

Et il nous génère :

  • Création de l’utilisateur « client » pour l’accès au panel Ispconfig
  • Création du site web
    • Création d’une base de donnée et de son utilisateur
    • Création d’un compte FTP et SFTP pour l’accès au site web
  • Création d’un transfère mail (ici cequejesouhait@zici.fr vers l’email de l’utilisateur)

Le script est téléchargeable ici.

2017-12-20

Firewall : Mon script iptables

Je partage ici mon script de firewall iptable. C’est un script « à l’ancienne », dans du bash… ça fait le taf, mais rien de bien transsudant. En gros :

  • On ferme tout les ports sauf ceux qui nous intéresse (80, 25, icmp…)
  • Petite fonction pour ouvrir les ports mis en écoute sur Portsentry. Portsentry c’est un petit logiciel de sécurité en mode « pot de miel ». On met des ports en écoute mais il n’y a rien derrière. Dès que quelqu’un tente de s’y connecter (un robot ou quelqu’un de malveillant), ça bloque son IP dans le firewall pour un temps donnée. C’est radical si vous déplacez le port SSH du 22 vers autre chose et que vous mettez Portsentry à écouter (entre autre) sur le 22…
  • Mode maintenance du serveur web (lancé via ./iptables.sh maintenance). Il permet de mettre une page de maintenance pour tout le monde sauf pour vous (j’explique en détail dans cet article)

#!/bin/bash

## IP :
# Chez moi
MOI="A.A.A.A" 
# Mon serveur
SRV1="X.X.X.X"

IPT="/sbin/iptables"
PORTSENTRYCONF="/etc/portsentry/portsentry.conf"

export IPT PORTSENTRYCONF

function portsentryOpen() {
	. ${PORTSENTRYCONF}
	IFS=',' read -ra TCP_PORTS_SPLIT <<< "${TCP_PORTS}"
	for TCP_PORT in "${TCP_PORTS_SPLIT[@]}"; do 
		${IPT} -A INPUT -p tcp --dport ${TCP_PORT} -j ACCEPT
	done
	IFS=',' read -ra UDP_PORTS_SPLIT <<< "${UDP_PORTS}"
	for UDP_PORT in "${UDP_PORTS_SPLIT[@]}"; do 
		${IPT} -A INPUT -p udp --dport ${UDP_PORT} -j ACCEPT
	done
}

# Remise a 0
${IPT} -F
${IPT} -t nat -F

# Les connexions entrantes sont bloquées par défaut
${IPT} -P INPUT DROP
# Les connexions destinées à être routées sont acceptées par défaut
${IPT} -P FORWARD ACCEPT
# Les connexions sortantes sont acceptées par défaut
${IPT} -P OUTPUT ACCEPT


######################
# Règles de filtrage #
######################
# Nous précisons ici des règles spécifiques pour les paquets vérifiant
# certaines conditions.
 
# Pas de filtrage sur l'interface de "loopback"
${IPT} -A INPUT -i lo -j ACCEPT
 
# Accepter le protocole ICMP (notamment le ping)
${IPT} -A INPUT -p icmp -j ACCEPT
  
# Accepter les packets entrants relatifs à des connexions déjà
# établies : cela va plus vite que de devoir réexaminer toutes
# les règles pour chaque paquet.
${IPT} -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# ftp 
${IPT} -A INPUT -p tcp --dport 20 -j ACCEPT 
${IPT} -A INPUT -p tcp --dport 21 -j ACCEPT
# Préalabielemnt, pour pure-ftpd : echo "29700 29750" > /etc/pure-ftpd/conf/PassivePortRange ${IPT} -A INPUT -p tcp --dport 29700:29750 -j ACCEPT
# SSH
${IPT} -A INPUT -p tcp --dport 222 -j ACCEPT
# NTP
${IPT} -A INPUT -p udp --dport 123 -j ACCEPT
# smtp
${IPT} -A INPUT -p tcp --dport smtp -j ACCEPT
# Pour test bricolage smtp
${IPT} -A INPUT -p tcp --dport 587 -j ACCEPT
# imap(s)
${IPT} -A INPUT -p tcp --dport 143 -j ACCEPT
${IPT} -A INPUT -p tcp --dport 993 -j ACCEPT
# sieve
${IPT} -A INPUT -p tcp --dport 4190 -j ACCEPT
# dns
${IPT} -A INPUT -p tcp --dport domain -j ACCEPT
${IPT} -A INPUT -p udp --dport domain -j ACCEPT
# http
${IPT} -A INPUT -p tcp --dport http -j ACCEPT
# https
${IPT} -A INPUT -p tcp --dport https -j ACCEPT

# Maintenance 
if [ "$1" == "maintenance" ] ; then
	echo "Maintenance On"
	/usr/sbin/service lighttpd start
	${IPT} -A INPUT -p tcp --dport 81 -j ACCEPT
	${IPT} -t nat -A PREROUTING \! -s ${MOI} -p tcp --dport 80 -j DNAT --to-destination ${SRV1}:81
	${IPT} -t nat -A POSTROUTING -j MASQUERADE
elif [ -f "/var/run/lighttpd.pid" ] ; then
	echo "Maintenance Off"
	/usr/sbin/service lighttpd stop
fi

# Portsentry 
if [ -f ${PORTSENTRYCONF} ] ; then
	portsentryOpen ${IPT} ${PORTSENTRYCONF}
fi

# End
${IPT} -A INPUT -j LOG --log-prefix "iptables denied: "  --log-level 4
${IPT} -A INPUT -j REJECT

# Si vous utilisez fail2ban, relancé à la fin du script :
#/usr/sbin/service fail2ban restart

 

 

 

2017-11-21

nethserver, une distribution serveur

Votre vie numérique mérite bien plus que d’être dans les mains des GAFAM. Puisque c’est dit nous pouvons aller directement dans le vif du sujet :)

Nethserver est une distribution Linux basée sur centos7, crée à partir d’un Fork de SME Server par une société Italienne appelé nethesis, épaulée par une brillante communauté.

Centos est connu pour sa stabilité, en proposant par les sources de redhat, 10 années de mise à jour, ainsi que des milliers de logiciels par les dépôts de centos et d’epel. Si l’envie d’une version logicielle plus récente se fait nécessaire, les ‘software collections‘ vous permettront d’installer une nouvelle version sans remplacer la version par défaut.

Cela évite bien des maux de têtes aux administrateurs système.

La particularité de Nethserver est la modularité, qui lui permet de tenir une montée en charge, car vous pouvez imaginer une architecture de plusieurs Nethserver pour repartir la travail.

Vous configurez en effet votre serveur suivant vos besoins, l’installation est minimale, web et ssh. Après cela à vous de créer le ou les rôles.

Voici un exemple de ce que pourrait ressembler votre réseau et les différents modules:

 

  • Firewall (shorewall, DPI, web filter, multi wan)
  • Samba4 AD ou OpenLDAP (un seul identificateur pour tous les serveurs)
  • Serveur Fichier (samba, nfs)
  • Web (httpd, mysql, postgresql)
  • VPN
  • Backup
  • VOIP PBX
  • Nextcloud
  • Email et webmail
  • Modules communautaires
  • et j’en oublie :)

Nethserver est conçu autour d’un server-manager, qui ne cache pas les options, elle sont toutes exposées dans le menu. L’idée  est de diminuer le cout d’appropriation pour les non experts ou pour les administrateurs système qui viennent du monde Windows.

Cette Interface est en mode responsive pour être paramétrée à partir d’un téléphone mobile. Accessible par https, vous pourrez si besoin créer un certificat let’sencrypt facilement et surtout gratuitement.Nethserver est maintenant une distribution à porté internationale, traduit dans plusieurs langues, il est compté 7800 serveurs.

La documentation est un axe majeur de ce projet, vous pourrez retrouver plusieurs sources intéressantes.

Sans oublier le site communautaire sur une plateforme moderne (discourse)

Maintenant c’est à vous de jouer: lien de téléchargement de l’ISO

2017-09-20

Shellinabox à la place d’ajaxterm pour un accès web-SSH

J’avais précédemment écrit un article sur Ajaxterm : https://blog.mossroy.fr/2014/10/18/ajaxterm-acces-ssh-minimaliste-via-le-navigateur-apres-correction-css/

Mais je l’ai remplacé par Shellinabox, qui a bien plus de fonctionnalités.

L’objectif est pour moi toujours le même : avoir un accès SSH basique à mes machines, depuis à peu près n’importe où.

Shellinabox permet les mêmes choses qu’Ajaxterm, mais en mieux : il me parait plus rapide (il ne rafraîchit pas l’écran complet à chaque fois), permet de faire du copier-coller (un peu), et fonctionne sur Firefox OS (oui, je sais, ça n’intéressera pas grand-monde).

D’autre part, je n’ai jamais eu de réponse sur les corrections que j’avais proposées sur Ajaxterm, donc je suppose que le projet n’est plus maintenu.

Bugs de clavier sur les anciennes versions

Je l’ai testé la première fois sur Debian 8 Jessie, qui fournit la version 2.14. Hélas, il y avait des bugs assez gênants sur le clavier : certaines touches, notamment « ! » et « ) », ne marchent pas sur Firefox, (mais elles fonctionnent sur Firefox OS et Chromium). Cf https://github.com/shellinabox/shellinabox/issues/81.

La version 2.20 corrige les problèmes de clavier, mais n’est disponible que sur Debian 9 Stretch. J’ai essayé d’installer le paquet .deb de stretch sur jessie : pas possible à cause d’une dépendance  à openssl 1.1.0 (et jessie ne fournit que la version 1.0.0). J’ai essayé de tricher en mettant de liens symboliques vers la version 1.0.0 : pas possible.

Mais bref, après mise à jour de mon serveur en version Stretch, ces bugs ont disparu.

Configuration

Par défaut, Shellinabox est exposé en HTTPS sur le port 4200.

Mais, avant de l’exposer sur Internet, je le fais passer par mon reverse-proxy Apache, qui fait le chiffrement avec Let’s Encrypt, et ajoute une authentification (surveillée par fail2ban).

La configuration est classique :

<VirtualHost *:443>
        ServerName shell.flaht.eu
        ProxyRequests Off
        <Proxy *>
                Require all granted
        </Proxy>
        SSLProxyEngine on
        ProxyPass / https://localhost:4200/
        ProxyPassReverse / https://localhost:4200/
        SSLEngine on
        SSLCertificateFile    /etc/letsencrypt/live/mondomaine.tld/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/mondomaine.tld/privkey.pem

        # Login/mot de passe pour accéder
        <Location />
                AuthType Basic
                AuthName "Authentication required"
                AuthUserFile /etc/apache2/auth-file
                Require valid-user
        </Location>
</VirtualHost>

D’autre part, j’ai besoin dans certains cas que ce shellinabox soit également accessible par nginx. Voici la conf que j’utilise :

server {
        # SSL configuration

        listen 443 ssl;
        listen [::]:443 ssl;

        server_name mondomaine.tld;

        ssl_certificate    /etc/letsencrypt/live/mondomaine.tld/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/mondomaine.tld/privkey.pem;

        location / {
                proxy_pass https://127.0.0.1:4200;
                proxy_redirect default;
                auth_basic "Authentication required";
                auth_basic_user_file /etc/apache2/auth-file;
        }
}

Le copier-coller

Il est pas top, mais c’est toujours mieux que rien.

Si vous voulez copier du texte depuis le terminal, il faut sélectionner le texte et utiliser ctrl-C, plutôt que de faire clic-doit->copier (que je n’ai pas réussi à faire marcher).

Dans le sens inverse, pour copier du texte dans le terminal, le clic-droit-> « Paste from browser » fonctionne, mais est mono-ligne.

Afficher par défaut le « Soft Keyboard »

Sur Firefox OS (et a priori sur toutes les plateformes qui n’ont pas de clavier), avoir le « Soft Keyboard » peut être nécessaire pour accéder aux touches de clavier non alphanumériques (Echap, Tabulation etc).

Sauf que, pour l’activer, il faut faire un clic-droit… qu’on ne peut pas faire non plus si on n’a pas de souris.

Dans le code source, ils ont apparemment un peu pensé à ce genre de cas, en l’activant automatiquement sur les plateformes Apple, et quelques autres. J’ai proposé un Pull Request pour étendre ce mécanisme aux user-agents ayant les termes « Mobile » ou « Tablet » (en suivant les recommandations de Mozilla).

En attendant que quelqu’un de shellinabox se penche sur cette proposition, il est possible de le modifier manuellement, en surchargeant le fichier javascript de l’outil.

Ca se passe dans /etc/default/shellinabox, en rajoutant un paramètre dans SHELLINABOX_ARGS :

SHELLINABOX_ARGS="--no-beep --static-file=ShellInABox.js:/var/lib/shellinabox/ShellInABox-softkeyboardon.js"

Malheureusement, c’est tout le fichier javascript qu’on remplace par celui qu’il faut créer dans /var/lib/shellinabox. Ce n’est pas exceptionnel puisqu’on va perdre le bénéfice des mises à jour ultérieures de ce fichier. J’aurais préféré pouvoir injecter un bout de javascript, mais je n’ai pas trouvé de meilleur moyen à court terme.

J’ai récupéré le fichier javascript ShellInABox.js depuis le navigateur, et y ai simplement rajouté la ligne 311, en gras ci-dessous :

// Enable soft keyboard icon on some clients by default.
if (navigator.userAgent.match(/iPad|iPhone|iPod/i) != null ||
  navigator.userAgent.match(/PlayStation Vita|Kindle/i) != null ||
  navigator.userAgent.match(/Mobile|Tablet/i) != null) {
    this.softKeyboard = true;
}

 

2017-08-16

JAH-13 – De la gestion des certificats SSL

Journal de bord du capitaine :
Date : 20 avril 2012
Lieu : Perdu dans le cyber espace

Lorsque je me suis lancé dans l'auto-hébergement, une fois passée l'étape du matériel, une des premières choses que j'ai faite a été d'acquérir un nom de domaine. Ce n'est en aucun cas obligatoire mais, il faut bien l'avouer, avoir son propre nom de domaine, c'est quand même plus classe que d'utiliser son adresse IP et c'est surtout plus simple à retenir (surtout avec la généralisation des adresses IPv6). À l'époque, j'avais fait le choix de n'acheter mon nom de domaine que pour un an, me laissant ainsi la porte ouverte à un éventuellement changement de registrar. J'ai depuis conservé mon registrar d'origine par simplicité et par fainéantise d'en chercher un nouveau.

De plus Gandi propose deux services dont j'étais utilisateur : la gestion de sa zone DNS et la possibilité d'obtenir un certificat SSL. Il est vrai que quand on est comme moi un grand débutant ne pas avoir à s'occuper de ces services fait gagner du temps. Mais cette année au moment du renouvellement de mon nom de domaine je me suis dit qu'il était temps de m'occuper moi même de mon certificat SSL.

En soit, créer son certificat SSL n'est pas compliqué mais le point clé repose dans la signature. En effet, un certificat SSL sert à authentifier un serveur, mais quelle confiance pourrait-on accorder à un serveur qui dirait lui-même "Oui oui, je suis bien moi et pas un vilain serveur tiers qui se fait passer pour moi" ? Ce qui est le cas pour tout les certificats auto-signés. D'ailleurs, lors d'une tentative de connexion en HTTPS à un serveur avec un certificat auto-signé, certains bons navigateurs affichent un avertissement de sécurité.

Pour résoudre ce problème, il existe le principe de la chaîne de confiance : depuis le plus haut niveau des autorités de gouvernance d'internet il est possible de se faire certifier comme tiers de confiance afin de pouvoir délivrer des certificats qui ne provoqueront pas d'avertissement de sécurité. Ces tiers peuvent également avoir le droit de certifier d'autres sources de confiance, créant ainsi une chaîne de signature. En fait, la plupart des navigateurs, ou plus généralement des distributions, sont fournis avec un certain nombre de certificats racines, chaque certificat racine correspondant à une source de confiance ayant le droit de délivrer et de signer d'autres certificats. Ainsi, lorsqu'un client reçoit le certificat SSL d'un serveur afin d'établir une connexion, il va remonter la liste des signatures et regarder si l'autorité de plus haut niveau fait partie de sa base de donnée; dans le cas contraire, il affichera un avertissement de sécurité. En pratique, d'autres choses sont vérifiées telles que la date de validité du certificat etc .

Pendant deux ans, mon certificat SSL était donc fourni par Gandi. Ayant décidé de gérer ce certificat moi-même, la méthode la plus rapide aurait été de se faire rapidement un certificat auto-signé et l'affaire aurait été réglée mais, par curiosité intellectuelle, et aussi parce que je trouve ça plus propre, j'ai opté pour une méthode un peu différente : créer ma propre autorité de certification (dont le certificat serait auto-signé) me permettant ainsi de signer moi-même les divers certificats dont je pourrais avoir besoin. Ainsi, les utilisateurs de mon site web pourront installer mon certificat racine et naviguer sur mes différents domaines sans avertissement de sécurité.

Il existe de nombreux tutoriels sur comment se créer en trois commandes son propre certificat auto-signé mais les exemples complets de ce que je souhaitais faire ne sont pas nombreux. J'ai pu trouver mon bonheur dans GNU/Linux magazine Hors Série n° 50 : Spécial apache [1].. La création d'un certificat SSL reposant sur un système de requête puis signature par une autorité, un "dédoublement de personnalité" me sera donc nécessaire afin d'assumer les deux rôles.

La première étape consiste donc à créer un certificat auto-signé qui va me permettre de signer mes autres certificats, jouant ainsi le rôle d'autorité de certification. Une fois mon autorité de certification prête il ne me restait plus qu'à créer une requête pour mon nom de domaine. A ce stade plusieurs possibilités s'offraient à moi :

  • Un certificat par nom de domaine et sous-domaine
  • Un certificat "joker" ou "wildcard" valable pour mon nom de domaine et tout les sous-domaines possibles
  • Un seul certificat pour mon nom de domaine et définir mes sous-domaines comme nom alternatif [2].
J'ai choisi la troisième option qui était bien moins fastidieuse que la première et je trouve plus propre et sécurisée que la seconde. En effet, dans cette option, seuls les sous-domaines définis explicitement lors de la création de la requête sont couvert par le certificat. Il est même possible de définir des noms de domaines complètement différents comme exemple.org, exemple.com ou www.exemple.net pour un même certificat.

Pour définir un tel certificat, il suffit de modifier la configuration d'openSSL or puisque je dois faire office à la fois d'autorité de certification et de client il ne faut pas oublier de créer un second fichier de configuration pour faire les modifications. Ainsi, selon le rôle à endosser, il suffira d'utiliser tel ou tel fichier de configuration.

Une fois le fichier de configuration modifié pour définir les noms alternatifs, il faut émettre une requête avec la configuration client et la signer à l'aide de l'autorité de certification précédemment créée. Ensuite, il n'y a plus qu'à modifier les configurations des applications utilisant le chiffrement SSL telles que apache ou ejabberd pour leur indiquer où se trouve ce nouveau certificat à utiliser.

Afin qu'un navigateur n'émette pas d'avertissement de sécurité lors d'une connexion à un serveur dont le certificat a été signé par mon autorité de certification, il faut rendre accessible son certificat racine. J'ai donc pour cela simplement ajouté un lien symbolique depuis le répertoire racine de mon site vers le certificat racine. En se connectant avec son navigateur à ce certificat, il sera proposé à l'utilisateur d'enregistrer ce certificat en reconnaissant sa capacité à authentifier certains types de serveurs comme par exemple un serveur web ou un serveur de courrier. En pratique, un utilisateur peut donner une plus ou moins grande visibilité à un certificat racine en l'enregistrant soit dans chaque application ou bien au niveau système pour qu'il soit globalement accessible.

Pour vérifier la bonne prise en compte du nouveau certificat, et vérifier l'installation du certificat racine, il suffit de se connecter en HTTPS au serveur sur lequel il est installé et de regarder les détails du certificat.

Conclusions :

  • La création et la gestion de certificats SSL est une partie importante de la sécurité d'un serveur, trop souvent expédié à la va-vite par un certificat auto-signé, alors qu'il suffit de creuser un peu le sujet pour faire quelque chose de propre et proposer un service de qualité à ses utilisateurs.
  • Faire les choses proprement ne requiert pas forcément de passer à la caisse, il existe d'ailleurs d'autres solutions que celle que j'ai choisie afin de créer des certificats qui ne généreront pas d'alerte de sécurité par exemple en utilisant l'autorité de certification collaborative CAcert [3].

Prochaine entrée dans le journal : De la mise en place d'un serveur de courriels complet

Notes

[1] Malgré son âge beaucoup d'articles sont encore d'actualité et il est toujours disponible ici .

[2] Les noms alternatifs du sujet (Subject Alternative Name) sont en fait une extension de x509 (le standard des clés publiques des certificats) permettant d'associer plusieurs valeurs à un seul certificat de sécurité.

[3] Depuis firefox 39.0 il n'est plus permis d'importer le certificat racine de CAcert car ce certificat auto-signé utilise l'algorithme MD5 qui est considéré comme obsolète.

2017-08-09

Openmailbox modifie son offre

En soit, une telle nouvelle ne m'intéresse pas car mon mail est auto-hébergé. Toutefois, nombreux sont ceux qui utilisent ce service. Nombreux sont ceux aussi à avoir été pris de cours lorsque le service a sans prévenir modifié son offre, amputant au passage l'offre gratuite de choses de base comme l'accès POP/IMAP. Certains semblent avoir du mal à digérer cela. A mon sens, ça pointe autre chose : un service mail ne peut pas à la fois être simple, gratuit, pérenne, éthique et efficace.

Les conditions générales d'utilisation ne sont jamais lues car souvent illisibles, faut bien l'avouer. Ici coup de bol, elles sont simples et claires : https://www.openmailbox.org/tos. Malheureusement, c'est pas pour ça qu'elles sont plus lues. Il existe bien une offre gratuite mais quoi qu'il arrive, OpenMailBox se décharge des conséquences des aléas techniques sur leurs utilisateurs, utilisateurs qui sont au passage seuls responsables de leurs données.

Je peux comprendre qu'une annonce aussi brutale soit (très) mal perçue mais il faut quand même remettre les choses à leur place. Un service gratuit peut s'arrêter du jour au lendemain sans préavis. C'est quasiment ce qui est arrivé là et c'est une chose à prendre en compte lorsque l'on s'inscrit. Il est de la responsabilité des utilisateurs de prendre les mesures adéquates pour faire face à ce qui peut survenir et qui est prévisible (encore une fois, c'était tout à fait prévisible à plus ou moins longue échéance). Donc la moindre des choses, c'est de sauvegarder ses données ailleurs périodiquement. La bonne pratique serait d'en conserver au moins une copie locale à jour. Cela est aussi utile en cas de problème technique indépendant de la volonté du tiers qui propose le service.

Chose amusante, car sans conséquences sur l'instant, ils sont nombreux à migrer vers un autre service gratuit. A ceux là, je tiens juste à rappeler que ça ne change rien au problème et qu'ils gardent cette épée de damoclès au dessus de la tête s'ils ne se sentent pas plus responsables de leurs données. Le prochain arrêtera peut être complètement son service sans possibilité de récupérer ses données.

Chose plus inquiétante, ceux qui se plaignent sont majoritairement des utilisateurs du service gratuit et ils se comportent comme des clients pour qui tout est dû et qui balaient leurs propres obligations d'un revers de main (envers eux même et envers le tiers qui propose le service). Je ne trouve pas ça sain comme approche. Dans les commentaires que j'ai pu lire, je vois qu'ils sont nombreux à annoncer vouloir migrer vers l'offre gratuite de net-c. Si vous vous trouvez dans ce cas là, je n'ai pas regardé dans le détail mais c'est probablement un très bon choix. Toutefois, en utilisant leur service gratuit, les conditions d'utilisation (point 12.1) stipulent par exemple et très clairement que lorsque vous accédez à leur service, vous ne devez pas bloquer leurs publicités (les CGU sont un peu plus consistantes que celles d'OpenMailBox mais elles restent lisibles, ne vous privez pas). Je serais curieux de connaître la proportion d'utilisateurs qui tiendra compte de ce genre de détail avant de souscrire... Et qu'est-ce qui empêche le service en question de bloquer l'accès à leur site pour les utilisateurs gratuits ne respectant pas cette clause ?

2017-08-06

Surveiller ses services auto-hébergés avec UptimeRobot et les SMS de Free Mobile

Être prévenu par SMS si son site auto-hébergé a des soucis, c’est quand même la classe, non ?

Ca permet d’être tout de suite au courant en cas de coupure d’accès Internet, ou d’électricité, ou d’un autre problème technique. Ou parfois des erreurs de configuration qu’on n’aurait pas soupçonnées ;-)

Et une manière de le faire facilement (et gratuitement) est d’utiliser UptimeRobot et les APIs de SMS de Free Mobile.

  + 

Pour tout ce que je décris ci-dessous, un compte gratuit chez UptimeRobot est suffisant. La version payante peut permettre d’avoir des contrôles plus fréquents (c’est jusqu’à 5 minutes en version gratuite, ce qui me parait largement suffisant).

Configurer ce qu’il faut monitorer

On peut vérifier si un port est accessible, ou si une machine peut être pingée (et d’autres choses : regardez sur leur site).

Mais le plus intéressant est de vérifier si une URL répond, et si la réponse contient une chaîne de caractères censée y être.

Configurer la manière d’être alerté

On peut être alerté par email, Twitter, et plusieurs autres moyens (qui peuvent être combinés).

Ils proposent notamment un « email-to-SMS », qui fonctionne avec certains opérateurs, mais Free n’est pas dans la liste.

On peut être alerté directement par SMS (n’importe quel opérateur), mais il faudrait avoir un compte payant pour cela.

Heureusement, UptimeRobot permet aussi d’appeler une URL (« Web-Hook »), et c’est ce qu’on va utiliser.

Évidemment, il faut d’abord avoir activé l’API de SMS dans votre console Free Mobile.

Dans l’interface d’administration de UptimeRobot, on peut créer un « alert contact » de type Web-Hook, et définir une URL du type :

https://smsapi.free-mobile.fr/sendmsg?user=12345678&pass=xxxx&msg=UptimeRobot%20indispo%20*monitorFriendlyName*%20(*monitorURL*)%20*alertTypeFriendlyName*%20*alertDetails*&

(en remplaçant le user id et le mode de passe par ceux issus de votre console de gestion Free).

Et c’est tout ! Nous voilà avec du monitoring simple et gratuit. J’utilise ça depuis quelques mois et ça marche très bien.

Et les statistiques d’accès ?

Vos statistiques d’accès peuvent être faussées par ces requêtes. Ca dépend si elles fonctionnent via du javascript (type Google Analytics, ou Piwik en mode javascript) ou via les logs de votre serveur HTTP (type Awstats ou Piwik en mode logs ou image). Ce n’est que dans le second cas qu’elles sont affectées.

Pour éviter ce biais, il est possible d’ignorer les requêtes de UptimeRobot via leur User-Agent (qui contient « UptimeRobot ») ou leurs IP sources (cf https://uptimerobot.com/locations.php).

Et pourquoi ne pas auto-héberger le système de surveillance ?

Ben oui… sauf que le serpent se mort la queue si vous mettez tout au même endroit. S’il y a une coupure de courant ou d’Internet, vous ne risquez pas d’être alerté.

Par contre, si vous hébergez de système de contrôle ailleurs (chez un copain, par exemple), ça peut marcher.

Apparemment, le projet phpservermonitor fait le nécessaire. Ils supportent a priori en standard l’envoi de SMS chez Free Mobile, à partir de la version 3.2.0. Mais je n’ai pas eu l’occasion de tester.

 

Chiffrer simplement un fichier texte avec Vim

Bonjour à tous,

Après 7 ans de bons et loyaux services, j'ai enfin décidé de réinstaller mon serveur perso. Oui, vous avez bien lu, je n'avais jamais changé de version de Debian (Lenny) depuis 2010, date d'installation de mon serveur à la maison (c'est pas bien). Bref, ça m'a donné l'occasion de remettre le nez dans pas mal de choses, en particulier remettre en place un nouveau fichier texte chiffré avec Vim. C'est une astuce peu connue que je voulais partager avec vous.

Vimlogo.svg.resized.png

J'utilise les fichiers vim chiffrés depuis 2010. À l'époque, le mode de compression était le format zip, peu fiable. Aujourd'hui, il est possible (et fortement recommandé) de chiffrer avec la méthode blowfish2. Cette méthode est supportée depuis la version 7.4 de vim, ça fait déjà un petit bout de temps.

Bon, fini le bla bla, voici comment on chiffre un fichier rapidement et simplement.

1. Mise en place

On commence par ouvrir un nouveau fichier normalement avec vim

Ensuite on va choisir la méthode de chiffrement avec la commande :setlocal cm=blowfish2


Enfin, on chiffre avec la commande :X, suivi de la clé de chiffrement

Une fois fait, on peut sortir du fichier normalement avec un :wq.

2. Lecture

Et là où c'est super, c'est que pour relire le fichier, il suffit juste de l'appeler normalement avec la commande vim (exemple : vim /tmp/secret). Vim vous indiquera alors la méthode de chiffrement utilisée :

Vous pouvez modifier votre fichier et l'enregistrer normalement avec :wq, plus besoin de passer par du :X, vim chiffrera systématiquement votre fichier à l'enregistrement.

3. Avertissement

Attention, si vous vous trompez de mot de passe pour ouvrir le fichier, vous aurez un écran de ce type :

N'enregistrez surtout pas ce fichier en l'état, sinon vous perdrez vos données. Sortez en prenant soin de faire :q! et retournez-y en tapant le bon mot de passe.

Vous voyez, c'est tout simple !

2017-07-28

Mon adresse email est inhabituelle

Cela fait 10 ans cette année que je gère mon mail comme un grand. C'est super d'avoir ses adresses mail personnelles sur son propre serveur mail. Je peux en créer autant que je veux dessus, avec n'importe quel nom, du plus drôle au plus court en passant par des choses plus passe partout. Je ne risque pas en tout cas de ne pas pouvoir en créer une car une autre personne l'a déjà prise. Pour les quelques adresses créées, je suis généralement resté sur des choses courtes ou assez évocatrices en fonction des besoins. Je peux par exemple décider de créer une adresse en cas d'inscription à une liste de diffusion ou quand je sais que je risque de me faire spammer lorsque je dois quand même laisser une adresse valide quelque part. Dans ce dernier cas, je pourrais aussi me créer des adresses jetables ailleurs.

La contrepartie, c'est que mon nom de domaine est ce qu'il est d'une part, et qu'il est surtout inhabituel pour le quidam dans une adresse mail. En soit, il n'est pas trop compliqué car composé de deux mots existants intercalés par un tiret et qu'il est enregistré sur le TLD .fr . Toutefois, il est devenu de plus en plus rare de voir des adresses mail autres que celles fournies par gmail, yahoo et les FAI en général. Non content de présenter un problème de manque de diversité (la centralisation est énorme sur les services mail en général), cela renforce l'idée qu'une adresse mail doit forcement se terminer par un truc comme gmail.com, yahoo.fr, orange.fr, etc... Cela me pose parfois un problème lorsque je donne une adresse personnel de vive voix. Une fois l'étonnement de mon interlocuteur passé, vient le moment où il faut bien épeler le truc. C'est là qu'on peut avoir l'impression d'agacer alors même que ce n'est pas le but. Est-ce que je peux leur en vouloir individuellement ? Non bien entendu. L'environement global conduit massivement vers cela, c'est tout.

Fut un temps, je donnais encore une adresse yahoo dont les mails étaient redirigés vers l'une des boîtes mail sur mon serveur pour éviter de gêner mon monde sans doute. J'ai passé le cap et maintenant, je donne directement l'adresse sur mon domaine. Si c'est pénible, ce n'est pas mon problème. Moi, c'est l'adresse que j'utilise et que je consulte et ce n'est pas moins une adresse mail qu'une autre avec un nom de domaine plus commun. Une lubie de geek ? En partie au début probablement mais aujourd'hui non, je vois les choses de manière plus simple. L'outil est assez ouvert pour permettre à quiconque de le faire (comprendre "quiconque" par le fait que c'est techniquement possible et qu'il n'y a pas d'interdiction à le faire) et je pense que je suis la personne la mieux placée pour gérer mes serveurs mail. Finalement, mes adresses ne sont pas plus compliquées que celles proposées par les gros services de mail mais la complexité ne se retrouve pas au même endroit.

2017-07-25

Twitter2mastodon

J’ai mis en ligne un script Python qui permet de recopier les posts public d’un compte Twitter sur Mastodon. Ca s’appelle twitter2mastodon, c’est sous licence libre GPL et c’est hébergé chez framagit.

Du coup, j’en ai profité pour introduire le clone de Donald Trump sur Mastodon :D

J’ai aussi ajouté une copie de CanardPCHardware

 

Related Posts:

2017-06-14

Nouvelle instance mastodon : social.jesuislibre.net

J’ai installé ma propre instance de Mastodon : https://social.jesuislibre.net

Le tutoriel écrit en français par Angristan est limpide et je n’ai pas eu de soucis pour l’installer sur Debian 9.
Le seul soucis est la config Apache qui n’est documentée proprement.

Ça tourne au poil et rapidement sur un petit NUC en auto-hébergement.
Ça m’a aussi permis d’utiliser la v1.4.1 quand Framapiaf est toujours en v1.3.2 (je ne sais pas pourquoi)

Je suis moins satisfait de la fédération. J’ai découvert l’envers du décors :
– le fil global que contient que les posts publics des personnes suivies par des comptes locaux. Donc si t’es seul sur ton instance. T’as juste rien à par les gens que tu suis déjà…
– la recherche de personnes ne se fait que parmi les personnes connues par ton serveur (donc suivies par des comptes de ton serveur). Donc si t’es seul, tu ne trouves que les personnes que tu suis déjà.
– sur la page de profil d’un compte, tu ne vois que les billets qui sont déjà arrivés sur ton serveur. Donc, pour un nouveau compte, tu ne vois rien.
– la liste des abonnés affichés sur le profil d’un compte distant ne comptabilise que les abonnés du serveur local. Donc si t’es tout seul sur ton serveur, les profils externes n’ont qu’un abonné. Toi. Bonjour la découverte.
– la recherche par htag ne fonctionne que sur les posts recus par ton serveur local.
– les commentaires à des messages émis par des comptes d’autres serveur ne se sont pas visibles.

Finalement, on retrouve presque les mêmes limitations que sur Diaspora, l’autre réseau décentralisé a-centré. Ces limitations poussent les nouveaux à s’inscrire sur une grosse instance pour avoir du contenu. Et donc nuisent à la décentralisation.

C’est dommage car si on clique sur le profil d’un utilisateur, on arrive sur la page web du profil sur son serveur d’hébergement. Et là, on retrouve tout son historique et ses abonnés. C’est dommage que l’interface de mastodon ne puisse pas récupérer ces infos d’elle même.

Ca permettrait également de partager (retweeter booster dans le jargon de mastodon) un post ancien que le serveur n’a jamais reçu.

Related Posts:

2017-05-16

Du bon usage de la sauvegarde de donnée -2-

dsc07744.jpg La sauvegarde de données est devenue aujourd'hui indispensable, on ne le répétera jamais assez !
Pourtant un grand nombre de gens ignorent parfois volontairement cette corvée, prétextant un manque de temps…
Choisissez !

  • Quelques minutes à passer pour la mise en place, et penser à mettre en marche le processus de temps à autres,
  • Ou alors Tout perdre… photos et montages vidéos, documents, mails, travaux divers ayant nécessités de longues heures de travail…

J'ai choisi mon camp !
… Pourtant je continue de m'inquiéter…Que se passerait-il si j'étais victime d'un sinistre, étant donné que mon original et mes sauvegardes sont situées au même endroit !
Qui plus est, c'est bien beau d'auto-héberger ses sites, mais en cas de pépin, les sites disparaitraient eux-aussi !

Bref, J'ai la ceinture et les bretelles, je m'en vais ajouter le parachute en mettant en place une sauvegarde distante, dans un second lieu…
Si la première méthode décrite est ultra simple et se doit d'être le minimum syndical à appliquer pour tous, la méthode qui suit s'applique aux geek et aux curieux un poil paranoïaque…

Sauvegarde distante synchronisée


1 - Principe :

Mes ordinateurs (serveur, bureau, etc) depuis le site A contactent automatiquement tous les jours un ordinateur de sauvegarde (si possible un vieux bouzin de récup) sur le site B, pour lui demander de s'allumer.
Ensuite ces ordinateurs poussent vers l'ordi de sauvegarde une synchronisation de type rsync, similaire au billet précédent.
Une fois l'opération terminée, l'ordinateur de sauvegarde s'éteint.
Le tout silencieusement, c'est à dire sans qu'on s'en soucie.
Bien sûr je continue la sauvegarde locale sur disque dur externe… suffit juste d'y penser.

Pour faire tout cela nous aurons besoin de :

  1. Un vieil ordi avec suffisamment de capacité en disque dur, installé dans un coin quelque part ou vous avez confiance (la famille, les amis…).
  2. Un routeur capable de faire du WOL (Wake On Lan).
  3. Évidemment une connexion internet sur les deux sites.


2 - Le routeur :

J'ai choisi un Routeur Linksys/Cisco modèle WRT54GL
Le « L » c'est pour Linux, qui à donc la particularité d'être prévu pour être reprogrammé avec des Firmwares alternatifs.
On va donc y coller le Firmware DD-WRT qui propose des fonctions WOL intéressantes !

Comment flasher votre WRT54GL en DD-WRT

Le routeur neuf est en configuration d'usine, donc avec un Firmware Linksys.
On aura besoin de télécharger le Firmware DD-WRT « mini généric » stable [1] depuis la page http://www.dd-wrt.com : dd-wrt.v24_mini_generic.bin
Flasher le firmware doit être fait avec une connexion stable uniquement par câble réseau.
dsc07749.jpg

  1. Brancher le routeur sur le secteur.
  2. Ne pas mettre le petit adaptateur d'interrupteur sur le câble Alim !
  3. Brancher le câble RJ45 livré, entre le routeur et un ordinateur.
  4. Accédez à l'interface web Linksys avec votre navigateur, 192.168.1.1 dans la barre d'adresse

Nom d'utilisateur : laisser vide
Mot de passe : admin

  • Aller au menu Administration
  • Puis le sous-menu Firmware Upgrade.
  • Cliquer sur le bouton Parcourir et sélectionner le fichier dd-wrt.v24_mini_generic.bin.
  • Cliquer sur le bouton « Upgrade » et arrêter de respirer pendant 2 minute minimum !

/!\ N'arrêtez pas votre ordinateur, ne fermez pas votre navigateur, ou n'éteignez pas le routeur pendant cette phase !
Le navigateur envoie le fichier au routeur, qui se charge alors de flasher le firmware dans son électronique…
La led « power » se met à clignoter et au bout de quasi 1 minute, la page va se rafraichir et inscrire que l'opération s'est bien déroulée et invite à cliquer sur « continue »…
NE PAS CLIQUER DESSUS !
Attendre encore, la led « power » n'a en effet pas terminé de clignoter…
Quand elle aura terminé, le routeur aura terminé de redémarrer et sera enfin prêt !

  • Pour jouir de son routeur DD-WRT, rendez-vous à la même adresse, 192.168.1.1

Nom d'utilisateur : root
Mot de passe : admin

  • L'opération peut très bien se terminer ici, puisque l'option qui nous intéresse, dans le menu Administration -> WOL est bien présente.


  • Pour ceux qui voudraient bénéficier d'autres fonctionnalités, il est possible de charger ensuite une autre version plus complète de DD-WRT

Voir le wiki pour les différences entre les versions

J'ai choisi la dd-wrt.v24_std_generic.bin.

  1. Pour la mise à jour, on va d'abord, par sécurité activer l'option Boot_wait depuis le menu Administration. Ceci sera utile en cas de flashage raté.
  2. Aller au menu Administration
  3. Puis le sous-menu Firmware Upgrade.
  4. Cliquer sur le bouton Parcourir et sélectionnez le fichier dd-wrt.v24_std_generic.bin.
  5. Cliquer sur le bouton « Upgrade » et arrêter de respirer pendant le décompte de 300 secondes, DD-WRT s'occupe de tout !

/!\ N'arrêtez pas votre ordinateur, ne fermez pas votre navigateur, ou n'éteignez pas le routeur pendant cette phase !

3 - WOL en local :

C'est très simple et doit fonctionner sans problème !

  • Aller au menu Administration > WOL

Entre l'adresse MAC de l'ordinateur à mettre en marche, ajouter un nom et l'adresse IP broadcast du réseau qui termine donc par 255.

  • Cliquer « Wake Up » et hop, le PC s'allume !

WOL04.png

  • À noter que WOL en local fonctionne très bien sans ce routeur spécial, ni aucune config particulière d'un autre routeur, avec la simple commande :
wakeonlan adresse-MAC

Après bien sûr avoir installé wakeonlan.
On peut aussi utiliser l'interface graphique gwakeonlan pour effectuer la même opération.

sudo apt-get install gwakeonlan wakeonlan


4 - WOL à travers internet :

Ici ça se complique un peu plus…
Pour allumer l'ordi à travers internet, on va envoyer sur internet un packet magique sur l'adresse MAC de l'ordi vers l'IP publique fournie par son FAI.
Le routeur le reçoit et doit l'envoyer à l'ordi qui nous intéresse, identifié normalement par une adresse IP locale qui lui sera attribué seulement quand l'ordi sera allumé… Mince alors !! Comment qu'on peut faire alors ??
Bon, d'abord on va faire suivre le packet magique sur les ports UDP 7 à 8 vers une IP bidon, mais qui fait partie de votre réseau local ![2]

  • Menu NAT/Qos > Port Range Forwarding

WOL02.png
Puis, on ajoute et exécute une commande dans le routeur.

  • Menu Administration > Commands
ip neigh change la-même-IP-bidon lladdr adresse-MAC nud permanent dev br0
ip neigh add la-même-IP-bidon lladdr adresse-MAC nud permanent dev br0


WOL03.png

Ce qui va avoir pour effet d'associer l'IP à l'adresse MAC.
Ainsi le packet magique magique entrant sur le port 9 est envoyé à l'IP bidon, et comme le routeur sait que l'IP bidon correspond à l'adresse MAC de l'ordi à démarrer, ben hop, l'ordi s'allume !
Une fois l'ordi démarré, il pourra prendre l'IP qu'on veut, fixe ou attribuée par le DHCP.

  • La commande pour parvenir à allumer le PC depuis un autre ordi sur internet : (cependant elle doit marcher en local aussi !)
wakeonlan -i IP-Publique -p 9 adresse-MAC

On peut aussi s'aider de service en ligne comme celui-ci : http://wakeonwan.webou.net/

Enfin, associer l'IP publique à un nom de domaine grâce à No-IP sera bien plus pratique, surtout si l'IP en question est soumise à renouvellement toutes les 24h, comme c'est encore souvent le cas.

5 - WOL à travers internet et une BOX Adsl :

Précision donc, que tout ces tests ont fonctionnés avec un Modem Adsl !
Avec une BOX Adsl, il faut prendre en compte le fait que cette BOX est en fait un routeur, à qui il faut aussi indiquer que le paquet magique reçut par l'IP publique doit aller à un ordi spécifique du réseau local.

  • Mais alors pourquoi ne pas avoir utilisé la BOX Adsl pour faire le WOL ???

Bien que ces box soient des routeurs, ceux-ci sont bridés et dépouillés de nombreuses fonctionnalités par le FAI… donc on oublie le WOL ou la possibilité de diriger le paquet magique vers l'adresse broadcast.

Donc il suffit d'ajouter dans la machinbox une redirection de port UDP 7 à 9 vers l'IP du routeur WRT54GL, qui prendra donc le relais.
Pour le coup il vaut mieux que le DHCP soit désactivé sur le routeur WRT54GL, et laisser le DHCP de la machinbox gérer le réseau local, tout en lui réservant l'IP fixée dans le routeur WRT54GL.
Et si vraiment ça veut pas, ou que la fonction n'est pas possible, on peut toujours déclarer en DMZ l'IP du routeur Linksys dans la BOX Adsl… À condition toujours que la fonction soit disponible.
.
wol.png

6 - Configuration de l'ordinateur distant :

installation de base d'une distribution Debian Squeeze depuis le CD netinstall.
installation des paquets lm-sensors openssh-server hddtemp rsync less ccze.
Tester et valider qu'on arrive bien à se connecter sur la machine en ssh via l'IP publique…

7 - Script de Synchronisation :

Maintenant qu'on sait allumer l'ordi distant, il va falloir lui envoyer les données à sauvegarder.
Je fais ça avec rsync par dessus ssh sur le PC qui va pousser les data vers le PC distant :

#!/bin/sh
######################################################################
# Synchronisation des data poussées depuis Debianbox vers BackupData #
######################################################################
# Allume L'ordi distant BackupData | attend 30 secondes ##############
# Synchronise les dossiers | Arrête L'ordi distant BackupData ########
# Envoie un E-mail avec le log #######################################
######################################################################

wakeonlan -i backupdata.dyndns.org -p 9 XX:XX:XX:XX:XX:XX
sleep 30s

date >> /var/log/SYNCHRO-BackupData.log
echo "\n" >> /var/log/SYNCHRO-BackupData.log

# synchro des dossiers :

rsync -e ssh -avz --delete /home/makoto/ root@backupdata.dyndns.org:/home/makoto >> /var/log/SYNCHRO-BackupData.log

# Arrêt du PC BackupData

echo "\n" >> /var/log/SYNCHRO-BackupData.log
date >> /var/log/SYNCHRO-BackupData.log
ssh root@backupdata.dyndns.org 'halt'
# ajoute une séparation pour la prochaine concaténation
echo "\n---------------------------------------------------------------------------------------------------------------------------------------" >> /var/log/SYNCHRO-BackupData.log

# Envoie d'un email avec le log

mutt -s "Synchronisation depuis Debianbox vers BackupData" adresse@email.com -a /var/log/SYNCHRO-BackupData.log < /chemin/emailmessage.txt
  • Pour que le script ne demande pas le mot de passe root à chaque ligne,

Créer une paire de clés publiques/privées sur le PC qui va pousser les data vers le PC distant :

ssh-keygen -t rsa

Laisser le chemin par défaut et laisser la demande de passphrase vide.
Copier la clé publique sur le PC distant :

ssh-copy-id -i /root/.ssh/id_rsa.pub "-p N°-de-port root@backupdata.dyndns.org"
  • Ne pas oublier de créer le fichier /chemin/emailmessage.txt

Mission accomplie !

8 - Conclusion :

Reste à planifier le script en automatique (crontab) pour une exécution régulière, ou une exécution ponctuelle en fonction de sa manière à produire du contenu; Ceci afin de ne pas laisser un delta de différences trop important entre l'original et la sauvegarde, sous peine de se retrouver avec une synchronisation très longue à faire, l'Upload Adsl étant ce qu'il est…
Et bien sûr à apporter l'unité centrale de l'ordinateur chez vos connaissance et bidouiller un poil leur réseau…

Suite

Ressources :

http://doc.ubuntu-fr.org/wakeonlan
http://www.crack-wifi.com/tutoriel-flash-wrt54gl-avec-firmware-dd-wrt.php
http://www.dd-wrt.com/wiki/index.php/DD-WRT_Docu_%28FR%29
http://www.philten.com/wol-livebox/

Notes

[1] Et uniquement celui-ci, pour un routeur sorti d'usine avec un firmware Linksys résident donc !

[2] J'ai bien pensé à utiliser l'adresse de broadcast pour la redirection de port, mais même si la saisie est bien prise en compte, le WOL ne fonctionne pas

2017-05-10

Debian 8.8

Mise à jour pour la version stable de Debian qui passe à la version 8.8

Vous trouverez ici la liste des changements en français. Comme d’habitude, principalement des corrections de bugs et de sécurité.

A noter la suppression du paquet Owncloud car il était obsolète. Il faut maintenant l’installer à la main (voir passer à Nextcloud)

N’oubliez pas que pour bénéficier de la mise à jour du noyau, il faut redémarrer la machine.

 

Related Posts:

2017-03-29

Installation d’OpenMediaVault 3 sur Debian 8 comme interface web d’administration

OpenMediaVault est le pendant Debian de FreeNAS, par l’un de ses développeurs d’ailleurs, mais c’est une autre histoire. Il s’installe habituellement via un ISO, pré-installé sur Debian, mais nécessite de formater intégralement le support de destination, ce qui est un poil gênant quand on envisage un dual boot avec Windows, vous vous en doutez.

Alors voyons plutôt comment installer OMV sur une Debian 8 classique glanée sur le site officiel.

Installation

Connectez vous en SSH sur votre machine, passez en root et ajoutez le dépôt OMV en exécutant :

cat <<EOF >> /etc/apt/sources.list.d/openmediavault.list
deb http://packages.openmediavault.org/public erasmus main
# deb http://downloads.sourceforge.net/project/openmediavault/packages erasmus main
## Uncomment the following line to add software from the proposed repository.
# deb http://packages.openmediavault.org/public erasmus-proposed main
# deb http://downloads.sourceforge.net/project/openmediavault/packages erasmus-proposed main
## This software is not part of OpenMediaVault, but is offered by third-party
## developers as a service to OpenMediaVault users.
# deb http://packages.openmediavault.org/public erasmus partner
# deb http://downloads.sourceforge.net/project/openmediavault/packages erasmus partner
EOF
export LANG=C
export DEBIAN_FRONTEND=noninteractive
export APT_LISTCHANGES_FRONTEND=none
apt-get update
apt-get --allow-unauthenticated install openmediavault-keyring
apt-get update
apt-get --yes --force-yes --auto-remove --show-upgraded  --no-install-recommends --option Dpkg::Options::="--force-confdef" --option DPkg::Options::="--force-confold" install postfix openmediavault

Configuration initiale

Maintenant que tous les paquets sont installés, on va appeler le script d’initialisation :

omv-initsystem

OpenMediaVault va à présent redéfinir la configuration d’un certain nombre de logiciels et de services, en se basant sur ce que l’interface permet de modifier.

Connectez vous sur :

http://<serveur>

avec l’identifiant admin et le mot de passe openmediavault.

Votre utilisateur SSH perdra le droit de se connecter dès la première application de configuration depuis l’interface web. Allez sur l’interface web, dans « Gestion des droits d’accès / Utilisateur », ajoutez le groupe « ssh » aux utilisateurs que vous souhaitez.

Sur le même principe, OMV redéfinit en partie la configuration de la machine. Allez dans « Système / Réseau / Interface » et ajoutez l’interface eth0 en DHCP.

Configuration de services dans OMV

Dans « Système / Notifications », configurez le système pour être tenu informé de l’état de santé de votre NAS. À l’heure où j’écris ces lignes, une erreur survient si on tente d’inscrire une adresse email pour le champ « Mail secondaire ». Le ticket a été ouvert sur la plateforme de gestion des bugs il y a quelques semaines.

Dans « Stockage / Disques physiques », repérez la correspondance entre les périphériques et leur modèle. Ensuite, dans « Stockage / Gestion du RAID », créer votre RAID en cochant les cases correspondant aux disques dans l’ordre voulu, par exemple /dev/sda, /dev/sdd, /dev/sdb, /dev/sdc donnera un RAID 10 avec une grappe contenant /dev/sda et /dev/sdd et une autre grappe contenant /dev/sdb et /dev/sdc.

Je vous conseille fortement d’activer la surveillance de santé des disques S.M.A.R.T dans « Stockage / S.M.A.R.T ». Il faut se balader dans les onglets « Paramètres » et « Périphériques » pour tout bien activer.

Si vous avez acheté un onduleur avec retour d’information par port série, dans « Système / Plugins », installez openmediavault-nut puis allez dans « Services / UPS » pour l’activer.

Source

Cette série d’articles peut vous intéresser :

  1. Un NAS-médiacenter-seedbox-steambox- PC de salon pour 1000€
  2. Comment prémunir votre NAS contre le maximum de risques
  3. Choix des composants de mon NAS 2017
  4. Montage des composants dans le BitFenix Phenom M version Micro ATX
  5. Mise en place d’un dual-boot en présence d’un RAID
  6. Montage Plug-and-Play des clés USB sous Debian sans interface graphique
  7. Installation de Kodi sur Debian 8 comme interface multimédia
  8. Installation d’OpenMediaVault 3 sur Debian 8 comme interface web d’administration
  9. Installation de Deluge sur Debian 8 comme interface web de téléchargement de torrents
  10. Ruse pour compresser efficacement une image de partition sous Linux

2017-03-28

Installation de Kodi sur Debian 8 comme interface multimédia

Je vais vous montrer comment mettre Kodi au démarrage d’une Debian serveur (sans interface graphique) et sans recourir à un environnement de bureau tel qu’Unity, Gnome ou KDE.

J’ai choisi l’interface Kodi pour monter mon mediacenter. Ce logiciel est très actif, il a de superbes applis sur mobiles (y compris sur Ubuntu Phone) et beaucoup d’addons.

À ce sujet, certains installent Plex. Même si Kodi ne répond pas à tout, pensez simplement qu’en installant Plex toutes les données de votre NAS seront accessibles par la boite qui le développe.

Bon, alors premier conseil, ne LISEZ PAS le fucking manuel, les docs sont écrites dans le désordre.

Installer le driver Nvidia

Applicable si vous avez une carte Nvidia bien entendu. Ajoutez le dossier « non-free » aux dépôts officiels utilisés (à ajouter après « main » dans /etc/apt/sources.list). Avec apt, installez le paquet nvidia-detect et exécutez la commande du même nom pour savoir quel driver installer. Si c’est par exemple nvidia-driver, installez-le, puis installez nvidia-xconfig et lancez-le à son tour pour générer le fichier de configuration pour le serveur graphique.

Ajouter le dossier jessie-backports aux dépôts

Debian 8 est l’actuelle version stable de Debian. Ça signifie que la version des logiciels proposés dans les dépôts est fixée depuis des années, Kodi n’y est même pas : c’est encore XBMC !

Il suffit d’ajouter « jessie-backports » en plus de « main » sur le dépôt officiel dans /etc/apt/sources.list. Si ce n’est pas clair, suivez ce tuto. Puis lancez apt-get update.

Installer Kodi

su root

apt-get install kodi kodi-visualization-* xorg xinit dbus-x11

adduser --disabled-password --disabled-login --gecos "" kodi

usermod -a -G cdrom,audio,video,plugdev,users,dialout,dip,input,netdev kodi

Modifier /etc/X11/Xwrapper.config et remplacer :

allowed_users=console

par

allowed_users=anybody

Créer le fichier /etc/systemd/system/kodi.service :

[Unit]
Description = Kodi Media Center

# if you don't need the MySQL DB backend, this should be sufficient
After = systemd-user-sessions.service network.target sound.target

# if you need the MySQL DB backend, use this block instead of the previous
# After = systemd-user-sessions.service network.target sound.target mysql.service
# Wants = mysql.service

[Service]
User = kodi
Group = kodi
Type = simple
#PAMName = login # you might want to try this one, did not work on all systems
ExecStart = /usr/bin/xinit /usr/bin/dbus-launch --exit-with-session /usr/bin/kodi-standalone -- :0 -nolisten tcp vt7
Restart = on-abort
RestartSec = 5

[Install]
WantedBy = multi-user.target

On ajoute les droits d’éteindre la machine, de la mettre en veille et de programmer son arrêt :
apt-get install policykit-1 upower acpi-support consolekit

Et en créant le fichier /var/lib/polkit-1/localauthority/50-local.d/custom-actions.pkla :

[Actions for kodi user]
Identity=unix-user:kodi
Action=org.freedesktop.upower.*;org.freedesktop.consolekit.system.*;org.freedesktop.udisks.*
ResultAny=yes
ResultInactive=no
ResultActive=yes

Pour vérifier que tout fonctionne :
systemctl start kodi

Puis :
systemctl enable kodi

Tips

Pour utiliser une application télécommande sur smartphone, j’ai remarqué qu’il fallait aller dans le menu « Système / Services / Serveur Web », l’activer et changer le port sur 9090 (et pas un autre) puis aller dans le menu « Système / Services / Contrôle à distance » et autoriser la prise de contrôle par des logiciels externes.

Source 1, source 2

Cette série d’articles peut vous intéresser :

  1. Un NAS-médiacenter-seedbox-steambox- PC de salon pour 1000€
  2. Comment prémunir votre NAS contre le maximum de risques
  3. Choix des composants de mon NAS 2017
  4. Montage des composants dans le BitFenix Phenom M version Micro ATX
  5. Mise en place d’un dual-boot en présence d’un RAID
  6. Montage Plug-and-Play des clés USB sous Debian sans interface graphique
  7. Installation de Kodi sur Debian 8 comme interface multimédia
  8. Installation d’OpenMediaVault 3 sur Debian 8 comme interface web d’administration
  9. Installation de Deluge sur Debian 8 comme interface web de téléchargement de torrents
  10. Ruse pour compresser efficacement une image de partition sous Linux

2017-03-23

Faire une redirection de port sur son routeur avec UPnP

Pour rendre accessible une machine derrière une box Internet (NAT), on doit souvent rentrer dans l’interface d’administration web de la dite box pour faire de l’adressage statique d’IP selon l’adresse MAC, puis de la redirection de port ou assigner un IP comme DMZ.

Mais saviez-vous que vous pouviez aussi créer votre redirection de port depuis votre PC en une ligne de commande et sans connaître le mot de passe admin du routeur grâce à UPnP ?

UPnP est un protocole réseau inventé pour simplifier la connexion d’appareils domestiques. La plupart des routeurs internet grand public l’activent par défaut.

Sous linux, il existe un logiciel graphique ultra-simple pour ajouter des redirection de ports upnp-router-control :

En ligne de commande, il existe miniupnpc (le paquet sur Debian a le même nom). Pour ouvrir rediriger le port 22 extérieur de la box vers le port 22 de l’ordinateur sur lequel est lancé la commande, rien de plus facile que :
$ upnpc -r 22 TCP

Pour lister les redirections de ports:
$ upnpc -l

Pour supprimer la redirection du port 22:
$ upnpc -d 22 TCP

Cerise sur le gateau, vous pouvez même demander au routeur votre IP publique externe:
$ upnpc -s | grep ExternalIPAddress | cut -c21-

Related Posts:

2017-03-22

Montage Plug-and-Play des clés USB sous Debian sans interface graphique

À la suite de l’article précédent, vous avez peut être choisi d’installer Debian en mode serveur sans interface graphique et de lancer Kodi au démarrage de la machine (encore une fois, un tutoriel sortira bientôt à ce sujet).

Néanmoins vous aurez besoin d’accéder au contenu d’une clé USB dès son branchement à un port USB. Et vous allez être très déçu d’apprendre que nativement sous Linux, les clés USB ne sont pas Plug-and-Play, le montage d’une partition est exclusivement manuel, via /etc/fstab ou via la commande mount.

La raison est toute simple : Linux laisse l’utilisateur libre de choisir les options de montage. Le Plug-and-Play est intégré à plus haut niveau, par les environnements tels que Unity, KDE ou Gnome.

Quand on n’a pas d’environnement de bureau, on doit recourir à un script écoutant les évènements de connexion des périphériques USB et réalisant le montage automatiquement. J’en ai justement trouvé un sur serverfault proposé par Mike Blackwell.

On va créer un fichier /usr/local/bin/usb-mount.sh et lui mettre les droits d’exécution :

#!/bin/bash

# This script is called from our systemd unit file to mount or unmount
# a USB drive.

usage()
{
    echo "Usage: $0 {add|remove} device_name (e.g. sdb1)"
    exit 1
}

if [[ $# -ne 2 ]]; then
    usage
fi

ACTION=$1
DEVBASE=$2
DEVICE="/dev/${DEVBASE}"

# See if this drive is already mounted, and if so where
MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }')

do_mount()
{
    if [[ -n ${MOUNT_POINT} ]]; then
        echo "Warning: ${DEVICE} is already mounted at ${MOUNT_POINT}"
        exit 1
    fi

    # Get info for this drive: $ID_FS_LABEL, $ID_FS_UUID, and $ID_FS_TYPE
    eval $(/sbin/blkid -o udev ${DEVICE})

    # Figure out a mount point to use
    LABEL=${ID_FS_LABEL}
    if /bin/grep -q " /media/${LABEL} " /etc/mtab; then
        # Already in use, make a unique one
        LABEL+="-${DEVBASE}"
    fi
    MOUNT_POINT="/media/${LABEL}"

    echo "Mount point: ${MOUNT_POINT}"

    /bin/mkdir -p ${MOUNT_POINT}

    # Global mount options
    OPTS="rw,relatime"

    # File system type specific mount options
    if [[ ${ID_FS_TYPE} == "vfat" ]]; then
        OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"
    fi

    if ! /bin/mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT}; then
        echo "Error mounting ${DEVICE} (status = $?)"
        /bin/rmdir ${MOUNT_POINT}
        exit 1
    fi

    echo "**** Mounted ${DEVICE} at ${MOUNT_POINT} ****"
}

do_unmount()
{
    if [[ -z ${MOUNT_POINT} ]]; then
        echo "Warning: ${DEVICE} is not mounted"
    else
        /bin/umount -l ${DEVICE}
        echo "**** Unmounted ${DEVICE}"
    fi

    # Delete all empty dirs in /media that aren't being used as mount
    # points. This is kind of overkill, but if the drive was unmounted
    # prior to removal we no longer know its mount point, and we don't
    # want to leave it orphaned...
    for f in /media/* ; do
        if [[ -n $(/usr/bin/find "$f" -maxdepth 0 -type d -empty) ]]; then
            if ! /bin/grep -q " $f " /etc/mtab; then
                echo "**** Removing mount point $f"
                /bin/rmdir "$f"
            fi
        fi
    done
}

case "${ACTION}" in
    add)
        do_mount
        ;;
    remove)
        do_unmount
        ;;
    *)
        usage
        ;;
esac

Puis on créé un fichier /etc/systemd/system/usb-mount@.service pour le service systemd :

[Unit]
Description=Mount USB Drive on %i
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/usb-mount.sh add %i
ExecStop=/usr/local/bin/usb-mount.sh remove %i

On fini en ajoutant des règles au fichier /etc/udev/rules.d/99-local.rules surveillant les évènements de connexion/déconnexion de clés :

KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service"
KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service"

Ce script n’est pas parfait, son comportement devient même assez étrange si la partition d’une clé USB n’a pas de nom et qu’on en branche une seconde : les dossiers se mélangent. Arrangez vous pour toujours nommer vos clés, ou proposez moi une correction du script ci-dessus 🙂

Source

Cette série d’articles peut vous intéresser :

  1. Un NAS-médiacenter-seedbox-steambox- PC de salon pour 1000€
  2. Comment prémunir votre NAS contre le maximum de risques
  3. Choix des composants de mon NAS 2017
  4. Montage des composants dans le BitFenix Phenom M version Micro ATX
  5. Mise en place d’un dual-boot en présence d’un RAID
  6. Montage Plug-and-Play des clés USB sous Debian sans interface graphique
  7. Installation de Kodi sur Debian 8 comme interface multimédia
  8. Installation d’OpenMediaVault 3 sur Debian 8 comme interface web d’administration
  9. Installation de Deluge sur Debian 8 comme interface web de téléchargement de torrents
  10. Ruse pour compresser efficacement une image de partition sous Linux

2017-03-07

Logiciel libre et auto hébergement, quid de la masse populaire?

Un utilisateur de Facebook rapporte 80$ de revenus publicitaires par an à Facebook. C’est une moyenne. Un utilisateur très assidu en rapporte plus.

In fine, Facebook dégage un bénéfice net de 10 milliards de dollars par an, principalement issu des revenus publicitaires.

Le prix à payer pour le service est :

  • accepter les messages publicitaires (comme sur TF1 ou la plupart des magazines papier en kiosque)
  • le profilage de son comportement à tout fin future
  • la censure selon les règles de Mark Zuckenberg (pas de nudité, etc…)
  • l’espionnage d’Etat, en premier lieu des USA.

Si l’on considère ces points comme non problématiques, alors les services proposés par Facebook (Facebook, Instagram, WhatsApp) sont très pratiques.

Il permettent de tisser des liens et accéder à des informations à une échelle et vitesse sans précédent pour le plus grand nombre et. Certes le web permet de communiquer à l’échelle de la planète depuis longtemps, mais la plupart des gens ne peuvent apprendre le HTML, comprendre le fonctionnement d’un serveur dans un réseau, payer un nom de domaine ou ne serait ce que le matériel nécessaire à un hébergement.

J’adore le logiciel libre notamment car il permet de voir et s’approprier comment fonctionne réellement un ordinateur mais la plupart des gens ne comprennent même pas ce qu’il y a derrière le mot « cloud ». Le « nuage » de fumée est un concept qui leur est suffisant pour utiliser le service.

Il y a donc là un dilemme. Si les alternatives libres à Facebook sont plus contraignantes à l’utilisation que Facebook, il est peu probable que la majorité des gens y migrent. Tout simplement car ils n’en comprennent pas l’enjeu et donc l’intérêt.

Leurs besoin sont instinctifs ou basiques : envoyer une vidéo rigolote, partager facilement des infos publiques, voir des images de mode vestimentaire, etc… et ils n’ont rien de sérieux à cacher. Snowden a tout dit et presque rien n’a bougé.

Dans ce contexte, quel est l’objectif du logiciel libre pour la masse des individus ?

Sa forme actuelle présuppose que l’utilisateur est éclairé, ne serait ce que pour décider quel moyen technique de communication utiliser (XMPP, email, Diaspora, GNUsocial, Movim, WebRTC, etc…) et maintenir lui même son ordinateur (comprendre APT/RPM est plus complexe qu’utiliser un app store de Google/Apple/Microsoft) et donc un utilisateur non éclairé ne peut pas s’en sortir seul.

Une faible partie de la population est actuellement prête à faire l’effort d’apprentissage (dénombrez parmi vous les utilisateurs éclairés de logiciels libres qui ne travaillent pas dans l’informatique) et l’usage d’un logiciel libre par un utilisateur non éclairé est similaire à l’utilisation d’un logiciel propriétaire (il ne peut rien modifier, est tributaire des conditions d’un prestataire pour toute modification ou administration de son informatique).

Tout le monde n’est pas programmeur comme Stallmann.

A mon avis, le libre ne s’imposera que si Facebook abuse de son monopole et devient un problème pour l’écosystème au dessus de lui (annonceurs, services de paiement, éditeurs de contenus, etc…). A ce moment, certains acteurs pourraient se regrouper pour imposer une base logicielle plus propice à la « libre » concurrence et fabriquée à partir de logiciels/protocoles libres et interopérables.

De la même manière, Steam a posé un pied dans l’environnement Linux, mais les utilisateurs ne bougeront pas à moins que les performances Linux dépassent celles de Windows ou que Microsoft gère mal sa cannibalisation du marché avec son magasin d’application intégré à Windows 10. Mais bon, Steam, c’est le mal, puisque pour le coup, c’est un système de DRM pour logiciels non libres.

Related Posts:

2017-03-03

Improve your Python Skills

Are you a student learning programming with Python? An experienced Java developer having to jump into a Python codebase? Every Python enthusiast started by writing mediocre code and got better by practicing. Here are the few advices that got me from writing, quite frankly, bad code to code that I'm proud of and gets deployed to thousands of servers.

Embrace the habits of the community

There is this saying that "the language is just a tool". What people often mean is that computer science is based on core concepts that stand true no matter the language. A hash table has roughly the same properties in every language or your knowledge of threads is still relevant in Java, Python and even Go.

People often miss the fact that a language is more than a mean to feed instructions to a CPU. More than anything a language is a community and its habits. Anyone writing code is free to adhere to the community habits or not. However when people start interacting with each other having a common ground comes very handy. In Python, people often refer to this common ground as code being "idiomatic or "Pythonic".

The Python community is a social entity that evolves over time, and with it its habits. What was considered good practice a few years ago may be to avoid now. You can clearly see this evolutions in the Python standard library: compare the deprecated asyncore and the new asyncio. They visually look different, one has code commented out, probably from a time when version control was not so popular, the other use way more docstrings.

Read lots of code

If there is one point to remember from the all the advices is this one: read as much code as you can. Reading other's code serves multiple purposes.

You will learn how to organize and format your code. You will discover new modules from the standard library that you never thought existed. Likewise you will discover awesome third party libraries that can be reused quickly. You will find what makes code easy or difficult to read for others.

You will also train yourself to jump into new codebases. After the tour of the office and the introduction to new colleagues around a coffee, one of the first things someone starting a new job has to do is getting familiar with the company code. This can be overwhelming as the codebase may be huge, written by many developers and with some legacy parts. All the training you can get beforehand will prepare you for this.

A huge benefit of GitHub being the central point where almost all open source software is developed is that it has never been easier to read some code.

I remember at my first real job after graduating, I was amazed by a coworker: while I was struggling to find some information in the documentation of an open source project, he was just going through the code. He was usually faster than me and his answers were way more accurate. I realized that reading code is definitely not a skill they teach at school!

Work with people

Which brings me to working with people. Getting code reviewed by peers is one of the best ways to improve. Even two beginners reviewing each others can help to grasp new concepts and develop healthy habits.

There is a reason why even small companies embrace code reviews and agile methodologies, working with people helps to produce better quality code.

Sitting close to someone can also help progress in unexpected ways. For instance the way people use their development tools: I used to code in Python using vim until I saw another coworker using PyCharm, at that point I changed my tools and it really made a difference.

Use an IDE that helps you

Developers tend to be very attached to their text editor. If you haven't found your editor yet and are getting serious about Python, I highly encourage you to take a look at PyCharm.

PyCharm comes with sane defaults for developing Python. A beginner can learn a lot on writing idiomatic code by just looking at the suggestions PyCharm makes.

PyCharm has a community edition which is free to use and already very good. Most developers I know start with it and end up buying the paid version, mostly to encourage these friendly people from Czech Republic.

Now don't get me wrong: there is nothing PyCharm gives you that is not feasible with a well tuned vim or emacs. Hell, you don't even need syntax highlighting to write awesome code, have you ever seen David Beazley codding?

Know your PEP8

PEP8 is a document providing a set of guidelines about code style that developers are free to follow or not.

Nowadays most open source and enterprise software tend to follow PEP8 to some extend, sometimes relaxing a few constraints like the line length.

Learning how to write PEP8 compliant code will help you the day you need to submit a pull request to an open source library. It is common for projects with many developers working on the same codebase to verify that each commit follows the guidelines. They often execute a tool like pep8, flake8 or pyflakes during the Continuous Integration build. If the code you write is not compliant, it cannot be merged.

Style guidelines have been an issue in many languages for decades. Newer languages like Go and Rust solve this problem by having a tool that automatically formats the code in the recommended way, putting an end to endless discussions.

Know the difference between bytes and str

Python 3 puts a clear delimitation on what is raw data used as bytes and what represents text used as str.

Data containing text can be decoded using its decode method and text that must be stored or sent to the network can be encoded as bytes using the encode method.

A common pattern in Python is to manipulate bytes at the application boundaries between other systems (network, file system or other processes) and manipulate str in the core of the application.

The key is to never loose track of what you hold. Because Python 2 used the same type for both it was hard to keep track of that, in Python 3 it is way easier once you have grasped this concept.

Use type annotations

If you target Python 3.5 and above you can use type annotations. It is a somehow controversial syntax that explicitly documents the type of functions arguments, return values and variables.

def read_config(file: str) -> dict:
    with open(file, 'r') as f:
        return json.load(f)

This example shows that clear naming and the extra 13 characters are enough to document was the function does. Some tools like IDEs or mypy can use these annotations to catch bugs during development.

These annotations coupled with static analysis help prevent errors that are typically happening at runtime, like TypeError or AttributeError. Pretty much like with a statically typed language.

Annotations are completely optional and have no impact on performance, the Python interpreter does not take them into account at all. They are only useful for you and your tools.

Avoid overusing classes

This is one of the strangest part of Python. It is an object oriented language, in Python literally everything is an object: a class is an object, a function is an object, a module is an object... Yet in practice, Python code does not use classes that often.

I once was reviewing the code of a developer that I didn't know. After a few seconds of reading his code I could swear that he had a strong Java background: everything was wrapped into classes. After asking him he told me that he knew mostly Java and this code was literally his first lines of Python. Indeed object oriented languages can mean widely different things.

Again the standard library itself is a good example: more often than not a functionality is provided as a function in a module rather than a method in a class:

import json

jsonified = json.dumps([1, 2, 3])

While it is common in other languages to have this pattern:

from json import Json

json = Json()
jsonified = json.dumps([1, 2, 3])

In practice Python classes are used when some data share a set of functions. When there is no function associated with the data it is common to see the usage of classes hidden through a namedtuple.

Avoid overusing packages

In Python a file ending in .py is called a module and a directory containing modules a package.

When I started Python I had this inexplicable need of organizing my code like I would organize my music library: as a deeply nested set of directories. I spent more time moving files around and fighting against circular imports than actually writing code.

Then I slowly realized that it didn't make my code any easier to manage. I looked at the layout of many open source projects, big and small, and came to the conclusion that most of them keep the hierarchy very flat. A prime example of it being the standard library itself.

A word of caution though: Django code is organized around directories. Do not break your application just because you read on a blog that less is better.

Understand how packaging works

Python has a great standard library, but it is nothing in comparison of the 100.000 libraries and applications available on PyPI, just a pip install away.

There is a catch however, Python is a language first and turned into an ecosystem only recently. Which means that the tooling and practices are not top of the line. But it's moving in the right direction, really.

Now if you do not know what Python virtual environments are, read the article about Virtualenvs in the Hitchhiker’s Guide to Python. Virtual environment are a bit like cloud servers: you create one, install a lot of crap in it to try something and get rid of it as soon as you are done. They allow to fearlessly install and try new dependencies without messing with your system.

If you want to publish your work on PyPI have a look at the Python Packaging User Guide and of course read the setup.py of your favorite library.

Forget about Python 2 if you can

From my experience, small to medium Python shops largely settled on Python 3. The release of Python 3.5 has been such a turning point in the history of the language that now I don't see any more project being started in 2.7.

I recently had to port a codebase from Python 2.7 to 3.5, the effort needed to rewire my brain to legacy Python made me realize how good Python 3 is and how well the abstraction it provides over data and strings fits my way of thinking.

I love Python 3 and I love being away of Python 2.

2017-02-28

Connexion SSH à travers un ordinateur relai avec ProxyJump

Depuis OpenSSH 7.3 il existe une manière bien pratique d’établir une connexion SSH en passant un ordinateur relai et ceci de manière transparente.

Imaginez la situation suivante, vous voulez vous connecter en SSH sur une machine (toto@destination) mais celle-ci ne vous est pas accesible directement. Vous devez passer par une autre machine (titi@relai).

Voici la commande qui permet de vous connecter en une ligne à la destination :

$ ssh -J titi@relai toto@destination

Vous pouvez aussi créer un alias dans le fichier de config ~/.ssh/config

Host destination_through_relai
HostName destination
ProxyJump titi@relai:22

Et vous pouvez chainer autant de sauts/relais que vous voulez.

Related Posts:

2017-02-14

Google favorise les contenus récents

J’ai enfin compris pourquoi Google avait une mémoire de poisson rouge.

Google favorise les contenus récents en les boostant dans son classement. Google a déposé un brevet dessus.

La règle ressemble à ceci :

Bilan, un site web ou article peut se retrouver premier sur une requête mais sur un temps très court. Ça dépend du contenu produit par la suite qui viendra le masquer.

Exemple :

Donc quand on dit qu’Internet n’oublie pas c’est vrai, mais en pratique Google a une mémoire de poisson rouge.

Résultat :

  • la vérité de Google change grandement en fonction du moment où la recherche est effectuée et un buzz peut enterrer une vérité.
  • Il suffit de publier régulièrement sur un sujet pour cacher d’autres infos ou concurrents.
  • Publier en dernier sur un sujet permet de temporairement être premier facilement.
  • Le buzz prend le pas sur les articles de fond.

Le bon coté des choses est bien sûr que l’on tombe plus souvent sur du contenu actualisé.

 

Related Posts:

2017-01-18

Installer les certificats SSL de LetsEncrypt avec Certbot

Voici ma procédure pense-bête. L’idée est de migrer des virtualhosts Apache déja configuré vers LetsEncrypt avec un bon contrôle, à savoir:
– aucun changement automatique des fichiers de configuration des sites web
– un certificat par sous domaine

Installer le générateur de certificats SSL en suivant la doc sur https://certbot.eff.org/

Arrêter le serveur web:

# systemctl stop apache2

Lancer le générateur de certificats SSL:

# certbot certonly

Choisir l’option 3 : « Spinup a temporary webserver (standalone) »

Saisir le nom de domaine. Ex: « tuxicoman.jesuislibre.net »

Ca va créer un certificat dans /etc/letsencrypt/live/ . Le certificat est aussi copié dans /etc/letsencrypt/archive/ et une tache de renouvellement est ajoutée dans  /etc/letsencrypt/renewal/ . Comme ça vous savez quoi effacer si vous faites de la merde.

Dans les fichiers de virtualhosts Apache qui sont destinés à recevoir du SSL , vous devez mettre au moins les lignes suivantes :

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/tuxicoman.jesuislibre.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/tuxicoman.jesuislibre.net/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

Répéter l’opération pour tous les noms de domaine.

Redémarrer le serveur web:

# systemctl start apache2

Les certificats ont une durée de vie de 90 jours.

On va modifier la méthode de renouvellement pour utiliser Apache. Car sinon, la méthode « standalone » requiert que Apache soit éteint.

# grep -rl 'authenticator' /etc/letsencrypt/renewal/ | xargs sed -i "s/authenticator = standalone/authenticator = apache/g"

On peut ensuite vérifier que la procédure de renouvellement fonctionne:

# certbot renew --dry-run

Enlever « –dry-run » pour le faire réellement.

Mais en pratique vous n’aurez pas à vous en occuper. Vos certificats seront renouvelés automatiquement. Une tache journalière vérifie si vos certificats vont expirer et les renouvelle pour vous. Elle met son log dans /var/log/letsencrypt/letsencrypt.log

Par contre, je n’ai pas trouvé le code ou le crontab qui est responsable de cette tâche journalière. Ça m’intrigue… mais je suis sûr qu’un lecteur me donnera la solution ;)

Related Posts:

2017-01-17

Mise à jour Debian 8.7

Debian 8.7 vient de sortir. Il s’agit d’une mise à jour mineure pour la version stable de Debian nommée actuellement « Jessie ».

Comme d’habitude sur Debian stable, il n’y a pas de mise à jour majeure des logiciels, juste des correctifs très localisés et de sécurité. C’est bien là l’intérêt de la version « stable » de Debian, des changements mineurs qui assurent le moins d’introduction de bugs possible. Ça permet de faire la mise à jour en étant confiant que la machine marchera toujours demain, sans régression.

La mise à jour est transparente, il suffit de suivre d’installer les nouveaux paquets proposés par votre outil de mise à jour préféré.

Sinon, en ligne de commande :

# apt update; apt upgrade

Related Posts:

2017-01-10

Statistiques de blog… à prendre avec des pincettes

Les blogs aiment bien parler de leur statistiques de visite après une année écoulée. Cependant, il faut prendre les statistiques avec des pincettes.

Il faut notamment :

  • enlever les robots et spammeurs de commentaires, qui sont souvent le gros des visiteurs sur des petits sites web!
  • ajouter tous ceux qui utilisent des bloqueurs de traqueurs comme Ublock Origin et qui ne sont donc pas comptés par GoogleAnalytics ou Piwik (…du moins par défaut)
  • ajouter ceux qui lisent les articles uniquement en RSS ou qui n’exécutent pas de code javascript.
  • oublier Facebook qui repompe le contenu.

Ensuite, qu’est ce qui est décompté?

  • Les pages vues: compliqué pour les pages déroulantes ou qui se rafraîchissent automatiquement. Si un visiteur ouvre le site web après avoir lu le RSS, on compte 2 pages vues ?
  • Les visiteurs : Il faut s’assurer qu’on ne compte pas plusieurs fois la même personne. Hors, l’IP change, les cookies sont parfois supprimés (ex: Cookie self destruct), la personne revient sur le site depuis un autre appareil (smartphone + pc)
  • Les visites : Piwik considère qu’un visiteur qui revient plus de 30 minutes après sa première visite, génère une nouvelle visite. Mais si on a déjà du mal à compter les visiteurs, ça va fausser le comptage des visites… Et cette définition de « visite » est propre à chaque outil de comptage et sujet à débat.

Donc, ce n’est pas facile du tout. Chaque outil (Piwik, Awstats, GoogleAnalytics, Xiti, etc…) va mesurer différemment et donner des résultats différents. D’où la difficulté de comparer.

Certains sites web seront plus sensibles aux bloqueurs de traqueurs si leur visiteurs sont plus geek. Et donc, même comparer des statistiques entre sites web utilisant le même outil est difficile.

Donc finalement, les statistiques pour un blog perso, ça permet surtout d’avoir une vague idée de sa popularité (Il y a t il plus que 10 personnes qui me lisent?) sans en savoir beaucoup plus. (Quid de la qualité du lectorat ?)

Si vous voulez avoir la plus grosse, ne vous prenez pas la tête, vous pouvez tricher comme je l’ai montré avec GoogleAnalytics ou même Piwik

Related Posts:

2017-01-04

Learning Python 3 threading module

The threading module that comes with Python is very nice to use. It is a bit scary at the beginning, but becomes a handy tool to attach to your Python toolbelt after a while.

What are threads?

In the past threads used to be referred at as "lightweight tasks". I like to consider that I have a main program that can fire tasks in the background and collect the result later when I need it.

When you launch a Python program you end up with a new process that contains one thread called the main thread. If you need to, you can launch additional tasks that will run concurrently.

One very common example is having the main thread of a program wait for remote connections and handle each new client in a separate thread.

Threads are managed by the operating system. Under the hood, most of the times, the pthreads C library is used by a program to ask the OS to create new threads. This is how CPython interacts with threads.

Scary threads

Threads have a key feature that makes them extremely powerful but also hard to use: threads share the same memory space.

That makes threads lightweight because creating a new thread, only means allocating a tiny bit of memory. Just enough memory to hold the thread stack and the bookkeeping done by the kernel. We are talking about a few kilobytes of RAM per thread.

However it also means that every thread of the same process can access everything from the others. A thread that holds a socket for instance, cannot keep it for itself. At any moment another thread can access this socket, modify it, close it, destroy it and so on.

A lot of smart people have worked hard on this problem, and they all tend to agree: threaded code is hard.

Thread safety

Threads are difficult but they have been around for ages and a lot of programs tend to use them anyway. So it must be possible to work with them somehow, right?

The answer is yes, some nice developers made reusable tools and libraries that cooperate well with threads. The fact that an API avoids most pitfall related to threads makes this API thread safe.

In Python thread safety is often achieved by avoiding shared mutable state. Meaning that threads avoid modifying the data they put in common.

Sometimes it's impossible to completely avoid shared mutable state, so instead threads collaborate to make sure they are either:

  • all reading the data and no one is writing it
  • a single thread is writing and no one else is reading

These two points are the key to understanding threads.

As a side note, they are also the leitmotiv of the Rust borrow checker. Rust is a language that guaranties at compile time that a program is thread safe. If you often write threaded code, Rust is probably the best tool you can hang at your belt.

The hard thing about threads in Python is that it is impossible to prove the safety of a program. Unit testing doesn't help, static analysis may raise some warnings but the only way to tackle the problem is to be careful.

CPython, GIL and atomic operations

The Internet is full of incorrect facts about Python and threads. The worst one is not the famous one saying that Python cannot use threads - at least if you don't use them you are not using them incorrectly. No the dangerous one is the one saying that Python provides thread safety by default thanks to the Global Interpreter Lock.

The GIL is an implementation detail of CPython (the most common implementation of the Python language that most people refer to as just "Python"). The GIL is there to protect CPython internals from issues related to thread safety.

Can Python use threads?

Yes absolutely.

CPython uses native OS threads but the GIL makes sure that only one thread executes some Python bytecode at a time. It makes Python a good platform for IO bound applications (sockets, HTTP, files...), less for CPU bound ones.

CPU heavy applications cannot be written in pure Python and run on CPython while leveraging multiple cores. There are ways to bypass the GIL for CPU bound programs:

  • Write some of the code in C and release the GIL, like Numpy.
  • Use multiple processes instead of multiple threads.

So the GIL makes Python code thread safe?

Not at all.

The GIL does not bring thread safety to the user's Python code but makes some basic Python operations atomic. Other implementations of Python, like Pypy do not bring the same guaranties.

What is more, even in CPython it is a slippery slope. Some operations on dicts are atomic and some aren't, it becomes very hard to verify the safety of code that relies on these implementation details.

Thread safety in practice

Before looking at some code, let's remind how to access shared data between thread safely:

  • some threads are reading the data and no one is writing it
  • a single thread is writing and no one else is reading

No shared mutable state, safe

import threading

def print_number():
    number = 42
    print(threading.current_thread().name, number)

t1 = threading.Thread(target=print_number)
t2 = threading.Thread(target=print_number)
t1.start()
t2.start()

This example creates two threads, that run the print_number function when their start method is called.

All thread get their own version of number when they run the function. No shared state, this code is safe.

Shared immutable state, safe

import threading

number = 42

def print_number():
    print(threading.current_thread().name, number)

Here threads do not get their local version of number, instead they all read the same one. This is safe because we are sure that no one is modifying it.

Note: the boilerplate code to create and run the threads does not change.

Shared mutable state, wildly unsafe

import threading

number = 42

def print_number():
    global number
    number += 1
    print(threading.current_thread().name, number)

In this example number is modified by all threads, possibly at the same time. This operation is unsafe.

If you run this code in CPython you will probably never see an incorrect result. This is a visible consequence of the GIL, which again is an implementation detail which shouldn't be relied on.

To actually see a data race we need a slightly more CPU heavy code:

import threading
from hashlib import sha512

data = b'Hello' * 1000

def hash_data():
    global data
    data = sha512(data).hexdigest().encode()

threads = []
for i in range(10):
    t = threading.Thread(target=hash_data)
    threads.append(t)
for t in threads:
    t.start()
for t in threads:
    t.join()

print(data)

This example hashes a piece of data ten times and prints the result. A reference to all threads is kept in a list to be able to start them at the same time and wait for them to finish with t.join().

If you run this code a few times you will likely see a different output, showing that there is a data race somewhere. Indeed this code has multiple threads reading and writing data concurrently.

Protecting the shared mutable state

The threading module features a multitude of tools to protect shared mutable data among threads. The easiest one to use is the Lock. A lock ensures that only one thread accesses the data at a given time, it does not care if it is for reading or writing though.

Making the previous example thread safe with a lock is easy:

data_lock = threading.Lock()
data = b'Hello' * 1000

def hash_data():
    global data
    with data_lock:
        data = sha512(data).hexdigest().encode()

data_lock is an instance of a Lock that can be safely shared. When acquired trough the context manager it makes sure that a single hash computation happens at a time.

This example is not very smart since it doesn't provide any advantage over a single threaded version of the program. Sometimes locking too much can even result is worse performances than using a single thread.

Common patterns with threads

APIs

The previous example shows how to protect a variable from data races. While it works, it couldn't be exposed as part of an API. It would be awkward to tell the users of the API to "remember to always lock the data before accessing it".

A solution for that is to encapsulate the locking logic so that it is not visible to the end user. This technique is used in the standard Python logging module for example.

class DataHasher:

    def __init__(self, data):
        self._data = data
        self._lock = threading.Lock()

    def hash(self):
        with self._lock:
            self._data = sha512(self._data).hexdigest().encode()

    def get(self):
        with self._lock:
            return self._data

An instance of this class can be safely shared among threads without requiring the user to care about locking:

data = DataHasher(b'Hello' * 1000)
for i in range(10):
    threading.Thread(target=data.hash).start()

The get method returns a reference of bytes. As bytes are immutable in Python, the user can then do whatever he wants with this reference without impacting DataHasher. However when handing references to mutable objects, the contract between the API and the user must be clear.

The user can either be told to not mutate the data, or he can be given a defensive copy of the data:

def get(self):
    from copy import deepcopy
    with self._lock:
        return deepcopy(self._data)

Defensive copies are not wildly used: they add a performance penalty even when the user has no intention of mutating the data and some objects cannot be copied safely (file handlers, sockets).

Producer - Consumer

The producer consumer pattern is very common in Python. The standard library provides a thread safe queue for this purpose.

import threading
import queue
import time

q = queue.Queue()

def append_to_file():
    while True:
        to_write = q.get()
        with open('/tmp/log', 'a') as f:
            f.write(to_write + '\n')

def produce_something():
    for i in range(5):
        q.put(threading.current_thread().name)
        time.sleep(1)

threading.Thread(target=append_to_file, daemon=True).start()
threading.Thread(target=produce_something).start()
threading.Thread(target=produce_something).start()

The code is fairly simple, it creates a queue, two threads that push their names into that queue and a consumer that writes everything that comes from the queue into a file.

The daemon=True argument passed to the consumer thread allows the program to exit when other threads finished their work.

Notice that this code does not explicitly do any locking thanks to the queue encapsulating the heavy work internally.

Poison pills

Daemon threads are abruptly killed when other non-daemonic threads exit. As the documentation mentions, it means that they do not clean up their resources before exiting the program. In the previous example it means that all messages may not be fully written when the consumer is stopped.

There a two main ways to allow the consumer to finish its job:

  • Make the consumer periodically check if an Event happened
  • Send a poison pill in the queue. When the consumer find the pills it stops itself.
import threading
import queue
import time

q = queue.Queue()
must_stop = threading.Event()

def append_to_file():
    with open('/tmp/log', 'a') as f:
        while True:
            data = q.get()
            if data is must_stop:
                print('Consumer received the poison pill, stopping')
                return
            f.write(data + '\n')
            f.flush()

def produce_something():
    for i in range(5):
        q.put(threading.current_thread().name)
        time.sleep(1)

threading.Thread(target=append_to_file).start()
p1 = threading.Thread(target=produce_something)
p1.start()
p1.join()
q.put(must_stop)

This snippet uses the poison pill pattern, the must_stop event is sent to the consumer when the producers exit.

Thread Pool

The creation of a thread can be considered a costly operation. When a program has a lot of short lived tasks it can save some CPU instructions by reusing existing threads that are done with their tasks. This is the job of a thread pool.

Instead of managing manually the life-cycle of threads, the standard library provides an easy to use implementation of a thread pool. The concept is simple, a pool of threads that can grow up to N threads is created. Each thread takes a task, processes it, and repeat the operation until all tasks are processed.

The official documentation provides an easy to understand example of distributing work to a thread pool.

Two very common libraries in the Python ecosystem extend this concept: Celery and Gunicorn can both operate in a mode where a master process pre-launches N threads that are used when a task or a request arrives.

Screenshot of a Gunicorn process managing a thread pool

Gunicorn manages ten threads, waiting to handle HTTP requests.

Going further

The Concurrent Execution part of the Python documentation provides a description of all the goodies Python provides out of the box for writing multi-threaded code.

As often in programming, the best way to learn is to read code written by others.

Questions

What is the cost of a thread?

Mostly some memory, the exact amount depends on a lot of factors. It is at least 32 KB per thread, but often much more.

When the OS decides to switch the execution from one thread to another, a bit of time is spent on context switching. In Python this is mostly negligible compared to the rest of the operations.

A decent computer with a recent OS can easily handle ten thousand threads simultaneously.

As discussed previously, threads also have a cost on development. The complexity added by switching from a single threaded program to a multi threaded one shouldn't be overlooked.

Should I go for threads or asynchronous IO in Python?

Given everything that happens currently in the asynchronous Python world it's easy to get lost.

Twisted, Tornado, Gevent, asyncio, curio, and many more... The Python ecosystem is still struggling to find a framework that the community will agree on. Don't get me wrong, all these framework are actually usable, you can build successful businesses with them. They just have some rough edges and a support for third party libraries that goes from good to abysmal.

On the other hand, third party libraries consider synchronous threaded Python code as their first class citizen. It means that if you decide to forget about asynchronous code you can benefit from very solid bases to start your work.

The same goes for developers. Finding people to work on a synchronous code base is relatively easy: every Python developer is expected to know how to do it. Finding people that have experience in cooperative multitasking can be more difficult.

Aren't threads a thing of the past?

If you look at popular languages right now it's easy to think so. Nodejs runs an event loop in a single process without threads. The Go language hides threads away from the programmer, giving him an easier to use interface for concurrency.

However threads are still the go to solution for many tasks, like accessing file systems. Linux does not provide an asynchronous API for that. Even some projects relying heavily on asynchronous IO sometimes have to use threads, Nginx for instance had to implement a thread pool to prevent the event loop from being slowed down by unresponsive disks.

It is also worth mentioning that CPU frequencies stopped their rise, instead we get more and more cores. Cores that can be used by either processes or their lightweight alternative: threads.

L'auto-hébergement garde-t-il du sens si le plus important n'y est pas ?

Récemment, Genma a publié un article au sujet de l'impact de diverses coupures électriques sur son activité auto-hébergée : Coupure-de-courant-et-auto-hebergement. Diverses idées sont développées dans ce billet mais celle qui a retenu mon attention est la suivante : L'auto-hébergement c'est bien mais il ne faut pas le faire pour les services sensibles et desquels on est fortement dépendant. J'ai bien entendu laissé un commentaire sur son blog mais je trouvais justifié de développer un peu plus mon point de vue ici.

En gros, le blog et le mail seraient à ne pas héberger derrière une ligne ADSL car on ne peut se permettre soit un blog inaccessible, soit la non réception de ses mails. On a chacun des priorités variables mais je conçois aussi que ces deux usages soient importants. Dans le cas des coupures électriques à répétition il est évident que ça perturbe fortement l'activité de ces services et que si c'est prolongé, ça fini par causer des pertes définitives de données. Typiquement, vous commencez à perdre des messages si votre serveur mail n'est pas en mesure de les réceptionner pendant plusieurs jours d'affilée et dans la mesure du possible, il est préférable d'éviter ça. A l'inverse les divers services moins importants peuvent être auto-hébergés.

J'ai en fait une approche diamétralement opposée et forcement, j'en arrive à préconiser à peu près l'inverse. J'ai décidé de m'auto-héberger, non pas pour tester des services mais parce que j'ai éprouvé le besoin de reprendre le contrôle de mes données personnelles, notamment le mail. J'ai alors décidé de m'auto-héberger. Forcement de mon point de vue, l'auto-hébergement perd fortement de son sens si on décide de ne pas y stocker les données que l'on a de plus précieuses.

Alors oui, le faire soit même présente des risques car on a rien sans rien. Il faut cependant se donner les moyens de ses ambitions. Dans des billets de blog divers et variés, je vois que certains peuvent utiliser des machines peu fiables pour faire de l'auto-hébergement (typiquement des Raspberry Pi avec un système sur carte SD). Sur le principe bon, pourquoi pas, c'est amusant et très formateur. Le côté Geek en plus, c'est cool aussi.

Pourtant quand on se lance là dedans pour vraiment rapatrier ses données personnelles, le jeu doit être pensé sérieusement dès le départ. Grossièrement, il faut déjà penser à se faire son analyse de risques puis identifier ceux qui sont les plus impactants et corriger ce qui doit vraiment l'être par des actions les plus efficientes possible. Et comme on pense à l'avenir, et bien on planifie ce qui n'aura pas pu être mené immédiatement tout en prévoyant des mesures palliatives si d'aventure le pire devait arriver.

Dans le cas de multiples coupures électriques de quelques heures il est assez simple d'évaluer l'impact que ça peut avoir sur ses services auto-hébergé. On peut alors apprécier les risques encourus : perdre des visiteurs de blog ? voir ses mails arriver avec 1 jour de retard ? Perdre carrément des mails ? Risquer de la casse matérielle ? Perte définitive des données stockées ? Risque très probable d'avoir d'autres priorités que les services auto-hébergés à gérer lorsque la coupure survient ? Tout ça est prévisible et si on pense son auto-hébergement sérieusement on peut immédiatement éliminer certains risques, atténuer les effets encourus par d'autres risques et dans tout les cas avoir une meilleure vue sur l'ensemble des risques résiduels. Le tout encore une fois, c'est de penser ce jeu de manière sérieuse car le risque, ça se gère.

Je pense que différentes motivations poussent à s'auto-héberger. Je me garderai bien d'être catégorique sur ce qu'il convient ou non de faire. La seule chose sur laquelle il faut à mon sens être clair quand on parle d'auto-hébergement, ce sont justement les motivations qui conduisent à s'y essayer. Ça aide à mettre en perspective les propos des uns et des autres et à les replacer dans le bon contexte. Les propos de Genma sont tout à fait pertinent dans son contexte et, à mesure que j'y réfléchi, pas du tout dans le mien.

2016-12-31

Bonnes résolutions 2017

Voici une liste de bonnes résolutions que vous pouvez prendre pour cette nouvelle année :

Facile :

  • Utiliser Firefox comme navigateur web par défaut sur tous vos appareils. Installer l’extension Ublock Origin pour supprimer les pubs des sites web.
  • Utiliser un compte mail respectueux de la vie privée (ex: ProtonMail, OpenMailbox, Gandi)
  • Utiliser Conversations sur Android pour chatter de manière privée.
  • Ouvrir un compte sur le réseau social Diaspora, l’alternative décentralisée à Facebook et Twitter
  • Faire un don (aussi minime soit-il) à un logiciel libre

Moyen :

  • Apprendre les bases de la programmation avec Python. Vous comprendrez mieux comment fonctionne un ordinateur et pourrez automatiser des taches.
  • Installer Cyanogen/LineageOS sur votre smartphone. Redevenez le maître de votre smartphone, bloquez les permissions abusives, supprimez la pub des applications, supprimer les applications préinstallées qui bouffent votre batterie et polluent l’interface, gagnez en vitesse, sécurité et autonomie avec toujours la dernière version d’Android sans devoir racheter de nouvel appareil
  • Essayez une distribution Linux sur votre PC personnel. Bénéficiez de tous les logiciels libres installables d’un clic et d’un ordinateur rapide, sans antivirus et sans espions. Le plus simple est d’installer Linux sur un deuxième disque dur pour commencer. Vous retrouverez les mêmes logiciels libres que vous utilisez sous Windows ou Mac et plus encore.

Difficile :

  • Gérer votre serveur personnel (chez vous) avec un Raspberry Pi et Nextcloud, WordPress, Prosody, Mumble, etc… pour une infrastructure efficace et privée.

Related Posts:

2016-12-07

Mémo à l’usage de ceux qui veulent avancer

[Le présent article a été en grande partie écrit en avril 2016 et légèrement retouché et actualisé en décembre]

Après quatre ans à fréquenter des élus et fonctionnaires de ma nouvelle campagne d’adoption, et plus généralement toute personne avec qui je me suis entretenu à propos de numérique ou, plus généralement, de politique, la phrase que j’ai dû entendre le plus, c’est « mais de toute façon, qu’est-ce qu’on peut bien y faire ? »

A propos d’un peu tout. De l’absence de connectivité fonctionnelle de façon satisfaisante dans nos campagnes, d’usage de trucs dans le cloud quitte à perdre toute notion de ce qu’est la vie privée voire intime, de dépenses de fonds publics totalement idiotes, etc.

Vous me voyez venir, je vais prendre mon cheval favori : le numérique, et je vais en parler pour ce qui concerne une zone que je commence à connaître un peu : l’Yonne.

« Mais qu’est-ce qu’on peut bien y faire ? »

Dans l’Yonne, il y a en gros deux grosses agglomérations, Sens et Auxerre, représentant quelque 120000 habitants sur 720 kilomètres carrés quand le département dans sa totalité en compte 342000 sur 7420 kilomètres carrés. On a donc, à la grosse, 35% de la population qui habite sur 10% du territoire.

Ces deux agglomérations ont bénéficié d’une « convention AMII ». Ça a l’air plutôt sympathique, « ami ». Même quand on commence à lire ce qu’en dit la presse, ça a l’air cool : « la fibre optique chez l’habitant tout payé par un opérateur sans une once d’argent public ». On fonce donc inévitablement dans le panneau, quand on est un élu, surtout quand on n’a pas lu les petites lignes et l’explication de texte.

Une petite ligne parmi d’autres

Cette convention AMII concerne les particuliers. Exit les entreprises, exit les hôpitaux, exit les choses qui, grosso modo, ont besoin de plus de débit que la moyenne. « Pas grave » va-t-on nous répondre, « ceux-là peuvent souscrire des offres entreprise ». Oui, 4000 euros de frais d’installation (quand on se débrouille TRÈS BIEN) et entre 600 et 3000 euros par mois en fonction du débit et des services voulus.

Oui, on croit rêver. On pose donc légitimement la question « mais pourquoi vais-je aller payer des milliers d’euros pour relier le local de mon entreprise à un débit suffisant alors que dans le quartier d’à côté, chez moi, j’ai la fibre pour 35 euros par mois avec deux ados qui doivent consommer 20 fois plus de données que ma secrétaire ? ». Et là, on s’accroche bien à son fauteuil : « parce que, Monsieur, C’EST PAS LA MÊME FIBRE ». Et vous savez le pire ? Ça passe. Ces empaffés ont réussi à faire croire que ce n’était pas la même fibre.

Eh ben si, en fait, c’est la même. Toute pareil que celle qui va aux domiciles du quartier résidentiel. A quelques détails près : la « fibre entreprise » n’est mutualisée qu’au niveau du NRO au lieu de l’être au PM (la belle affaire… Vous ne savez pas ce que sont un NRO ou un PM ? En gros, de grosses armoires dans lesquelles on branche plusieurs fils ensemble sur un autre fil. Des multiprises réseau, quoi), et elle bénéficie généralement d’une garantie de temps de rétablissement en cas de panne.

« Aaahhh ouiiii, donc c’est quand même vachement mieux que le FTTH chez moi, cette fibre entreprise ». Oui, si vous avez besoin d’une garantie de rétablissement en 4h et d’un tuyau dédié jusqu’au central téléphonique. Mais au fait, vous avez quoi aujourd’hui pour accéder à internet ? Ah, une livebox. Et la dernière fois qu’elle est tombée en panne, ça a pris quoi ? 2 semaines pour retrouver une connexion ? Ah, chiant .. Mais ça vous a empêché de bosser ? Non, ben non, vous vous êtes débrouillés avec le voisin ou des clés 3G. Et vous avez quoi comme débit ? 10 méga ? Et ça va ? Oui, ça met juste un peu de temps pour envoyer un mail avec des pièces jointes mais on s’y fait. Ben oui.

Donc en réalité, vous avez juste besoin d’une connexion plus performante, pas énormément plus performante, juste un peu, allez, soyons fous, 20Mbps symétriques… mais sinon, vous êtes content. Et vous n’allez sûrement pas investir l’équivalent d’un SMIC mensuel pour vous payer une fibre, non, vous êtes un brin plus intelligent, vous allez embaucher quelqu’un si vous avez des sous devant vous.

Explication de texte

Quand un opérateur comme Orange ou SFR signe une convention AMII, il fait donc croire à sa victime qu’il est son sauveur et qu’il va sur ses fonds propres (grand prince, en plus) déployer un réseau tout beau tout neuf que les électeurs ils vont être super contents. Promis, dans 5 ans, on a fini, et on s’arrangera pour avoir fait le plus gros dans les endroits à problèmes, comme ça, aux prochaines élections, vous aurez un bon argument pour être réélu.

Et puis une fois signé, il se passe quoi ? Ben il se passe que des agglomérations comme Sens et Auxerre sont déjà, à quelques exceptions notables près, plutôt pas trop mal servies et que l’investissement sur fonds propres promis par l’opérateur qui aménage le réseau FTTH ne concerne que l’horizontal (les fibres sous le trottoir) mais ni le vertical (dans les immeubles) ni le branchement des pavillons… qui sont à la charge de l’opérateur qui va vouloir relier son client, donc, in finé, du client. Prix de ce petit luxe qui consiste généralement à tirer quelques dizaines de mètres de fibre ? Entre 200 et 800 €.

Évidemment, les opérateurs sont malins, ils n’annoncent pas des frais de mise en service de ce genre là, non. Ils noient ce montant dans l’engagement.

« Bonjour, vous avez déjà de l’ADSL qui pédale pas trop mal, mais c’est hasbeen. Prenez la fibre, c’est QUE 45 € par mois avec un engagement 3 ans, vous pourrez regarder 12 chaînes HD en même temps ! ». Alors, je m’engage 3 ans avec un opérateur, je paie plus cher, mais en fait j’en ai pas besoin parce que j’ai que deux yeux et que j’ai beau essayer, je peux pas regarder deux trucs différents en même temps.

Et du coup, que dit l’opérateur à la collectivité avec qui il a signé la convention AMII ? « Euhh bon en fait on vend beaucoup moins que prévu, et comme on comptait un peu dessus pour financer le reste du déploiement, ben il va durer plus longtemps que prévu, mais vous pouvez rien y faire, c’est marqué dans le contrat, article 156 alinéa 16876″.

Tadaaaa.

Cerise sur le gâteau

L’opérateur qui a réussi à arracher une convention AMII aux grands pôles urbains l’a mis bien profond au département et à la région concernés. Eh oui, on dit qu’il a vitrifié la zone. Interdiction pour toute collectivité de venir investir un centime sur la chasse gardée de l’opérateur en matière d’aménagement numérique pendant la durée de la convention.

Du coup, il se passe quoi ? Il se passe que les zones les plus peuplées (qui sont moins chères à déployer, compte tenu de la densité de logements) sont exclues de la péréquation que pourrait effectuer un département pour créer un réseau d’initiative publique. Reste les zones moins densément peuplées qui coûtent plus cher à couvrir en fibre.

En résumé, la boite privée riche qui fait des bénéfices s’occupe de couvrir là où ça coûte pas cher mais ou personne n’en a besoin, et le secteur public déjà exsangue doit se démerder avec les zones qui coûtent cher mais ne le fait pas et les laisse moisir faute de moyen.

Bien joué, l’AMII.

Bon, du coup, on fait quoi, nous, collectivité petite ou grosse ?

On se demande comment faire pour régler le léger problème des campagnes avoisinant ces centres urbains qu’un gros opérateur a phagocyté, vu qu’on peut pas faire péter les conventions qui ont été signées.

On va se renseigner là où les gens ont l’air de savoir ce qu’ils font, chez les grands opérateurs. Une commune du coin a tenté de se démerder, téléphonant à quelques opérateurs nationaux, disant « coucou, on voudrait créer un réseau fibre sur notre commune, on paie, vous voulez bien venir y vendre vos offres. Ils se sont fait rire au nez sur le thème : « Mais vous êtes ridicules. C’est trop petit. On prendra même pas le train pour venir voir. Ça nous intéresse pas ».

Il s’agissait, pour que les choses soient claires, que la ville finance et construise un réseau pour que ces messieurs les opérateurs n’aient rien à investir et puissent débarquer avec leurs offres pour les vendre aux gens. Plutôt sympa, moi, je dirais.

Bon, du coup, on pose la question : « à partir de combien ça vous semble intéressant ? ». Là, on vérifie qu’on est bien assis, la ville a demandé : trop petit. La communauté de commune a demandé : trop petit. Le département a demandé : trop petit. Oui oui, ces gens là ne veulent discuter qu’avec un truc à l’échelle régionale.

Et comme ils ont embauché des lobbyistes doués, ils ont même réussi à faire gober à l’état qu’il était nécessaire de freiner toute velléité locale de construction de réseaux optiques en ne réservant les subventions état et Europe qu’aux projets d’envergure régionale. Il faut le savoir, aujourd’hui, une collectivité territoriale ne fait RIEN si il n’y a pas au moins un bout de subvention qui vient de plus haut. Alors qu’elles pourraient souvent faire quand même quelques trucs, mais c’est un autre débat.

Bon ben, du coup, on va rien faire hein. Enfin, rien de concret. On va voter un budget. Allez, 55 millions d’euros. Hop. L’Europe va en payer 12, l’état 18, le département 14 et on va aller siphonner les 11 millions restants dans les caisses de nos communautés de communes, elles referont leurs trottoirs ou leurs terrains de foot plus tard.

Bon. Et avec ces 55 millions on fait quoi ?

On a tout bien écouté Orange, ils nous on dit que la fibre c’était au moins 2000 € par foyer compte tenu de notre densité de population mais que eux avait une solution magique géniale qui coûte deux fois moins cher, et qui consiste à rapprocher la fibre de chez l’habitant. Pas l’y amener, hein, la rapprocher. Nom de code « Montée en débit », MeD ou PRM chez les initiés.

Bon, je la fais courte pour ceux qui ne connaissent pas le principe de la montée en débit : ça monte pas bien haut.

Si l’ADSL ne marche pas ou pas bien à certains endroit, c’est parce que les lignes de téléphones sont trop longues. Du coup, le principe de la PRM, c’est de remplacer un bout de ces lignes de téléphones par une fibre optique (qui souffre beaucoup moins de la baisse de qualité avec la distance) et, au bout, de planter un mini central téléphonique sur lequel on viendra raccrocher les lignes. Les lignes sont plus courtes, l’ADSL marche mieux. CQFD.

En plus, ça « prépare l’arrivée de la fibre ». Pensez donc, ils enterrent 6 paires de fibres pour relier un mini central téléphonique perdu dans la pampa sur lequel il y a quelques dizaines de lignes. Et ils veulent nous faire croire que 6 paires sont suffisantes pour proposer, plus tard, une offre FTTH digne de ce nom ? Raté, il faudra changer le câble en question, ne serait-ce que parce que l’ARCEP impose qu’il y ait une fibre par habitant qui arrive au point de mutualisation le plus proche, que celui-ci doit couvrir au moins 300 logements et que bon nombre d’opérations PRM actuellement en route portent sur des PM de moins de 90 lignes. Donc en fait, ça ne prépare rien du tout.

De toute façon, le gros du coût de déploiement de la fibre ne concerne pas cette longue distance effectuée entre le central d’origine et le nouveau petit, bien souvent faite en bordure de route facile à creuser, mais bien la mise en service jusqu’à l’abonné où il faut se torturer l’esprit pour ne pas trop ravager le devant de la maison pour y faire rentrer le nouveau câble.

Mais s’il n’y avait que ça, on s’en contenterait. Là où il y a un hic, c’est que cette fameuse offre PRM est :

  • Affreusement chère : en ce qui concerne l’Yonne, elle va concerner, ces prochaines années, un peu moins de 19000 foyers pour un coût total d’un peu moins de 22 millions d’euros. Quelque chose comme 1150 € par foyer bénéficiant de l’augmentation de débit.
  • Une subvention à Orange : il n’y a qu’eux qui peuvent la mettre en œuvre puisqu’il s’agit de leur réseau. L’excuse typique étant « c’est faux, il y a plusieurs entreprises qui proposent l’offre PRM cuivre, il y a donc libre concurrence ! » oui, et qui, une fois la phase d’étude réalisée, sous-traitent la réalisation du boulot à… Orange.
  • Contre performante au possible : pour cette somme modique offerte à l’opérateur historique, l’ADSL pourri ou inexistant d’aujourd’hui deviendra un ADSL qui marche à peu près dans 2 à 6 ans, on « investit » donc de l’argent pour garder à la traîne ceux qui y sont déjà.

Pendant ce temps, vous continuez à payer directement ou indirectement l’entretien du réseau téléphonique (qui n’est plus assuré qu’en cas d’extrême urgence) sur vos factures mensuelles, et vous allez donc, en plus, payer, via vos impôts, le fait de pouvoir continuer encore longtemps à financer cet entretien inexistant. Heureusement que plus de la moitié sont payés par l’Europe et l’état, hein, on se sent moins seuls.

Bon, ça, c’est fait, un petit cadeau de 22 millions d’argent public à une boite qui caracole en tête des plus gros bénéfices à la bourse de Paris. Admettons. La consolation c’est que c’est encore l’état qui capte 13% de ces dividendes. On n’a pas tout perdu.

Bon, et les 33 millions qui restent, on en fait quoi ?

On va quand même faire un peu de fibre, hein. Bon, on le fait où ? Bon, ce bled là, celui là et celui là y sont de gauche, je les aime pas, donc pas chez eux. Là bas, c’est trop paumé et Orange a dit que ça coûterait trop cher, donc on n’ira pas. Bon, ben on va déployer dans les villes les plus peuplées en dehors des deux zones AMII et uniquement si elles sont du même bord politique que nous. Allez, c’est ficelé, on y va.

Au fait, on fait comment la fibre ? Tu sais, toi, René ? Non. Francis non plus ? Bon… on va attendre que la région se bouge le fion pour nous pondre un truc, tout seuls on n’y arrivera pas.

Attend, on va quand même sortir un appel à projet pour les zones industrielles histoire de faire croire qu’on se préoccupe de nos entreprises. Non, t’inquiète, s’il y en a qui répondent on fera comme d’habitude : les morts. Avec un peu de bol Orange ouvrira des offres fibre entreprise sur ces zones et on pourra valablement retirer l’appel à projet avant que ça râle trop fort en disant « ah ben non, à Bruxelles ils ont dit que quand le privé couvre, nous on n’a plus le droit ».

3 ans plus tard, la région, toute contente de se marier avec la Franche-Comté, parvient à monter une Société Publique Locale pour piloter les déploiements FTTH. Bon, en vrai, elle va aussi édicter les règles d’ingénierie et choisir un délégataire privé qui sera chargé de se mettre dans la poche les 33 millions de l’Yonne (et les millions des autres départements) pour construire un beau réseau FTTH sur lequel ces messieurs « opérateurs d’envergure nationale » viendront vous vendre leurs offres.

« Gérer ça en propre ? Mais vous n’y pensez pas Geneviève, Orange a dit que c’était compliqué, la fibre. Déjà qu’on n’est plus foutus de gérer nous-mêmes les réseaux d’eau potable… »

Petite consolation tout de même, les opérateurs qui vont venir vendre leur service payeront (en principe) une dîme mensuelle pour chaque ligne qui reviendra dans les caisses des départements. C’est donc un investissement, contrairement à la montée en débit PRM qui est une subvention à fonds perdus.

Espérons juste qu’au détour de l’appel à délégation de service public qui sera passé, les deux ou trois candidats « sérieux » qui se présenteront n’imposeront pas de clauses bien tordues (du genre « pour pouvoir jouer sur le réseau il faut le cofinancer à hauteur de 25% ») leur permettant de s’arroger à eux seul le droit d’exploiter le réseau public. L’avenir nous le dira.

Bon, eh, Spyou, t’es sympa avec ton roman fleuve, mais tu nous as toujours pas dit ce qu’on pouvait faire, là.

C’est pas faux. Mais il fallait quand même bien que je vous brosse le tableau avant de le barbouiller avec ma gouache.

Deux ou trois autres détails, que vous ayez bien l’image en tête.

Déployer un réseau fibre, c’est de la plomberie. Tout pareil que de l’eau ou n’importe quel autre réseau déjà existant : il faut enterrer des tuyaux ou planter des poteaux pour ensuite y mettre des câbles dans lesquels il y a de la fibre.

Petit point financier :

  • Un mètre de fibre, c’est entre une poignée de centime et 2 euro en fonction de la quantité achetée et du nombre de fibres dans la gaine.
  • Un mètre de fourreau pour mettre la fibre, c’est du même acabit.
  • Un poteau, c’est quelque chose entre 50 et 100 euros.
  • Un mètre de tranchée pour enterrer un fourreau, c’est entre 10 euros (dans un champ) et 3 ou 400 euros (en ville où il faut faire attention aux autres réseaux, reconstruire le marbre plaqué or du trottoir, etc.)

Bilan de ce point financier : la fibre, ça coûte rien. Ce qui coûte, c’est de faire des trous.

Ça fait déjà un bon moment que toutes les collectivités le savent : quand on fait un trou quelque part, on en profite, on met des fourreaux vides en trop dedans, ça évitera d’avoir à creuser à nouveau, et dans le pire des cas, on aura perdu quelques centimes, c’est pas bien grave.

Alors qu’on m’explique pourquoi, pas plus tard que l’année dernière dans l’Yonne, plus de 80km de tranchées ont été réalisées (pour celles dont j’ai eu connaissance), dont certaines assez longues, sans qu’aucun fourreau vide n’ait jamais été posé.

Florilège :

  • « On savait pas comment faire donc on n’a rien fait »
  • « Ça traversait plusieurs communes et il y en avait dans le tas qui ne voulaient pas payer plus cher que le strict nécessaire donc on n’a rien fait »
  • « C’est une intervention faite par un gestionnaire de réseau privé, si on voulait mettre des fourreaux vides, on aurait dû cofinancer les travaux donc on n’a rien fait »
  • « Quand on pose un type de réseau, on fait appel à une entreprise spécialisée dans ce type de réseau. Si on lui demande de poser un autre type en même temps, elle fait n’importe quoi et c’est la merde intersidérale donc on n’a rien fait »

Et vous demandez encore ce que vous pouvez faire ?

J’ai d’autres idées, si profiter des trous qui sont faits pour préparer l’avenir n’est pas à votre portée.

Vous avez l’immense chance (des communes d’autres départements tueraient pour l’avoir) de bénéficier de l’implantation, sur votre territoire, d’une initiative locale, portée bénévolement par des gens motivés, qui ont les compétences, le temps et l’envie de faire quelque chose. Ils ont, pour arriver à leurs fins, créé une structure éminemment démocratique et totalement transparente, tant financièrement que techniquement. Pourquoi persister à ne pas les considérer, sans même parler de les soutenir, hein ?

Ils sont mal fringués et leurs principes ont l’air vaguement communistes… ok… j’ai d’autres idées, si soutenir les initiatives locales n’est pas de votre goût.

Une idée plus administrative, tiens. Se grouper pour faire pression. Il existe des tas d’organisations regroupant de petites communes rurales. Il serait peut être temps d’envoyer promener le diktat privé imposé par Bruxelles et faire pression sur notre état pour qu’il oblige ceux qui en ont les moyens d’assurer l’investissement nécessaire à la sortie du tiers monde numérique de nos territoires. Pas en suggérant une nouvelle taxe qui retombe systématiquement sur le nez des clients comme l’a proposé un de nos députés locaux, mais en réévaluant par exemple la notion de service universel pour y inclure l’accès à internet avec un débit minimal valable.

Non ? Si faire bosser vos équipes sur un nouveau genre de projet qui a l’air un peu révolutionnaire ça vous colle la frousse, j’ai encore une pochette surprise dans ma besace.

Pourquoi ne pas suivre les buts que vous vous êtes fixés quand vous avez demandé à un cabinet de conseil d’écrire le schéma directeur d’aménagement numérique à votre place ? Ils n’y ont pas mis QUE des âneries hein. Loin de là. Il y a même une idée toute bête et qui, pourtant, n’a toujours pas été mise en œuvre, bien qu’elle soit un des prérequis avant de pouvoir éventuellement penser à faire de la fibre : recenser le génie civil disponible. Mettre des outils de cartographie à disposition de toutes les structures administratives, et pourquoi pas de l’ensemble de la population pour aller plus vite ?

Maintenant, si même faire ce que vous aviez dit que vous feriez n’est pas possible… je ne vois qu’une solution, continuez à chercher des papiers et des chèques à signer en espérant que les choses se feront toutes seules.

En parlant de chèques… Chaque année, les opérateurs paient une Redevance d’Occupation du Domaine Public (RODP) aux collectivités dont ils occupent tout ou partie de l’espace public, en souterrain ou en aérien. Vous êtes-vous un jour demandé d’où sortait le montant en bas de la feuille ? Je serais vous, je creuserais le sujet. Sachez que si vous trouvez une bourde dans le calcul, vous pouvez demander le complément de façon rétroactive sur 5 ans. Allez, je vous aide, c’est Orange qui vous donne le chiffre, et en dehors d’aller recenser le réseau physiquement dans votre commune, vous n’avez aucun moyen de vérifier sa validité. Action.

Moi, je vais continuer chaque semaine à connecter 2 à 10 personnes au réseau de SCANI, ça va être long, on sera toujours une bande de gnioufs bizarres qui font pas du vrai internet, mais à la fin, quand on comptera les points, nous, on saura ce qu’on aura fait pour le département.

Je m’énerve pas, Madeleine, j’explique.

Le truc qu’on fait chez SCANI est assez simple à comprendre. On prend de l’internet où il marche et on l’emmène là où il ne marche pas. On ne pirate pas un opérateur quelconque, nous SOMMES opérateur. N’en déplaise à certains, « être opérateur », ça se résume à cocher quelques cases sur le formulaire du site de l’ARCEP et de cliquer sur « envoyer ».

Comme on a avec nous quelques personnes du métier qui sont tombés dedans quand ils étaient petits, on arrive à obtenir les meilleurs prix pour les services qui sont utiles et on sait faire tomber en marche ces objets bizarres portants des noms qui font peur : « routeur, switch, lns, serveur dns… »

Et ensuite, on y va petit à petit. Pas de grande folie, pas de couverture totale de tel village, pas d’investissements colossaux. Non, on a commencé avec Pclight par un investissement en matériel de 500 € et un coût mensuel récurrent à payer de 60 €. C’était début 2013, moment où les premiers adhérents ont été reliés à des connexions proposant un débit descendant de 12Mbps et un débit montant de 1Mbps. Du simple ADSL, en fait.

Le schéma technique est compréhensible par n’importe qui : une ligne ADSL, un bête câble réseau, une antenne wifi au bout, accrochée à la cheminée, la même en face plus loin, et un ordinateur au bout du câble.

C’est ce qu’on fait depuis 4 ans : mettre des antennes wifi en face les unes des autres pour amener des connexions internet dans la campagne.

Avec un travail 100% bénévole, en dehors des prestations dangereuses réalisées par des antennistes professionnels, on en est rendus à 370 connexions finales actives et un peu plus de 700 antennes installées. Du coup, le budget de 60 € par mois a un peu grossi, le récurrent mensuel qui rentre, une fois la TVA déduite, est d’environ 8000 € qui permettent aujourd’hui de financer :

  • Trois arrivées de « fibre optique entreprise », les mêmes que celles décrites plus haut, qui ont coûté fort cher à l’installation mais qu’on a pu offrir aux adhérents avec leur argent mis en commun dans la coopérative.
  • Un cœur de réseau parisien composé de quatre routeurs servant à accueillir d’une part l’arrivée de ces fibres optiques et des liens ADSL et VDSL que nous utilisons sur certaines portions isolées du réseau, et d’autre part les interconnexions avec 300 autres opérateurs de toutes tailles avec qui nous échangeons le trafic des adhérents.
  • L’achat de matériel et de prestations pour continuer à déployer le réseau et l’améliorer.

Le modèle économique est idéal : plus il y a de personnes reliées, plus le budget mensuel augmente, plus on peut augmenter les débits disponibles en en faisant profiter tout le monde. Certains bénéficient aujourd’hui d’un débit de 60 méga, toujours pour 30 € TTC par mois.

L’objectif à court terme est de commencer à creuser nous mêmes ces fichus trous pour y mettre de la fibre optique. Même si certains douteront toujours, l’union fait la force, et nos agriculteurs ont tout le matériel nécessaire pour faire des trous. Avec ce principe de fonctionnement, une coopérative anglaise arrive à un investissement tout compris (fibre, génie civil, matériel actif, déploiement chez les gens, connectivité vers internet) de 1200 € par habitation connectée avec un débit disponible de 1000Mbps pour chacun.

Concernant le travail déjà réalisé avec le wifi sur notre réseau, il n’est pas condamné, puisque la fibre viendra en remplacement des liens wifi les plus chargés pour les rendre plus fiables et performants et que les antennes pourront être réinstallées pour étendre encore le réseau plus loin, voir, pourquoi pas, les céder à d’autres initiatives ailleurs.

A plus long terme, il s’agit de créer des emplois qualifiés et non délocalisables autour d’un projet économique, social et solidaire.

La totalité des données financières sont accessibles en temps réel aux adhérents, tous les outils et méthodes de travail sont publics et l’ensemble des actions menées sont ouvertes à qui veut bien se donner la peine de venir à notre rencontre.

En bref, soutenir nos actions présente un risque : celui qu’on aille plus vite, plus fort et plus loin. C’est promis, on ne se moquera pas de celles et ceux qui pourraient venir en nous disant « bon, ok, au temps pour moi, c’est un vrai projet que vous avez, comment on avance ensemble maintenant ? ».

Eh, t’es bien mignon avec ton association de Trotskystes là… on peut pas baser la stratégie numérique d’un département là dessus.

C’est assez délirant comme idée, je le reconnais.

D’ailleurs, une petite ligne sur les associations en question. Depuis fin 2012, Pclight sonnait tantôt comme une douce musique (aux oreilles de certains, délaissés des sphères numériques, qui voient là une bonne opportunité de s’en sortir), tantôt comme une rengaine plutôt enquiquinante (pour d’autres, habitués à des fonctionnements plus institutionnels). C’était un brin voulu. En plus de faire du réseau, on est également une belle bande d’agitateurs qui aimons coller de grands coups de pieds dans la fourmilière. Pas super sympa, mais nécessaire.

Certains ont pu se demander ce qui se passait avec cette histoire de Pclight & SCANI. Sans rentrer trop dans les détails, des divergences de point de vue concernant entre autre la gouvernance et la taille des projets a mené à une séparation en deux structures. Ça a probablement été fort mal géré, mais passons, le temps a fait son œuvre et les deux structures envisagent à présent des actions communes.

L’idée n’est pas d’avoir à faire un choix entre blanc ou noir, entre conservateur et 68’tards, entre bien et mal, entre capitaliste et communiste, entre gros ou petits mais bien de saisir les opportunités pertinentes au moment où elles se présentent avec un seul et unique objectif : le bien commun.

C’est ronflant comme objectif, même un poil arrogant, OK. Mais c’est comme ça, faudra vivre avec.

Et si on arrive à bosser en bonne intelligence avec le reste des opérateurs, les élus, les autres associations, les habitants, les coopératives, les entreprises, la région, l’état, etc. qui sait où on ira ?

Super, tu m’as convaincu. Je suis élu, je fais quoi ?

Bon, déjà, tu retournes en haut de la page et tu vas lire une seconde fois.

Ensuite, SCANI est une coopérative. Pour un élu, ça veut donc dire deux choses :

  • tu peux venir à notre rencontre et même, avec un peu de bol, nous demander de venir te voir (par mail, de préférence), pour t’expliquer les points que tu n’as pas compris et discuter de ce que la collectivité que tu représentes peut apporter au projet (délégation de personnel, mise à disposition de points hauts, prêts d’engins…)
  • tu peux aussi soutenir l’activité de la coopérative en investissant au capital. Ça passe par une délibération et il faut, ensemble, veiller à ce que l’investissement public ne dépasse pas l’investissement privé et à la façon dont le capital investi sera utilisé par SCANI, mais c’est un bon moyen de dépenser l’argent de tes électeurs puisque tu ne le dépenseras pas : il reviendra dans les caisses communes lorsque ce à quoi il aura servi aura été rentabilisé (à supposer qu’on ne se plante pas, bien entendu …). Tu trouveras un peu de littérature en cliquant ici.

Au boulot maintenant !

2016-11-10

Fausser les stats de GoogleAnalytics

Dans un précédent article, je vous montrais qu’on pouvait fausser les stats Piwik assez facilement. Voici maintenant l’exemple avec GoogleAnalytics qui est le compteur de visites le plus répandu sur le web.

En 15 min, j’ai généré plus de 100’000 nouveaux visiteurs avec un script Python :

fake-google-analytics2

J’ai du me limiter à ~100 connexions simultanées. Je recevais des erreurs TCP104 (Connection reset by peer) au delà :

fake-google-analyticsCe qui est intéressant bien sûr, c’est que les requêtes se font auprès du serveur de GoogleAnalytics et non auprès du site web. Donc le site web n’a pas de trace de l’IP voulant tricher puisqu’il n’a reçu aucune communication.

Mieux, contrairement à Piwik, GoogleAnalytics ne communique jamais l’IP du visiteur à son client (celui qui regarde les stats). Aussi il lui est impossible de bannir/filtrer l’IP de la personne qui s’amuserait à fausser les stats.

Conclusion, ne pas prendre les statistiques visiteur pour argent comptant. Elles sont facilement falsifiables. De plus, elles ne prennent pas en compte les utilisateurs qui bloquent les traqueurs, qui sont de plus en plus nombreux (et ils ont raison).

Est ce que des sites web utilisent GoogleAnalytics pour se monétiser? Ça me ferait bien rire.

C’est aussi un moyen de booster artificiellement la popularité de Linux sur le site web de votre choix ;-)

Related Posts:

2016-11-07

Accéder au flux RSS d’un compte Diaspora

Si il n’y avait qu’une seule raison d’utiliser Diaspora par rapport aux réseaux sociaux tels que Twitter, Facebook et Google+ ce serait la mise à disposition d’un flux RSS pour suivre vos articles publics pour les non-membres.

En clair, ça permet à n’importe qui, même non inscrit sur Diaspora de suivre vos articles (notification à leur parution) dans le logiciel et la plateforme de leur choix. C’est la grosse différence avec les autres plate-formes qui enferment le contenu des utilisateurs derrière un mur opaque pour les non-membres (le dark web c’est ça…)

Donc par exemple, mon utilisateur c’est « tuxicoman » sur le serveur Framasphere. Donc mon flux RSS est https://framasphere.org/public/tuxicoman.atom

Vous pouvez aussi retrouver cette info facilement à travers le menu de Firefox en cliquant sur le bouton s’abonner :

rss-firefox

Simple !

Related Posts:

2016-11-06

Migration owncloud -> nextcloud

J’ai effectué la migration d’Owncloud à Nextcloud il y a quelques semaines. Aucun soucis à signaler.

La migration se fait sans peine puisque Nextcloud s’installe comme une mise à jour classique pour Owncloud. Il suffit de faire une mise à jour manuelle en suivant la documentation.

J’utilise maintenant l’application « News » pour lire mes flux RSS :

Elle est très pratique et se marie bien avec l’application OCReader pour Android afin d’avoir une synchronization des flux lus et favoris.

Astuce pour accéder à l’app store de Nextcloud et à l’application « News », ajoutez ces lignes à votre fichier de config :

'appstore.experimental.enabled' => true,
'appstoreurl' => 'https://apps.nextcloud.com/api/v0',

Par contre, cet appstore n’a pas autant d’application que celui d’owncloud… donc je ne vous le conseille que pour télécharger l’application « News » facilement.

Related Posts:

2016-10-28

Exploser le compteur de visites de Piwik

Je me demandais si c’était possible de tricher facilement sur les compteurs de visites webs tels que GoogleAnalytics ou Piwik.

Le principe est le suivant : si le compteur est un script en Javascript qui tourne entièrement coté utilisateur et envoie des données au serveur, il me suffit d’envoyer à la volée les bonnes requêtes vers le serveur pour augmenter artificiellement le compteur.

Je commence par Piwik car c’est la solution que j’utilise et le code source est ouvert.

Piwik utilise des heuristiques pour détecter si les visites proviennent du même visiteur ou non. Il se base notamment sur la configuration machine envoyée à travers les entêtes HTTP.

Mais je suis tombée sur une fonctionnalité cadeau. Il suffit de passer l’argument « new_visit=1 » pour désactiver ce mécanisme et faire reconnaître chaque nouvelle requête comme provenant d’un nouveau visiteur.

J’ai trouvé ça en lisant le code source de Piwik. L’info est ici et .

Voici donc comment j’ai pu exploser mon compteur avec un script Python en quelques secondes :

capture-decran-de-2016-10-27-230057Est ce que certains d’entre vous ont déjà essayé de fausser les résultats de GoogleAnalytics ?

Related Posts:

2016-10-14

Bloquer les publicités et traqueurs au niveau du DNS avec Unbound

Hormis les plugins bloqueurs de publicités comme Ublock Origin au niveau du navigateur, il est aussi possible d’agir au niveau DNS. Je pense que les 2 méthodes sont complémentaires. Le blocage au niveau du DNS permet d’agir sur tout les ordinateurs l’utilisant (par exemple tous les ordinateurs de votre réseau local). C’est à dire que le blocage va fonctionner aussi sur les iMachines, iTéléphones et Androphones plutot réticents à ce que vous bloquiez les publicités qui rapportent des brouzoufs à leur éditeurs.

Si vous avez un DNS local tel que Unbound, c’est très simple à mettre en place. L’idée est télécharger une liste de domaines connus pour fournir uniquement de la publicité ou des traqueurs et de mentir sur leur adresse IP. Votre DNS va dire que ces domaines sont inaccessibles.

On commence par télécharger la liste de domaines à bloquer sur le site de StevenBlack et la convertir au format Unbound :
# cd /etc/unbound/unbound.conf.d
# wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | grep '^0\.0\.0\.0' | awk '{print "local-zone: \""$2"\" redirect\nlocal-data: \""$2" A 0.0.0.0\""}' > adslist

On ajoute la prise en charge de cette liste de domaines à bloquer dans notre fichier de configuration d’Unbound :
#Ads blocking
include: "/etc/unbound/unbound.conf.d/adslist"

On redémarre le service:
# systemctl start unbound

Et voila, simple !

J’ai fait pour vous un petit test sur le site web http://www.jeuxvideo.com/

C’est assez parlant ;-)

Sans bloquage au niveau du DNS (temps de chargement 10 secondes):

sans-dns-block

Après bloquage au niveau du DNS (temps de chargement 1 seconde):

avec-dns-block

Je vous invite à suivre mon tutorial pour installer Unbound sur Debian. Ca vous permet également d’accéder à tout le web et échapper à la censure par bloquage DNS.

Related Posts:

2016-10-10

Utiliser Signal impose la présence de l’espion de Google

La semaine dernière, j’ai vu beaucoup de publicité sur Internet à propos du fait que les serveurs de Signal avaient peu de métadonnées à donner au FBI. Même Snowden recommande Signal et tance Google.

Sois je suis aveugle, soit les autres le sont. À mon grand désespoir, Signal repose sur le service Push de Google (Google cloud messaging). Or celui-ci est accessible uniquement aux appareils Android ayant installé les Google Apps et utilisant un compte Google. Pour rappel, les Google Apps ne font pas partie d’AOSP, la partie libre d’Android. Le code source est opaque et seul Google sait ce qu’il peut faire avec vos données. Ce que l’on sait par contre, c’est que les Google Apps ont les droits root (c’est pour cela qu’il n’est pas possible de les installer avec la méthode classique des APK), tournent en permanence, remontent des données en continu au serveurs de Google, permettent d’effacer/remplacer n’importe quelle application silencieusement et même d’effacer toutes les données du téléphone à distance.

La création d’un compte Google implique l’acceptation des conditions générales de Google spécifiant qu’on y laisse moult informations de vie privée, à commencer par son numéro de téléphone. Ensuite, en opt-out (à la manière de Windows 10), les Google Apps envoient par défaut la liste de vos contacts, l’agenda, l’historique de vos appels reçus et émis, votre position au moins une centaine de fois par jour, et même les données de configuration de vos applis pour que vous puissiez aisément transférer vos données sur un autre appareil.

Donc pour moi, la première mesure d’hygiène, c’est de réinstaller un OS comme Cyanogen sans le mouchard de Google. Mais dans ce cas, impossible d’utiliser Signal ???

Est ce que Edward Snowden utilise un téléphone qui remonte toute sa vie privée à Google en plus de lui donner l’accès complet à distance ? Je suis assez interloqué sur ce point.

Pour ma part, pour la messagerie instantanée, j’utilise Conversations avec mon propre serveur Jabber. Ca fonctionne très bien. Mon serveur étant auto-hébergé, je n’ai pas de soucis sur les données qu’il contient (mot de passe et liste de contact).

D’ailleurs, je me demande où la boulimie d’informations de Google et Microsoft va s’arrêter. Google s’attaque à la vie à la maison. Microsoft à la vie au bureau. Que va-t-il rester dans 5 ans de lieux et moments privés ?

Related Posts:

2016-10-08

MySearch 1.10

Je viens de publier la version 1.10 de Mysearch, mon métamoteur de recherche anonymisant, sans tracking, libre et avec la pertinence des résultats de Google.

Il est désormais compatible avec Twisted 16 et donc Ubuntu 16.04

Le paquet d’installation Deb se trouve ici.

Comme toujours vous pouvez le tester sur https://search.jesuislibre.net/

Un journal allemand (Golem.de) l’a récemment testé et comparé avec les autres métamoteurs de recherche (Searx notamment)

Related Posts:

2016-09-22

Modules pratiques pour serveur Prosody(XMPP)

Voici une liste de modules pratiques pour Prosody afin d’améliorer votre expérience de messagerie instantanée XMPP:

  • compression pour XEP-013 : stream compression. Compresse les données avec zlib pour économiser de la bande passante.
  • smacks pour XEP-0198: Stream Management. Permet au client de se reconnecter et récupérer les messages perdus en son absence. Indispensable lorsque l’on a une connexion instable (genre téléphone portable)
  • carbons pour XEP-0280: Message Carbons. Permet que les messages recus et envoyés s’affichent sur tous les clients/appareils connectés en même temps. Pratique pour ne plus s’embêter avec la gestion des priorités et ressources d’XMPP. Vous recevez tout partout et pouvez répondre de n’importe quel appareil.
  • mam pour XEP-0313: Message Archive Management. Permet à l’utilisateur de récupérer les derniers messages reçus (50) lorsqu’il se connecte. Pratique lorsqu’on allume un appareil pour poursuivre une conversation. On récupère les derniers messages envoyés et reçus depuis les autres appareils.

Les modules se rajoutent dans la section « modules enabled » dans le fichier de config de Prosody:

modules_enabled = {
....
"compression";
"carbons";
"mam";
"smacks";
};

Related Posts:

Généré le 2018-12-11 16:29 UTC avec Planet Venus