mercoledì 13 ottobre 2010

HowTo: Creiamoci i nostri script Acpi personalizzati

Il supporto del Kernel Linux ai nostri EeePc in questi ultimi tempi è aumentato notevolmente, si veda come per la maggior parte dei netbook di casa Asus (e non solo) molti dei tastini funzione ora funzionino nativamente; mi riferisco in particolare al tasto per accendere/spegnere il wifi, a quello per la sospensione e a quelli per il volume e la luminosità.
Purtroppo i restanti tasti non vengono nativamente riconosciuti (e mi riferisco soprattutto al Super Hybrid Engine) ed è per questo che sono nati alcuni software per sopperire a questa mancanza (vedasi eee-control e Jupiter), inoltre alcune distro (vedasi Archlinux e Debian) hanno creato script propri.
In questo articolo vi spiegherò come interagire con il demone Acpid per costruirsi i propri script fatti su misura.


Una domanda a questo punto sorge spontanea, perché dovrei perdere tempo a farmi degli script quando i vari eee-control, Jupiter e compagnia bella funzionano a dovere?
Ecco qualche motivo (personale) che mi ha indotto a questa scelta:
  1. Non sempre eee-control o Jupiter funzionano a dovere o fanno ciò che vogliamo.
  2. Non tutte le distribuzioni offrono nei loro repository i software sopracitati a meno di rocamboleschi adattamenti (vedete la mia guida per installare Sabayon su EeePc), quindi se vi piace provare le distribuzioni più esotiche non avrete problemi.
  3. Perchè una volta fatti sono portabili, li potrete usare su una qualsiasi distribuzione con il minimo sforzo e senza grandi modifiche (anche nessuna se siete come me).
  4. Perché eee-control e Jupiter si basano comunque sul demone Acpid, quindi perché avere un programma in più che beve dalla nostra ram quando possiamo delegare il tutto a Acpid (e si sà che certe persone sono molto brave a delegare)?
  5. Perché chi fa da se fa per tre ed è servito meglio di un re!!!


AVVISO!!!
In questa guida non ci sarà manna che scende dal cielo fornendovi degli script Acpi, sarete voi a farveli quindi è necessario che conosciate un minimo di alfabetizzazione dello scripting da terminale, in particolare l'unica cosa veramente indispensabile è avere manegevolezza con le variabili e sapere cos'è una condizionale e come si usa (if-else).

Fatta questa premessa prima di buttarci a capofitto assicuriamoci che sia caricato il modulo eeepc_laptop e che il demone Acpid sia in esecuzione, aprite un terminale e digitate:
lsmod | grep eeepc
nel caso non compaia il suddetto modulo per avviarlo date il seguente comando
su -c 'modprobe eeepc_laptop'
per acpid invece:
ps -e | grep acpid
e nel caso non compaia niente sempre da terminale per avviarlo date
su -c 'acpid'
Inoltre ricordatevi che nel caso facciate qualche modifica all'interno della cartella /etc/acpi/events dovrete riavviare Acpid affinché abbia effetto.
Ora nel caso in cui abbiate altri software quali eee-control, Jupiter e compagnia bella, prima di procedere premuratevi di disabilitarli/disinstallarli in modo che non vadano in conflitto.

INIZIAMO
Tutto ciò che faremo ora avverrà all'interno della cartella /etc/acpi, nonostante sia possibile mettere gli script in altre cartelle io consiglio di metterli qui, sia perché in questo modo solo l'utente root potrà modificarli, sia perché così è piu facile copiarli da una distro ad un altra nel caso ne abbiate la necessità. Per quanto appena detto tutte le operazioni che verranno fatte di seguito necessiteranno dei privilegi di root, quindi non lo ripeterò in seguito, ma quando non esplicitamente specificato sentitevi liberi di usare quello che preferite tra su e sudo.

Ora bisognerà dire ad Acpid che alla pressione di un dato tasto (e quindi quando si genera un evento acpi) bisogna associare un determinato script e per fare ciò per ogni tasto che si vuole intercettare basterà mettere un file di testo nella cartella /etc/acpi/events adeguatamente formattato come vi spiegherò di seguito (più in basso vi spiegherò anche come mettere tutto in un unico file in modo da essere ancora più compatti).
Ogni file che create nella cartella /etc/acpi/events dovrà avere il seguente contenuto:
event=XXXXXXXX
action=script-da-eseguire
Dove al posto di quelle XXXX ci va inserito l'evento acpi del tasto in questione; come reperire questo codice?
Semplice aprite il vostro fido terminale e digitate il seguente comando (in questo caso non sono necessari i privilegi di root):
acpi_listen -c 1
ora il terminale rimarrà in attesa che voi premiate la combinazione di tasti e quando lo farete vi restituirà in output il codice, ad esempio quando io premo Fn+F7 (che è il tasto per spegnere lo schermo) ottengo questo:
hotkey ATKD 00000016 00000002
tralasciando l'ultimo gruppo di numeri che indica il numero di volte che è stato premuto quel tasto (nel mio caso 2) copiate tutto il resto e inseritelo al posto delle XXXX di prima... quindi sempre per fare un esempio nel mio caso avrò creato dentro la cartella /etc/acpi/events un file chiamato schermo con il seguente contenuto:
# potete anche inserire un commento anteponendo il cancelletto
event=hotkey ATKD 00000016
action=/etc/acpi/schermo.sh
il file schermo.sh è lo script che viene eseguito alla pressione del tasto, è scritto in Bash e deve essere reso eseguibile, per tutto il resto può contenere tutto quello che vi passa per la testa.
Sempre a titolo esemplificativo vi posto il mio schermo.sh:
#!/bin/bash
#qualche commento fa sempre comodo
#la prima riga non è obbligatoria ma è buon costume metterla
xset dpms force off
Semplice no? Ricordatevi di rendere eseguibile il suddetto file dando da terminale chmod +x file, nel mio caso:
chmod +x /etc/acpi/schermo.sh
(come ho già specificato sopra queste operazioni vanno fatte da root)

