Tag: acpi

MythTV et l’extinction automatique pour une machine bureautique/frontend/backend

2 commentaires sur MythTV et l’extinction automatique pour une machine bureautique/frontend/backend

3 septembre 2010 at 22 h 03 minCategorie :PC Home Cinema

L’une des fonctions d’un Media Center, peut être la plus impressionnante à l’usage,  est sa faculté à se transformer en un puissant magnétoscope numérique.
Une fois bien configuré, mon chouchou MythTV est capable de renvoyer au vestiaire le fameux TiVo, qui est pourtant déjà une petite révolution dans l’usage et la consommation de programmes télévisuels. La consommation différée et massive, à l’origine difficile par l’usage de supports magnétiques volumineux et nombreux, a pris un tournant avec l’apport du numérique, sa facilité de stockage et l’usage ergonomique des outils intelligents qu’il propose.

Pour atteindre cet objectif de super-magnétoscope, il faut avoir bien configurer une option essentielle : l’allumage et l’exctinction automatique de la machine. D’une part pour ne rater aucun enregistrement pour cause de machine éteinte, et d’autre par pour ne pas voir sa facture d’électricité drastiquement augmenter. Bien que simple à énoncer,  cette fonction est très complexe à mettre en oeuvre. Et pourquoi donc? Premièrement, le PC n’a pas été pensé pour ça; et deuxièmement, le grand nombre d’installations possibles rend l’automatisation de la configuration très difficile à mettre en oeuvre. Choix a donc été fait de laisser l’utilisateur final se débrouiller pour faire monter la sauce de lui même. Il faut alors se retrousser les manches et ne pas avoir peur de scripter son installation.

Après cette longue introduction, j’en viens enfin à expliquer le double but de ce billet. D’une part pour faire ce qui n’est pas fait souvent dans les howto, à savoir expliquer ce qui se passe réellement derrière la scène (à l’instar de mon précédent billet sur LIRC). Et d’autre part pour couvrir un exemple pas vraiment explicité dans les différents tutos que j’ai pu trouver : la machine MythTV frontend+backend+desktop.

AVERTISSEMENT : Cet article, qui se veut un complément et non un tutorial aveugle, est donc à apprécier en parallèle de la lecture du howto de mythtv.org sur le sujet.

Allumage et extinction de MythTV, behind the scenes

Le réveil d’un PC à une heure précise se fait par l’utilisation d’une fonction ACPI présente dans la plupart des BIOS des machines vendues au grand public. Cette fonction est activable dans les menus de votre système au démarrage, et charge est ensuite à l’OS de prévoir une interface permettant l’accès en écriture à cette horloge. C’est heureusement le cas de GNU/Linux qui présente généralement le pseudo fichier /sys/class/rtc/rtc0/wakealarm pour cette tâche. Je n’irais pas plus loin, il y a déjà abondance de matière sur le sujet sur Internet.

Petit exercice de logique : le backend de MythTV, seul à être au courant de l’heure du prochain enregistrement, doit  être celui qui configure l’heure du réveil par l’utilisation de cette interface. Afin de ne pas écrire à tout bout de champ dans la petite mémoire de la carte mère, et risquer ainsi de la corrompre ou de l’user, cette écriture doit se faire logiquement à l’arrêt de la machine afin d’assurer son réveil. Ceci implique tout aussi logiquement que MythTV soit l’acteur principal de cet arrêt. Afin de déterminer qu’une machine peut être arrêtée, MythTV va donc utiliser un certain nombre de règles basiques :

  • Est ce que qu’un frontend est connecté ?
  • Est ce qu’un enregistrement est en cours?
  • Est ce qu’un enregistrement arrive très bientôt, et est-il trop tard pour faire un arrêt?

1- Backend seul

Si toutes les réponses à ces questions sont négatives, alors MythTV provoque un arrêt. Et avant d’éteindre la machine, MythTV va écrire dans la mémoire de l’alarme pour le réveil.  Les options (commande d’arrêt, commande d’écriture dans la mémoire, différentes variables temporelles) sont accessibles depuis la configuration du backend.

Si tout s’est bien passé,  vous ne raterez pas votre fantastique Théma « L’histoire des pâtes » sur Arte. Génial non? Pas si vite, ne partez pas !! Il subsiste de nombreux problèmes. Le problème d’une telle solution est son manque de souplesse, car elle ne s’applique que pour une machine faisant office de backend seul. Un exemple : ma mythbox, à la fois frontend et backend, est configurée pour lancer une session et un frontend automatiquement au démarrage. C’est indispensable à mon avis si son usage principal est de traîner sous votre TV et non pas dans un grenier. Comment en effet envisager un Media Center qui afficherait au démarrage une odieuse fenêtre de login ou un simple environnement de bureau?
Le problème d’un tel démarrage dirigé vers un frontend, c’est que la machine ne s’arrêtera  jamais, même à la fin de l’enregistrement, car un frontend sera toujours connecté.

2- Backend et frontend.

Bien sûr, les développeurs/utilisateurs de MythTV ont  pensé à çà, et ont créé MythWelcome. Nous voilà donc dans le cas d’une machine frontend + backend avec démarrage automatique de session et de frontend.
MythWelcome est un sympathique programme qui sera lancé à la place de votre frontend et déterminera que faire : si le démarrage semble être manuel (si aucun programme à enregistrer n’est visible dans la tranche horaire à venir), alors un frontend est lancé par dessus. Si le démarrage est automatique, MythWelcome reste le seul programme lancé, et comme il ne se connecte pas au backend, ce dernier éteindra la machine en se croyant tout seul.
Autre situation : le fontend est lancé par MythWelcome; à la fin de la session, on quitte MythTV; MythWelcome repasse alors au premier plan et l’extinction peut avoir lieu dès que le backend l’a décidé.
Comme MythWelcome possède d’autres atouts dans sa manche (plage horaire de réveil automatique, verrouillage empêchant l’extinction), les développeurs ont choisi de lui confier à lui et son partenaire « mythshutdown », plutôt qu’au backend, la logique de gestion de l’arrêt de la machine. Les options (commande d’arrêt, commande d’écriture), sont désormais du ressort de MythWelcome et configurables depuis son interface. Il est bien sur nécessaire de configurer le backend afin qu’il délègue sa gestion à MythWelcome. Ceci explique l’usage de la commande mythshutdown que l’on constate dans les différents tutos sur le sujet disponibles sur Internet : le backend délègue le contrôle à cet outil bien pratique qui utilise les paramètres de MythWelcome.

Une petite subtilité que j’ai apprise à mes dépends : La commande

Command to set Wakeup Time             : mythshutdown --setwakeup $time

est un piège. Elle n’écrit en fait pas dans l’heure de réveil du bios, seulement dans la base de données. C’est en effet la commande

Server halt command                    : mythshutdown --shutdown

qui s’occupe de l’écriture, ainsi que de l’arrêt de la machine. Le but de ce changement est de permettre à MythWelcome de prendre en compte les plages de réveil quotidienne que vous pouvez configurer.
C’est une différence de fonctionnement fondamentale avec la configuration « simple » de MythTV vu dans le paragraphe « backend seul ». Vous aurez besoin de cette information si vous avez un problème et chercher à debugger votre environnement.

Super ! Voilà donc le cas d’un frontend + backend couvert. Mais qu’en est-il des autres combinaisons impliquant un backend?

3- Le combo backend et desktop.

Celui ci est vicieux. On souhaite se servir de son PC pour autre chose qu’un « simple » enregistreur Media Center.
La seule difficulté est d’empêcher MythTV d’éteindre le PC lorsqu’aucun frontend n’est connecté. MythWelcome et sa fonction de lock peuvent être utilisés pour ça, mais ce serait un détournement de sa fonction, loin d’être ergonomique qui plus est : qui aimerait voir un écran bizarre d’enregistreur numérique se lancer à l’ouverture de sa session alors qu’il souhaite juste aller consulter ses mails? Non, la solution est encore une fois décrite sur le wiki de mythtv (rubrique desktop user). On fait un petit script détectant si un utilisateur est connecté au système. Si oui, alors MythTV n’a pas le droit d’éteindre la machine. Tout simple et évident. Dans cette configuration, c’est le setup de MythTV qui est responsable de la configuration de cet ensemble, aidé d’un script de pré-extinction contrôlant les utilisateurs connectés. Ceci implique aussi d’empêcher toute extinction manuelle du système (ou alors avec un script utilisant mythshutdown).  On veillera donc du coup  à autoriser uniquement les utilisateurs à se « déconnecter », probablement par la configuration de votre environnement de bureau.

Le véritable problème arrive, avec la dernière combinaison impliquant un backend. Et c’est sur ce point que je n’ai pas vraiment vu de tutos sur Internet.

Le triple combo backend-frontend-desktop

Voilà la situation : une machine enregistrant la télévision en arrière plan, servant principalement de frontend, mais pouvant aussi dépanner pour n’importe quel tâche habituellement dévolue à la bureautique (photos, mail, vidéos de lolcat sur internet).

Dans cette configuration, voici le cahier des charges :

  • Allumage automatique sur le frontend
  • Pas d’extinction automatique si en cours d’usage bureautique
  • Allumage automatique pour un enregistrement
  • Extinction automatique après un enregistrement suite à un allumage automatique

Le point 1 et 4 implique l’utilisation de MythWelcome.
Le point 2 implique l’utilisation du script de détection d’utilisateur connecté.
Problème : si une session est lancée au démarrage, accompagnée de MythWelcome, alors le script de détection d’utilisateur connecté empêchera toujours MythTV d’éteindre la machine, ce qui ne respecte pas le point numéro 4.

Une solution sous entendue par les tutos du site MythTV, mais jamais énoncée directement, est d’utiliser la fonction de lock offerte par MythWelcome. En verrouillant l’arrêt, on se prémunit du problème et on peut alors utiliser son PC de façon bureautique. Le problème est qu’il faut ensuite enlever ce verrou, soit en lançant de nouveau MythWelcome, soit par une ligne de commande, raccourci, ou touche de télécommande configurée de façon adéquate. On a vu mieux au niveau ergonomie.
Lorsque j’ai configuré une telle machine pour mon environnement familial, j’avais des besoins très clairs : aucune contrainte superflue. Le verrou de MythWelcome dans cette situation d’usage bureautique en était clairement une. MythWelcome doit se faire complètement oublier. Si je veux cliquer sur le menu K et demander l’arrêt de l’ordinateur, je veux pouvoir le faire sans penser à déverrouiller l’extinction automatique qui doit avoir lieu.

La solution à mon problème est une petite modification toute bête du script de détection de l’utilisateur :

# Check to see if anyone is currently logged in. Return zero if not and 1 if so.
# Echoed text appears in log file. It can be removed and --quiet added to the
# grep command once you are satisfied that mythTV is working properly
result=1
#
if
    mythshutdown --check
then
    echo mythshutdown ok to shut
    result=0
else
    result=1
    echo mythshutdown not ok to shut
    echo result : $result
exit $result
fi
#
if
    w | grep -v grep | grep " 0 user"
then
    echo `date` " No one is logged in, ok to shut down." #>> /home/mythtv/.mythtv/extinction.log
    result=0
else
    echo `date` " Someone is still logged in, do not shut down?" #>> /home/mythtv/.mythtv/extinction.log
    if
        ps -edf | grep mythwelcome | grep -v grep
    then
        echo `date` " Mythwelcome is launched, so its ok to shut" #>> /home/mythtv/.mythtv/extinction.log
        result=0
    else
        echo `date` " No mythwelcome, no shutdown" #>> /home/mythtv/.mythtv/extinction.log
        result=1
    fi
fi
#
echo result : $result
exit $result

Ce script est à lancer en prérequis de tout arrêt. C’est à dire qu’il faut le placer à « Pre Shutdown check-command » dans la configuration de MythTV, à la place du « mythshutdown –check » mentionné pour la mise en place de MythWelcome. C’est d’ailleurs pour cette raison que la première tache de ce script est d’appeler « mythshutdown –check » pour effectuer les vérifications qui lui sont liées.

Ce script vérifie si un utilisateur est connecté. Si non, alors l’arrêt est autorisé (c’est par exemple le cas d’un utilisateur qui s’est déconnecté de la session). Si oui, alors il vérifie si MythWelcome est lancé. Si MythWelcome n’est pas lancé, alors c’est qu’on est en train de faire un usage bureautique de sa machine et qu’il ne faut pas s’éteindre. Mais si MythWelcome est lancé, alors nous avons là une exception à la règle interdisant l’arrêt si un utilisateur est connecté, et il est donc possible d’éteindre la machine.  Ce script étant lancé par le backend MythTV après ses propres vérifications (frontend lancé?), on ne risque pas d’interrompre une session de visualisation malgré le fait que MythWelcome soit toujours lancé lorsqu’on utilise le frontend. Vous m’avez suivi j’espère?

Bonus : Déconnexion par la touche d’une télécommande

Dans ce cadre, j’ai eu à rechercher comment déconnecter l’utilisateur par l’action d’une touche de la télécommande (toujours dans l’optique de s’affranchir au maximum des contraintes du retour à MythWelcome). Voici la commande magique valable pour KDE 4:

/usr/bin/qdbus org.kde.ksmserver /KSMServer logout 0 2 0

Il est ensuite facile de combiner cette commande avec LIRC et irexec pour qu’une touche lance le processus « sûr » d’arrêt de votre machine. Vous pouvez aussi utiliser mythshutdown à la place pour que l’arrêt soit direct plutôt que temporisé.

Pre Shutdown check-command