Le Blog Utux

HTTP 200 GET /

OpenBSD: get rid of Comic sans ms in httpd error messages

Rédigé par uTux Aucun commentaire

I have been playing with OpenBSD and httpd lately. It's a really simple and fun webserver to use, despite suffering huge limitations, but I quickly stumble across this horror:

No joke. httpd will serve all errors messages with the infamous Comic sans ms font. It's probably a troll from the maintainers, at least I hope so. Comic sans ms sucks, I don't want that on my server. Fortunately, there is a simple way to disable it.

Add this line into your /etc/httpd.conf:

errdocs "/errdocs"

Then create the file /var/www/errdocs/err.html with the following content:

                                                                                                           
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>$RESPONSE_CODE $HTTP_ERROR</title>
<style type="text/css"><!--
body { background-color: white; color: black; }
hr { border: 0; border-bottom: 1px dashed; }
@media (prefers-color-scheme: dark) {
body { background-color: #1E1F21; color: #EEEFF1; }
a { color: #BAD7FF; }
}
--></style>
</head>
<body>
<h1>$RESPONSE_CODE $HTTP_ERROR</h1>
<hr>
<address>$SERVER_SOFTWARE</address>
</body>
</html>

Then restart httpd:

rcctl restart httpd

Explanation: httpd manage says:


A custom error document may contain the following macros that will be expanded at runtime:

$HTTP_ERROR
    The error message text.
$RESPONSE_CODE
    The 3-digit HTTP response code sent to the client.
$SERVER_SOFTWARE
    The server software name of httpd(8).

So I just took the source code of a 404 error page, removed the Comic sans ms part in the CSS and replaced the values (error code, message, server identity) by the proper variables. Now all errors messages should be generated with this new template, with a fallback font.

Build Zabbix-Agent2 under Ubuntu 16.04

Rédigé par uTux Aucun commentaire

If you need to install Zabbix-Agent2 on Ubuntu 16.04, you will find out that there is no available packages in Zabbix repository (unlinke Zabbix-Agent). You can try to use packages for other Linux systems, even RPMs, but you will always end up with library or ABI issues. The only way to make it work is compilation.

Install requirements:

apt install -y libpcre++-dev build-essential zlib1g-dev libssl-dev

Get Zabbix source code:

wget https://cdn.zabbix.com/zabbix/sources/stable/6.2/zabbix-6.2.4.tar.gz
tar xf zabbix-6.2.4.tar.gz

You need at least Go 1.17 (for Zabbix 6.2.4):

wget https://go.dev/dl/go1.19.3.linux-amd64.tar.gz
tar xf go1.19.3.linux-amd64.tar.gz
export PATH=$PATH:/root/go/bin

You should now be able to build Zabbix-Agent 2. I took these options from Zabbix documentation and made some ajustements from what I found in packages in Zabbix repository:

cd zabbix-6.2.4
./configure \
--enable-agent2 \
--enable-static \
--prefix=/usr \
--sysconfdir=/etc/zabbix \
--libdir=/usr/lib/zabbix \
--with-curl \
--with-openssl

Note: According Zabbix documentation, the --enable-static flag is useful if you want to create your own package and use it on other systems.

You can now build and install:

make install

You can now remove Go if you don't need it. A few steps are required to make Zabbix-Agent 2 work:

addgroup --system --quiet zabbix
adduser --quiet --system \
--disabled-login \
--ingroup zabbix \
--home /var/lib/zabbix \
--no-create-home zabbix
mkdir -p /etc/zabbix/zabbix_agent2.d/plugins.d
mkdir /run/zabbix/
chown -R zabbix:zabbix /run/zabbix
mkdir /var/log/zabbix
chown -R zabbix:zabbix /var/log/zabbix

Create /etc/logrotate.d/zabbix_agent2:

/var/log/zabbix/zabbix_agent2.log {
    weekly
    rotate 12
    compress
    delaycompress
    missingok
    notifempty
    create 0640 zabbix zabbix
}

In the packages from Zabbix repository we have /usr/lib/tmpfiles.d/zabbix-agent2.conf:

d /run/zabbix 0755 zabbix zabbix - -

Don't forget to create a /etc/zabbix/zabbix_agent2.conf file. Here is a sample.

Finally, create a systemd unit file in /lib/systemd/system/zabbix-agent2.service:

[Unit]
Description=Zabbix Agent 2
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/etc/zabbix/zabbix_agent2.conf"
EnvironmentFile=-/etc/default/zabbix-agent2
Type=simple
Restart=on-failure
PIDFile=/run/zabbix/zabbix_agent2.pid
KillMode=control-group
ExecStart=/usr/sbin/zabbix_agent2 -c $CONFFILE
ExecStop=/bin/sh -c '[ -n "$1" ] && kill -s TERM "$1"' -- "$MAINPID"
RestartSec=10s
User=zabbix
Group=zabbix

[Install]
WantedBy=multi-user.target

Reload, enable and start this new service:

systemctl daemon-reload
sytemctl enable --now zabbix-agent2

Check that everything works:

systemctl status zabbix-agent2
tail /var/log/zabbix/zabbix_agent2.log

Profit!

Buzz l'Éclair / Lightyear

Rédigé par uTux Aucun commentaire

Je suis un grand fan des Pixar, je ne pouvais donc pas rater ce film qui signe d'ailleurs leur retour au cinéma. Je n'ai pas écrit d'article sur les précédents films (Soul, Lucal, Alerte Rouge) car je n'avais rien de particulièrement intéressant à dire à part qu'ils sont excellents, mais si je le fais pour Lightyear c'est parce qu'il semble être sorti dans l'indifférence totale et avoir reçu un accueil que je trouve injustifié.

Lightyear fait partie du lore des Toy Story, c'est le film que Andy (l'enfant) a vu au cinéma et qui lui a donné envie d'avoir le jouet. En soit ce n'est donc pas une origin story du personnage de Buzz l'éclair, on se rapproche plutôt d'un spin-off, il faut comprendre que le personnage dans le film n'a pas le même caractère que son jouet.

Pour résumer l'histoire rapidement sans trop spoiler, Buzz et sa coéquipière Hawthorne sont à la tête d'une expédition de colons humains à la recherche d'une planète habitable. A la suite d'une attaque de créatures hostiles sur un monde en apparence paisible, Buzz va commettre une erreur qui empêche le vaisseau des colons de repartir. Se sentant responsable de la situation, il va s'obstiner à trouver une solution, seul, coûte que coûte.

Avis

Lorsque je suis sorti de la salle de cinéma, j'étais un peu partagé. J'avais beaucoup de mal à savoir si j'avais aimé ou pas. Dans la lignée des Pixar, le film est conduit par un scenario honnête, cohérent, et à plusieurs niveaux de lecture. Il n'est cependant pas dénué de défauts, et s'il y en a un qui m'a marqué, c'est qu'il semble s'adresser à un public très jeune, ce qui mène à un humour très premier degré avec des personnages assez cartoonesques, ce qui peut faire grincer des dents les adultes qui attendaient un peu plus de subtilité.

Le personnage de Sox - le chat-robot-savant - peut diviser le public. On peut le voir soit comme un personnage mignon et drôle, soit comme un produit issu du service marketing de Disney, exactement comme BB-8 ou les Porgs pour Star Wars.

Je dois aussi mentionner ce cancer qu'est le Star-Talent, c'est à dire le fait de faire venir des célébrités pour faire les voix des personnages. Dans Toy Story 4, c'était insupportable avec Angèle et Jamel. Doubler des personnages c'est un métier, il ne suffit pas d'avoir une belle voix, il faut jouer la comédie et sortir de sa propre identité. Roger Carel était un véritable génie car il était capable de transformer sa voix au point qu'on ne sache même plus que c'est lui. Or quand Jamel double un personnage dans Toy Story 4, on entend Jamel jouer du Jamel (le même numéro de comique depuis quasi 30 ans). Lightyear limite les dégâts car la performance de Chantal Ladesou est plutôt correcte bien que sa voix soit extrêmement reconnaissable (surtout pour ceux qui écoutent les grosses têtes).

Et pourtant je ne peux pas dire qu'il s'agisse d'un mauvais film. Il est divertissant, parsemé de références aux Toy Story, pose ses enjeux, et propose des personnages attachants dont j'ai pris plaisir à suivre les aventures. Et, fidèle à la tradition, on sent que l'histoire est construite autour d'une morale.

Seconde lecture (spoiler)

Il y a probablement plusieurs interprétations possibles, personnellement j'y ai vu plusieurs métaphores sur la vie: apprendre à vivre avec ses erreurs, profiter de l'instant présent, savoir travailler ensemble (ce qui fait echo avec le premier Toy Story d'ailleurs).

Obstiné, Buzz va essayer à tout prix de réparer ses erreurs en faisant des bonds dans le futur pour tester une technologie expérimentale. Ce faisant, il perd son équipière et amie qui meurt de vieillesse. Cette dernière avait pris le commandement de la colonie et y avait fondé une famille. Il ne voit pas que loin de se sentir prisonniers, les colons se sont plutôt bien acclimatés à la vie sur ce nouveau monde et ont eux aussi fondé des familles. Le point culminant du film est le moment où Buzz rencontre son double du futur, un homme que l'obstination et la solitude ont transformé en méchant.

Notre héros devra choisir son destin: poursuivre dans la voie de l'obstination quitte à devenir fou et méchant - mais avec la perspective de réparer ses erreurs - ou choisir de laisser la vie continuer son cours et se consacrer à l'instant présent et à son entourage.

Conclusion

Alors que j'étais plutôt partagé en sortant de la salle, le fait d'y repenser et d'écrire cette critique m'a au contraire fait réaliser que Lightyear est un excellent film que je vous encourage à aller voir (faut pas traîner).

Que penser de The book of Boba Fett ?

Rédigé par uTux 1 commentaire

Avec beaucoup de retard, et alors que la mini-série Obi-Wan Kenobi démarre demain, je livre un court avis sur The book of Boba Fett que j'ai vu il y a quelques mois.

Alors que Disney a bien failli tuer la licence Star Wars avec sa postlogie misérable et inutile, force est de constater qu'ils s'en sortent beaucoup mieux au niveau des séries. Je dirais même qu'ils lui ont redonné un nouveau souffle avec The Mandalorian et que cela fait beaucoup de bien.

Malheureusement, les retours sur The book of Boba Fett sont beaucoup moins élogieux, ils sont même très partagés, parfois décevants. Mais si j'écris cet article c'est avant pour tout pour donner mon propre avis complètement subjectif.

Au tout début, la série m'a vraiment emballé. Même si je dois admettre que le personnage de Boba Fett en lui-même n'était pas passionnant, j'étais vraiment attiré par tout ce qu'il y avait autour. La ville de Mos Espa, le palais de Jabba le Hut, le Saarlacc... j'avais l'impression de voir un fork du début de Star Wars Episode VI, et je trouvais intéressant de mettre de côté les Jedi, la force, le bien et le mal, pour faire place à un bon petit western. La série introduisait de nombreux personnages, des intrigues politiques, des enjeux, du fan service (le chasseur Naboo), l'histoire des hommes des sables, bref le parfait cocktail pour attiser mon intérêt. Et là, c'est le drame.

C'est le drame oui, car au fur et à mesure des épisodes, les intrigues et les personnages ne sont jamais développés, ne mènent nulle part ou ne servent à rien. Boba Fett est... un gentil. On comprend rapidement que sa motivation pour prendre la suite de Jabba et devenir un seigneur du crime, est de faire le bien, c'est tout. Fennec ne sert à rien, 90% des personnages introduits dans les premiers épisodes passeront à la trappe. Et puis il y a l'épisode de trop.

La série décide en plein milieu de revenir sur les aventures du Mandalorien, comme si elle oubliait qu'elle était censée raconter l'histoire de Boba Fett, mais il y a pire. Pire oui, car un des épisodes remet à l'honneur Grogou et Luke Skywalker.

L'apparition de Luke Skywalker en Deus Ex Machina à la fin du Mandalorian était un moment épique qui a fait couler pas mal de larmes des yeux des fan. Mais la séquence était courte et se suffisait à elle-même, le personnage n'avait pas vraiment de dialogue, c'était presque un caméo, il n'en fallait pas plus. Or la série Boba Fett nous offre un épisode complet où Luke en CGI réapparaît, a des dialogues, et nous montre qu'il est devenu un Jedi chiant et dogmatique comme ceux de la prélogie. C'était vraiment l'épisode de trop, foutez la paix à Luke Skywalker, laissez ce personnage vivre dans le cœur des fans, n'essayez pas de lui écrire une nouvelle histoire, ça ne marche pas.

Alors que mon intérêt pour cette série était au plus bas et que je songeais même à arrêter de regarder, la fin se profilait déjà à l'horizon. Et même si elle confirme qu'aucune intrigue, aucun personnage n'a d'importance dans la série, elle a le mérite de nous offrir une ultime bataille divertissante. Finalement mon intérêt pour cette série aura été une courbe en parabole, c'est à dire en forme de U, mais cela n'aura pas suffit à me convaincre.

Pour conclure, je ne peux que me ranger à l'avis général: The Book of Boba Fett était une série décevante qui souffrait de gros problèmes d'écriture. Je reproche à la postlogie d'être faite par des gens qui ne connaissent rien à Star Wars, The Book of Boba Fett en est un peu l'antimatière: elle a été faite par des gens qui connaissent très bien Star Wars, mais qui ont échoué à écrire une histoire consistante.

Je compte beaucoup sur la série Obi-Wan Kenobi pour relever le niveau, et je serais devant mon PC le 27 Mai.

De Kubernetes à NixOS

Rédigé par uTux 4 commentaires

Il y a un an et demi, j'annonçais avoir migré mon blog sur Kubernetes (K3s). Bien que je sois globalement satisfait du résultat et que cela m'a permis de beaucoup apprendre, je rencontre tout de même des désagréments :

  • Kubernetes, c'est lourd. Comptez 1 GB de RAM à vide. Pour être à l'aise, j'ai du prendre un VPS avec 4GB de RAM, là où 2 suffiraient largement sans Kubernetes.
  • Absence de support d'IPv6. En 2022 c'est franchement difficile à justifier.
  • La gestion des Ingress est complexe. J'utilise Traefik mais c'est compliqué, il m'a fallu quasiment 2 jours pour faire fonctionner les certificats ACME, et les montées de version ne se passent pas toujours très bien.
  • Comme prévu, les mises jour à demandent un peu plus d'efforts car les composants ne sont pas gérés par la distribution. Il faut donc:
    • Mettre K3s à jour régulièrement.
    • Reconstruire et livrer les images même si l'application n'a pas changé, juste pour être sûr de ne pas trimbaler de failles de sécurité dans les librairies.
    • Mettre à jour Traefik régulièrement.

Bref, même si je trouve que Kubernetes est une super solution qui a mis en valeur les containers et l'écosystème Linux, c'est clairement overkill pour moi et je souhaite me simplifier la vie. Et si au passage je peux me former à de nouvelles technos, c'est un plus.

La solution de facilité aurait été d'installer Debian et de coder quelques roles Ansible mais l'inconvénient est que je n'apprendrais rien de nouveau. Je suis donc parti sur NixOS. C'est une distribution où la configuration s'effectue de manière déclarative via le langage Nix, avec gestion des états et possibilité de rollback.

En effet lorsque vous gérez votre distribution Linux avec Ansible, Puppet ou Salt, vous pouvez déployer une configuration et des applications, en revanche le retour en arrière n'est pas géré. Par exemple si vous avez déployé Apache et que vous voulez changer pour Nginx, c'est à vous de coder la manière dont Ansible va désinstaller Apache, sinon il sera toujours présent. Avec NixOS, si vous retirez toute référence à httpd dans votre configuration, il ne sera plus du tout présent à la prochaine génération du système. C'est un fonctionnement atomic et stateful.

Pour l'installation, j'ai utilisé nixos-infect, un script à lancer sur la plupart des distributions Linux afin de les remplacer par NixOS. Associé à un cloud-init, il permet de faire le déploiement via Terraform de manière complètement automatique, ce qui est vraiment cool il faut le dire. Et pour les gens qui préfèrent une installation à la main, sachez que Hetzner proposer une ISO NixOS et un accès console distante même pour les VPS, c'est donc totalement possible :)

Pour la partie hébergement web, voici mon fichier de configuration /etc/nixos/web.nix :

{ config, lib, pkgs,  ...}:

let
  defaultVirtualHost = {
    documentRoot = "/var/www/html/blank";
    addSSL = true;
    forceSSL = false;
    sslServerKey = "/var/www/ssl/snakeoil.key";
    sslServerCert = "/var/www/ssl/snakeoil.pem";
    locations."/" = {
      index = "index.html";
    };
  };
  makeVirtualHost = webroot:
    { documentRoot = "${webroot}";
      forceSSL = true;
      enableACME = true;
      locations."/" = {
        index = "index.php";
      };
      extraConfig = ''
        <Directory "${webroot}">
          AllowOverride All
        </Directory>
      '';
    };
in {
  security = {
    acme = {
      email = "hostmaster@example.org";
      acceptTerms = true;
    };
  };
  services = {
    httpd = {
      enable = true;
      mpm = "prefork";
      adminAddr = "hostmaster@example.org";
      enablePHP = true;
      phpPackage = pkgs.php80;
      phpOptions = "display_errors = off";
      extraConfig = ''
        SetOutputFilter DEFLATE
        ServerSignature Off
        ServerTokens prod
        <FilesMatch ".(ico|pdf|jpg|jpeg|JPEG|png|gif|js|css)$">
          Header set Cache-Control "max-age=3600, public"
        </FilesMatch>
      '';
      extraModules = [
        "deflate"
      ];
      virtualHosts =
        {"_default_" = defaultVirtualHost;
         "utux.fr"   = (makeVirtualHost "/var/www/html/utux.fr");
        };
    };
  };
}

Explications : j'ai d'autres vhosts non mentionnés ici, et à chaque fois leur configuration est identique. Pour éviter d'avoir à répéter du code, j'utilise let (permet de définir des variables et des fonctions) ainsi que in (pour les appliquer). Je ne connais pas de moyen plus propre de faire des loop pour le moment, car c'est le but. Étant donné que j'utilise PluXml, il ne faut pas oublier le AllowOverride All qui permet aux .htaccess de fonctionner, sinon les fichiers XML qui contiennent les data deviennent accessible, ce qui fait fuiter pas mal d'infos sensibles.

Pour le moment, ça marche plutôt bien. Le serveur consomme 119 Mo de RAM, soit quasiment 10x moins que Kubernetes :) Et en prime le support de l'IPv6 est revenu.

En conclusion, je suis content de pouvoir enfin tester NixOS en production. Bien que je ne sois pas encore familier avec le langage Nix, et que je le trouve bien trop compliqué par rapport à un bon vieux Ansible, j'estime que c'est l'avenir de Linux sur serveur. Les distributions devront être atomiques, et leur configuration centralisée, versionnée et reproductible. J'espère que ceci est le début d'une aventure positive.

Fil RSS des articles