ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Ich habe das Script mal mit einigen Neckereien erweitert und lasse es in meiner neuen Unity-VM laufen ☺ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | #!/bin/bash
export DISPLAY=:0 #benötigt für xprintidle
#Funktionsdefinitionsbeispiel um eine Logdatei mit Daten zu füllen
function log() {
#würde man einzelne Teile abfangen wollen, könnte man auch mit $2, etc. weiterarbeiten.
echo "$1" >> /home/unity/screenlock.logged;
}
log "$(date)" #$(XXX) führt XXX aus und gibt die Standardausgabe zurück.
#das true oder false des lock-Status in eine Variable lesen:
gesperrt=$(qdbus --system-bus org.freedesktop.secrets /org/freedesktop/secrets/collection/login org.freedesktop.Secret.Collection.Locked )
log "gesperrt=$gesperrt" #gibt true oder false in die logdatei
if "$gesperrt" #entspricht if [ $gesperrt=true ]
then
log "Bereits gesperrt! Beende."
exit 0 #Beende das Programm, alle Fehler ignorierend (0=ordentlich beendet)
fi
#Wenn $gesperrt false war, kommen wir bis hier!
#Auslesen der Ganzzahl von xprintidle
if [[ $(/usr/bin/xprintidle) -gt 0 ]]
then
log "sperre Bildschirm..."
SEAT=$(dm-tool list-seats | grep Seat) #würde in deinem Beispiel Seat0 ergeben (Ist der Standard bei einem angemeldeten Benutzer)
$( qdbus --system org.freedesktop.DisplayManager /org/freedesktop/DisplayManager/$SEAT org.freedesktop.DisplayManager.Seat.Lock )
fi
|
Habe aber das Gefühl dieser qdbus-command funktioniert nicht so, wie er soll oder ich bekomme die Variable nicht richtig befüllt. Teste das eben noch. (bei mir ist der immer true)
|
Vej
Moderator, Supporter
Anmeldungsdatum: 7. März 2013
Beiträge: 3391
|
Hallo ChickenLipsRfun2eat. ChickenLipsRfun2eat schrieb: Habe aber das Gefühl dieser qdbus-command funktioniert nicht so, wie er soll oder ich bekomme die Variable nicht richtig befüllt. Teste das eben noch. (bei mir ist der immer true)
Vielleicht ein VM-Problem? Bei mir ist er unter 16.04 und Unity false im ungesperrten Zustand. Im gesperrten, habe ich jetzt nicht testen können (das geht ja nur per Skript). Viele Grüße Vej
|
uptime24
(Themenstarter)
Anmeldungsdatum: 25. Dezember 2014
Beiträge: 121
Wohnort: Schafflund
|
Vej schrieb: Bei mir ist er unter 16.04 und Unity false im ungesperrten Zustand.
Bei mir liefert er manuell auch ein false. Ich schau mir mal ChickenLipsRfun2eat's neues script an und berichte gleich...
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
| qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.IsLocked
|
Damit teste ich gerade als "lock-check" /edit: Das ist kein neues Script. Ich habe es nur aufgrund Vej's Link zum scripting-guide etwas erweitert und kommentiert, zwecks Nachvollziehbarkeit. Das eigentliche funktioniert noch nicht... /edit2: Problem erkannt. Beide dbus-methoden geben nur "leer" zurück, wenn sie als cronjob laufen. Ergo bleiben uns noch andere Möglichkeiten. Eine Dauerschleife, welche auf das "unlock-Signal" wartet oder eine bessere methode. Ich suche erstmal letzteres.
|
uptime24
(Themenstarter)
Anmeldungsdatum: 25. Dezember 2014
Beiträge: 121
Wohnort: Schafflund
|
Fr 29. Apr 19:30:01 CEST 2016
gesperrt=
sperre Bildschirm...
Fr 29. Apr 19:31:01 CEST 2016
gesperrt=
sperre Bildschirm...
Fr 29. Apr 19:32:01 CEST 2016
gesperrt=
sperre Bildschirm...
Fr 29. Apr 19:32:36 CEST 2016
gesperrt=false
sperre Bildschirm...
Fr 29. Apr 19:33:01 CEST 2016
gesperrt=
sperre Bildschirm... Das eine mal wo er false reingeschrieben hat, habe ich das script manuell in der Konsole gestartet...
edit: ok, hattest du schon auf dem schirm 😉
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Ich hab mich doch für die faulste aller Lösungen entschieden... 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | #!/bin/bash
export DISPLAY=:0 #benötigt für xprintidle
#Funktionsdefinitionsbeispiel um eine Logdatei mit Daten zu füllen
function log() {
#würde man einzelne Teile abfangen wollen, könnte man auch mit $2, etc. weiterarbeiten.
echo "$1" >> /home/unity/screenlock.logged;
}
log "$(date)" #$(XXX) führt XXX aus und gibt die Standardausgabe zurück.
#das true oder false des lock-Status in eine Variable lesen:
gesperrt=$(qdbus --system-bus org.freedesktop.secrets /org/freedesktop/secrets/collection/login org.freedesktop.Secret.Collection.Locked )
log "gesperrt=$gesperrt" #gibt true oder false in die logdatei
#if [ -z "$gesperrt" ] #entspricht if [ $gesperrt=leerer string ]
if [ "$gesperrt"!="false" ] #NICHT false
then
log "Bereits gesperrt! Beende."
exit 0 #Beende das Programm, alle Fehler ignorierend (0=ordentlich beendet)
fi
#Wenn $gesperrt false war, kommen wir bis hier!
#Auslesen der Ganzzahl von xprintidle
if [[ $(/usr/bin/xprintidle) -gt 0 ]]
then
log "sperre Bildschirm..."
SEAT=$(dm-tool list-seats | grep Seat) #würde in deinem Beispiel Seat0 ergeben (Ist der Standard bei einem angemeldeten Benutzer)
$( qdbus --system org.freedesktop.DisplayManager /org/freedesktop/DisplayManager/$SEAT org.freedesktop.DisplayManager.Seat.Lock )
fi
|
Mit if [ -z "$gesperrt" ] #entspricht if [ $gesperrt=leerer string ]
fragen wir einfach ab, ob die Methode nix zurückgibt. Da bei angemeldetem Zustand ja zuverlässig ein "false" kommt, sollte das auch klappen.... Falls es mal dubiose Auswirkungen hat, könnte es daran liegen ☺ /edit: Nochmal sinnvoller auf ein "nicht false" geändert. if [ "$gesperrt" != "false" ] #sorry. -ne is für Zahlen... -.- Ich bin etwas durch heute :D
|
uptime24
(Themenstarter)
Anmeldungsdatum: 25. Dezember 2014
Beiträge: 121
Wohnort: Schafflund
|
Das false kommt bei mir aber nur, wenn ich es manuell aufrufe?! Ich lasse es mal laufen und schaue mir das log an... - gesperrt= bleibt leer, sowohl beim eigentlichen sperren als auch jedem weiteren Durchlauf.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Kopiere es nochmal neu. Ich hab da nochn Fehler drin gehabt (Leerzeichen).
|
uptime24
(Themenstarter)
Anmeldungsdatum: 25. Dezember 2014
Beiträge: 121
Wohnort: Schafflund
|
Jetzt lockt er gar nicht mehr, aber ich starte lieber erstmal neu und teste dann noch einmal. edit: ne, er schreibt jetzt immer ins log das er bereits gesperrt ist.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Ja, bei mir auch. Kommt plötzlich immer ein true raus. Ich hab nochmal von "klein" angefangen. In Ruhe und mit Nachdenken geht's meist besser... /edit:
Manmanman...da is auch so ein blöder Denkfehler drin 😀 Sorry. Das ist, wenn man zu schnell zu wenig denkt 😀 Kannst ihn ja rausfinden, wenn du willst. Ich bin gerade am neu testen ☺
|
uptime24
(Themenstarter)
Anmeldungsdatum: 25. Dezember 2014
Beiträge: 121
Wohnort: Schafflund
|
Du hattest das -z vergessen, aber am Verhalten ändert sich bei mir nichts.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Nee. Viel schlimmer. Im Terminal kam ja immer 'false' raus, was auch logisch ist. Aber per cronjob kam ja immer "" (nix, null) bei raus, gleich welcher Zustand war. Das Ganze läuft leider darauf hinaus, dass man das mit den Signalen abgleichen muss, vermute ich. Ich tu mir da mit der bash gerade echt schwer. Vllt wäre es leichter sowas in Python / C++ abzufragen und auf die Signale zu reagieren. Habs auch mit dem export der in ~/.dbus/[machine-id] enthaltenen Variablen versucht, mit su und sudo Benutzername...aber gerade bin ich am rumraten ☺ Morgen versuche ich das mal als Upstart, bzw. systemd-Job aufzusetzen und das mit start on desktop-lock...vllt klappt das besser. Alternativ gibts nen kleines dbus-monitor-programm, welches das selbe macht wie | gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session
|
Da kann man wunderbar die Wechsel beobachten, Abfragen und drauf reagieren. Das "idlet" dann halt "unnötig" herum. /edit: https://github.com/c0rp-aubakirov/lock_unlock_event_catcher/blob/master/event_catcher.sh Haben sich wohl auch andere schon dran versucht ☺
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | #!/bin/bash
IDLE=5000 #erlaubte Abwesenheit
SLEEP=5 #Sekunden die die Schleife wartet
while [ 1 ];
do
if [[ $(/usr/bin/xprintidle) -gt $IDLE ]]
then
qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.Lock
fi
#Pause, während der Sperrung:
while [ $(qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.IsLocked) == "true" ];
do
/bin/sleep $SLEEP && continue
done
/bin/sleep $SLEEP
done
|
So sollte es klappen... /edits:
Dieses Script läuft nicht per cronjob, sondern selbst in einer Dauerschleife. Also am besten bei Systemstart einmalig ausführen (in crontab mit @reboot).
Man könnte es auch zu einem Start-/Stop-Script umbauen...aber an sich solls ja laufen.
|
uptime24
(Themenstarter)
Anmeldungsdatum: 25. Dezember 2014
Beiträge: 121
Wohnort: Schafflund
|
Ja, sehr schöne Arbeit! Vielen herzlichen Dank, Du hast mir wirklich sehr geholfen. 👍 Kann ich das auch abändern mit dem org.freedesktop.Secret.Collection.Locked? Ich werde das mal ausprobieren.
Der com.canonical.Unity.Session.Lock schaltet ja nach der Sperrung gleich die Bildschirme aus. edit:
OK, mit freedesktop stehen wir wieder vor dem alten Problem das er das "true" nicht erkennt. Allerdings bekomme ich es bei com.canonical.Unity.Session.Lock nicht hin, das es mir die Bildschirme eingeschaltet lässt. Aktuell habe ich ja keinen Vorteil gegenüber der Ubuntu -eigenen Display Abschalt- & Sperrfunktion. Die Bildschirme sollen aber erst nach einer Stunde idle ausgeschaltet werden wobei die Sperre deutlich früher greifen muß. Ich merke schon, ich bin ein schwieriger Fall und bitte um Nachsicht 😳
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Du bist nicht der schwierige Fall, eher Unity. Ich habe das auch versucht als cpp-Programm (Qt mit qtdbus-qt5) zu schreiben und mittels qDebug viele Ausgaben bekommen. Das Problem bei Unity ist, dass die freedesktop.org-Methoden nicht alle so implementiert sind, wie es sein könnte oder sollte. Habe aber auch etwas den Überblick verloren, was nun geht und was nicht. Heute muss ich leider nen Exkurs machen und nen PC neu einrichten, aber ich werde das weiter versuchen. Die Lösung ist wahrscheinlich super einfach, wenn man mal durchgestiegen ist, wie Unity arbeitet^^ Man kann den Bildschirm auch sperren, ohne dass Unity ein Signal sendet. Da laufen wohl verschiedene Systeme im Hintergrund, mit denen man arbeiten kann, könnte aber auch an der VM liegen (ich kann mit SUPER+L sperren, ohne dass ein Signal ankommt, mit CTRL-ALT-L funktioniert es tadellos). Wie gesagt, ich bleibe dran. Zum einen ist das schönes Neuland für mich, weil ich mit Bildschirmsperre, -schoner, etc. noch nie was zu tun hatte, zum anderen interessiert mich die Lösung auch. Fuchst mich etwas, dass das "nicht so einfach geht". Bisher bin ich mit dbus-methoden immer gut gefahren, wenn ich was wollte..
|