Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/05/2011, à 20:07

Zakhar

[Avancé] Comment "trapper" le dialogue de "shutdown"

Description du besoin :
Il m'arrive d'être connecté en SSH sur le PC de ma mère (Oui, j'ai une mère moderne qui a 68 ans et qui est sur GNU/Linux !), or lorsqu'elle éteint le PC à ce moment là, cela interrompt les actions que je faisais : sauvegardes, installations, etc...
Ma mère, moderne qu'elle soit sous GNU/Linux, n'est tout de même pas une informaticienne, et n'a pas la compétence (ni l'envie) de taper une commande pour voir si quelqu'un est en session SSH ou pas au moment où elle éteint !..
Donc la cinématique souhaitée est la suivante :
-1) Clic sur le bouton de l'applet session (celui pour éteindre, par défaut tout en haut à droite)
-2) Choix de la ligne de menu "Eteindre"
-3) [TRAP] Là si aucun utilisateur n'est en SSH, on passe à l'item 7), sinon
-4) [TRAP] ... comme un utilisateur est connecté, on met une boite de dialogue l'indiquant et proposant le choix : éteindre réellement ou annuler (*).
-5) [TRAP] ... si on choisit Annuler, la fenêtre disparait, et on revient à son bureau, on peut continuer à travailler.
-6) [TRAP] ... si on choisit OK, on enchaine alors sur la fermeture "normale"
-7) Dialogue de confirmation d'extinction du PC
-8) Extinction

- (*) Nota: le troisième choix consiste à laisser la boite de dialogue sans y répondre. Dans ce cas, c'est l'utilisateur en session SSH qui éteindra le PC (il sera prévenu par un message sur sa console).

Les étapes marquées [TRAP] sont celles que je veux rajouter dans la cinématique.
Les autres étapes sont celles qui existent déjà et sont standard.
C'est un [TRAP] dans le sens où on peut encore choisir d'annuler l'action qu'on vient de demander (éteindre le PC) après avoir vu le message.


Investigations... so far
De nombreux post existent sur "comment je peux faire tourner un script" à la fermeture de session/extinction.
Ceux qui ont répondu proposent :
- des scripts dans le rcX.d
- un script dans le gdm post session (ou un nom de ce genre).

Mais dans les deux cas ça ne répond pas à la cinématique recherchée parce qu'on a alors plus choix de revenir dans la session, le processus d'extinction est lancé. Au pire on peut mettre un truc pour que le processus soit "suspendu" et que l'utilisateur en SSH puisse continuer, mais l'option de revenir en session n'est plus possible.

J'avais aussi trouvé un post ici d'une personne qui avait remplacé l'applet par une autre qui lançait un tel script.
Cette solution là ne me va pas non plus, car je ne veux pas modifier le comportement de l'applet, ni ses menus.

J'ai regardé la cinématique lorsqu'on éteint, voici ce qu'il se passe.

Le clic sur l'icone (en haut à droite) est associé à l'applet (bonobo) FastUserSwitch.
Lorsqu'on clique sur éteindre, redémarrer, fermer la session (donc les cas qui m'intéressent), l'applet passe la main au programme :
/usr/lib/indicator-session/gtk-logout-helper en lui donnant un paramètre correspondant à l'option choisie, comme on peut le voir dans le help de ce programme.

$ /usr/lib/indicator-session/gtk-logout-helper --help
Utilisation :
  gtk-logout-helper [OPTION...]  - logout of the current session

Options de l'aide :
  -h, --help               Affiche les options de l'aide
  --help-all               Affiche toutes les options de l'aide
  --help-gtk               Affiche les options GTK+

Options de l'application :
  -l, --logout             Log out of the current session
  -s, --shutdown           Switch off the entire system
  -r, --restart            Restart the system
  --display=AFFICHAGE      Affichage X à utiliser

Mon idée était donc simple (quoique pas totalement propre)
-1) Renommer gtk-logout-helper en gtk-logout-helper-save
-2) Créer un script qui fait les étapes [TRAP] ci-dessus, et qui chaine éventuellement sur gtk-logout-helper-save

Mais là... hic... visiblement l'applet ne sait lancer que de "vrais" exécutables, et pas des scripts.
Je présume que le exec qui a été mis dans l'applet est un des 3 execs qui a vraiment besoin d'un exécutable, et pas un des 2 qui permet aussi de lancer un script.
J'ai tâcher de trouver où était cet exec... mais en réalité je me suis arrêté à DBUS. Il semble (à vérifier) qu'en réalité les applets se reposent sur DBUS pour faire les actions comme lancer un exécutable. Et là j'ai pas poussé plus loin... je vais pas aller patcher DBUS !..

A ce point il me reste une solution :
- écrire un petit programme C qui lancera mon /usr/bin/bash mon_script_trap et que je nommerai gtk-logout-helper