ATTENZIONE!!!
Il demone Acpid viene eseguito da root, quindi qualsiasi script da esso eseguito avrà i privilegi di amministratore. Non è obbligatorio ma è caldamente consigliato che le operazioni per cui non siano strettamente necessari questi privilegi elevati vengano eseguite da utente normale, per fare ciò è sufficiente che al posto di dare un comando usiate la seguente sintassi:
su utente -c 'comando'
dove al posto di utente dovrete mettere il nome dell'utente che utilizzate, mentre al posto di comando ci va naturalmente il comando che volete sia eseguito (qui fate attenzione agli apici, se il comando che dovete lanciare richiede dei parametri tra virgolette utilizzate le virgolette "" e non gli apici, se volete vedere un esempio date un'occhiata più in basso alla parte riguardante le notifiche).
Inoltre se fate lanciare dagli script un programma con interfaccia grafica potreste avere qualche problema (il problema è che non succede niente quando invece dovrebbe aprirsi il programma), se questo è il vostro caso dovrete aggiungere in cima ai vostri script questa riga:
export DISPLAY=:0



UNO SGUARDO AI FILE DI SISTEMA
Ora che avete visto come fare affinché il demone Acpid esegua un'azione da voi voluta alla pressione di un tasto, vi mostrerò quali sono i file di sistema su cui dovrete agire per poter gestire correttamente le periferiche del vostro EeePc (webcam, cardreader, SHE ecc) e si trovano tutti nella cartella /sys/devices/platform/eeepc.

AVVISO!!!
Nella seguente trattazione ometterò alcuni tasti funzione in quanto sono correttamente riconosciuti dall'ultimo Kernel, questi sono i tasto per la sospensione, wifi, luminosità e volume, nel caso il vostro Desktop Environment non li assegni di default dovreste poter comunque impostarli tra i settaggi del DE in questione.


Super Hybrid Engine
Se avete un EeePc con il processore Intel Atom potrete usare lo SHE per regolare le prestazioni della vostra CPU in base alle vostre esigenze.
Il file a cui dovete far riferimento si chiama cpufv e se andate a vedere il suo contenuto troverete qualcosa del tipo 0x30? dove al posto del punto interrogativo ci sarà un numero trà 0 1 o 2 a seconda se siete rispettivamente su Performance, Normal o Powersave.
Cambiare lo scaling è quindi molto semplice, vi basterà mettere il numero desiderato in questo file e il modo più semplice per farlo è usare il comando echo, da terminale e con i privilegi di amministratore (attenzione qui non va bene usare sudo, dovrete per forza usare su) date:
echo X > /sys/devices/platform/eeepc/cpufv
mettendo al posto di X il numero che rappresenta il regime scelto.

NOTA!!
Il Super Hybrid Engine e lo scaling della cpu effettuato da cpufreq (le varie applet di gnome e kde per regolare la cpu) sono due cose diverse, infatti uno agisce sul moltiplicatore mentre l'altro sul Front Side Bus, quindi potrete usare entrambi senza conflitti.


Vediamo ora per completezza uno script che legge lo stato attuale dello SHE e scorre ciclicamente i vari profili:
#!/bin/bash
she="/sys/devices/platform/eeepc/cpufv"

case "$(cat $she)" in
   0x300)
      echo 2 > $she
      ;;
   0x301)
      echo 0 > $she
      ;;
   0x302)
      echo 1 > $she
      ;;
esac


WEBCAM
Il file di sistema relativo alla webcam è chiamato camera, è molto semplice e può assumere solo due valori: 0 per off e 1 per on, per cambiarne lo stato come già fatto per lo SHE potete usare il comando echo, inoltre quando spegnete la webcam potete anche rimuovere il modulo uvcvideo.
Vediamo un rapido esempio:
#!/bin/bash
camera="/sys/devices/platform/eeepc/camera"

if [ $(cat $camera) = 1 ]; then
   modprobe -r uvcvideo
   echo 0 > $camera
else
   modprobe uvcvideo
   echo 1 > $camera
fi


CARDREADER
Per il cardreader vale lo stesso discorso della webcam, il file di riferimento è cardr e assume il valore 0 per off e 1 per on. L'amico Valantin ci propone uno script per abilitarlo/disabilitarlo che nel secondo caso si assicura che il cardreader non sia in uso.
#!/bin/bash
CARDR=`cat /sys/devices/platform/eeepc/cardr`

