Alkoi ärsyttää se, että hiiri herättää koneen valmiustilasta. Netistä löytyy paljon ohjeita, joissa herätys estetään tyyliin
echo disable | sudo tee /sys/bus/usb/devices/*/power/wakeup
Yritin noudattaa tätä neuvoa, mutta sain Invalid argument -virheilmoituksia. Päättelin, että kernel varmaankin suojaa sisuksiaan nykyään paremmin. Oli jo aikakin.
Päädyin tähän ratkaisuun:
#!/bin/bash
rules=/etc/udev/rules.d/90-usb-wakeup.rules
format=(
'ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb",'
'ATTRS{idVendor}=="%s", ATTRS{idProduct}=="%s",'
'ATTRS{power/wakeup}="disabled"'
)
format=${format[@]}
for file in /sys/bus/usb/devices/*/power/wakeup
do
[[ $(cat $file) == enabled ]] || continue
d=${file%/power/wakeup}
printf "$format\n" $(cat $d/idVendor) $(cat $d/idProduct)
done | sudo tee -a $rules
Aiempaan verrattuna tässä on se hyvä puoli, että estosta jää jälki, jonka avulla eston voi perua; sääntötiedoston voi poistaa helposti. Sekin on hyvä puoli, että näin lyhyt koodinpätkä on helppo lukea.
Mutta tämä komentotiedosto täytyy suorittaa sokkona. Teki mieli kirjoittaa viimeinen rivi muotoon
done # | sudo tee -a $rules # uncomment for immediate effect
Tein siitä sitten interaktiivisemman version:
#!/bin/bash
rules=/etc/udev/rules.d/90-usb-wakeup.rules
format=(
'ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb",'
'ATTRS{idVendor}=="%s", ATTRS{idProduct}=="%s",'
'ATTRS{power/wakeup}="disabled"'
)
format=${format[@]}
comment(){
for f in iManufacturer iProduct manufacturer product
do
[[ -f $1//$f ]] && printf " $(cat $1/$f)"
done
}
pick(){
zenity --list --checklist \
--title 'Estä herätys valmiustilasta' \
--text 'Herätys on sallittu näille:' \
--ok-label 'Jatka' --cancel-label 'Peru' \
--column '' --column '' --column 'USB-laite' \
--hide-column 2 --print-column 2 --separator ' ' \
"$@" || exit # cancel button
}
advice(){
echo "
Esto tulee voimaan kun USB-laite kytketään uudelleen.
Voit palauttaa herätyksen poistamalla estosäännöt:
sudo rm $rules
"
}
menu=()
for file in /sys/bus/usb/devices/*/power/wakeup
do
[[ $(cat $file) == enabled ]] || continue
d=${file%/power/wakeup}
menu+=( true $d "$(comment $d)" )
done
for d in $(pick ${menu[@]})
do
echo "#$(comment $d)"
printf "$format\n" $(cat $d/idVendor) $(cat $d/idProduct)
done | sudo tee -a $rules && advice
... ja työn touhussa totesin, että ainoa USB-laite, joka herättää koneen, on Logitech Universal Receiver, eikä siihen paritettuja laitteita voi estää yksitellen. Plääh.