C'est pas trop dur... mais bon, il y a certainement mieux.


Et donc la question :
avez-vous une meilleure idée que tout ce expliqué ci-dessus pour réaliser les fonctionnalités souhaitées ?

Dernière modification par Zakhar (Le 27/05/2011, à 20:14)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#2 Le 27/05/2011, à 23:06

GR

Re : [Avancé] Comment "trapper" le dialogue de "shutdown"

hello,

pourquoi pas virer ce bouton et le remplacer par un bouton, avec le meme dessin, et associé à un
shell script qui vérifie qu'il ný a pas de ssh en cours et qui réalise le shutdown dans ce cas (seulement) ?

A+

un de plus de soixante ans qui utilise GNU/Linux sur son PC big_smile

Hors ligne

#3 Le 28/05/2011, à 10:29

Zakhar

Re : [Avancé] Comment "trapper" le dialogue de "shutdown"

Oui pourquoi, c'est expliqué plus haut... mais sans doute un peu brièvement !

Si je remplace l'applet par un de mon crû, je vais devoir refaire le menu qui est prévu pour cet applet... et sauf à le reprogrammer entièrement, je n'arriverai pas à refaire exactement ce qui est fait.
Comme dit dans le message, j'avais vu passer cette solution (je ne retrouve plus le post) mais ça ne correspond pas exactement à ce que je veux faire, car mon idée est de garder le comportement exact du bouton tel qu'il est programmé dans "FastSwitchUser", mais simplement d'intercaler le test sur présence de session ssh avant le gtk-logout-helper.

C'est sûr que changer l'applet est une solution approchante... mais le menu par défaut présente 8 options :

  1. Verrouiller l'écran

  2. Session d'invité

  3. Changer d'utilisateur...

  4. Se déconnecter...

  5. Mettre en veiller

  6. Hiberner

  7. Redémarrer...

  8. Éteindre...

Or seulement les options terminant par ... (3, 4, 7, 8) sont gérées par gtk-logout-helper. Les 4 autres c'est autre chose, et je n'ai pas encore exploré comment l'applet fait ces fonctions là.
De plus, vu le code de l'applet (j'ai jeté un oeil), il semble composer le menu dynamiquement. Il est donc possible que ce menu "par défaut" ne soit pas toujours tout à fait pareil selon certains conditions (pas de compte invité, pas d'autre utilisateur, etc...)
Donc même si c'est approchant, reprogrammer toute cette logique est un peu hors de proportion, même par rapport à l'écriture d'un petit programme C qui va juste lancer un script. tongue

Dernière modification par Zakhar (Le 28/05/2011, à 10:50)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#4 Le 29/05/2011, à 20:20

GR

Re : [Avancé] Comment "trapper" le dialogue de "shutdown"

Bonjour,

Le plus serait de créer un nouveau bouton (supplémentaire) dans la barre du haut avec une icone appropriée et dire
à ta maman que c'est ce bouton qu'elle doit utiliser, dorénavent, pour éteindre l'ordinateur. Pour réaliser cela, il suffit
de faire un clic droit dans cette barre, cliquer sur "ajouter au pannel" (ou quelque chose d'approchant, mon interface ne
parle pas francais), dans la fenetre qui s'ouvre choisir "application définie par le user" et là, compléter le formulaire en donnant
comme commande le nom absolu du script qui vérifie qu'il n'y a pas de ssh en cours et qui réalise le shutdown. Avant de terminer
cliquer sur le stapontin à ressort pour choisir une icone pour le nouveau bouton.

Bonne  chance.

Hors ligne

#5 Le 30/05/2011, à 09:52

Zakhar

Re : [Avancé] Comment "trapper" le dialogue de "shutdown"

Certes, cette solution est plus "propre" dans la mesure où elle ne touche pas aux composants standard livrés par la version. Donc pas de risque qu'une mise à jour "casse tout" ou du moins fasse disparaitre les nouvelle fonctionnalités (trap).

Cependant, cette solution ne répond pas au besoin ! (que j'ai pris la peine de décrire).

C'est un peu comme si je disais : je veux des carottes rapées, et que tu proposais du choux rouge à la place. C'est très bon aussi, mais pas ce que je voulais avoir. wink

Et en réalité, effectivement, pour faire "propre", il faudrait que je fasse la chose suivante :
- Repartir du code source de l'applet "FastUSerSwitch".
- Le dupliquer en "MyFastUserSwitch"
- Patcher là où le code lance "gtk-logout-helper" pour lancer à la place "my-gtk-logout-helper" qui pourra donc chainer sur le programme d'origine inchangé au besoin.
- Remplacer le bouton standard par un bouton identique vers "MyFastUserSwitch"

... mais ça c'est pour faire dans le "raffinement". Dans un premier temps je vais me explorer ma solution "brutale". tongue

Dernière modification par Zakhar (Le 30/05/2011, à 09:53)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne