Kategória: Debian Linux

Zmenené: 22. september 2010

Ovládanie KDE na diaľku

K napísaniu tohoto článku ma viedla moja snaha presvedčiť KDE aby ma pri vypínaní/reštartovaní počítača neotravovalo správou o aktívnych reláciách, pretože neraz som zistil, že sa mi stroj nevypol ale čaká na stupídne potvrdenie akcie, ktorá na jedno-používateľskom počítači proste nemá zmysel.

Celé to začalo tým, že som maród a poctivo ležím už viac týždňov. Po čase mi síce začalo byť lepšie, ale na sedenie pri počítači to stále nie je, i preto som využil notebook, ale často som narazil na problém, že veci mám na stolnom počítači. Teda, ono to problém nie je, veď nainštalovať a sprístupniť SSH je otázkou pár minút. Nenastavoval som vzdialený prístup k X Window, na to čo som potreboval plne stačí X Forwarding v ssh.

Počítač si zapnem pomocou WakeOnLan (presnejšie gWakeOnLan), KDM ma prihlási automaticky (určite neodporúčam na notebook), ale ako potom korektne vypnúť reláciu KDE? Iste budete so mnou súhlasiť, že použitie halt je síce možné, ale nie veľmi citlivé ku KDE a spusteným aplikáciám… No a narazil som aj na problém s úsporou energie (PowerDevil), ktorý mi po určitom čase stroj proste uspal (áno, používam automatické uspávanie i na stolnom počítači je to pohodlné, keď sa odbehnutie zmení na dlhšiu neprítomnosť).

Uspávanie

Prvý problém, ktorý som začal riešiť, bolo uspávanie, pretože opätovné zapínanie uspaného stroja po sieti síce nie je problém, ale je to dosť otravné, pretože po uspaní prestanú reagovať všetky vzdialené programy. Ako prvé riešenie som použil jednoduchý shellový skript, ktorý proste pohybuje v určitých intervaloch myšou:

fake_power

#!/bin/sh

# vypnúť autovypínanie pomocou pohybovania myšou

F_DISPLAY=":0.0"
F_SLEEP=900
#xset -display "$F_DISPLAY" dpms force off

while true; do
    xte -x $F_DISPLAY "mousemove 100 100"
    sleep $F_SLEEP
    xte -x $F_DISPLAY "mousemove 10 10"
    sleep $F_SLEEP
done

Hoci som to pôvodne ani netušil, po spustení som zistil, že vypínať monitory nemusím, pretože napriek pohybom myšou sú monitory po zadanom čase vypnuté. Ale sami uznáte, že je to riešenie, nazvem to, nečisté, a tak som hľadal iné. A našiel som D-Bus.

Desktop Bus

Častejšie označovaný skratkou D-Bus, je spôsob komunikácie medzi programami. Funguje tak, že program si pri spustení zaregistruje veci, ktoré sprístupňuje prostredníctvom D-Bus, a tak môžete čítať/meniť premenné programu alebo používať jeho metódy (funkcie). Samozrejme, nie všetky, ale ako som už spomenul, len tie, ktoré program zaregistruje v D-Bus. S D-Bus môžete pracovať ako pomocou príkazového riadku (qdbus z balíka libqt4-dbus), tak i z grafického prostredia (qdbusviewer z balíka qt4-dev-tools). Prípadne sa môžete pozrieť na programy dbus-send a dbus-monitor, oba z balíka dbus.

D-Bus cez SSH

Pri práci s D-Bus prostredníctvom vzdialenej relácie SSH však narazíte na jeden problém, a to, že nefunguje tak, ako by ste očakávali. Je to tým, že sa pri svojej práci spolieha na obsah premennej prostredia DISPLAY. Táto premenná identifikuje X Window. Ak nemáte v SSH zapnuté presmerovanie X Window (X11 Forwarding), bude táto premenná prázdna, respektíve nenastavená. Ak ste X11 Forwarding zapli, bude obsahovať identifikáciu, napr:

localhost:10.0

Avšak, na displeji 10 nebeží KDE… Aby to celé fungovalo, musí táto premenná ukazovať na lokálny displej s KDE (ak je to jediná grafická relácia, bude to :0). Ak nepoužívate X11 Forwarding, stačí v SSH zadať:

export DISPLAY=:0

Ak však používate X11 Forwarding, týmto príkazom by ste si pokazili spúšťanie vzdialených grafických programov oni sa budú spúšťať, len sa nezobrazia na vašom monitore, ale na monitore vzdialeného počítača. V takom prípade plne postačí predradiť nastavenie premennej DISPLAY príkazu qdbus, napríklad takto:

DISPLAY=:0 qdbus

V ďalšom texte nebudem túto premennú uvádzať, ak ich teda budete spúšťať cez SSH, nezabudnite ju pridať.

Správa napájania a D-Bus

Tak, čo to môžeme stvárať so správou napájania (powerdevil)?

  • vypnúť správu napájania KDE:

    qdbus org.kde.kded /kded org.kde.kded.unloadModule powerdevil
    
  • znova načítať modul PowerDevil:

    qdbus org.kde.kded /kded org.kde.kded.loadModule powerdevil
    
  • zmeniť profil správy napájania:

    qdbus org.kde.powerdevil /modules/powerdevil setProfile <MenoProfilu>
    

Rada

Áno, namiesto vypínania PowerDevil si môžete vytvoriť samostatný profil, ktorý bude využívať pri pripojení SSH.

Uspávanie cez D-Bus

Cez D-Bus možno počítač aj uspať. Prešiel som na nete veľa rád a tipov ako to urobiť, všetky však stáli (a padali) na parametroch, ktoré treba funkcii predať. Preto si najprv treba pozrieť, aké možnosti uspávania počítač poskytuje:

qdbus org.kde.kded /modules/powerdevil org.kde.PowerDevil.getSupportedSuspendMethods
Uspať do RAM: 2
Uspať na disk: 4

Všimnite si čísla, ktoré nasledujú za menom akcie, toto číslo treba predať funkcii, takže v mojom prípade:

  • uspať do RAM (suspend):

    qdbus org.kde.kded /modules/powerdevil suspend 2
    
  • uspať na disk (hibernate):

    qdbus org.kde.kded /modules/powerdevil suspend 4
    

Vypínanie

Keď som vyriešil uspávanie, ostalo mi vypínanie, ktoré je v KDE realizované jednou metódou, ktorá podľa zadaných parametrov buď aktívnu reláciu ukončí (odhlásenie) alebo vypne/reštartuje počítač. Ovládanie pomocou D-Bus je jednoduché, ale ako v predchádzajúcom prípade, stojí na správnom zadaní parametrov, v tomto prípade troch:

  1. potvrdenie (-1 podľa nastavení v SystemSettings, 0 nepotvrdzovať ukončenie, 1 potvrdzovať ukončenie);
  2. typ akcie (-1 podľa nastavení v SystemSettings, 0 odhlásiť, 1 reštartovať, 2 vypnúť);
  3. režim vypnutia (0 naplánovať akciu, 1 vyskúšať akciu, 2 vynútiť akciu, 3 interaktívne vykonanie).

Zastavím sa ešte trochu pri režimoch vypnutia/reštartu. Režim 0 neurobí nič, ale bude vykonaný po odhlásení/ukončení všetkých relácií. Režim 1 sa pokúsi akciu vykonať, ak sú však aktívne iné relácie, neurobí nič, Režim 2 bude okamžite vykonaný a posledný Režim 3 je kameňom úrazu a počiatočným dôvodom celého článku a spôsobí zobrazenie potvrdzujúceho dialógu, ak sú aktívne iné relácie, ale o tom neskôr. Existuje aj Režim -1, ale i tento súvisí so spomenutým problémom.

Takže celé vypnutie potom vyzerá takto:

qdbus org.kde.ksmserver /KSMServer org.kde.KSMServerInterface.logout <potvrdenie> <akcia> <režim>

Teraz niekoľko konkrétnych príkladov, v ktorých nechcem potvrdzovanie, a chcem to vykonať ihneď (režim 2):

  • odhlásenie:

    qdbus org.kde.ksmserver /KSMServer org.kde.KSMServerInterface.logout 0 0 2
    
  • reštart:

    qdbus org.kde.ksmserver /KSMServer org.kde.KSMServerInterface.logout 0 1 2
    
  • vypnutie:

    qdbus org.kde.ksmserver /KSMServer org.kde.KSMServerInterface.logout 0 2 2
    

Samozrejme, pokojne experimentujte, chce to však trpezlivosť.

Potvrdzovací problém

V skutočnosti to nie je problém, najmä nie na viac používateľskom systéme, teda na systéme, ktorý naozaj používajú viacerí používatelia (pretože Linux je viac používateľským vo svojej podstate). Toto správanie naozaj oceňujem v práci, keď sa mi niekoľko krát skoro podarilo vypnúť terminálový server, na ktorý boli prihlásení viacerí. Ale doma je to otravné a zbytočné? A čo je najhoršie, nedá sa to vypnúť. Pátral som po riešení tohoto problému niekoľko hodín.

Najprv som skúšal nastavovať KDM, ktorý poskytuje voľbu DefaultSdMethod, ale bez úspechu. Hoci má táto voľba aj možnosť ForceNow, jej nastavenie proste nepomohlo. Nebudem popisovať celý proces, ale nakoniec som skončil v preskúmavaní zdrojového kódu, kde som zistil, že vypínanie počítača z menu (kickoff) nenastavuje režim vypnutia, takže je použitý predvolený. To by ešte nebol problém, dokonca to považujem za správne riešenie. Horšie je, že správca relácie KDE (ksmserver) neposkytuje žiadnu možnosť nastavenia predvoleného režimu a ako predvolený režim natvrdo nastavuje Režim 3. Toto správanie má za následok, že vždy pri vypnutí, ak sú aktívne aj iné relácie, sa objaví to otravné okno so zoznamom aktívnych relácií.

Riešenie?

Jednou z možností je pridať si do kickoff natvrdo režim vypnutia, ale to by vyžadovalo prekompilovanie pomerne veľa balíkov a v žiadnom prípade nie to nie je systémové riešenie. Aj preto som tento problém nahlásil, ale priznám sa, neveľmi verím v jeho skoré opravenie/vyriešenie.

Prístupnejším riešením je použiť vyššie spomenuté volania D-Bus a vytvoriť si ikonku na ploche, ktorá zavolá vypnutie s požadovanými parametrami. Ale priznajte si, chce sa vám robiť si ikonu pre každú vypínaciu akciu? Mne nie.

Je tu však aj tretie riešenie, ktoré spočíva v použití balíka kshutdown. Nepátral som hlbšie ako má tento program riešené vypínanie, každopádne otravný dialóg pri vypínaní nezobrazuje. Jednoducho si ho pridajte do automatického spustenia (nepoužívam správcu relácie na automatické obnovovanie programov po prihlásení). Je mu možné pridať parameter, aby po spustení neotváral svoje okno, ale usídlil sa len v systémovej lište (trayicon), parameter si pozrite pomocou

kshutdown --help

Pretože sa práve v tejto dobe mení a závisí od použitej verzie. Prípadne si urobte ikonku na ploche.