case $CARDR in
   0)
      echo 1 > /sys/devices/platform/eeepc/cardr
      /usr/bin/notify-send "Cardreader" "Abilitato" -t 5000 2>/dev/null
      ;;
   1)
      SECURE=`ls -l /dev/disk/by-id/ | grep -c Single_Flash_Reader`
      if [ $SECURE -gt 1 ]; then
      /usr/bin/notify-send "Cardreader" "Ancora in uso" -t 5000 2>/dev/null
      elif [ $SECURE -le 1 ]; then
      echo 0 > /sys/devices/platform/eeepc/cardr
      /usr/bin/notify-send "Cardreader" "Disabilitato" -t 5000 2>/dev/null
      fi
      ;;
   *)
      /usr/bin/notify-send "Errore" "Problemi Cardreader" 2>/dev/null
      ;;
esac
In questo script viene fatto uso delle notifiche, per maggiori dettagli vedete la relativa sezione.

WIFI
Per quanto riguarda il wifi come ho già detto sopra dovrebbe già essere riconosciuto, per i più curiosi però anche il wifi ha uno switch on-off così come per la webcam e il cardreader.
Per trovarlo, partendo sempre dalla cartella /sys/devices/platform/eeepc, andate nella cartella rfkill, dentro questa troverete un'altra cartella (o due se avete anche il bluetooth) all'interno della quale c'è il file state che è lo switch desiderato, potete farne uso nel caso vogliate farvi delle notifiche per il wifi visto che non tutti i DE ce l'hanno. Nel caso invece abbiate la necessità di attivare disattivare il wifi tramite script (se non viene automaticamente riconosciuto il tasto) vi consiglio di usare il comando rfkill che come vedrete è utile anche se avete il bluetooth.


BLUETOOTH
Il caro amico Valantin propone uno script per gestire il bluetooth, richiede però di aver installato il pacchetto rfkill, quindi nel caso non lo abbiate usate il vostro package manager di fiducia per procurarvelo.
#!/bin/bash
for i in /sys/class/rfkill/*; do
   if [ -f "$i/name" ] && [ "$(cat "$i/name")" = "eeepc-bluetooth" ]; then
      BT_STATE=`cat "$i/state"`
   fi
done

case $BT_STATE in
   0)
      rfkill unblock bluetooth
      /usr/bin/notify-send "Bluetooth" "Abilitato" -t 5000 2>/dev/null
      ;;
   1)
      rfkill block bluetooth
      /usr/bin/notify-send "Bluetooth" "Disabilitato" -t 5000 2>/dev/null
      ;;
   *)
      /usr/bin/notify-send "Errore" "Problemi Blutooth" 2>/dev/null
      ;;
esac
Questo script fa uso anche delle notifiche, per maggiori dettagli vedete la relativa sezione.

SPEGNERE IL MONITOR
Riguardo lo spegnimento del monitor ho già fatto un esempio all'inizio, comunque non necessita la modifica di alcun file ma basta dare il seguente comando:
xset dpms force off


DISABILITARE IL TOUCHPAD
Anche per quanto riguarda il touchpad il controllo è molto semplice, in questo caso useremo il comando synclient in questo modo:
synclient TouchpadOff=1
per spegnerlo, mentre basterà sostituire 0 a 1 per riattivarlo;
vediamo uno script di esempio:
#!/bin/bash
touchpad=$(synclient -l | grep TouchpadOff | awk '{print $3}')
if [ "$touchpad" = "0" ]; then
   synclient TouchpadOff=1
else
   synclient TouchpadOff=0
fi

CAMBIARE RISOLUZIONE
Nel caso abbiate la necessità di switchare la risoluzione a 1024x768 Valantin nel primo commento ha postato un utile script per farlo.
#!/bin/bash
RESOLUTION=`xrandr | grep LVDS1 | awk '{print $3}'`

case "$RESOLUTION" in
   '1024x600+0+0')
      xrandr --output LVDS1 --panning 1024x768
      /usr/bin/notify-send "LCD Panning" "1024x768" -t 5000 2>/dev/null
      ;;
   '1024x768+0+0')
      PANNING=`xrandr | grep LVDS1 | awk '{print $15}'`
      if [ "$PANNING" = 'panning' ]; then
         xrandr --output LVDS1 --scale 1x1.28 --panning 0x0
         /usr/bin/notify-send "LCD Scaling" "1024x768" -t 5000 2>/dev/null
      else
         xrandr --output LVDS1 --scale 1x1
         /usr/bin/notify-send "LCD Default" "1024x600" -t 5000 2>/dev/null
      fi
      ;;
   *)
      /usr/bin/notify-send "Errore" "impossibile cambiare risoluzione" 2>/dev/null
      ;;
esac

VARIE ED EVENTUALI
Potremmo andare avanti all'infinito a fare script, comunque ritengo che già questi coprano quasi la totalità delle necessità di un comune essere umano.
Se avete bisogno di altro vi consiglio caldamente di fare qualche ricerca su internet in quanto sicuramente l'argomento sarà stato ampiamente trattato, inoltre siccome credo che si impari più dalla pratica che dalla teoria vi consiglio di dare un'occhiata agli script acpi delle maggiori distribuzioni Gnu/Linux, in particolare a quelli di Archlinux reperibili sul relativo sito di googlecode http://code.google.com/p/acpi-eeepc-generic/.


NOTIFICHE
Siamo quasi giunti a conclusione...
Vediamo ora come aggiungere le notifiche ai vostri script in modo che vi appaia un bel messaggio quando spegnete la webcam o quando cambiate il profilo dello SHE.
Ci sono vari programmi per mandare a schermo delle notifiche ma in genere il più gettonato (presente in tutte le distro maggiori e minori) è notify-send facente parte del pacchetto libnotify, vediamo qual'è la sintassi:
notify-send "Titolo notifica" "testo notifica" -t 3000 -i "icona"
dove il numero dopo -t è il tempo espresso in millisecondi per il quale la notifica rimarrà a schermo, mentre l'ozione -i vi permette di aggiungere un'immagine alla notifica (naturalmente il parametro tempo e l'icona non sono indispensabili, possono anche essere omessi). Inoltre potete impostare anche l'urgenza della notifica, vi basterà aggiungere l'opzione -u seguita da un parametro a scelta tra low, normal e critical.

Per gli utenti di Kde c'è a disposizione anche un'altro comando, integrato nel DE:
kdialog --passivepopup "testo notifica" 10
dove il numero finale stavolta rappresenta il tempo espresso in secondi.

Vediamo ora un esempio di come sarebbe il mio script per spegnere il touchpad postato in precedenza con l'aggiunta delle notifiche:
#!/bin/bash
export DISPLAY=:0
touchpad=$(synclient -l | grep TouchpadOff | awk '{print $3}')
if [ "$touchpad" = "0" ]; then
   synclient TouchpadOff=1
   su melko -c 'notify-send "EeePc" "Touchpad disabilitato" -t 4000'
else
   synclient TouchpadOff=0
   su melko -c 'notify-send "EeePc" "Touchpad abilitato" -t 4000'
fi
Notate che ho utilizzato la sintassi su utente -c 'comando' e ho anche messo export DISPLAY=:0


COMPATTARE IL TUTTO
Come vi avevo promesso all'inizio ora vi mostrerò come compattare il tutto in un unico file.
Il procedimento non è difficile... basta dire al demone Acpid di indirizzare tutti gli eventi che intercetta in un unico file.
Per fare questo torniamo nella cartella /etc/acpi/events
e creiamo un file con il seguente contenuto:
event=hotkey.*
action=/etc/acpi/eeepc_script.sh %e
in questo modo Acpid ogni qual volta intercetta un evento di tipo hotkey invoca lo script eeepc_script.sh (potete metterci quello che volete, l'importante è che vi ricordiate di rendere eseguibile lo script attraverso l'uso di chmod +x nomefile) passandogli quattro variabili che sono semplicemente le stesse che vi dava acpi_listen...

Riprendendo l'esempio iniziale con il tasto per spegnere lo schermo con acpi_listen ottenevamo:
hotkey ATKD 00000016 00000002
quindi le quattro variabili sono:
$1 = hotkey
$2 = ATKD
$3 = 00000016
$4 = 00000002
ora se mi avete seguito fin qui saprete che l'unico dato che ci interessa è il codice del tasto che è rappresentato dal terzo gruppo di numeri, quindi l'unica variabile che vi interessa è $3.

detto ciò basterà utilizzare il costrutto if-else oppure case
e far eseguire i comandi relativi al tasto premuto;
inoltre per facilitarvi le cose vi consiglio caldamente l'uso delle funzioni in modo da rendere più leggibile il codice.

Vediamo ora un piccolo esempio del file eeepc_script.sh (per brevità ho inserito solo il comando per spegnere lo schermo, ma potete inserire tutti gli altri che sono stati elencati sopra):
#!/bin/bash

toggle_display()
{
   su melko -c 'xset dpms force off'
}
export DISPLAY=:0
case "$3" in
   00000016) #questo è il codice relativo al tasto per spegnere il display
      toggle_display
      ;;
   00000037) #qui ci va il codice di un altro tasto
      #e qui ci mettete l'azione che dove essere eseguita
      ;;
   00000018) #cosi andate avanti finché non avete messo tutti i tasti
      #con le relative azioni, ricordatevi la comodità delle funzioni
      ;;
esac

45 commenti:

  1. function resolution {
    RESOLUTION=`xrandr | grep LVDS1 | awk '{print $3}'`

    case "$RESOLUTION" in
    '1024x600+0+0')
    xrandr --output LVDS1 --panning 1024x768
    /usr/bin/notify-send "LCD Panning" "1024x768" -u critical -t 5000 -i "/usr/share/icons/gnome/32x32/devices/video-display.png" 2>/dev/null
    ;;
    '1024x768+0+0')
    PANNING=`xrandr | grep LVDS1 | awk '{print $15}'`
    if [ "$PANNING" = 'panning' ]; then
    xrandr --output LVDS1 --scale 1x1.28 --panning 0x0
    /usr/bin/notify-send "LCD Scaling" "1024x768" -u critical -t 5000 -i "/usr/share/icons/gnome/32x32/devices/video-display.png" 2>/dev/null
    else
    xrandr --output LVDS1 --scale 1x1
    /usr/bin/notify-send "LCD Default" "1024x600" -u critical -t 5000 -i "/usr/share/icons/gnome/32x32/devices/video-display.png" 2>/dev/null
    fi
    ;;
    *)
    /usr/bin/notify-send "Errore" "impossibile cambiare risoluzione" -u critical 2>/dev/null
    ;;
    esac
    }

    function toogle_cardreader {
    CARDR=`cat /sys/devices/platform/eeepc/cardr`

    case $CARDR in
    0)
    echo 1 > /sys/devices/platform/eeepc/cardr
    /usr/bin/notify-send "Cardreader" "Abilitato" -u critical -t 5000 -i "/usr/share/icons/gnome/32x32/devices/media-flash.png" 2>/dev/null
    ;;
    1)
    SECURE=`ls -l /dev/disk/by-id/ | grep -c Single_Flash_Reader`
    if [ $SECURE -gt 1 ]; then
    /usr/bin/notify-send "Cardreader" "Ancora in uso" -u critical -t 5000 -i "/usr/share/icons/gnome/32x32/devices/media-flash.png" 2>/dev/null
    elif [ $SECURE -le 1 ]; then
    echo 0 > /sys/devices/platform/eeepc/cardr
    /usr/bin/notify-send "Cardreader" "Disabilitato" -u critical -t 5000 -i "/usr/share/icons/gnome/32x32/devices/media-flash.png" 2>/dev/null
    fi
    ;;
    *)
    /usr/bin/notify-send "Errore" "Problemi Cardreader" -u critical 2>/dev/null
    ;;
    esac
    }

    function toogle_bluetooth {
    for i in /sys/class/rfkill/*; do
    if [ -f "$i/name" ] && [ "$(cat "$i/name")" = "eeepc-bluetooth" ]; then
    BT_STATE=`cat "$i/state"`
    fi
    done

    case $BT_STATE in
    0)
    rfkill unblock bluetooth
    /usr/bin/notify-send "Bluetooth" "Abilitato" -u critical -t 5000 2>/dev/null
    ;;
    1)
    rfkill block bluetooth
    /usr/bin/notify-send "Bluetooth" "Disabilitato" -u critical -t 5000 2>/dev/null
    ;;
    *)
    /usr/bin/notify-send "Errore" "Problemi Blutooth" -u critical 2>/dev/null
    ;;
    esac
    }

    in queste due funzioni c'è come cambiare risoluzione come avviene con il tasto sull'eeepc 1000h e come disattivare il cardreader controllando che non sia utilizzato :)

    ottima guida ma arrivi in ritardo per essermi utile XD
    il mio bel script è già scritto da tempo sul mio 1000h.
    cmq per quanto riguarda la cosa del kernel e dei tasti funzione, penso che non sia così, dovrebbe essere udev a controllare i tasti e non direttamente il kernel.....

    RispondiElimina
  2. @Valantin
    credo che uno come te non avrebbe avuto comunque bisogno di questo howto :D

    anche io ce l'ho da tempo... è molto comodo, infatti avendo tutto in un file quando passo da una distro all'altra devo solo fare copia-incolla e sostituire il nome utente se diverso...

    grazie per le funzioni per la risoluzione e bluetooth vedrò di integrare domani (oggi)

    per quanto riguarda il cardreader a me ls -l /dev/disk/by-id/ | grep -c Single_Flash_Reader ritorna 2 avendo una SD nello slot nonostante non sia montata... quindi non lo disattiverebbe, però credo che la cosa possa dipendere anche da kde...

    RispondiElimina
  3. @Valantin
    ah per quanto riguarda i tastini e udev/kernel poi faccio una capatina su google e nel caso correggo

    RispondiElimina
  4. Utilissimo come al solito Melko, mi hai risparmiato una bel pò di ricerche sintetizzando il tutto in un' unica discussione!

    Grazie anche a te Valantin relativamente all'implementazione dei comandi del cardreader e risoluzione display.

    Ottimo davvero :)

    RispondiElimina
  5. wow davvero utilissimo! grazie e complimenti Melko!

    RispondiElimina
  6. ottima guida grandissimo melko
    curiostià così hai ancora problemi con le notifiche e per farle funzionare devi resettare acpid??

    RispondiElimina
  7. @Phoenix Fire
    nono ho risolto..
    come ho scritto sopra se lancio un applicazione grafica con il comando
    su melko -c 'comando' e avendo prima esportato la variabile DISPLAY=:0 partono bene anche le notifiche

    RispondiElimina
  8. @Valantin
    Sto dando un'occhiata alla funzione per la risoluzione, ma nel passaggio a 1024x768 dal bordo inferiore rimangono un paio di centimetri neri...
    forse è dovuto a kde

    RispondiElimina
  9. @Melko
    ottimo allora, ma quel trucco del display non me lo consigliasti già a suo tempo e sulla mia config non funzionava o sbaglio??

    RispondiElimina
  10. @Phoenix Fire
    infatti mi funziona solo se usato insieme al su -c ecc

    RispondiElimina
  11. @Phoenix Fire
    comunque molto dipende anche dalla distro in questione...
    con Sabayon non ho mai avuto nessun problema, posso lanciare le notifiche come mi pare e sono sempre apparse...
    su Slackware invece il problema c'è ma basta esportare la variabile DISPLAY per farle funzionare;
    su Frugalware invece non basta, addirittura li non funziona nemmeno se riavvio acpid, devo per forza metterci il comando per lanciarle da utente normale..

    altre distro non le ho al momento quindi più di cosi non ti so dire

    RispondiElimina
  12. @Melkook hai saziato la mia sete di conoscenza :D

    RispondiElimina
  13. @Melko è un problema tuo sicuramente.... su gnome ha sempre funzionato alla perfezione

    RispondiElimina
  14. ciaoooo mi sono finalmente deciso a farmi i miei script ma ho un paio di problemi
    1) fatto il file in events e fatto il file in acpi; premendo il tasto collegato lo script non viene eseguito (faccio notificare una cosa tanto per vedere se va)
    2) eseguendolo manualmente per vedere se funziona, mi viene chiesta la password, nonostante la inserisco mi viene dato "permission denied"

    RispondiElimina
  15. @Phoenix Fire
    se usi 'su' è normale che ti chieda la password (anche se lo fai su te stesso e non sull'utente root), strano invece che ti dia "permission denied", gli script li hai tutti in un file o hai un file per ogni script? nel secondo caso cosa fa lo script che stai provando?

    per quanto riguarda il fatto che non faccia niente, hai riavviato acpid? il codice del tasto corrispondente è giusto? ( nota che il primo termine che in genere è ATKD non è uguale per tutti... ad esempio a me su Fedora diventa ASUS)

    per vedere se funziona più che una notifica ti consiglio un echo su file cosi sei sicuro che non sia un problema di notifiche

    RispondiElimina
  16. visto che stavo imparando ho fatto uno script singolo per lo SHE per il discorso ATKD o ASUS, eccetera ho fatto acpi_listen e copincollato tutta la stringa (escluso of course la parte riguardante il numero di pressioni), ah poi altra cosa strana è che sto cercando di configurare i tasti argentati sul 901GO e un tasto (quello di ZOOM) produce due eventi acpid uno con asus e uno con ZOOM, come va gestita la cosa in questo caso?

    RispondiElimina
  17. @Phoenix Fire
    per quanto riguarda lo zoom si, alcuni tasti generano più di un evento... ad esempio anche quelli per regolare il volume... e in genere quando ciò accade significa che molto probabilmente non hai bisogno di usare acpid ma puoi benissimo impostare una shortcut direttamente dal tuo DE... comunque puoi anche usare l'evento acpi per fargli fare qualcosa (quello ASUS)...

    per quanto riguarda il primo punto, se lo script per lo she è piu o meno simile a quello che ho messo io sopra allora è normale che eseguendolo ti dia un "permission denied", perché la password che lui ti chiede non è quella dell'utente root (i vari echo per cambiare lo stato dello she non sono preceduti dal 'su' perché acpid usa gli script direttamente da root) ma quella del tuo utente (sempre se hai usato la forma 'su -c ....' per far partire le notifiche)... quindi non riesce a cambiare lo stato dello she perché non ha i privilegi, ma comunque dovrebbe apparirti la notifica...

    sul fatto invece che non ti funzioni quando usi il tasto è molto strano... se il nome dello script a cui l'evento punta è scritto correttamente e lo script è eseguibile allora deve funzionare...

    RispondiElimina
  18. lo script è uguale al tuo; ho anche provato a cambiare la variabile che usi sostituendo ad essa il percorso diretto con e senza virgolette per escludere eventuali problemi con le virgolette
    per il discorso permessi le password per root e utente sono uguali (lo so che per questioni di sicurezza non è molto prudente ma almeno è comodo :D) quindi non vedo perchè nn dovrebbe andare :D

    RispondiElimina
  19. dimenticavo non so se centra qualcosa ma io ho un demone acpid e uno kacpid è normale? non fanno la stessa cosa tipo?

    RispondiElimina
  20. @Phoenix Fire
    sisi riguardo kacpid è normale non preoccuparti...

    per quanto riguarda la password mi sono spiegato male, acpid viene eseguito con i privilegi di root quindi non ha bisogno di nient'altro... il fatto che ti chieda la password se tu esegui lo script da terminale come utente è perché per evitare potenziali problemi, le applicazioni grafiche come notifiche e via dicendo ho consigliato di farle lanciare da utente normale e non da root.. e per fare questo uso il comando su utente -c comando... quando acpid va ad eseguire lo script, siccome ha privilegi elevati, non ha nessun problema a impersonare te, mentre se tu lo esegui a mano con privilegi bassi, anche se vuoi impersonare te stesso ti viene chiesta la password... ma "permission denied" non ti è dato su quest'ultima, ma sulle operazioni che vengono svolte prima, che presuppongono i privilegi di root (e non c'entra nulla il fatto che tu abbia impostato la password di root uguale a quella dell'utente, lo script in quel momento non ti sta chiedendo privilegi elevati per fare qualcosa, perché quelli presuppone di averli già)


    comunque il modulo eeepc-laptop è caricato?
    se si dovresti ritrovarti tutti i file riguardanti she, webcam ecc nella cartella /sys/devices/platform/eeepc o giù di li...
    se ce li hai puoi provare anche a mettere temporaneamente qualche script "ufficiale", tipo quelli di arch, o anche jupiter (non eeecontrol perché funziona in modo diverso)... se non ti vanno nemmeno quelli il problema è a monte

    RispondiElimina
  21. ah ok ora ho capito il modulo è caricato tanto è vero che per gestire lo she ora sto facendo a mano con su-c 'echo bla bla bla'
    sono su fedora posso usare lo stesso quelli di arch? se si come?

    RispondiElimina
  22. mi sono autorisposto ricordando che tu ne consigliavi l'installazione su sabayon, sfruttando la tua guida ho installato gli script di arch funzionano però compare una notifica riguardante un problema
    acpi-generic-handler: undefined group/action e poi una parte che dipende dal tasto/combinazione che premo sai cosa può essere?

    RispondiElimina
  23. @Phoenix Fire
    funzionano in che senso? solo perché vedi la notifica o effettivamente riesci a cambiare lo she, ecc? perché a me quell'errore non fa pensare niente di buono...
    prova a postare l'errore completo anche della parte riguardante il tasto... casomai postalo anche ripetendolo per tasti differenti

    RispondiElimina
  24. funziona effettivamente mi cambia lo she e mi attiva/disattiva la webcam; l'errore riguardante il tasto è roba del tipo button/wireless (che ricordo al volo) gli altri appena posso li posto

    RispondiElimina
  25. @Phoenix Fire
    bene allora non c'è nessun problema, quindi non ci sono santi che tengano, lo script per lo she ti deve funzionare

    casomai prova a indirizzare tutti gli eventi in un unico script e in questo mettici che ti stampa su file le quattro variabili date dalla riga di acpi_listen (la parte COMPATTIAMO IL TUTTO della guida)...
    se te li prende allora puoi iniziare a modificare quel file scremandolo come ho specificato nella parte finale.

    RispondiElimina
  26. ok appena posso provo2 domande al volo come si stampa su file?? :D
    e per il messaggio di errore?

    RispondiElimina
  27. @Phoenix Fire
    per il messaggio di errore sono andato a rileggermi gli script di arch, e è un messaggio che da quando non riconosce l'hotkey... ma se te lo dava solo per il wifi non c'è da preoccuparsi perché il wifi funziona gia senza bisogno di script.

    Per stampare su file basta che reindirizzi l'output di echo... ad esempio per provare potresti fare:
    echo $1 $2 $3 >> /home/phoenix/acpi_log
    così ti stampa una riga corrispondente all'evento generato dalla pressione del tasto

    RispondiElimina
  28. me lo da per tutte le combinazioni di tasti funzione e per tutti i tasti argentati :D compresi wifi she volume luminosità camera cardreader per questo non mi sentirei di ignorarli :D

    RispondiElimina
  29. @Phoenix Fire
    se te lo da allora sei a cavallo...
    aggiungi un po di if-else a piacere come ho indicato nella guida e costruisciti anche tu i tuoi script...
    e non dimenticare la colla vinilica :D

    RispondiElimina
  30. mi sa che mi hai frainteso intendevo l'errore me lo da con tutto non solo col wifi e lo da anche se faccio gestire l'evento al sistema e non agli script (lascio vuoto il comando corrispettivo)
    pensavo che dicendo che nn mi sentirei di ignorarlo si capisse

    RispondiElimina
  31. @Phoenix Fire
    ah ok allora ho frainteso alla grande

    guardando il file acpi-eeepc-generic-handler.sh (che dovresti avere nella cartella /etc/acpi) questa è la sezione che ti riguarda:

    case "$1" in
    battery|processor)
    .....
    ....
    ....
    hotkey)
    .....
    .....
    *)
    msg="acpi-eeepc-generic-handler: undefined group/action ($1) event: $2 $3 $4"
    eeepc_notify "$msg" keyboard
    logger "$msg"
    ;;
    esac

    che non è altro che un costrutto condizionale sulla prima parola dell'output di acpi_listen (che per i tastini dovrebbe essere "hotkey")...
    quindi il fatto che entri nell'ultimo caso e ti dia quel messaggio significa l'evento generato dalla pressione del tasto non è tra quelli conosciuti e quindi non sa che farci...
    ora siccome hai detto che comunque a funzionare funzionano non riesco a capire come possa darti quel messaggio visto che non ci dovrebbe nemmeno entrare in quella parte di codice se funziona...
    l'unica spiegazione che mi viene in mente è che, se come hai detto, acpi_listen alla pressione di un tasto ti genera più di un evento, allora può darsi che l'evento 'hotkey ATDK 00000* ecc" venga visto e venga quindi eseguita la corrispettiva azione, mentre l'altro no.. però questo dovrebbe accaderti solo per quei tasti che generano più di un evento e non per tutti...

    comunque ti dicevo di ignorarli perché ti ho fatto mettere gli script di Arch solo per testare il corretto funzionamento di Acpid... l'importante è che l'evento ti venga catturato correttamente, perché è l'unica condizione necessaria e sufficiente.
    Quindi poi prova a far stampare su file quella robba che ti ho detto sopra e agisci di conseguenza.

    PS.
    Scusa se ti rispondo un giorno si e l'altro no, ma la ventola del mio eeepc è andata a farsi benedire e non impreco solo perché fortunatamente è inverno.

    RispondiElimina
  32. ok grazie per l'aiuto fino a adesso ora appena finisco il reinstall (che devo modificare le partizioni del net) mi butto sugli script
    per il tempo di risp nessun problema anzi grazie dell'impegno

    RispondiElimina
  33. MAGIA
    non so cosa sbagliavo prima o in cosa stavo antipatico al net ma ora funzionano sia gli script che le notifiche

    RispondiElimina
  34. domandina tecnica sulle notifiche, avrei l'esigenza di stampare a schermo dei numeri ottenuti con cat come faccio? leggendo gli script che scrisse a suo tempo lacunoso io avevo fatto una cosa del genere:

    CARD_ST=`cat /sys/devices/platform/eeepc/cardr`
    case "${CARD_ST}" in
    0)
    CARD=`echo Off`
    ;;
    1)
    CARD=`echo On`
    ;;
    *)
    CARD=`echo N/A`
    ;;
    esac
    su Giuseppe -c 'notify-send "EeePC Status" "Cardreader: ${CARD}" -t 2500 -i "/percorso/icona.png"'

    lo script mostra la notifica ma non mostra niente al posto della variabile, immagino sia un problema derivante dal fatto che io piazzo tutto il comando all'interno del su 'comando' cosa che forse modifica la sostituzione delle variabili (visto che sullo script originale si usava un altro metodo per le notifiche) hai idea di come possa risolvere questo problema?

    RispondiElimina
  35. @Phoenix Fire
    si naturalmente entrando in un ambiente differente non si porta dietro le variabili...
    hai due modi
    1)prima di stampare la notifica esportare la variabile
    export CARD

    2)passare la variabile al comando
    CARD=$CARD su Giuseppe -c blablabla

    a te la scelta...

    PS.
    se la variabile CARD assume solo valori fissi perché usi echo?
    bastava un
    CARD="on"
    CARD="off"
    e CARD="N/A"

    RispondiElimina
  36. quindi basta che a inizio script faccio
    export VAR per tutte le variabili e mettere nella stampa ${CARD}?

    la seconda è stata fatta per ignoranza ho visto che lacunoso fece così è ho pensato fosse quello il modo giusto visto che all'inizio con le "" non fungeva ignorando che il problema fosse un altro :D

    RispondiElimina
  37. volendo puoi anche assegnare un valore alla variabile mentre la esporti:
    export CARD="off"

    come vedi le vie dello scripting sono infinite :D

    RispondiElimina
  38. si però dovrei esportarla dentro l'if cosa che mi è scomoda visto che nello script io mi stampo lo stato di tutto il net (she, cardreader, cam eccetera)

    RispondiElimina
  39. @Phoenix Fire
    se lo script serve a stampare solo lo status delle varie periferiche non ti conviene metterlo in un file separato nella cartella bin della tua home e poi richiamarlo dagli script acpi?
    così lo puoi usare anche in altri contesti e ti risparmi anche di esportare variabili e di usare su -c ecc perché lo eseguiresti direttamente da root e non da utente ;)

    RispondiElimina
  40. spiegati meglio :D
    io farei uno script che stampa lo status e lo metto in bin, e lo faccio stampare tramite notify-send ma senza il su prima? e l'export display?
    ulima dopmanda da interrogatorio che cosa dovrei inserire nello script acpi?
    su utente -c "./script.sh"?

    RispondiElimina
  41. fai uno script e lo metti nella tua home o dove preferisci (io ce l'ho nella cartella ~/bin che è aggiunta nel PATH cosi anche da terminale posso richiamarlo ovunque)

    lo script fa normalmente quello che deve fare, senza l'uso di export DISPLAY, su -c e robba varia perché quelli li metti soltanto negli script acpi

    negli script acpi oltre a esportare la variabile DISPLAY dai un su -c '/home/utente/percorso/script.sh/' e il gioco è fatto

    RispondiElimina
  42. ok tra stasera e domani mi ci metto e faccio tutto

    RispondiElimina
  43. Salve a tutti, da qualche settimana mi trovo a frequentare questo blog, e mi sembra doveroso complimentarmi con tutti per l'ottimo lavoro svolto, e ringraziandovi per aver realizzato un portale italiano dedicato ai netbook in ambiente linux.
    Detto questo, devo dire di aver riscontrato qualche problemino con il mio asus 1215n:
    1)in /etc/acpi ho trovato i file per la gestione della luminosità e in events il file dove inserire il codice del tasto.
    Dopo aver fatto casini, credo di aver rimesso tutto a posto ma sfortunatamente la luminosità non funziona più
    posto i file in seguito:
    asus-brn-down.sh
    #!/bin/sh

    test -f /usr/share/acpi-support/key-constants || exit 0
    . /usr/share/acpi-support/key-constants
    acpi_fakekey $KEY_BRIGHTNESSDOWN

    e l'altro:

    event=hotkey (ATKD|HOTK) 0000002
    action=/etc/acpi/if-asus-not-eee.sh asus-brn-down.sh

    il mio tasto è questo:
    hotkey ASUS010:00 00000029
    (quando lo premo lo schermo lampeggia)
    (gli altri problemi riguardano il wireless e lo she ma è meglio affrontarli uno per volta)
    ringrazio anticipatamente tutti quelli che si interesseranno al problema.

    RispondiElimina
  44. di norma la luminosità è l'unica cosa che funziona senza complicazioni...
    ricordo che sugli eeepc più moderni bisognava aggiungere acpi_backlight=vendor tra i parametri del kernel nel file di configurazione di grub.

    Se non dovesse bastare prova a dare un'occhiata qua:
    http://wiki.daviddarts.com/Ubuntu_Maverick_on_the_Asus_UL30VT#Screen_Brightness_.28Backlight.29

    RispondiElimina

EDIT 30/12/2017: abbiamo deciso di chiudere i commenti ma lasciare le guide intatte.

Nota. Solo i membri di questo blog possono postare un commento.