Coin web de Frédéric Péters

fpeters@0d.be

La journée de 8 heures et les mails pro

5 octobre 2023, 17:15

«â€ŻOn s'est battu pour la gagner on se battra pour la garder », comme un slogan de manif repris en refrain par les Vulves assassines, mais ici pour la journée de travail, et il y a plus d’un siècle.

J’ai toujours été mauvais à ça, j’ai mes mails perso et mails boulot qui arrivent au même endroit alors que d’expérience le seul truc qui marche vraiment pour me déconnecter est de totalement couper la réception des mails du serveur du boulot. Avec le temps j’étais passé d’une exécution directe de fetchmail à un contrôle via un script, et même si c’était à la base surtout pour avoir un affichage de contrôle, la structure permettait d’assez facilement éliminer un serveur, il suffisait en début de congés de commenter la ligne boulot,

tasks = (
#    asyncio.create_task(fetchmail(server='mail.boulot')),
    asyncio.create_task(fetchmail(server='mx.0d.be')),
)
await asyncio.gather(*tasks, return_exceptions=False)

Mais je n’avais pas la discipline de faire ça les weekends et autres jours pas travaillés, et encore moins de faire ça soir et matin. Il était temps de faire quelque chose là-dessus, et se donner des horaires, qui s’ils ne sont pas encore la journée de 8 heures, s’éloignent quand même nettement de la disponibilité permanente. Des horaires, donc, d’une manière très basique, des jours avec heure de début et heure de fin.

servers = {
    'mx.0d.be': {
    },
    'mail.boulot': {
        'schedule': {
            0: [(8, 0), (20, 0)],  # Monday, from 8 to 20
            1: [(8, 0), (20, 0)],
            2: [],  # Wednesday, full off
            3: [],
            4: [(8, 0), (20, 0)],
            5: [],
            6: []
        }
    }
}

Et le code sans aucune finesse pour interpréter ça,

def should_run(server):
    schedule = servers.get(server).get('schedule')
    if not schedule:
        return True  # always
    now = datetime.datetime.now()
    day_schedule = schedule[now.weekday()]
    if not day_schedule:
        return False
    if (now.hour, now.minute) < day_schedule[0]:
        return False
    if (now.hour, now.minute) >= day_schedule[1]:
        return False
    return True

Resterait ensuite de manière régulière à vérifier l’heure mais il n’y a pas non plus à être très fin ici, je passe juste par l’ajout d’une tâche qui toutes les dix minutes provoquera réévaluation des horaires, et redémarrage des processus fetchmail,

async def period():
    await asyncio.sleep(600)  # 10 minutes
    raise Restart()

Il y aurait dans une des nombreuses heures ainsi libérées à nettoyer le reste du script, pour en retirer des éléments qui auraient davantage leur place dans un fichier de configuration, mais comme ça n’est pas fait, je n’ai exceptionnellement pas de lien vers le dépôt avec le code.