SheevaPlug

Debian 13 (Trixie)

Sunday, 31 August 2025
|
Écrit par
Grégory Soutadé

Trixie

Après plusieurs mois de gel, permettant des tests approfondis, la dernière version stable de Debian (nom de code Trixie) est sortie le 9 août !

Qu'est-ce que Debian ? On pourrait dire basiquement qu'il s'agit d'un système d'exploitation. Pour être exact, Debian est une "distribution", c'est à dire un assemblage de tous les composants nécessaires à la réalisation d'un système d'exploitation. La nuance tient au fait que chaque composant (ou presque) est développé par des équipes indépendantes. Les composants majeurs sont le noyau (ici Linux), l'environnement de bureau (GNOME, KDE...), les gestionnaire de logiciels/paquets (apt, fait par Debian), l'installeur (fait par Debian) et tous les logiciels (dont les plus connus : LibreOffice, Chrome, Firefox, Gimp ...).

Organisé sous forme de fondation à but non lucratif, le travail des développeurs Debian consiste donc à s'assurer que tout ces composants fonctionnent ensemble. Côté grand public, on a plutôt tendance à résumer les choses en parlant de Linux, sans faire référence à la distribution. Pourtant, il y a des milliers de personnes de part le monde qui développent (la plupart du temps bénévolement) tous ces logiciels.

Debian est l'une des plus anciennes distributions Linux (première version en 1993), sortie seulement 2 ans après la première version du noyau. Il y a donc beaucoup de distributions dérivées de cette dernière. Un peu comme Android qui est développé par Google, mais qui est personnalisé par les constructeurs de téléphones. Mes serveurs fonctionnent tous grâce à Debian. C'est également le cas pour mon PC personnel depuis plus de 15 ans ! Mieux encore, je l'ai aussi installé sur un ordinateur plus ancien lors du passage forcé à Windows 10 (l'histoire se répète avec Windows 11...), alors que l'ordinateur en question n'était pas compatible. C'est donc un système utilisable par le grand public, pour peu que l'on soit un peu curieux en cas d'erreur...

Ma découverte de ce système s'est faite lors de mes études à l'IUT où nous avions accès à des serveurs sous Linux (avec une interface graphique nativement accessibles à distance grâce au serveur X \o/). Mais à l'époque, l'environnement manquait de maturité et n'était pas facilement exploitable par tout le monde. L'interface graphique primaire de GNOME était assez moche comparé à celle de Windows XP. Je me souviens également avoir partitionné un disque dur pour y installer la distribution Mandrake (il y avait plusieurs CD) quand j'étais au lycée. Ça marchotait, mais sans soutien extérieur (Internet était plus basique, avec seulement une connexion ADSL à 128kb/s et la plupart des ressources an Anglais), j'ai rapidement abandonné. Il faut dire qu'en ces temps, bien que curieux, j'étais un Windowsien convaincu.

Vint ensuite l'école d'ingénieur. Le Conseil Général nous a gracieusement prêté des ordinateurs portables pour notre cycle supérieur. Ils étaient configurés avec la distribution Fedora (et une interface KDE proche de celle de Windows). Et puis la révolution Ubuntu est arrivée, avec son bureau à effet whaou Compiz (comprendre : avec des animations 3D et de la transparence dans les fenêtres). À l'époque, Canonical (la société derrière Ubuntu), offrait gratuitement les CD d'installation ! C'est également à ce moment où j'ai commencé à m'intéresser à la couche système et aux systèmes embarqués, en gros : mon métier ! L'outillage disponible dans le monde Linux (et qui est directement hérité de l'univers UNIX, système historique de l'informatique moderne) est sans commune mesure par rapport à Windows, qui a toujours eu une approche utilisateur standard : applications métiers, bureautique, jeux. Après ce (petit) passage avec Ubuntu, j'ai migré sur Debian, pour ne plus jamais le lâcher !

Quelle plaie de voir aujourd'hui des entreprises m'imposer un Windows sur ma station de travail (et tout particulièrement la version 11 qui est une bouse sans nom). Mon ordinateur d'il y a 15 ans (un Core i5 M450 quad core) avec Linux est plus rapide que celui du travail avec son processeur Intel Core i7 vPro, ses 14 cœurs et ses 32GO de RAM. Tout ça pour simplifier le travail des administrateurs systèmes qui ne veulent pas gérer plusieurs systèmes. Pour respirer un peu, il y a bien les machines virtuelles (parfois limitées) et/ou le sous-système Linux (WSL), mais c'est loin d'être parfait (surtout quand il faut accéder aux périphériques).

La mise à jour de mon serveur avec cette nouvelle version s'est bien déroulée, mis à part la configuration mail (toujours aussi cryptique) qu'il a fallu retravailler un peu, quelques soucis PHP et Django, ainsi que le serveur de nom de domaine (bind9). J'en ai profité pour recompiler mon noyau Linux afin d'être aligné avec celui de Debian.

NB: Le serveur X a longtemps été le serveur graphique utilisé par Linux. En cas de soucis, une recherche sur internet avec ces termes ne donnait pas forcément les réponses attendues...

Le coût de l'intelligence artificielle

Sunday, 09 February 2025
|
Écrit par
Grégory Soutadé

L'intelligence artificielle est un sujet récurrent ces derniers temps. Entre la génération d'image réaliste, la (plus ou moins grande) pertinence de ChatGPT, le modèle soi-disant ultra performant et à bas coût de DeepSeek, le projet de méga centre de calcul Stargate, l'échec de la première version publique de Lucie, la concurrence dans le domaine est acharnée, avec des investissements qui vont de pair.

D'ailleurs, on ne devrait pas parler d'une intelligence artificielle, mais de plusieurs. Chacune avec son modèle et sa finalité propre. C'est exactement comme pour le cerveau qui est découpé en différentes zones avec des domaines spécialisés (langage, mémoire, vision ...). Mais dans le cas du cerveau, nous avons tous les domaines en même temps !

Pourtant, quel que soit le domaine, l'intelligence artificielle n'est pas juste un modèle informatique. Avant de pouvoir être efficace, il faut réaliser toute une phase d'apprentissage à partir de données existantes. Sur ce point, le web représente une véritable aubaine, une mine d'or de données de type divers et varié. Ce n'est pas pour rien que Microsoft a racheté Github en 2018 pour la modique somme de 7,5 milliards de dollars... Il peut ainsi accéder à, désormais, 500 millions de projets ! En ce qui concerne les données multimédia (particulièrement les images), l'apprentissage est plus complexe car il faut des personnes pour "annoter" ce que contient l'image, c'est à dire spécifier dans un carré la nature d'un élément (une personne, une voiture ...). Sur ce point, les premières annotations à grande échelle ont été réalisées via les CAPTCHA afin de "prouver" que l'utilisateur n'est pas un robot. Aujourd'hui, il existe dans des pays où la mains d'œuvre est peu chère (notamment en Asie du Sud Est) des centres professionnels où les personnes sont payées pour annoter des millions d'images.

Tout cela est relativement transparent pour les utilisateurs finaux, qui se contentent d'envoyer des requêtes via le "prompt".

Dans la dernière version d'IWLA, j'ai implémenté la fusion des robots via leur identifiant ("compatible"). Quelle ne fut pas ma surprise de voir qu'en à peine 6 jours, le robot GPTBot/1.2 a téléchargé 19,5GB de contenu depuis mon site, alors que ce dernier n'évolue que très peu. Je suppose donc que GPTBot opère une ré indexation complète à chaque changement. L'utilisation de toute cette bande passante est là encore invisible pour l'utilisateur final, mais constitue, avec le stockage des données et son traitement, une consommation d'énergie très importante.

C'est pourquoi j'ai décidé de bloquer purement et simplement toutes les requêtes venant d'openai, comme je l'avais fait pour le très gourmand robot de Microsoft (bingbot).

Voici le script que j'utilise et qui est dans mon crontab. Il va analyser les logs du serveur Apache et bloquer les IP qui correspondent à un mot :

#!/bin/bash

function ban_ip()
{
    echo "Ban $1"
    nft add rule inet BAN_RU input ip saddr $1 drop
}

function ban_file()
{
    file=$1
    token=$2
    prefix_len=$3
    fields=""
    postfix=""
    case $prefix_len in
        "8")  fields="1";       postfix=".0.0.0";;
        "16") fields="1,2";     postfix=".0.0";;
        "24") fields="1,2,3";   postfix=".0";;
        "32") fields="1,2,3,4"; postfix="";;
        *) echo "Error: prefix_len must be 8, 16, 24 or 32"
           return;;
    esac
    ips=`cat $file|grep $token|cut -f2 -d' '|sort|uniq|cut -d'.' -f$fields|uniq`
    for ip in $ips ; do
        ban_ip "${ip}${postfix}/${prefix_len}"
    done
}

if [ -z "$1" -o $1 = "-h" -o $1 = "--help" ] ; then
    echo "$0 token prefix_len (8,16,24,32)"
fi

ban_file /var/log/apache2/access.log.1 $1 $2

Il se base sur le pare-feu Linux netfilter configuré comme tel :

nft create table inet BAN_RU
nft add chain inet BAN_RU input "{{ type filter hook input priority filter; }}"

La table en question est BAN_RU, déjà utilisée pour bloquer les IP venant de Russie. Le script ne supporte que des IPv4, mais je ne vois pas de connexion IPv6 de la part de robots aussi gourmands.

IWLA 0.8

Tuesday, 04 February 2025
|
Écrit par
Grégory Soutadé

Capture d'écran IWLA

Version 0.8 of IWLA (Intelligent Web Log Analyzer written in Python) is now released. While looking at the Changelog, I realized that IWLA is now 10 years old ! It's crazy to see that it's still so useful for me, I use it everyday. There is no real alternatives to it if we consider statistic analysis without cookies/embedded javascript. Only AWSTATS do the same, but it's one big unmaintainable PERL file. This is why I created my own tool which is, I think, more accurate and fine tuned. IWLA is my most actively developed personal project, but this not the only one to be old. I also developed gPass (12 years old), KissCount (15 years old), Denote (10 years old) and Dynastie (13 years old). For these projects, I only do maintenance, but I still use them a lot. For KissCount, I think it should be re wrote from scratch with a cleaner architecture. For Dynastie, there is no real alternative, any current static site generator has a dynamic/web frontend, but I think backend should be migrated to something else (more fast). Denote is quite simple and perfect for my needs.

Going back to IWLA, the changelog is :

Core

  • Awstats data updated (8.0)
  • Sanitize HTTP requests before analyze
  • Fix potential division by 0

Plugins

  • Add rule for robot : forbid "1 page and 1 hit"
  • Try to detect robots by "compatible" strings
  • Move feeds and reverse_dns plugins from post_analysis to pre_analysis
  • Move reverse DNS core management into iwla.py

HTML

  • Add domain and number of subscribers for feed parser

Config

  • Add "multimedia_re" filter to detect multimedia files by regular expression
  • Add "no_merge_feeds_parsers_list" configuration value
  • Add "robot_domains" configuration value
  • Add "ignore_url" configuration value

A demo instance (for forge.soutade.fr) is available here

TIP: Country based IP filtering

Sunday, 09 June 2024
|
Écrit par
Grégory Soutadé

Some days ago was the 80th anniversary of the d-day landings. Thousands of soldiers at the same place, the same day to flood nazi's defenses. Probability to die far away from home was huge, but they didn't escape. In the east part of Europe, URSS did the same. But, 80 years later, russia seems to have forgot what means war, nazi and dictator... Vladimir Poutine sends, for 2 years now, people to death without any concern.

This is why I first decided to redirect all people visiting my website to this thread if they're coming from an russian website. Some weeks ago, I finally decided to block every connexion that comes from russia because my website contains some computer stuff that can helps industry. I know, it's not fair for all people that just want to live normally and being informed or just want to see different things. But, even if filtering can be bypassed using a VPN, this is what I can do to help a bit Ukraine.

The script output commands for nftables (Linux kernel firewall). It reads data from one of ripe.net database (filled by AFRINIC, ARIN, APNIC, LACNIC and RIPENCC organisations) which contains allocated IP ranges for all countries. These databases are updated everyday. For an easier databases retrieval, you can look at my own project iptogeo or directly on ripe.net.

#!/usr/bin/env python3                                                                                                                                                                                             

TABLE_NAME = 'BAN_RU'
COUNTRY = 'RU'
RIPE_FILE = 'ripencc'

# Create table and add an inet filter chain                                                                                                                                                                        

print(f'nft delete table inet {TABLE_NAME}')
print(f'nft create table inet {TABLE_NAME}')
print(f'nft add chain inet {TABLE_NAME} input "{{ type filter hook input priority filter; }}"')

# ripencc|RU|ipv4|2.56.88.0|1024|20190313|allocated|caa02a36-bb09-4e4f-a834-1038f57676c1                                                                                                                           
# ripencc|RU|ipv6|2001:640::|32|19991115|allocated|ea8bf0c4-24e1-4e58-8a09-cee9da9a38f5                                                                                                                            

with open(RIPE_FILE, 'r') as fd:
   for line in fd.readlines():
        parts = line.split('|')
        if parts[1] != COUNTRY: continue
        if parts[2] == 'ipv4':
            nb_ip = int(parts[4])
            bits = (~(nb_ip - 1)) & 0xffffffff
            mask = 0
            for i in range(31,-1,-1):
                if (bits & (1 << i)) == 0: break
                mask += 1
            print(f'nft add rule inet {TABLE_NAME} input ip saddr {parts[3]}/{mask} drop')
        elif parts[2] == 'ipv6':
            mask = int(parts[4])
            print(f'nft add rule inet {TABLE_NAME} input ip6 saddr {parts[3]}/{mask} drop')
        else:
            continue

Output must be redirected to a file, then you can source it. For russia, there is about 20 000 entries.

IWLA 0.7

Sunday, 17 March 2024
|
Écrit par
Grégory Soutadé

Capture d'écran IWLA

Here is the work done for version 0.7 of IWLA (Intelligent Web Log Analyzer witten in Python) since one year and a half :

Core

  • Awstats data updated (7.9)
  • Remove detection from awstats dataset for browser
  • Don't analyze referer for non viewed hits/pages
  • Remove all trailing slashs of URL before starting analyze
  • Improve page/hit detection
  • Main key for visits is now "remote_ip" and not "remote_addr"
  • Add IP type plugin to support IPv4 and IPv6
  • --display-only switch now takes an argument (month/year), analyze is not yet necessary
  • Add --disable-display option

Plugins

  • Geo IP plugin updated (use of ip-api.com)
  • Update robot detection
  • Display visitor IP is now a filter
  • Add subdomains plugin

HTML

  • Generate HTML part in dry run mode (but don't write it to disk)
  • Set lang value in generated HTML page
  • Bugfix: flags management for feeds display
  • New way to display global statistics : with links in months names instead of "Details" button

Config

  • Add no_referrer_domains list to defaut_conf for website that defines this policy
  • Add excluded domain option
  • Set count_hit_only_visitors to False by default

A demo instance (for forge.soutade.fr) is available here