Comment 12 for bug 553557

Revision history for this message
Tom Chiverton (bugs-launchpad-net-falkensweb) wrote :

Scratch #11, wasn't running as root, which of course the powerbtn.sh would be :-)

Cut'n'paste tests now show
... as before ...
root@wopr:~# getXconsole
root@wopr:~# echo $XUSER
falken
root@wopr:~# test "$XUSER" != "" && pidof dcopserver > /dev/null && test -x /usr/bin/dcop && /usr/bin/dcop --user $XUSER kded kded loadedModules | grep -q klaptopdaemon
root@wopr:~# echo $?
1
root@wopr:~# test "$XUSER" != "" && test -x /usr/bin/qdbus && test -r /proc/$(pidof kded4)/environ && su - $XUSER -c "eval $(echo -n 'export '; cat /proc/$(pidof kded4)/environ |tr '\0' '\n'|grep DBUS_SESSION_BUS_ADDRESS); qdbus org.kde.kded" | grep -q powerdevil
-bash: test: too many arguments

Ahh ha ! That is the line that's meant to spot KDE4 and poke it... it looks like a horrible undocument mess to me though.

root@wopr:~# pidof kded4
14371 2153 1955
root@wopr:~# ps -efww|grep kded4
falken 1955 1 0 May01 ? 00:01:23 kdeinit4: kded4 [kdeinit]
falken 2153 1955 0 May01 ? 00:00:00 [kded4] <defunct>
root 14371 1 0 May03 ? 00:00:02 kdeinit4: kded4 [kdeinit]
root 20826 20690 0 22:43 pts/1 00:00:00 grep kded4

I found the process I think it should be asking for, and it looks like it should work:
root@wopr:~# cat /proc/1955/environ |tr '\0' '\n'|grep DB
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-wZqbwHsRWt,guid=a017520a52ed70c025d498814bdc07f1
root@wopr:~# su - $XUSER -c "eval export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-wZqbwHsRWt,guid=a017520a52ed70c025d498814bdc07f1; qdbus org.kde.kded"|grep powerdevil
/modules/powerdevil
root@wopr:~#

As a suggestion, the final test should replace 'pidof kded4' with 'ps -efww|grep kded4|grep $XUSER|grep -v grep|grep -v defunct
' or similar.
I do not believe the defunct is the problem, rather there are many kded4's (one for me, one for root, one for every user logged in ?). I've filtered out defunct ones anyway, and also restricted it to the current X user name. This should more reliably locate the one KDE instance we are interested in.

This appears to work:
PIDOFKDE4=`ps -efww|grep kded4|grep $XUSER|grep -v grep|grep -v defunct|tr -s ' '|awk '{print $2}'`

if pidof x $PMS > /dev/null ||
         ( test "$XUSER" != "" && pidof dcopserver > /dev/null && test -x /usr/bin/dcop && /usr/bin/dcop --user $XUSER kded kded loadedModules | grep -q klaptopdaemon) ||
         ( test "$XUSER" != "" && test -x /usr/bin/qdbus && test -r /proc/$PIDOFKDE4/environ && su - $XUSER -c "eval $(echo -n 'export '; cat /proc/$PIDOFKDE4/environ |tr '\0' '\n'|grep DBUS_SESSION_BUS_ADDRESS); qdbus org.kde.kded" | grep -q powerdevil) ; then
 echo hello
fi

Attached is a a version of powerbtn.sh that works for me.
Someone with more Bash voodoo might want to take a look at this.

Using this version, with a power button press, hibernate and resume betwen the two ls's :
root@wopr:~# ls -lah /tmp/powerbutton.fail
-rw-r--r-- 1 root root 0 2010-05-03 22:01 /tmp/powerbutton.fail
root@wopr:~# date
Tue May 4 23:10:10 BST 2010
root@wopr:~# ls -lah /tmp/powerbutton.fail
-rw-r--r-- 1 root root 0 2010-05-03 22:01 /tmp/powerbutton.fail
root@wopr:~# date
Tue May 4 23:12:20 BST 2010

this indicates the script correctly bailed rather than falling through to the shutdown.