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 01/09/2015, à 09:22

slash-z

[qdbus] être à l'écoute et intercepter les signaux en shell

Salut,

Je débute dans l'utilisation de qdbus.

Ce que je voudrais faire: écouter tout ce qui se passe concernant les activités (en particulier certains signaux: ActivityStopped, ActivityStarted)

Ce que j'arrive à faire actuellement:
- j'arrive à requêter au coup par coup le service qui m'intéresse au travers des différentes méthodes disponibles de cette façon, exemple simple:

qdbus org.kde.ActivityManager /ActivityManager/Activities ListActivities

OK, jusque là ça va. Dans un script, je peux imaginer d'envoyer des requêtes régulièrement pour surveiller ce qui se passe.
Mais ce n'est pas l'idéal, j'envoie plein de requêtes parfaitement inutiles en procédant de cette façon.

Ce que je voudrais faire: rester connecté en permanence de façon à intercepter les signaux qui m'intéressent et réagir en conséquence.
J'ai fouillé sur le net pas mal (je suis peut-être passé sans le voir d'ailleurs), j'ai fait plein d'essais en ligne de commande. Je n'arrive à rien.

Est-ce que c'est possible déjà en shell ? J'imagine que oui. Et comment fait-on cela ?

--------------------------
Par ailleurs je n'arrive pas à non plus à utiliser toutes les méthodes qui m'intéressent potentiellement.
Par exemple, quand je tape cela:

qdbus --literal org.kde.ActivityManager /ActivityManager/Activities

OK, j'obtiens cette liste de méthodes et de signaux:

signal void org.kde.ActivityManager.Activities.ActivityAdded(QString activity)
signal void org.kde.ActivityManager.Activities.ActivityChanged(QString activity)
method QString org.kde.ActivityManager.Activities.ActivityIcon(QString activity)
signal void org.kde.ActivityManager.Activities.ActivityIconChanged(QString activity, QString icon)
method QDBusRawType::(sssd) org.kde.ActivityManager.Activities.ActivityInformation(QString activity)
method QString org.kde.ActivityManager.Activities.ActivityName(QString activity)
signal void org.kde.ActivityManager.Activities.ActivityNameChanged(QString activity, QString name)
signal void org.kde.ActivityManager.Activities.ActivityRemoved(QString activity)
signal void org.kde.ActivityManager.Activities.ActivityStarted(QString activity)
method int org.kde.ActivityManager.Activities.ActivityState(QString activity)
signal void org.kde.ActivityManager.Activities.ActivityStateChanged(QString activity, int state)
signal void org.kde.ActivityManager.Activities.ActivityStopped(QString activity)
method QString org.kde.ActivityManager.Activities.AddActivity(QString name)
method QString org.kde.ActivityManager.Activities.CurrentActivity()
signal void org.kde.ActivityManager.Activities.CurrentActivityChanged(QString activity)
method QStringList org.kde.ActivityManager.Activities.ListActivities()
method QStringList org.kde.ActivityManager.Activities.ListActivities(int state)
method QDBusRawType::a(sssd) org.kde.ActivityManager.Activities.ListActivitiesWithInformation()
method void org.kde.ActivityManager.Activities.RemoveActivity(QString activity)
method void org.kde.ActivityManager.Activities.SetActivityIcon(QString activity, QString icon)
method void org.kde.ActivityManager.Activities.SetActivityName(QString activity, QString name)
method bool org.kde.ActivityManager.Activities.SetCurrentActivity(QString activity)
method void org.kde.ActivityManager.Activities.StartActivity(QString activity)
method void org.kde.ActivityManager.Activities.StopActivity(QString activity)
method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name)
method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name)
method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value)
method QString org.freedesktop.DBus.Introspectable.Introspect()
method QString org.freedesktop.DBus.Peer.GetMachineId()
method void org.freedesktop.DBus.Peer.Ping()

J'aurais voulu essayer cette méthode:

method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name)

Problème, je ne sais pas quelle ligne de commande je suis sensé taper. J'ai essayer plusieurs trucs, rien ne marche.
Et puis dans un second temps, comme je n'ai pas encore saisi la notion d'interface pour qdbus, je ne saurais pas quoi lui fournir en argument de toute façon.



--------------------------
EDIT 1:

J'ai cru un moment tenir le bon bout grâce à cette page https://doc.ubuntu-fr.org/dbus

J'ai donc tapé ceci:

dbus-monitor --session "type='signal',interface='org.kde.ActivityManager.Activities.ActivityStopped'"

qui m'a affiché ceci:

signal sender=org.freedesktop.DBus -> dest=:1.3667 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
   string ":1.3667"

... et sans me rendre la main ensuite, ce que j'ai interprété comme un bon signe par rapport à ce que je souhaite faire.

Malheureusement, ensuite j'ai stoppé et relancé différentes activités pour voir si quelque chose s'affichait dans ma console.
Mais rien ne ne se passe.... bouhhhhhhhh

Dernière modification par slash-z (Le 01/09/2015, à 11:18)

Hors ligne

#2 Le 02/09/2015, à 12:28

slash-z

Re : [qdbus] être à l'écoute et intercepter les signaux en shell

Je me réponds à moi-même pour la postérité.

Que fait-on:
- On surveille tout ce qui se passe concernant les activités sur le dbus.
- On s'intéresse particulièrement aux 3 messages "started, stopped et current".
- On va chercher la ligne suivante qui est porteuse de l'info recherchée. (d'où cette sombre histoire de "verrou")
- On transmet cette info à une fonction lancée en tâche de fond.

Attention, le script est à lancer explicitement avec le shell bash et non le shell par défaut (en général dash)

Quelques docs intéressantes en français ou en anglais sur dbus et qdbus:
http://yoannsculo.developpez.com/tutori … tion-dbus/
https://doc.ubuntu-fr.org/dbus
https://techbase.kde.org/Development/Tu … troduction
http://manpages.ubuntu.com/manpages/uto … bus.1.html
https://github.com/luebking/KLItools/bl … activities
http://www.glennie.fr/KDEEtDBUS

Les deux dernières m'ont beaucoup aidé.

#!/bin/bash

DBUS_MONITOR="dbus-monitor --session type='signal',interface='org.kde.ActivityManager.Activities'"

#####################################################
#			SOUS-PROGRAMMES
#####################################################

f_started () {
	echo "started $1"
}

f_stopped () {
	echo "stopped $1"
}

f_current () {
	echo "current $1"
}



#####################################################
#			MAIN
#####################################################

verrou=0

$DBUS_MONITOR | while read line
do

	if [ $verrou -eq 0 ]; then
		verrouStopped=$(grep -c "ActivityStopped" <<< $line)
		verrouStarted=$(grep -c "ActivityStarted" <<< $line)
		verrouCurrent=$(grep -c "CurrentActivityChanged" <<< $line)

		verrou=`expr $verrouStopped + $verrouStarted + $verrouCurrent`

	else
		verrou=0

		if [ $verrouStopped -ne 0 ]; then
			(f_stopped "$line") &

		elif [ $verrouStarted -ne 0 ]; then
			(f_started "$line") &

		elif [ $verrouCurrent -ne 0 ]; then
			(f_current "$line") &

		fi
	fi

done

exit

Je suis ouvert à tous les commentaires sur le sujet et/ou sur le code que j'ai fourni.

Dernière modification par slash-z (Le 02/09/2015, à 12:54)

Hors ligne