Hello les amis !
J’aime bien mes petites habitudes et j’ai horreur des débats triviaux qui durent mille ans, surtout quand j’ai faim !

Du coup, quand c’est l’heure de manger et qu’on met 30 minutes à choisir où aller, c’est long, et ça nous fait arriver tard au restau, donc on est servis tard.
Et moi, ça me rend chafoin. Plutôt que de bouder dans mon coin, j’ai commencé à organiser un peu le truc et à faire un message simple avec une liste de restaus avec des emojis. Ça permet de résoudre le problème démocratiquement, en votant et en organisant efficacement le départ au restau. Je maintiens la liste manuellement. Au fur et à mesure des demandes, la liste s’enrichit, mais très vite, méga flemme de copier-coller le message.

Mon idée, c’était d’en faire un webhook et de lancer ça dans un cron GitLab CI. C’était simple et participatif : tout le monde peut éditer le code et changer la liste.
Le truc se lance tout seul, du lundi au vendredi, et voilà. Finalement, pas de runner GitLab dispo, la flemme d’en configurer un. Et puis en termes de flexibilité, c’est bof. Qu’est-ce qui se passe si j’ai pas envie de lancer le cron aujourd’hui ?
C’est les vacances, on va continuer à bombarder le chat ?

Du coup, vous ne l’avez pas demandé, mais tel un horloger suisse, j’ai ajouté des complications, mais qui répondent à mon besoin !

Je boude dans un coin , pendant que les collègues discute de oû on mange, avec un message “mais, moi j’ai faim”

Fait pas le cron, t’as une femme et des enfants !

Mettre un cron qui se déclenche tous les jours ouvrés à 11h05, on fait comme ça.

1
5 11 * * 1-5 /opt/ratatouille/send_message.sh | logger

11h05 les jours 1 à 5 (du lundi au vendredi).

Le | logger permet de collecter les logs dans journalctl proprement (les cronjobs, ça n’aime pas trop les écritures sur stdout/stderr).

Donc oui, ça pourrait s’arrêter là, mais qu’est-ce qui se passe si je ne veux pas déclencher le cron aujourd’hui ?

Je lance ça sur ma machine de dev, je pourrais activer/désactiver le cron au gré des besoins, mais est-ce que j’ai envie de traîner une charge mentale pour ça ? NON.

Alors j’ai eu une idée : et si je faisais un cronjob semi-automatique ? :)

le réveil Baffe de Simone Giertz (réveil couplé à une main qui tourne pour mettre des baffes)

Un cron semi-automatique, c’est comme un cron, mais avec une confirmation manuelle

Si je lance mon shell, je veux un message qui me demande si oui ou non je veux lancer mon cron aujourd’hui, et en fonction de la réponse, l’envoi du message est lancé ou non.

Par quel prodige, me direz-vous ?

La technique la plus naze et low-tech qui soit : un script au démarrage de mon shell, lancé dans mon .bashrc, qui vérifie que le fichier existe.

Si mon fichier n’existe pas, on lance la question et on écrit la réponse dans un fichier ; si le fichier est présent, on skippe la question et le shell démarre normalement.

Maintenant c’est marrant, mais il reste un petit problème : comment je clean le fichier pour que le jour prochain j’aie quand même ma question.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

set -x

if [ -f "$(dirname "$0")/lancer_le_cron" ] && [ "$(cat $(dirname "$0")/lancer_le_cron)" == "oui" ]; then

    # phrase changeante tout les jours
    if [[ -f "$(dirname "$0")/phrase" ]]; then
      phrase=$(shuf -n 1 "$(dirname "$0")/phrase")
    fi

    # concatene la phrase random avec la liste des restau + emojis
    raw_content=$phrase\n$(cat $(dirname "$0")/restau)
    
    # convertir la chaine de caractère brut en json
    json_payload=$(jq -n --arg text "$raw_content" '{text: $text}')
  
  webhook_url="https://chat.googleapis.com/ .... "
    
    # Envoyer le message via curl
    curl -X POST "$webhook_url" \
         -H "Content-Type: application/json" \
         -d "$json_payload"
fi

Oui c’est dégueu, j’aurais pu variabiliser le chemin du fichier, mais nah.

bob l’éponge, déprimé, i don’t feel like it

Je pourrais faire un cron pour ça, mais y’a une complication

J’aurais pu faire un bête cron @reboot /bin/rm /opt/ratatouille/lancer_le_cron , au reboot de ma machine, vire-moi le fichier de réponse.
Mais comme je suis sur une machine avec un home directory chiffré, le cron s’exécute et foire avant que la partition soit déchiffrée.

