5571 links
  • GuiGui's Show

  • Home
  • Login
  • RSS Feed
  • Tag cloud
  • Picture wall
  • Daily
Links per page: 20 50 100
◄Older
page 62 / 279
Newer►
  • Adminsys : cas d'étude d'un diagnostic

    Je vais revenir sur un problème informatique. Sa résolution technique est insignifiante, mais je veux illustrer le déroulé d'un diagnostic, l'arbre de décisions, les différentes possibilités techniques, les différentes contraintes, les erreurs de réflexion, etc. En parlant autour de moi, je me suis rendu compte que quelques-unes des notions et des commandes / variables que je vais présenter ci-dessous sont méconnues (apt-file, apt-mark, dpkg-divert, ldconfig, LD_LIBRARY_PATH, PPID, snoopy, etc.).

    Pour notre supervision, nous utilisons Xymon. Alors, oui, il est rustique, mais, pour avoir manipulé pas mal des standards du marché (Zabbix, Icinga, Centreon, Shinken, etc.), je peux affirmer qu'au moins il est KISS, flexible, et qu'il fonctionne. Je parle bien de la partie supervision, les graphes (via RRDtool) sont une plaie à configurer. L'écriture d'un test de supervision est facile : il suffit d'apeler un binaire en lui donnant un état + message, en gros. Il s'appelle de n'importe où, par n'importe qui, point d'authentification ni autres. Juste, ça fonctionne.

    Le test interne nommé « memory » affiche une ligne « physical » (consommation totale de RAM ‒ processus + cache + tampons ‒), une ligne « actual » (consommation de la RAM par les processus, hors cache et tampons), et une ligne « swap ». Sur certains de nos serveurs, la ligne « actual » n'apparaît pas. On en avait viteuf déduit que ça se produit sur nos machines Debian >= 9.

    Quel logiciel Xymon utilise-t-il pour connaître la consommation RAM ? Avec grep -Ri memory, je cherche dans la configuration de Xymon (/etc/xymon) et dans les scripts et binaires (/usr/lib/xymon) aussi bien sur le serveur que sur un client. Je trouve rien. Cela doit se faire au sein d'un binaire, illisible par grep.

    Essayons de deviner le logiciel utilisé en sous-main par Xymon. Pour afficher la consommation RAM, je connais vmstat (dont je sais qu'il est utilisé par Xymon, je l'ai déjà vu plein de fois dans une sortie ps faux avec Xymon comme parent) et free. J'utilise whereis pour localiser ces deux binaires et chmod -x pour les rendre inutilisables. J'attends la fréquence d'actualisation du test (5 minutes) et, par déduction, j'en arrive à la conclusion que Xymon utilise free car la sortie du test est vide quand je bloque l'exécution de free.

    J'aurais pu utiliser snoopy logger afin de tracer les commandes lancées par Xymon, mais je ne suis pas sûr qu'il fonctionne avec un compte système sans shell (car c'est ce qu'utilise Xymon), il faut l'installer, et je me suis dit que c'était "too much" pour mon besoin.

    À ce stade, remplacer /usr/bin/free par un script shell qui aurait juste exécuté un ps aux | grep $PPID > /tmp/debugXymon aurait été utile : j'aurais appris quel composant précis de Xymon exécute la commande système free ($PPID : identifiant numérique du processus parent ;) ). Mais, sur le coup, je n'y ai pas pensé.

    Qu'est-ce qui a changé dans free entre Debian 8 et Debian 9 ? Le format de la sortie :

    • L'intersection de la ligne « Mem » et de la colonne « used » comptabilise uniquement la mémoire consommée par les processus (hors cache et tampons)… Ce que Xymon nomme « actual » ;

    • La ligne « -/+ buffers/cache » a été retirée. Dans le manuel, je trouve aucune option pour la faire revenir. Or, Xymon utilisait cette ligne pour son item « actual ». La ligne « -/+ buffers/cache » est remplacée par les colonnes « buff/cache » et « available ». La méthode pour calculer la mémoire disponible hors cache et tampons a changé afin d'être plus exacte, je vais y revenir.

    On a donc la raison qui explique notre constat : Xymon n'a pas été mis à jour pour tenir compte de ce changement dans l'affichage de free (enfin, je croyais, mais je me trompe, voir ci-dessous). Il ne trouve plus la ligne « -/+ buffers/cache » donc il n'affiche plus sa ligne « actual ». Et ce qu'il nomme « physical », qui était toute la RAM consommée (processus + cache + tampons), prend le nouveau sens de la commande free, à savoir la mémoire utilisée par les processus hors cache et tampons.

    Est-ce un problème ? Puisqu'« actual » est, de fait, devenue la ligne « physical », tout va bien, on a l'info qu'on a toujours eu.

    Sauf que je pense que la quantité de RAM utilisée par le cache et les tampons est une info intéressante. Pas forcément sur tout type de serveur. Mais moins on a de lectures depuis les supports de stockage, mieux on se porte. Elle m'a permis d'ajuster la quantité de RAM de notre serveur LDAP. De même, le cache est important sur un serveur de bases de données. Je pense que c'est aussi important sur des serveurs d'applications web (PHP, uwsgi/django, Tomcat, etc.

    Pour me contredire, on peut citer les propos de tonton Torvalds : "toute RAM libre est du gâchis". Linux va toujours exploiter la RAM au maximum, y compris pour mettre en cache des trucs qui serviront qu'une fois genre une mise à jour aptitude. Donc, la quantité de cache va augmenter constamment. De ce fait, mesurer cette quantité est inintéressant. Ceci dit, ce n'est pas parce qu'on voit un chiffre augmenter dans sa supervision qu'on augmente automatiquement la quantité de RAM. En revanche, avoir l'historique de la consommation de RAM par le cache+tampons est intéressant (si au boot de la machine LDAP, le cache monte direct à 500 Mo, c'est qu'il est plutôt utile ; si un reboot libère 3 Go de cache sans y revenir avant 6 mois, c'est qu'il contenait nawak, donc il ne faut pas redimensionner la RAM).

    Avant de me demander si j'agis, je trouve sain de me demander si le problème est temporaire ou définitif.

    J'installe un agent / client Xymon sur une machine Debian 10 (oui, en supervision, un logiciel est installé sur les ordinateurs à surveiller, et un serveur de supervision centralise les remontées d'informations et présente les informations aux administrateurs). Je l'ajoute dans notre supervision. *Le problème demeure. En même temps, entre Stretch et Buster, on passe de la version 4.3.28-2 de Xymon à la 4.3.28-5… Version très mineure voire interne à Debian, donc il ne fallait pas en attendre grand-chose.

    Peut-être que l'analyse des données se fait côté serveur Xymon (je ne le sais pas encore, mais c'est bien le cas) ? Nous ne prévoyons pas de le mettre à jour puisque nous allons migrer vers une autre solution de supervision. Quand ? Aucune idée, aucun projet à l'horizon. Cela justifie qu'on corrige temporairement ce problème.

    Je pourrais coder un nouveau test qui surveille la quantité de RAM. J'ai pas trouvé comment désactiver le test « memory » intégré à Xymon. Je pense que cumuler deux tests qui font la même chose est confusant. De plus, il faudrait re-coder toutes les subtilités du test : les seuils d'alerte, le passage de paramètres depuis la configuration du serveur (chose qu'on ne fait pas dans nos autres scripts, d'où il faudra du temps pour chercher comment faire) ‒ car, sur certains de nos serveurs, on change les seuils, entre autres ‒, etc. Tout ça sera spécifique à Xymon… Dont nous voulons nous débarrasser à moyen-terme. Trop d'investissement pour pas grand-chose, à mon avis. Je laisse tomber cette piste.

    Une piste vient à l'esprit : remplacer /usr/bin/free par un script. S'il est exécuté par Xymon, il lancera l'ancien binaire free ou un script maison qui collectera les données et les affichera dans le même format que le faisait l'ancienne version de free. S'il est lancé par quoi ou qui que ce soit d'autre, il lancera le vrai binaire free que l'on déplacera en /usr/bin/free.new (par exemple). Afin de ne pas lever d'alerte ni d'écraser notre /usr/bin/free modifié sans pour autant se priver des mises à jour de free, ce qui serait le cas si l'on empêchait sa mise à jour avec apt-mark hold procps (je sais que free est empaqueté dans ce paquet grâce à apt-file search -x '/usr/bin/free$'), on utiliserait dpkg-divert.

    Je scp le binaire free depuis un Debian 8 sur un Debian 9. Il refuse de s'exécuter car il manque la bibliothèque de fonctions libprocps.so.3. En effet, c'est la version 6 de cette bibliothèque qui est empaquetée dans Debian Stretch / 9. Créons un lien symbolique afin de le duper : sudo ln -s /lib/x86_64-linux-gnu/libprocps.so.6 /lib/x86_64-linux-gnu/libprocps.so.3. Cela fonctionne mais la ligne « -/+ buffers/cache » présente des nombres négatifs. Si je copie la version 3 depuis Debian 8, cela fonctionne. La bibliothèque a changé…

    Je pourrais déployer la vieille version de free et de libprocps sur nos Debian >= 9. Le risque que la vieille bibliothèque soit utilisée par d'autres binaires que notre vieux free est proche de 0. Si je voulais m'en assurer, je pourrais la stocker dans une arborescence ignorée par ldconfig (configuration du chargement à chaud des bibliothèques de fonctions) et utiliser LD_LIBRARY_PATH pour forcer son utilisation quand free est exécuté par Xymon. Sauf qu'à ce stade-là, je ne sais pas quel composant de Xymon exécute free, donc il est inenvisageable de surcharger son appel à free.

    De toute façon, free dépend d'autres bibliothèques de fonctions (libc, libdl) qui peuvent changer de version et/ou de comportement. Plus le temps (et les versions de Debian) passe, plus la probabilité que ça casse augmente. Utiliser une vieille version de free est donc plutôt un mauvais choix.

    D'autant que, de l'autre côté de la balance, écrire un script qui va chercher les mêmes informations que free ne semble pas être difficile puisque le manuel de free expose qu'il récupère les informations dans le fichier /proc/meminfo.

    Au début, je pars dans l'idée d'exécuter la version actuelle de free, d'y ajouter une ligne « -/+ buffers/cache » et de remplacer l'intersection de la ligne « Mem » et de la colonne « used ». J'ai considéré que je change 3 valeurs (Mem+used + 2 valeurs sur la ligne « -/+ buffers/cache ») alors que free en affiche 11 en tout. Les deux tiers des valeurs sont valides, donc pourquoi s'embêter à les récupérer nous-même ?

    En pratique, je récupère les infos manquantes depuis /proc/meminfo et je les stocke dans des variables, je stocke les deux premières lignes de la sortie de free avec head -n 2 dans une variable, la dernière ligne avec tail -n 1 dans une deuxième variable, je corrige Mem+used avec un awk -v memUsed="$memUsed" 'FNR==2 { $3=memUsed }; { print };' (-v permet de créer une variable interne à awk et de lui attribuer la valeur d'une variable shell et FNR est le numéro de la ligne, donc on remplace le troisième élément de la deuxième ligne par le contenu de la variable shell maison nommée memUsed), j'affiche tous les variables, et hop, ça fonctionne.

    Ça fonctionne, mais c'est un mauvais raisonnement : afin de corriger un problème lié à un changement dans la sortie d'un programme, je crée un script qui dépend lui-même de la sortie d'un programme qui peut changer (il a même déjà changé, c'est l'origine du problème). Genius!

    Je ré-écris tout. Je récupère toutes les valeurs depuis /proc/meminfo et je les affiche. Le code est même plus simple : juste un cat, des grep, des additions / soustractions et des echo. Comment sais-je quelles valeurs dans /proc/meminfo dois-je utiliser ? Je lis le code source de la commande free. Enfin… L'ancienne version, évidemment. Je cherche où est défini la fonction meminfo() qui semble collecter les données… Dans sysinfo.c. Ainsi, mémoire totale = kb_main_total dans le code = « MemTotal » dans /proc/meminfo, mémoire utilisée = « MemTotal » - « MemFree », mémoire réellement utilisée = mémoire utilisée - (« Buffers » + « Cached ») , etc.

    Au final, ça donne ça :

    #!/bin/bash
    
    # On récupère les valeurs depuis procfs
    meminfo=$(cat /proc/meminfo)
    
    memTotal=$(grep '^MemTotal:' <<< "$meminfo" | awk '{ print $2 }')
    memFree=$(grep '^MemFree:' <<< "$meminfo" | awk '{ print $2 }')
    shared=$(grep '^Shmem:' <<< "$meminfo" | awk '{ print $2 }')
    buffers=$(grep '^Buffers:' <<< "$meminfo" | awk '{ print $2 }')
    cached=$(grep '^Cached:' <<< "$meminfo" | awk '{ print $2 }')
    
    swapTotal=$(grep '^SwapTotal' <<< "$meminfo" | awk '{ print $2 }')
    swapFree=$(grep '^SwapFree' <<< "$meminfo" | awk '{ print $2 }')
    
    # On calcule ce qui nous manque
    memUsed=$(( $memTotal - $memFree ))
    swapUsed=$(( $swapTotal - $swapFree ))
    
    # voir https://gitlab.com/procps-ng/procps/-/blob/099bf9a26a074a7f58442aa0c907980459afdc02/free.c
    buffers_plus_cached=$(( $buffers + $cached ))
    
    # +/- used = kb_main_used - buffers_plus_cached
    #          = memUsed      - buffers_plus_cached
    buffersUsed=$(( $memUsed - $buffers_plus_cached ))
    
    # # +/- free =  kb_main_free + buffers_plus_cached
    #            =  memFree      +  buffers_plus_cached
    buffersFree=$(( $memFree + $buffers_plus_cached ))
    
    # Affichage
    echo -e '\ttotal\t\tused\t\tfree\t\tshared\t\tbuffers\t\tcached'
    echo -e "Mem:\t$memTotal\t\t$memUsed\t\t$memFree\t\t$shared\t\t$buffers\t\t$cached"
    echo -e "-/+ buffers/cache:\t$buffersUsed\t\t$buffersFree"
    echo -e "Swap:\t$swapTotal\t\t$swapUsed\t\t$swapFree"
    
    exit 0

    Alors, oui, les chiffres remontés à notre supervision seront moins fiables que la colonne « available » d'un free moderne puisque le calcul de la mémoire utilisée pour le cache a changé (source : https://gitlab.com/procps-ng/procps/-/blob/13f20a48119894638a98b9a17a714704c69492d4/proc/sysinfo.c#L685 versus https://gitlab.com/procps-ng/procps/-/blob/master/proc/sysinfo.c#L781), mais on est à quelques dizaines de mégaoctets d'écart… Nous ne sommes pas la NASA : cette imprécision est largement tolérable.

    Il me reste plus qu'à écrire le script qui prendra la place de /usr/bin/free et qui dirigera vers le bon binaire en fonction de qui l'exécute. Comment savoir qui exécute un script ? Il existe la variable shell USER, ce qui rend envisageable une condition if [ "$USER" == 'xymon' ]. La variable PPID permet de connaître l'identifiant du processus parent, ce qui rend envisageable un if ps aux | grep $PPID | grep -q xymon. Plein d'autres moyens existent.

    Dans mon cas, USER n'est pas provisionnée. Car Xymon est exécuté par un compte utilisateur système qui a /bin/false pour shell ? Je pourrais utiliser id -u, mais je pars sur $PPID, comme ça, sans raison. Mais… Attends… Je peux donc savoir quel composant de Xymon exécute free : il suffit de remplacer /usr/bin/free par un script ps aux | grep $PPID > /tmp/debugXymon. J'attends la fréquence d'actualisation du test « memory ». le fichier apparaît dans /tmp et je découvre que le processus Xymon qui exécute free est /usr/lib/xymon/client/bin/xymonclient-linux.sh.

    Comment a-t-il échappé à mes grep du début ? Parce qu'à ce stade-là, le test se nomme « free », pas « memory ». Je n'ai pas lancé une nouvelle campagne de grep quand j'ai compris que c'était bien la commande free qui était utilisée en sous-main, donc j'ai rien vu, forcément. Cela permet d'affirmer que le test définitif, « memory », est produit côté serveur Xymon à partir des données remontées par xymonclient-linux.sh sous le nom de « free ». Comme pour l'espace disque. Comme pour les processus. Comme pour… De même, si j'avais percuté qu'une version de Xymon est sortit en 2019 et si j'avais lu le journal des changements j'aurais compris que le problème qui m'interroge a été corrigé dans la version 4.3.20 du serveur Xymon (notons que le fichier « README » de la version la plus récente ne contient pas tout l'historique, il faut donc remonter de version en version pour prendre connaissance de tous les changements…). Ce constat ne change pas la conclusion : le problème se situe côté serveur… que nous ne mettrons pas à jour.

    Du coup, nul besoin de remplacer /usr/bin/free : il suffit de lancer notre script depuis xymonclient-linux.sh. Cela fonctionne. \o/

    Avec Puppet, je déploie, sur nos Debian >=9 uniquement, mon script qui émule l'ancienne version de free et une nouvelle version de xymonclient-linux.sh qui exécute mon script au lieu de free afin de remonter l'utilisation de la RAM.

    Fin.

    Sun Nov 22 21:24:22 2020 - permalink -
    - http://shaarli.guiguishow.info/?GU_XIg
  • La grande flexibilité du mod_userdir d'Apache httpd

    Le module userdir du serveur web Apache httpd permet à chaque utilisateur d'un serveur d'héberger un site web dans son dossier personnel ($HOME). Celui-ci sera accessible à l'URL https://www.monorganisation.example/~<IDENTIFIANT_UTILISATEUR>.

    Du moins, ça c'est la théorie. J'ignorais la grande flexibilité de mod_userdir :

    • Par défaut, le site web d'un utilisateur doit se trouver dans un dossier « public_html » situé dans le $HOME (home directory, dossier personnel) de cet utilisateur. Mais, en fait, ce dossier peut se trouver n'importe où, tant que le chemin pour y accéder contient / dépend de l'identifiant de l'utilisateur. Même le nom du dossier n'est pas imposé ;

    • Il est possible de préciser plusieurs chemins vers le dossier contenant le site web d'un utilisateur. Apache httpd cherchera le dossier contenant le web d'un utilisateur dans telle arborescence, et s'il ne trouve pas le dossier, il le cherchera dans telle autre arborescence, puis dans telle autre, etc.


    Cas d'étude

    Nous avons un serveur Debian GNU/Linux sur lequel tous nos utilisateurs peuvent se connecter en SSH et déposer des pages web (entre autres choses).

    Deux espaces de stockage sont à leur disposition : leur dossier personnel ($HOME) et leurs données. Les deux sont montés en NFS. Les données sont aussi accessibles en CIFS depuis n'importe quelle machine et n'importe quel système d'exploitation. Le dossier personnel est accessible seulement depuis ce serveur.

    Certains utilisateurs veulent modifier leur site web depuis winwin (entre l'encodage des caractères, le codage différent d'un retour à la ligne, et autres fourberies, ce n'est pas une bonne idée, mais je ne suis pas là pour empêcher nos utilisateurs de se faire mal). On va donc stocker les sites web dans l'espace de stockage « données ».

    Comment faire ? Simple. Voici le contenu du fichier /etc/apache2/mods-enabled/userdir.conf :

    <IfModule mod_userdir.c>
    
        UserDir disabled root
    
        UserDir /nfs/nas-datas/datas/*/public_html
    
        <Directory /nfs/nas-datas/datas/*/public_html>
            AllowOverride All
            Options Indexes
            Require all granted
        </Directory>
    
    </IfModule>

    Commentaires :

    • Par sécurité, on désactive ce module pour l'utilisateur root ;

    • Pour servir une URL de la forme https://www.monorganisation.example/~<IDENTIFIANT>, Apache httpd cherchera les fichiers dans le dossier /nfs/nas-datas/datas/<IDENTIFIANT>/public_html ;

    • On autorise Apache httpd à accéder au dossier public_html des utilisateurs. Selon la documentation, ici, le caractère substituable « * » n'est pas remplacé par l'identifiant demandé dans l'URL, mais signifie « n'importe quels caractères qui apparaît 0, 1 ou une infinité de fois ».



    Difficulté supplémentaire : en fait, sur notre NAS, pour des raisons de performances, le dossier d'un utilisateur est en fait un sous-dossier d'un dossier qui peut prendre le nom d'un hash ou celui du groupe auquel appartient l'utilisateur (son service, par exemple) ou l'année d'arrivée de l'utilisateur, etc. Pour cet exemple, on considérera que c'est le groupe de l'utilisateur et que celui-ci équivaut à son service.

    Comment faire ? Facile. Le module userdir peut chercher le site web dans plusieurs dossiers en s'arrêtant à la première occurrence trouvée. Quant à elle, la directive « Directory » autorise plusieurs caractères substituables.

    Le contenu du fichier /etc/apache2/mods-enabled/userdir.conf devient :

    <IfModule mod_userdir.c>
        UserDir disabled root
    
        UserDir /nfs/nas-datas/datas/info/*/public_html /nfs/nas-datas/datas/compta/*/public_html /nfs/nas-datas/datas/direction/*/public_html
    
        <Directory /nfs/nas-datas/datas/*/*/public_html>
            AllowOverride All
            Options Indexes
            Require all granted
        </Directory>
    
    </IfModule>



    Allez, une dernière chose : si le site web n'est pas trouvé dans l'espace de stockage « données », on souhaite le chercher dans le dossier personnel.

    Ce n'est pas un problème : on peut bien évidemment cumuler les différentes syntaxes de la directive « UserDir » : UserDir /nfs/nas-datas/datas/info/*/public_html public_html. Dans cet exemple, Apache httpd ira chercher dans le dossier /nfs/nas-datas/datas/info/<IDENTIFIANT>/public_html et, si ce dossier n'existe pas, il ira chercher dans le dossier public_html du home directory (qui n'est pas toujours /home/<IDENTIFIANT>, pour rappel).

    Évidemment, pour que cela fonctionne, il faut ajouter une directive « Directory » supplémentaire autorisant l'accès au dossier « public_html » situé dans le $HOME. Exemple :

    <Directory /nfs/nas-homedir/homedirs/*/*/public_html>
        AllowOverride All
        Options Indexes
        Require all granted
    </Directory>
    Mon Nov 16 20:41:55 2020 - permalink -
    - http://shaarli.guiguishow.info/?LvGB_A
  • Barre de progression d'un upload web calculée côté serveur

    Je me suis toujours demandé comment fonctionne les barres de progression d'un téléchargement / téléversement que l'on trouve sur les sites web : comment le code du site web peut-il être au courant de l'avancement d'une telle action puisqu'il est exécuté une fois l'upload terminé ?

    Au temps du module PHP pour Apache httpd, je me disais que, vu qu'il s'agit d'un module, il est incrusté au cœur d'Apache httpd donc il doit certainement disposer d'infos supplémentaires. Mais quid des installations dans lesquelles le serveur web est uniquement un reverse proxy vers un serveur d'applications (FastCGI, PHP-FPM, Python uwsgi) ?

    La première réponse qui vient à l'esprit est : on surveille la progression de l'upload entièrement côté client avec Ajax.

    J'ignorais qu'il est également possible de surveiller l'upload côté serveur. Enfin, pas totalement, puisqu'il faudra toujours de l'Ajax pour actualiser la barre de progression. Mais le reste est fait côté serveur.


    Fonctionnement d'une barre de progression côté serveur

    A priori, tout le monde s'est mis d'accord sans pour autant produire une norme (en tout cas, le RFC 1867, souvent cité, normalise l'envoi de fichiers avec un formulaire web, mais pas la mesure de la progression d'un upload) :

    • Le script côté client génère un identifiant unique pour chaque upload ;

    • Le navigateur web lance l'upload ;

    • Le serveur fait les calculs de la progression de l'upload ;

    • En parallèle de l'upload, le client interroge le serveur grâce à Ajax (requêtes asynchrones) en utilisant une URL convenue à l'avance choisie par l'application et en rappelant l'identifiant unique de l'upload. Exemple : XHR GET https://www.monorganisation.example/progressbarupload/upload_progress?X-Progress-ID=42122089-d6dd-4570-9ded-09e75f8a50d2 ;

    • Le serveur répond du JSON. Exemple : « { "state" : "uploading", "received" : 49478497, "size" : 65730134 } ».

    • Le client actualise la barre de progression, puis refait une requête au serveur web afin de connaître l'avancement de l'upload, donc retour au 4e point ci-dessus ;



    Quand j'écris « le serveur fait » ceci ou cela, de quel composant précis est-ce que je parle ?

    • Cela peut être PHP, nativement ou couplé au module APC. Dans ces deux cas, le suivi de la progression fonctionne uniquement avec le module PHP pour Apache httpd, pas en FastCGI ni avec PHP-FPM ;

    • Cela peut être le serveur web. Il existe un module pour nginx, un module pour Apache httpd, un module pour Lighttpd, etc. Dans Debian GNU/Linux, celui pour nginx est activé par défaut, celui pour Apache httpd est disponible dans le paquet libapache2-mod-upload-progress. Celui pour nginx est plutôt bien documenté (peut mieux faire sur les valeurs par défaut des paramètres, par exemple) alors que celui pour Apache httpd ne l'est quasiment pas (ça ne permet pas de comprendre que l'URL à laquelle récupérer les rapports de progression est configurable, par exemple).


    Configurer nginx

    • Dans le bloc http du fichier ngnix.conf, il faut ajouter : upload_progress uploadp 1m;. On réserve un espace mémoire d'un mégaoctet nommé « uploadp » pour le suivi des uploads ;

    • Dans le serveur virtuel, dans le bloc location qui envoie les requêtes vers un serveur d'applications, il faut ajouter track_uploads uploadp 30s. On surveille tous les uploads en les enregistrant dans l'espace mémoire « uploadp » défini ci-dessus. On conserve la trace d'un upload jusqu'à 30 secondes après sa complétion ;

    • Dans le serveur virtuel, on ajoute un nouveau bloc location capturant l'URL à laquelle l'application est programmée pour venir chercher les informations concernant un upload à coup de XMLHTTPRequest. nginx répondra aux requêtes GET qu'il recevra à cette URL avec les informations concernant un upload dont l'identifiant est passé en argument si celui-ci a été surveillé dans l'espace mémoire « uploadp » :

      location ^~ /progressbarupload/upload_progress {
          upload_progress_json_output
          report_uploads uploadp;
      }


    • On recharge la configuration : sudo systemctl reload nginx.

    Notons que le module nginx prend en charge JSONP, JSON with Padding, qui encapsule les données dans un appel de fonction afin de contourner les restrictions inter-domaines : la récupération d'un fichier depuis un autre domaine avec XMLHTTPRequest est interdite par défaut par les navigateurs web sauf si l'on positionne des en-têtes CORS sur le site web sur lequel les données doivent être récupérées, alors que la récupération d'un script JavaScript sans utiliser XMLHTTPRequest est autorisée par défaut. Pour activer un retour au format JSONP, il faut remplacer upload_progress_json_output par upload_progress_jsonp_output.


    Configurer Apache httpd :

    • On installe le module (il sera activé et httpd sera redémarré) : sudo apt-get install libapache2-mod-upload-progress ;

    • Dans le serveur virtuel, dans le bloc location qui envoie les requêtes vers un serveur d'applications, il faut ajouter TrackUploads On ;

    • Dans le serveur virtuel, on ajoute un nouveau bloc location capturant à l'URL à laquelle l'application est programmée pour venir chercher les informations concernant un upload à coup de XMLHTTPRequest. nginx répondra aux requêtes GET qu'il recevra à cette URL avec les informations concernant un upload dont l'indentifiant est passé en argument :

      <Location ~ '^/progressbarupload/upload_progress'>
          ReportUploads On
      </Location>


    • On recharge la configuration : sudo systemctl restart apache2.

    Le module Apache httpd prend aussi en charge JSONP. Pour l'activer, il suffit d'ajouter le paramètre callback=<nom_désiré_pour_la_callback> à la requête HTTP GET qui viendra consulter le rapport d'avancement de l'upload produit par le serveur, il y a rien à activer dans la configuration du serveur web.

    Sun Nov 15 19:14:33 2020 - permalink -
    - http://shaarli.guiguishow.info/?TtmNbA
  • OpenLDAP : faire des recherches <= / >= sur des attributs de type entier

    Réponse : ajouter « ORDERING integerOrderingMatch » à la définition de l'attribut.

    Sur les attributs numériques (integer) de notre annuaire LDAP (OpenLDAP), nous aimerions faire des recherches de la forme « valeur supérieure ou égale à ». Exemples : trouver les prénoms+nom des personnels dont employeeNumber est >= XXXXXXXX ; trouver tous les uid des personnels dont pwdLastChange est <= 20191231 (cela fonctionne car la date est au format ISO 8601 dont le Hollandais Volant présente les avantages) ; trouver tous les uid des personnels dont gidNumber >= XXXXXXXX.

    Notons que la norme LDAP ne permet pas des recherches avec les opérateurs strictement inférieur (<) et strictement supérieur (>). Uniquement <= et >=.

    Notre recherche sur le gidNumber fonctionne. Elle échoue sur les autres attributs : aucun résultat est retourné alors que des objets correspondent à notre recherche.

    J'ai déjà présenté les règles de comparaison qui peuvent être affectées à un attribut LDAP afin de pouvoir comparer deux objets LDAP entre eux et le fait que, par défaut, aucune régle de comparaison est associée à un attribut. Je pressens qu'il en va de même pour une recherche ordonnée portant sur des attributs numériques.

    Je parcours à nouveau le RFC 4517. Bingo, il existe bien des règles de comparaison ordonnée.

    Ainsi, pour être en mesure d'effectuer une recherche <= ou >= sur un attribut LDAP de type entier, il faut ajouter « ORDERING integerOrderingMatch » à sa définition en mettant à jour le schéma qui la contient.

    Sun Nov 15 17:00:28 2020 - permalink -
    - http://shaarli.guiguishow.info/?x7DXvQ
  • Rappels de sécurité concernant sudo

    Ces derniers temps, j'ai utilisé sudo pour faire du contrôle d'accès, donc j'ai dû réviser les bases :

    • sudo ne prend pas en charge les regex dans sa configuration, uniquement les glob patterns, un sous-ensemble de caractères substituables. Il n'est donc pas possible d'indiquer la répétition d'un ou de plusieurs caractères avec « + », « * » ou « {} », par exemple ;

    • Le caractère substituable « * » autorise toujours plus d'actions que ce que l'on pense initialement en écrivant la règle sudo. Parfois à cause des programmes à qui l'on donne des droits avec sudo (exemple avec less, mais on peut faire la même avec vim qui permet d'exécuter des commandes ;)), très souvent à cause de la configuration de sudo.

    Exemples :

    • toto ALL=(titi) NOPASSWD: /usr/bin/id : l'utilisateur toto peut se faire passer pour l'utilisateur titi afin d'exécuter la commande id sans avoir à saisir un mot de passe. Tous les paramètres du programme id sont utilisables (« - g », par exemple). Plus largement, tous les arguments sont possibles : autoriser less ou cat donne la possibilité de consulter tooous les fichiers du système en se faisant passer pour titi. C'est pourquoi il ne faudrait jamais avoir une entrée dans la configuration de sudo de la forme toto ALL=(root) NOPASSWD: /usr/bin/id * si le but est d'autoriser tous les arguments d'une commande (lire les points suivants pour connaître les dangers de l'entrée sudo énoncée à l'instant) ;

    • toto ALL=(titi) NOPASSWD: /usr/bin/id -[gu] (pas « -(g|u) » puisque sudo ne prend pas en charge les regex) : toto peut lancer id -u et id -g sans mot de passe en se faisant passer pour titi ;

    • toto ALL=(root) NOPASSWD: /usr/bin/ssh root@cluster[0-9] id : toto peut se faire passer pour root afin de se connecter, en SSH, aux machines nommées clusterX où X doit être entre 0 et 9 inclus. Pour autoriser les dizaines (« clusterXX ») : « cluster[0-9][0-9] ». Surtout pas « cluster[0-9]* » : il ne s'agit pas d'une regex, donc « * » n'agit pas sur le groupe précédent afin de le répéter 0 ou n fois : il autorise clusterX (où X = entre 0 et 9, ça ne change pas) suivi de n'importe quoi (des chiffres, des lettres, des espaces, etc.). Toto peut donc exécuter : sudo ssh root@cluster10 'rm -rf / ; id' ;

    • toto ALL=(root) NOPASSWD: /usr/bin/ssh root@web[0-9]*.monorganisation.example id : toto pourra exécuter sudo ssh root@web1 rm -rf /#.monorganisation.example id. # = commentaire, tout ce qui suit ne sera pas exécuté. Il faudra juste définir le nom web1 dans /etc/hosts (sauf s'il y a une instruction search ou domain dans /etc/resolv.conf).

    Il y a un cas que je ne sais pas résoudre sur le plan de la lisibilité :

    • On veut se connecter à un serveur pour exécuter un script maison. Jusque-là, c'est facile : toto ALL=(root) NOPASSWD: /usr/bin/ssh root@srv.monorganisation.example /usr/local/bin/script.sh ;

    • S'il y a des arguments facultatifs et/ou dont la valeur change ? Facile : toto ALL=(root) NOPASSWD: /usr/bin/ssh root@srv.monorganisation.example /usr/local/bin/script.sh -a start, /usr/bin/ssh root@srv.monorganisation.example /usr/local/bin/script.sh -a stop. Mais plus il y a d'arguments et de valeurs, plus la configurarion de sudo devient lourde, longue et illisible ;

    • Et si, parmi les arguments du script, il y a une chaîne de 4 caractères variables ? toto ALL=(root) NOPASSWD: /usr/bin/ssh root@srv.monorganisation.example /usr/local/bin/script.sh -a start -b [a-z][a-z][a-z][a-z], /usr/bin/ssh root@srv.monorganisation.example /usr/local/bin/script.sh -a stop ;

    • Et si, parmi les arguments du script, il y a une longue chaîne de caractères (comme un hash) ? Il faut les préciser caractère par caractère ;

    • Au final, la configuration de sudo devient illisible.
    Sat Nov 14 13:05:03 2020 - permalink -
    - http://shaarli.guiguishow.info/?e6SBSw
  • adduser / passwd demandent de saisir le mot de passe actuel ?! Merci, pam_script

    Sur ma machine perso GNU/Linux Buster, j'ajoute un utilisateur :

    $ sudo adduser toto
    [sudo] Mot de passe de guigui : 
    Ajout de l'utilisateur « toto » ...
    Ajout du nouveau groupe « toto » (1002) ...
    Ajout du nouvel utilisateur « toto » (1002) avec le groupe « toto » ...
    Création du répertoire personnel « /home/toto »...
    Copie des fichiers depuis « /etc/skel »...
    Current password: 
    New password: 
    New password (again): 
    Mot de passe inchangé
    passwd: Erreur de manipulation du jeton d'authentification
    passwd: password unchanged

    Le comportement est identique après un su - root.

    Depuis quand passwd demande l'ancien mot de passe quand on crée un compte ?! Depuis quand cette demande se fait-elle en anglais ?

    Je crée un compte sans mot de passe (entrée, entrée, entrée, entrée, etc.) puis je tente de changer le mdp :

    # passwd toto 
    Current password: 
    New password: 
    New password (again): 
    Aucun mot de passe fourni
    passwd: Erreur de manipulation du jeton d'authentification
    passwd: password unchanged

    … … …

    J'ai trouvé l'origine du problème avec de la chance : j'ai installé le module pam_script. Celui-ci modifie le fichier /etc/pam.d/common-password de la manière suivante :

    - password        [success=1 default=ignore]      pam_unix.so obscure sha512
    + password        sufficient                      pam_script.so
    + password        [success=1 default=ignore]      pam_unix.so obscure use_authtok try_first_pass sha512

    C'est donc pam_script qui affiche « Current password » / « New password » / « New password (again) ». A priori, ce n'est pas un script lancé par pam_script mais bien pam_script lui-même qui affiche cela, car, en mettant mon /etc dans un dépôt git, je n'ai pas trouvé un quelconque script et l'installation de libpam-script ne modifie / n'ajoute pas d'autres fichiers dans /etc.

    Du coup, si l'on répond uniquement avec entrée, on devrait passer au module suivant, pam_unix.so, non ? Oui.

    Donc retrouver le comportement habituel ? Non. Car pam_unix est exécuté avec l'argument « use_authtok » qui lui ordonne de définir le nouveau mot de passe à la valeur fournie par un module précédent… Or, nous ne l'avons pas saisi. Le module pam_unix affiche donc « Aucun mot de passe fourni ». Puis le module pam_deny afffiche les deux dernières lignes.

    Saisir un nouveau mot de passe sans saisir le mot de passe actuel change rien : la comparaison entre le mot de passe enregistré en base et celui saisi échouera, donc pam_unix échouera.

    Solution ? Soit désinstaller libpam-script (je l'avais installé pour tester des choses). Soit commenter la ligne pam_script et virer les arguments « use_authtok try_first_pass » de pam_unix.

    Fri Nov 13 19:51:51 2020 - permalink -
    - http://shaarli.guiguishow.info/?E9iTJw
  • How to Send a Message to Logged Users in Linux Terminal

    Envoyer un message sur tous les tty/pts d'une machine GNU/Linux : wall <message>. Utile pour annoncer une maintenance imprévue et urgente ou pour rappeler une maintenance planifiée.

    Ça faisait bien bien bien longtemps que je n'avais pas eu l'opportunité de faire ça. \o/

    Thu Nov 12 21:56:00 2020 - permalink -
    - https://www.tecmint.com/send-a-message-to-logged-users-in-linux-terminal/
  • systemd - What are the systemctl options to "List all failed units" - Unix & Linux Stack Exchange

    Quand systemctl status affiche qu'une ou plusieurs units sont en état « failed », systemctl list-units --state=failed permet d'identifier laquelle / lesquelles. Je l'oublie toujours…

    Thu Nov 12 17:48:46 2020 - permalink -
    - https://unix.stackexchange.com/questions/341060/what-are-the-systemctl-options-to-list-all-failed-units
  • 🍆😏 Guibre #20794 - DTC Dans Ton Chat - BashFR - Humour perles citations

    Jô paté : MIS A PART MON ÉNORME CHIBRE
    Makaps : Chibre : (Pénis) Étymologie incertaine : déformation argotique de guibre, désignant un nez fort dans le parler marin ou bien de l’arabe (« empan ») (prononcer ch-b-r), unité de mesure allant de l’extrémité du pouce à l’extrémité du majeur d’environ cinq pouces.
    Makaps : Alors 5 pouces ça fait combien en cm...
    Makaps : ... 5 pouces = 12.7cm
    Jô paté : Emmerdeur, euse, subst.,trivial, péj. [Correspond à emmerder B] Personne qui importune, contrarie ou agace fortement les autres; personne qui ennuie les autres.

    :)

    Wed Nov 11 20:11:34 2020 - permalink -
    - https://danstonchat.com/20794.html
  • MariaDB / MySQL : attention à « log_slow_rate_limit » quand tu utilises « slow_query_log »

    Résumé : si tu journalises les requêtes lentes avec le paramètre slow_query_log de MariaDB / MySQL, attention à log_slow_rate_limit (qui est désactivé par défaut), car, avec lui, seule une fraction des requêtes sera analysée et, si besoin, journalisée. Avec « log_slow_rate_limit = 10 », seule la dixième requête sera analysée et, si elle est lente, journalisée. Dans une séquence "4 requêtes OK suivies par 3 requêtes lentes suivies par 3 requêtes OK", les trois requêtes lentes passent inaperçues.



    Sur l'un de nos serveurs MariaDB, mysqladmin status nous informe qu'il y a des requêtes lentes / slow queries. Une requête lente est une requête dont la durée d'exécution dépasse la valeur du paramètre long_query_time (10 secondes par défaut).

    Nous journalisons les requêtes lentes avec les paramètres suivants dans /etc/mysql/mariadb.conf.d/60-surchargeLocale.cnf (cela permet qu'une mise à jour des paquets mette à jour les paramètres généraux dans 50-server.cnf sans affecter les paramètres que nous savons essentiels / vitaux pour nos besoins + de simplifier l'usage de Puppet puisqu'il suffit de déposer le fichier au lieu de modifier l'autre avec file_line ou concat ou…) :

    slow_query_log      = 1
    slow_query_log_file = /var/log/mysql/mariadb-slow.log

    Je regarde donc le journal sus-mentionné : il est vide ! O_O

    J'utilise le client en ligne de commande, mysql afin d'exécuter la requête « SELECT SLEEP(12); » (ben quoi, il s'agit d'une requête dont l'exécution va durer plus de 10 secondes). Elle n'est pas journalisée. mysqladmin nous mentirait ?

    Après m'être cassé les dents, il s'avère que le paramètre log_slow_rate_limit, qui n'est pas activé par défaut dans Debian GNU/Linux ni sur nos autres serveurs, était activé sur ce serveur.

    Je n'y avais pas pris garde car, dans les autres logiciels que je connais, comme OpenVPN, la limitation du débit signifie que le logiciel arrête de journaliser quand un même message d'erreur se répète X fois. log_slow_rate_limit fonctionne à l'envers : seule une fraction des requêtes sera analysée et, si elle est trop longue, alors la requête sera journalisée.

    Avec « log_slow_rate_limit = 10 », seule 1 requête sur 10 sera analysée. Ainsi, si 8 requêtes OK sont suivies par deux requêtes lentes, alors la journalisation s'activera au bout de la deuxième requête lente. Si 13 requêtes sont OK puis 7 foireuses, la journalisation s'activera au bout de la 7e requête (13 + 7 + 20 qui est un multiple de 10). Autant dire que si t'as une séquence de la forme "4 requêtes OK suivies par 3 requêtes lentes suivies par 3 requêtes OK", tu vas attendre longtemps la journalisation, même si la connexion au serveur, la commande jouée à la connexion, etc. (qui sont considérées comme des requêtes) ajoutent de l'entropie.

    Dans mon cas, la valeur de log_slow_rate_limit était 1000, donc, forcément, il fallait attendre loooongtemps avant qu'une requête soit journalisée.

    Thu Nov 5 22:28:19 2020 - permalink -
    - http://shaarli.guiguishow.info/?ouejzw
  • Trois notes pour bien lire mysqladmin status

    On utilise mysqladmin status pour récupérer quelques métriques concernant nos serveurs MariaDB.
    Sous Debian GNU/Linux, cet outil est fourni par le paquet mariadb-client.

    Je relève trois points de vigilance à avoir quand on examine la sortie de cette commande :

    • Le manuel ne le dit pas mais Queries per second avg, c'est le nombre de questions (alors que questions et queries ne sont pas synonymes… … …) divisé par l'uptime. Cela explique pourquoi ce nombre ne fluctue pas entre le jour et la nuit, en fonction de l'usage réel du serveur de bases de données. Pour contourner cela, je graphe, avec rrdtool, le nombre de « questions » avec un type COUNTER et hop ;

    • Le champ Questions ne comptabilise pas uniquement les requêtes SELECT, INSERT, etc. Cela comptabilise aussi les connexions réussies au serveur (bind), les déconnexions propres (si tu fermes le client en ligne de commande ‒ mysql ‒ avec quit; ou avec un ctrl+c. Les fermetures de connexions PDO ne sont pas comptabilisées), la requête exécutée à la connexion (paramètre init-connect dans la configuration de MariaDB), le choix d'une base de données (use <nom_base> avec le client en ligne de commande mysql ‒ autant de questions qu'il y a de tables dans la base ‒. « dbname » dans le DSN d'une connexion PDO n'est pas comptabilisé), l'exécution de mysqladmin compte lui-même pour une question, etc. ;

    • La sortie mélange des métriques instantanées / en direct / à l'instant T (GAUGE) comme « Threads » et « Open tables » avec des nombres incrémentés depuis le démarrage du serveur (COUNTER) comme « Questions », « Slow queries », « Opens » et « Flush tables ».
    Thu Nov 5 21:09:13 2020 - permalink -
    - http://shaarli.guiguishow.info/?vR38hg
  • La Poste perd les accusés de réception

    Il y a une semaine et un jour, j'ai envoyé une LRAR. D'après le site web de La Poste, elle a été remise contre signature il y a une semaine. Aujourd'hui, j'ai reçu la réponse de mon destinataire. Je n'ai toujours pas reçu l'accusé de réception (t'sais, le bout de carton). La Poste perd les accusés de réception, c'est-à-dire les trucs qui sont censés servir de preuve. C'est le 4e accusé perdu depuis le début de l'année 2020 sur plus d'une cinquantaine de LRAR, soit quasiment 10 % de perte. Ça commence à faire beaucoup…

    Je ne sais pas si je suis le seul concerné…

    Tue Nov 3 20:40:27 2020 - permalink -
    - http://shaarli.guiguishow.info/?jgDzAA
  • Shaarli sans cookie superflu · GuiGui's Show - ArthurHoaro's Links

    Ce n'est pas indispensable mais il y toujours quelques fonctionnalités liées à la session comme le nombre de liens affichés par page

    Je n'avais pas pensé à ça. Après vérification : dans la version 0.7.0, le stockage du nombre de liens affichés par page est la seule utilité d'une session quand on n'est pas connecté.

    Du coup, le correctif est simple. Ma ligne header_remove('set-cookie'); devient :

    if (! isset($_GET['linksperpage']))
    {
        header_remove('set-cookie');
    }

    Dans mon cas, je ne souhaite pas proposer cette fonctionnalité (choisir le nombre de liens par page) donc je reste sur ma proposition initiale.


    De manière générale, lorsqu'il y a un dysfonctionnement ou un comportement qui peut être amélioré comme ici, le bon réflexe est de remonter le problème en créant un ticket.

    Je ne souhaite pas détenir un compte GitHub. ^^

    Tue Nov 3 20:19:23 2020 - permalink -
    - https://links.hoa.ro/shaare/QPMc8Q
  • Shaarli sans cookie superflu

    Résumé : pour empêcher Shaarli (version 0.7) de déposer un cookie dans le navigateur web de tous tes visiteurs, même ceux qui ne s'identifient pour écrire / administrer, ajoute une instruction header_remove('set-cookie'); à la fin du fichier index.php, juste avant « renderPage(); ».



    Un truc m'a toujours gonflé avec le logiciel Shaarli : il dépose tout le temps un cookie, même si le visiteur ne s'identifie pas. Je pourrais raisonner en juriste (ce cookie est-il légitime ? Dois-je recueillir le consentement de mes visiteurs pour le déposer ? A priori, non, mais, d'un autre côté, comme il n'est pas prévu ni attendu qu'un visiteur puisse se connecter, il est cocasse de déposer un cookie pour cette finalité… Etc.), mais ça ne m'intéresse pas. Je raisonne en technicien : toute action inutile doit disparaître, point. ÉDIT DU 03/11/2020 À 20 H 30 : comme me l'a signalé Arthur, la session permet de stocker le nombre de liens que le visiteur souhaite afficher sur une page. Les autres personnalisations nécessitent de s'être identifié. FIN DE L'ÉDIT.

    Pour constater ce dont je parle, on peut procéder ainsi :

    $ curl -k -D - -o /dev/null -s https://shaarli.guiguishow.info/ | grep 'set-cookie'
    set-cookie: shaarli=idfu66r9egijg8f1nmh775ao96; domain=shaarli.guiguishow.info
    set-cookie: shaarli_staySignedIn=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/

    Mon WordPress, lui, ne dépose aucun cookie (tant qu'on ne poste pas un commentaire ou que l'on ne se connecte pas à son administration, bien entendu) :

    $ curl -k -D - -o /dev/null -s https://www.guiguishow.info/ | grep 'set-cookie'
    $ 



    À la ligne 207 du fichier index.php de Shaarli, on trouve une instruction « session_start(); » qui appelle le gestionnaire de sessions qui, par défaut, dépose un premier cookie. Un deuxième est déposé par la fonction logout() qui est systématiquement appelée par la fonction setup_login_state() qui est appelée ligne 329.

    J'utilise la version 0.7.0 de Shaarli. Si le deuxième cookie n'est plus déposé sur une version plus récente, le premier l'est toujours.

    Le formulaire de connexion est traité à partir de la ligne 451. On constate que toutes les fins de ce bloc « if » contiennent un « exit() », c'est-à-dire la fin du script.

    D'une manière générale, le dépôt d'un cookie se fait avec un entête de réponse HTTP « set-cookie ». On ne peut pas demander au serveur web de supprimer l'entête HTTP « set-cookie » (Header always unset set-cookie avec Apache httpd, par exemple) sinon tout accès admin / écrivain devient impossible.

    Je n'ai pas les compétences nécessaires pour remanier le code de Shaarli afin de déplacer le « session_start() » au bon endroit, démarrer une session que si le visiteur tente de s'identifier, etc.

    En revanche, je comprends que je peux ajouter une instruction header_remove('set-cookie'); à la fin du fichier index.php, juste avant « renderPage(); ». ÉDIT DU 03/11/2020 À 20 H 30 : si l'on veut que l'utilisateur puisse choisir le nombre de liens affichés sur une page, il faut encadrer l'instruction d'une condition : if (! isset($_GET['linksperpage'])) header_remove('set-cookie');. FIN DE L'ÉDIT.

    En faisant ça :

    • Dans le cas général, le fonctionnement interne de Shaarli reste inchangé, il tente bien de déposer un cookie en ajoutant un entête HTTP « set-cookie », mais, juste avant le rendu de la page, hop, on l'en empêche en supprimant ledit entête ;

    • Quand je m'identifie, le formulaire de connexion est vérifié et validé, l'expiration du cookie (dont l'entête permettant son dépôt a déjà été ajouté à la pile des entêtes de réponse) est positionnée en fonction de mon choix (« Stay signed in » coché ou non), puis mon navigateur est redirigé vers la page d'accueil et le script s'arrête… sans atteindre l'instruction demandant la suppression de l'entête déposant un cookie. À partir de là, ayant reçu l'entête « set-cookie », mon navigateur web sait qu'il doit positionner un entête « cookie » à chaque fois qu'il revient sur mon shaarli donc l'identification fonctionne correctement.
    Mon Nov 2 23:11:31 2020 - permalink -
    - http://shaarli.guiguishow.info/?iIKa6Q
  • La Communication NonViolente au quotidien | Editions Jouvence - GuiGui's Show

    C'est agréable de s'arrêter, de regarder derrière, et de constater que l'on a un peu progressé.

    Ce que j'ai principalement retenu de la communication non-violente (CNV) dont quelques-uns des préceptes sont honnêteté, gentillesse, laisser autrui choisir, etc., c'est que si ce mode ne communication ne fonctionne pas, alors tu peux toujours gueuler sur autrui, lui mentir, tricher, etc. afin d'obtenir ce que tu veux, mais ça mènera à rien : tu ne respecteras pas autrui qui fera mal ce que tu lui demandes, le tout dans une ambiance pourrie.

    Récemment, une amie m'a dit qu'elle apprécie vraiment mon honnêteté dans mes demandes d'aide / invitations. Je formule mes attentes clairement genre là j'ai absolument besoin de toi car ce lieu est inaccessible en transports en commun, là ton aide me ferait gagner du temps mais je peux me débrouiller tout seul, ici ça me ferait plaisir de faire telle activité avec toi, là, l'horaire est flexible, par contre aucun retard là-bas, etc. Elle m'a dit que ça lui permet de s'organiser et de ne pas culpabiliser de dire non, qui sont des objectifs de la CNV. De mon côté, ce n'est pas minimiser que de dire que la tolérance et l'attention de cette personne ainsi que sa manière de ne pas me brusquer donnent envie de bien se comporter.

    J'ai tendance à forcer les gens à faire ce que je veux, à imposer ma façon de faire et ma volonté. Du coup, ce genre de retour fait plaisir. Ce qui me fait penser qu'il faut jamais hésiter à faire de tels retours, même s'ils semblent insignifiants / banaux.

    Mais, il me reste encore beaucoup de chemin à parcourir. Je n'arrive toujours pas à pratiquer la CNV dans mon emploi ou alors auprès de rares collègues. C'est beaucoup plus difficile.

    • Les gens ne se comportent pas aussi bien que cette amie, ce qui ne donne pas forcément envie de lâcher prise.

    • De plus, ce qui se passe chez mon employeur me semble être plus impactant sur ma vie. Si mon amie me dit qu'on ne se voit pas à telle date, je suis contrarié, mais ça s'arrête là, je passe à autre chose. Chez mon employeur, les décisions prises et les actions effectuées auront des conséquences plus lourdes et au long court, ça ne s'arrête pas là. Ce n'est pas la même temporalité : je suis 7 heures par jour à la merci de mon employeur alors que je vois moins fréquemment mes ami⋅e⋅s, ce qui réduit la probabilité de subir quelque chose.

    • Enfin, dans le contexte professionnel (comme politicien), j'ai toujours eu une analyse "rapport de force" digne de la CGT : les décisions sont très rarement raisonnées, mais souvent émotives, précipitées, dépendantes de l'éloquence des uns et du niveau hiérarchique des autres, d'où le seul moyen d'influer sur cela est de créer un rapport de force ("on va faire comme j'ai dit car je suis en mesure de te nuire"). Ça n'aide pas à se détendre.
    Sun Nov 1 19:43:51 2020 - permalink -
    - http://shaarli.guiguishow.info/?Z56Y5A
  • Les ninjas de l'informatique ne peuvent pas tout

    Une amie souhaite migrer le contenu de son blog d'un logiciel à un autre. A priori, aucun mécanisme de migration est prévu. Elle migre donc à la main tout en grommelant, je cite « le monde est conçu pour les ninjas de l'ordinateur et je ne fais pas partie de cette caste ».

    Ma réponse ? Les ninjas de l'informatique (si toutefois ça existe…) ne peuvent pas tout. La compétence brute ne peut pas tout, elle est vaine, car limitée par l'environnement (temps, argent, etc.). Si un outil n'est pas prévu pour un usage, c'est perdu. Si un serveur de stockage n'a pas été conçu pour ton usage (CIFS sans domaine AD + NFS + …) et/ou pour tenir ta charge (nombre de lectures+écritures par seconde), c'est perdu. Si un pare-feu ne permet pas de consigner les infos réclamées par le chef, c'est perdu. Les exemples sont nombreux. T'as beau être un « ninja de l'informatique », ça va rien changer : l'écrasante majorité des personnes qui exercent dans l'informatique ne vont pas construire un serveur de stockage ou développer une passerelle entre deux CMS ou…, car cela est complexe et/ou chronophage. À l'impossible (qui varie en fonction du niveau de compétences de celui qui s'exprime), nul n'est tenu.

    En fait, les ingénieurs en informatique apprennent à détecter ce qui sera possible ou non, et donc, à exclure des solutions ou à contourner / filouter. Dans le cas présent, il ne suffit pas de trouver un CMS joli et pratique pour déclencher l'acte de migration. Un informaticien se posera forcément les questions suivantes : comment conserver les billets de blog existants, comment intégrer ce nouveau CMS au reste de mon système d'information (authentification, sauvegardes, etc.), et à quel coût (temps, moyens à mettre en œuvre, etc.) ? S'il faut développer un outil de migration sur mesure, peut-être qu'un autre CMS, moins convivial mais plus facilement intégrable, sera retenu. Renoncer à un coup de cœur afin d'éviter de perdre du temps, en somme.

    Au quotidien, je me sens nul. Quand je regarde mes collègues, nous savons très peu de choses, au final : nous savons détecter quand un truc ne sera pas possible et contourner l'obstacle, c'est tout. C'est précisément ce contournement, qui, ajouté à tous les autres, nous pourrira la vie dans le futur, mais on les empile, parce qu'on n'a pas le choix face à des besoins contradictoires. Il faudra le contourner à son tour ? C'est pareil dans les autres professions : médecins, ingénieur nucléaire, etc. : tout le monde croit savoir, très peu savent, beaucoup filoutent en ne répondant pas tout à fait à la question / besoin exprimé, mais ça fait illusion.

    C'est l'essence de l'organisation de nos sociétés : nous sommes des gestionnaires de projets, c'est-à-dire les merdes inutiles qui peuvent prétendument tout faire : aujourd'hui piloter l'achat d'un nouveau cœur de réseau en informatique, demain piloter la mise en œuvre de mesures sanitaires, après-demain piloter de l'événementiel. Quand on réfléchit "méta" / en gros / de manière macroscopique, tout ça fonctionne pareil : définir un besoin, mettre ce besoin en adéquation avec des moyens (humains, temps, etc.), choisir une solution et l'intégrer à l'existant, déléguer + cheffer, et détecter quand un truc ne sera pas possible / tenable afin de le contourner.

    Je n'approuve pas, je pense que c'est en partie pour ça que nos sociétés partent en couille et que les gens souffrent, mais c'est un fait.

    Point de ninja, donc.

    Sun Nov 1 18:55:16 2020 - permalink -
    - http://shaarli.guiguishow.info/?3G_cdw
  • Tout ça pour des chaussures… - GuiGui's Show

    Après 1 an et 1 mois d'utilisation quotidienne, mes chaussures commencent à prendre l'eau. Contrairement à mes chaussures précédentes qui se transformaient en piscine après un mois d'utilisation, seuls mes deux hallux (gros orteils) sont légèrement humides par forte pluie.

    Je vois aucun trou dans la semelle ni aucune couture altérée entre le nubuck et la semelle. Peut-être que l'eau entre par le dessus, par le tissu ? Peut-être que cela concerne mes deux gros orteils car, vu leur taille, ils touchent plus souvent le tissu du haut de la chaussure ? Peut-être que la chaussette absorbe l'eau lors de ces interactions ? Aucune idée. À plusieurs reprises, le dessus de mes chaussures ne me semblait pas être gorgé d'eau alors que mes hallux étaient déjà humides. ÉDIT DU 07/11/2020 : cette fois-ci, le sol était mouillé, mais il ne pleuvait plus. Un hallux humide. Cela semble confirmer la thèse d'une remontée depuis le sol en passant par la semelle. FIN DE L'ÉDIT.

    J'ai utilisé de l'imperméabilisant que l'on m'a donné. On verra bien. Oui, je sais que cela s'utilise sur des chaussures neuves, mais je voulais mesurer l'usure de mes chaussures afin de vérifier que leur achat était rentable, c'est tout l'objet du shaarli pointé par celui-ci.

    Sun Nov 1 18:00:24 2020 - permalink -
    - http://shaarli.guiguishow.info/?XiDFnQ
  • Le bullshit de l'habilitation électrique

    Résumé : habilitation électrique = morceau de papier valable 3 ans (il faut suivre un « recyclage » avant ce délai) délivré par un employeur (tu changes d'employeur = tu la perds) après une formation bidon (dont la qualité varie amplement en fonction de l'organisme formateur) qui dédouane ton employeur d'une partie de ses responsabilités quand tu branches des appareils électriques et ré-arme un disjoncteur sur ton temps de travail. Fabuleux, non ?



    Ha, il faut que je t'expose le grand n'importe quoi que constitue l'habilitation électrique. Tu vas voir, le niveau de connerie est cosmique. Ça fait trois ans que je l'ai passé, et un an qu'on m'a proposé de la passer à nouveau (changement d'employeur), mais j'en garde un vif souvenir.

    J'exerce l'activité salariée d'administrateur de systèmes et de réseaux informatiques. Il m'arrive donc de me faire livrer des ordinateurs, de les ranger dans un endroit approprié (une armoire de rangement dans une salle machines), et de les raccorder, entre autres, à l'électricité. Prise murale, 230 V, 50 Hz, tout comme à la maison. J'insère parfois des composants dans des ordinateurs. Il m'arrive aussi de devoir ré-armer des disjoncteurs. Je fais rien de plus. Je n'installe / interviens pas sur les circuits électriques de mon employeur. Rien.

    À la maison, j'ai le droit de brancher des appareils au courant, y compris des ordinateurs, et de ré-armer des disjoncteurs. Pas au taff. Il me faut une habilitation électrique. Sans elle, un chef ne peut pas m'ordonner de toucher des bidules électriques sans engager sa responsabilité.

    Avant d'obtenir cette habilitation, il faut suivre une formation de deux jours. Le contenu de ma formation était FOR-MI-DA-BLE :

    • Notre formateur nous a montré des vidéos YouTube montrant des accidents électriques genre un Indien qui touche une caténaire TGV… Ha ouais, l'électricité, ça tue, quelle surprise !

    • Il nous a exposé toutes les mesures de sécurité bidons comme être seul dans les xx centimètres / mètres autour du point électrique d'intervention. C'est noté : au moindre problème électrique, je mesurerai, t'inquiète :- ;

    • Il nous expliquera que le meilleur moyen de se déplacer autour d'une ligne très haute tension tombée sur un sol terreux, c'est à cloche-pieds (l'électricité se déplace par cercles concentriques et c'est la différence de potentiel électrique qui compte, d'où il faut garder ses pieds serrés). Super, je me trouve très souvent dans une telle situation sur mon lieu de taff ! ;

    • En revanche, expliquer que l'on ne ré-arme pas un disjoncteur sans vérifier au préalable l'absence d'humains dans le périmètre que ce disjoncteur alimente en électricité (au cas où il ai sauté car un humain était en danger de mort) ? Non. Expliquer qu'il vaut mieux avoir le bras tendu et détourner le regard lorsqu'on ré-arme un disjoncteur (au cas où il flashe / pète à la gueule) ? Non. Expliquer qu'on ne ré-arme pas plusieurs fois de suite un même disjoncteur qui saute à peine il est réarmé (car il y a forcément un problème sur le circuit) ? Non. Nous apprendre les gestes automatiques à avoir en cas de danger électrique ? Non. L'important, c'est d'être seul dans les xx centimètres autour du tableau électrique :)))) Un collègue m'a dit avoir appris les points précédents lors de son habilitation électrique, donc on peut, a minima, relever une grande variation de la qualité des formations ;

    • À la fin, le formateur nous a remis un guide pratique résumant son blabla. Merci de m'avoir fait perdre deux jours de ma vie à t'écouter jacter alors que j'aurais pu lire ta brochure ! ;

    • Le plus beau, c'est quand tu obtiens deux réponses différentes à une même question de la part de deux formateurs. À la question « comment font les oiseaux pour se poser sur les lignes basse et moyenne tension ? », l'un répond que c'est le faible écart entre leurs pattes qui le leur permet, l'autre que c'est leur petite taille qui le leur permet. Si c'est pour avoir la même absence de qualité dans la réponse que ce que je peux trouver sur le web (voir ici, là et là-bas), merci bien ! Les plus pragmatiques réagiront "non mais c'est normal de ne pas savoir répondre à une question inutile posée juste pour faire chier". C'pas moi qui ait parlé le premier des lignes à haute / très haute tension que je rencontrerai jamais dans mon taff, hein…

    Bref, formation inutile. Comme tant de formations, ceci dit (coucou la formation aux méthodes agiles qui reprenait les illustrations que l'on trouve dans tout livre et dans tout cours à la fac… Plus de trois ans après, je me rappelle mon envie de me trancher les veines d'ennui durant cette formation).

    Le mieux reste à venir. L'habilitation est une auto-certification. C'est l'employeur qui habilite son employé à toucher des bidules électriques. Comme il le fait sur validation d'un formateur, il n'engage plus sa responsabilité. Conséquence : tu perds ton habilitation quand tu changes d'employeur. Génial ! Argent facile pour les formateurs.

    T'en veux encore ? L'habilitation électrique a une durée de validité. La préconisation est de suivre un « recyclage » (rappel durant un jour de """"formation"""") tous les trois ans. Au-delà, l'habilitation n'est pas caduque en elle-même, mais, comme d'hab, l'employeur engage sa responsabilité, et l'employé devra subir à nouveau les deux jours complets de formation. Argent facile pour les formateurs, bis.

    Évidemment, il y a plusieurs niveaux de certification en fonction de la tension et de la nature des tâches. Si tu ne crées pas de la complexité inutile, tu ne vends pas de la formation. :)

    Bref, bienvenue dans l'univers des gens RES-PON-SA-BLES… qui se défaussent de leurs responsabilités les uns sur les autres. Comme d'hab, ça permet à des gens de jouir dans leur délire paperassier, à d'autres d'encaisser, à d'autres d'avoir un emploi, et à d'autres de subir.

    Bullshit over bullshit for more bullshitness.

    P.-S. : j'ai rien contre le fait de former aux risques électriques, de développer des automatismes permettant de réagir à un danger électrique, etc., mais ce n'est clairement pas le sujet de l'habilitation électrique qui apprend plutôt la paperasse (se tenir seul à xx cm du tableau électrique, hein !), le dédouanement et la couardise. D'autant qu'elle est obligatoire au travail pour des tâches que tu effectues sans problème chez toi sur des circuits identiques (230 V, 10-20 A, 50 Hz)… On pourrait au moins faire sauter ce premier niveau d'habilitation pour les tâches basiques.

    Sun Nov 1 17:30:24 2020 - permalink -
    - http://shaarli.guiguishow.info/?NF3qcA
  • Privacy Badger Is Changing to Protect You Better | Electronic Frontier Foundation

    Résumé : la détection en local des traqueurs et autres menaces est désactivée par défaut dans Privacy Badger depuis début octobre 2020. Seul un apprentissage mutualisé des menaces perdure. La liste des traqueurs identifiés par cet apprentissage est publique.

    Brivacy Badger est une extension Firefox qui bloque les traqueurs sans utiliser une quelconque liste de filtrage mais en détectant les traqueurs grâce à leurs comportements caractéristiques. Cette détection se fait en local, par chaque Privacy Badger installé. L'objectif est : réactivité face aux nouvelles menaces + résistance à la censure.

    L'équipe sécurité de Google a signalé plusieurs problèmes à l'EFF (qui maintient cette extension) dont : 1) un attaquant peut voir que tel site est bloqué par tel Privacy Badger et donc suivre un utilisateur de Privacy Badger entre plusieurs sites web ; 2) un attaquant peut faire bloquer un site web par un Privacy Badger.

    En conséquence, depuis le début du mois d'octobre 2020, la détection locale des traqueurs est désactivée par défaut (on peut la réactiver en cochant « Apprendre à bloquer de nouveaux traceurs en naviguant » dans l'onglet « Réglages généraux » des préférences). Par défaut, cette détection des traqueurs est désormais conduite uniquement par un script lancé quotidiennement par l'EFF. Ainsi, tous les Privacy badger utilisent une même "liste de filtrage". Cette "liste de blocage" de Privacy Badger est librement consultable. Les détails de fonctionnement sont exposés ici.

    Mon avis ? D'un côté, l'apprentissage effectué par le script de l'EFF est très centré sur les grands sites web états-uniens (c'est mentionné dans l'annonce de l'EFF), ce qui fait que les autres utilisateurs sont peu protégés. De l'autre, les attaques à mener pour tromper me semblent complexes à mettre en œuvre. Ainsi, en ce qui me concerne, considérant que le gain dépasse le risque, j'ai ré-activé la détection locale des menaces par Privacy Badger.

    Sun Nov 1 15:34:57 2020 - permalink -
    - https://www.eff.org/deeplinks/2020/10/privacy-badger-changing-protect-you-better
  • Retour sur Bref.

    En 2011/2012, la série télévisée Bref. était diffusée sur Canal+ et l'expression était sur toutes les lèvres.

    Je n'avais pas accroché : série pour djeunz (fallait donc que ça parle de cul, encore et encore), personnage superficiel, etc.

    Récemment, j'ai re-regardé cette série, et des épisodes m'ont particulièrement touchés. Ils contiennent une leçon de vie. Je veux partager ça.

    Comme les sous-titres automatiques de Youtube sont toujours aussi médiocres, je transcris les paroles ici afin que ces épisodes soient accessibles au plus grand nombre.


    J'ai fait une dépression

    Copie de l'épisode.

    Superbe métaphore filée de la déprime.


    (Voix off) Bref, j'étais au cinéma avec des potes. On a bien rigolé. Je suis rentré chez moi, j'ai mis la mauvaise clé dans la porte, j'ai pleuré. Je me suis dit que j'étais fatigué. Je me suis couché. J'ai re-pleuré. Je me suis dit que ça passerait avec la nuit. Je me suis réveillé, j'ai re-re-pleuré. Les gens m'ont dit :
    ‒ Tu fais une dépression
    (Voix off) Je me suis dit que non, que je devais être fatigué parce que c'était l'hiver et que ça faisait trois semaines que j'étais resté enfermé chez moi à rien faire parce que la vie c'était de la merde parce que, dans la vie, au début, on né, à la fin on meurt, et entre les deux il se passe rien. J'étais en dépression.
    (Voix off) La vie, c'est comme un ascenseur. Quand ça va bien, il monte, quand ça va mal, il descend, et la dépression, c'est quand tu restes coincé au sous-sol et que quand t'essayes d'appeler le dépanneur, tu te rends compte que le dépanneur, c'est toi. Au sous-sol, il y a tous les trucs que t'as enfouis et que t'as pas envie d'affronter.
    (Voix off) Alors, j'ai fait ce que n'importe qui aurait fait : j'ai joué à la console. Un jour. Deux semaines. Trois mois. Et, une nuit, les plombs ont sauté. Je suis allé chercher des bougies. Les seules que j'avais, c'était celle de la fille dont j'étais amoureux, Marla. Je suis tombé sur un mot qu'elle m'avait écrit un jour en disant :
    (Marla) ‒ Tiens
    (Voix off) ‒ C'est quoi ?
    (Marla) ‒ Tu le lis que si un jour t'es vraiment pas bien, OK ?
    (Voix off) ‒ OK
    (Voix off) J'étais vraiment pas bien, alors je l'ai lu. J'ai décidé de reprendre le contrôle de ma vie et nettoyer mon sous-sol.
    (Voix off) Le premier stade, c'était le stade de mon enfance. J'étais tout petit, je me suis battu contre les meufs qui voulaient pas être mon amoureuse. Je me suis battu contre des mecs qui voulaient pas être mes copains. Et tous les adultes qui avaient raison parce que j'avais tort. Le boss, c'était mes parents. Je les ai défoncés. Je suis devenu adulte.
    (Voix off) Le stade 2, j'étais adulte, j'étais tout seul, j'avais la pression. Je me suis battu pour avoir un travail. Je me suis battu pour avoir une meuf. Je me suis battu pour être heureux, pour pas avoir peur de la mort, pour avoir un travail, pour avoir une meuf, pour être heureux, pour pas avoir peur de la mort, je tournais en rond. Je me suis rendu compte que la solution, c'est de buter le mec qui criait « fight ». Je l'ai buté.
    (Voix off) Je suis arrivé dans la salle du boss final. Y'avait tous mes potes autour. J'étais face à mon double. J'ai essayé de le frapper, mais, à chaque fois, il me tapait deux fois plus. J'ai arrêté de le taper, il a arrêté de me taper, j'ai avancé vers lui, il a avancé vers moi, j'avançais vers lui, il avançait vers moi. J'avançais vers moi. On avait gagné.
    (Voix off) J'ai repris l'ascenseur. C'est celui de ma vie. Bref, j'ai fait une dépression.
    (Pote) ‒ Y'a quoi d'écrit sur le mot, alors ?
    (Voix off) ‒ C'est pas c'qu'est écrit qu'est important. [ c'est le rappel que t'as compté pour quelqu'un ]


    On était des gamins

    Copie de l'épisode.

    Excellent rappel que les pires choses arrivent quand les humains se prennent trop au sérieux au motif qu'ils seraient adultes alors qu'il se comportent mal, font des erreurs, comettent des fautes, etc. tout pareil que des enfants. C'est d'ailleurs l'un des arguments de Catherine Baker dans son livre qui plaide pour l'abolition de l'école et de la différence enfant/adulte. Il ne faut pas cesser d'être un gamin, jamais.


    (Voix off) Bref, la première fois que j'ai vraiment été en couple, c'était avec mon ex. Un jour, elle m'a dit :
    (L'Ex) ‒ Tu fais quoi ce soir ?
    (Voix off) J'ai dit : ‒ rien.
    (Voix off) Elle m'a dit : ‒ moi non plus.
    (Voix off) J'ai dit : ‒ on le fait ensemble ?
    (Voix off) Elle m'a dit : ‒ OK.
    (Voix off) Voilà : être en couple, pour moi, c'est pas se marier, emménager ensemble, ou changer de statut Facebook. C'est décider que quand on a rien à faire, on le fait à deux.
    (Voix off) La première fois qu'on a rien fait ensemble, on a rien fait. Mais c'était bien, parce qu'on était amoureux. Les dix fois suivantes on s'est avoué des trucs :
    (Voix off) ‒ En fait, dans ma tête, des fois, y'a une voix qui…
    (Voix off) La onzième fois, on a rigolé. Et puis, un jour :
    (Voix off) ‒ Viens, on fait une cabane [ avec des draps ].
    (L'Ex) Ouiiii
    (Voix off) On a fait les gamins.
    (Voix off) Bonjour madame, c'est très beau, chez vous.
    (L'Ex) ‒ C'est pas chez moi, c'est chez l'ours.
    (Voix off) ‒ Chuuut
    (Voix off) Quand t'es en couple, tu retombes en enfance. On passait nos journées à jouer. On jouait avec la nourriture.
    (L'Ex) ‒ Je vais appeler l'ours !
    (Voix off) On regardait des films qui font peur en mangeant des bonbons. On jouait à chat. À la barbichette. Et à n'importe quoi.
    Le téléphone sonne
    (L'Ex) ‒ Attends. Décroche. Allo, oui ? Oui bah j'arriverai à 8 h lundi, c'est pas très grave. Se retourne vers la voix off qui l'embête MAIS ARRÊTEEEE ! Oui, voilà, au revoir. Raccroche Tu m'as embêté, j'vais appeler l'ours !
    (Voix off) C'était les meilleurs moments. Et puis, un jour, on a trop fait les adultes.
    (L'Ex) […] Putain mais grandit, quoi !
    (Voix off) Tu sais quoi, je t'ai jamais aimé ! … … … … Attends, c'est pas ce que je voulais dire.
    Séparation, avec les deux enfants intérieurs qui regrettent la décision des """"adultes"""".
    (Voix off) Bref, on était des gamins.
    (Fille) voix off lui met de la purée sur le nez ‒ Putain, mais t'es con ! Un vrai gamin, ma foi, putain !
    (Enfant intérieur de voix off) ‒ Je l'aime pas trop, elle.


    Mon père veut être jeune

    Copie de l'épisode.

    Une belle définition de l'amour. Un collègue m'a exposé que ça représente également bien les couples qui se sont séparés mais qui s'aiment toujours, car, en général, la rupture est liée au quotidien, à l'organisation quotidienne de la vie commune devenue impossible ("t'as encore oublié d'aller faire les cours !", "t'as pas fait la vaisselle", etc.), pas à un manque d'amour. Ainsi, des ex-couples se retrouvent pour revivre les émotions d'antant, pile ce qu'illustre cet épisode.


    (Voix off) Bref, à partir du jour où mon père a quitté ma mère, il a tout fait pour être jeune. Il mettait des slims, des baskets, et même des slims avec des baskets. Il faut comme s'il aimait les groupes dont il n'arrivait pas à prononcer le nom […]. Il s'était créé un compte Facebook, avait ajouté mes copines en amies et les draguait dans Farmville. Il avait un iPad qu'il utilisait à 1 % de ses capacités […]. Quand je suis venu vivre che lui, c'est devenu invivable. Dès que je m'absentais, il téléchargeait des virus, porno.exe, bigboobs.exe, blowjob.exe, et il niait en bloc […]. Quand je partais, il me disait « tu vas en discothèque ? ». Quand je revenais, il me disait « alors, t'étais en discothèque ? ». Il essayait d'utiliser des expressions de jeunes, mais il n'y arrivait pas […]. Il draguait à l'ancienne. Il faisait du charme aux serveuses dans les p'tits restaurants. Il faisait son regard « je suis un homme, et j'ai une voiture ». Il laissait des pourboires. Parfois, ça payait, mais ça lui coûtait cher […].
    (Voix off) Un jour, j'lui ai demandé un service. Il m'a dit qu'il avait un truc plus important à faire. Ça puait le mensonge. À tous les coups, il allait voir une meuf. Du coup, j'ai regardé dans l'historique. Il avait réservé une chambre d'hôtel pour deux en plein après-midi. Ça m'a énervé. Je l'ai attendu [ à l'hôtel ]. Il est arrivé. je suis allé le voir. J'ai dit : ‒ c'est ça ton truc important ?!
    (Père) ‒ Mais qu'est-ce que tu fous là ?!
    (Voix off) On s'est engueulé. Un moment, j'ai dit : ‒ t'as quitté maman pour des petites jeunes qui en veulent qu'à ton argent.
    (Père) ‒ Mais ça n'a rien à voir avec le fric !
    (Voix off) Le réceptionniste a dit : ‒ votre chambre habituelle, monsieur ?
    (Voix off) ‒ Tu sais que maman t'aimes toujours ?
    (Père) ‒ Mais moi aussi, petit con ! Quand j'ai rencontré ta mère, on a couru sous la pluie. Je lui ai offert des trucs de merde qui avaient plus de valeur que ce que j'ai pu lui offrir avec de l'argent. On allait nulle part en chantant à tue-tête dans ma vieille voiture cabossées. Une fois, j'ai écrit « je t'aime » par terre tous les 3 mètres, de chez elle à son arrêt de bus, comme ça, pour qu'elle sourie un matin. J'ai des centaines de souvenirs avec elle. Alors arrête de me juger ! La fille qui m'attend là-haut, c'est ça mon truc important. Mon truc important, c'est de retrouver ça.
    (Voix off) J'ai rien dit. Je l'ai regardé. Il m'a regardé. J'ai baissé les yeux. Il est parti. […]
    On entrevoit la mère dans la chambre d'hôtel.


    Je suis en couple

    Copie de l'épisode.

    Illustration du dilemme "couple amoureux versus liberté individuelle". Chacun à ses avantages et inconvénients. Dommage que cet épisode n'illustre pas assez la nécessité de pratiquer le "1 + 1 = 3" plutôt que le "1 + 1 = 2" : il y a la vie de couple, mais aussi les deux individus qui ne doivent pas fusionner, qui doivent rester des identités distinctes avec des activités distinctes qui devront composer avec l'identité commune "le couple" afin que l'amour et la liberté individuelle perdurent.


    (Liberté) ‒ Viens, on va draguer des filles. On n'a qu'à acheter des Transformers. Ou alors, on se balade juste pour se balader. Ho, non, viens, on mate les trois Retour vers le futur en slip.
    (Voix off) Bref, lui, c'est ma liberté. Quand je suis célibataire, il traîne tout le temps avec moi.
    (Pote) ‒ Venez les mecs, on s'en bat les couilles, on part à la mer !
    (Liberté) ‒ Wouhoouu !
    (Voix off) Quand je suis bourré, il me dit : « Bois ! ». « Plus ! ». « Vomit où tu veux ! ». Après, il me dit : « Hé, tu devrais dire à tous ces gens que tu les aimes, et montre ton cul après ».
    (Voix off) On s'voit le soir, car, la journée, mon patron essaye de le tuer.
    (Patron) Y'a ça à faire avant demain matin.
    (Voix off) Et le pire, c'est quand je me pose avec une fille. Au début, on est bien tous les trois. Et puis petit à petit…
    (Fille) ‒ T'as pas fait la vaisselle ?!
    (Voix off) … il s'éloigne…
    (Fille) ‒ Tu pourras virer tes trucs périmés là ?
    (Voix off) … beaucoup…
    (Fille) ‒ Ha, au fait, ce week-end, on va chez mes parents
    (Voix off) … beaucoup trop. Et puis un jour…
    (Pote) ‒ Hé, venez les mecs, on s'en bat les couilles, on part à la mer !
    (Fille) ‒ Ho non, j'ai pas pris mon produit à lentilles.
    (Voix off) … il disparaît. Du coup, elle le remplace. Des fois, c'est chiant…
    (Fille) ‒ Non, bois pas,
    (Voix off) … les deux sont enlacés des fois, c'est cool, des fois, je le retrouve sur Internet regarde un site porno, et des fois, il demande à mes potes de m'apeller
    (Voix off) ‒ Non, ça ne me dit pas trop, là, désolé les gars. Ouais, passez une bonne soirée, salut.
    (Fille) fellation - c'était qui ?
    (Voix off) ‒ T'inquiète.
    (Voix off) Mais… je ne suis pas libre. Bref, j'suis en couple.
    (Voix off) au téléphone Ouais ma chérie, ouais, ouais non mais profite si t'es avec tes copines, tu es libre, j't'embrasse.
    (Voix off et Liberté) jouant aux Transformers

    Sun Nov 1 13:47:49 2020 - permalink -
    - http://shaarli.guiguishow.info/?PF6MnQ
Links per page: 20 50 100
◄Older
page 62 / 279
Newer►
Mentions légales identiques à celles de mon blog | CC BY-SA 3.0

Shaarli - The personal, minimalist, super-fast, database free, bookmarking service by the Shaarli community