Donc j’ai essayé de changer le comportement du service cron, mais en cherchant, j’ai trouvé plus débile.

En fait, je veux que le fichier soit supprimé quand je lance ma session utilisateur graphique.
Alors j’ai fait une directive .desktop qui supprime le fichier. C’est parfait, ouvrir et fermer un shell, je le fais 20 fois par jour. Ouvrir la session utilisateur, une fois par jour, deux max :)

1
2
3
4
5
6
7
8
9
cat ~/.config/autostart/.desktop                                   

[Desktop Entry]
Type=Application
Name=clean cron question
Exec=sh -c '/bin/rm -f /opt/ratatouille/lancer_le_cron 2>&1 | logger'
X-MATE-Autostart-enabled=true
NoDisplay=false
Terminal=false

Le seul truc un peu con, c’est que si j’éteins mon PC dans la journée, je me retape le message à nouveau. Mais je peux vivre avec.

carlin tourne la tête brusquement , avec des lunettes de soleil minecraft en incrustation et le label “deal with it”

Un dernier truc, mais c’est pour jouer là

Il ne vous a pas échappé que je n’ai pas encore montré mon script d’envoi.
Maintenant que j’ai un webhook, j’ai décidé de randomiser un peu plus le message pour faire comme si c’était Rémy de Ratatouille qui avait la grosse dalle.
Alors j’ai fait une liste de messages que Rémy pourrait dire, en plus du message avec la liste des restaus, et ça donne un truc comme ça.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

set -x

if [ -f "$(dirname "$0")/lancer_le_cron" ] && [ "$(cat $(dirname "$0")/lancer_le_cron)" == "oui" ]; then

    # phrase changeante tout les jours
    if [[ -f "$(dirname "$0")/phrase" ]]; then
      phrase=$(shuf -n 1 "$(dirname "$0")/phrase")
    fi

# EOF pour avoir un format de message composé et fixer les problèmes d'encodage json qui suivent
raw_content=$(cat <<EOF
$phrase

$(cat "$(dirname "$0")/restau")
EOF
)

    echo -e "$raw_content"
    json_payload=$(jq -n --arg text "$raw_content" '{text: $text}')
    webhook_url="https://chat.googleapis.com/v1/spaces/{oui mon webhook est en dur dans le code comme un gros sale}
    # Envoyer le message via curl
    curl -X POST "$webhook_url" \
         -H "Content-Type: application/json" \
         -d "$json_payload"
fi

Mon fichier phrase contient les phrases de Rémy (en réalité, y’en à bien plus que ça) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Bon, c’est pas que j’ai pas de projets, mais… qu’est-ce qu’on mijote, là ?
Okay, okay… assez parlé, il est temps de passer à table, non ?
J’suis peut-être un rat, mais j’ai un palais ! Alors, on mange quoi ?
La théorie c’est bien, mais la pratique… c’est quoi le menu ?
Bon, ça commence à sentir bon… mais qu’est-ce qu’on va déguster, exactement ?
Là, j’ai l’estomac qui fait la révolution. C’est quoi le plan bouffe ?
On peut parler cuisine toute la journée, mais moi j’veux goûter ! Qu’est-ce qu’on mange ?
Tout ça c’est bien joli, mais mon ventre réclame justice. Alors, le repas ?
L’odeur est prometteuse… mais j’vais pas survivre sans une bouchée !
Hey, j’suis pas difficile hein, mais… y a un plat qui mijote ou pas ?
Mon museau sent quelque chose… et mon ventre veut savoir c’est quoi !
J’peux faire des sauces, des réductions, des miracles… mais là j’veux juste manger.
On cuisine pas juste pour cuisiner, on cuisine pour manger !
Si c’est pas encore prêt, j’goûte quand même. Pour le contrôle qualité, bien sûr.
Un peu de fromage, un brin de pain… ou carrément un festin ? Dis-moi tout !
Même un rat a besoin d’un plan repas, tu vois ce que j’veux dire ?

Et voilà, c’est débile, overkill, et forcément indispensable !

capture du chatbot avec la liste des restaurants et la phrase du jour “On cause, on cause… mais c’est pas avec des mots qu’on fait une ratatouille.

Je pourrais faire un message avec un restaurant random chaque jour, mais par expérience, le choix est toujours contesté.

Stars Wars, ainsi s’éteint la démocratie, sous une pluie d’applaudissements