A mój skaner działa i /etc/rc.d/scanner (moje wypociny).

Jakoś zawsze mnie to zniechęcało, żeby zainstalować skaner. Może dlatego że miałem jakieś dziwne how-to, wczoraj zacząłem instalować skaner z urządzenia wielofunkcyjnego Lexmark X73 (drukarka działa bezproblemowo). Na początek:

pacman -S sane xsane

Jak się zainstalowało, to uruchamiam z roota, jakieś pierwsze wyszukiwania skanera

sane-find-scanner

i wykryło go. Wchodzę na usera, też wykryło. Odpalam ze swojego konta xsane, a tu błąd, nie ma urządzenia, brak dostępu albo coś tam innego (było podane kilka możliwości). Odpalam z roota i jest, działa. No to już wiem, że coś nie tak z prawami dostępu. Poszukałem trochę w googlach i znalazłem archowe how-to w wersji Polskiej. Robie jak trzeba, ale nie działa. I tu zaczeły się klocki. Szukałem, cudowałem i nic. Okazało się, że skaner bierze nie z /dev/??? ale z /proc/bus/usb/???/???. A że udev operuje na /dev/, a za /proc/bus/usb jest odpowiedzialny hotplug. Szkoda, że tyle cudowałem z tym, zanim się tego dowiedziałem z forum.slackware.pl.

Dodawałem grupy, edytowałem reguły udeva, nic - kompletnie. Co prawda jakieś tam pliki z /dev dostawały prawa takie jak ustawiłem w udev, ale to nic nie dawało. Cały czas od kiedy wiedziałem, że to /proc/bus/usb/???/??? miałem alternatywę w stylu:

/etc/rc.localchmod 664 /proc/bus/usb/???/??? && chgrp scanner /proc/bus/usb/???/???

tylko że tą alternatywę sobie zostawiałem na ostateczność, bo chciałem to przez udeva zrobić. W momencie kiedy przeczytałem, że udevem tego nie zrobie to mój plan b stał się planem a. Jako, że trzeba było to załatwić skryptem startowym, to pozwoliłem sobie napisać skrypt do nadawanai praw dla odpowiednich plikół skanera w bashu.
/etc/conf.d/scanner

  1. # New group name
  2. GROUP=scanner
  3. # Default group name
  4. GROUPD=root

/etc/rc.d/scanner

  1. #!/bin/bash
  2. . /etc/rc.conf
  3. . /etc/rc.d/functions
  4. # config
  5. if [ -e /etc/conf.d/scanner ]; then
  6. . /etc/conf.d/scanner
  7. else
  8. echo "Could not load configuration file!"
  9. echo "Using default configuration."
  10. GROUP="users"
  11. GROUPD="root"
  12. fi
  13. CONN=`sane-find-scanner | grep libusb | wc -l`
  14. if [ $CONN -gt 0 ]; then
  15. PORT=`sane-find-scanner | grep libusb | cut -d : -f 2`
  16. LINE=`sane-find-scanner | grep libusb | cut -d : -f 3`
  17. PORTS_CMD=`sane-find-scanner | grep libusb | cut -d : -f 2 | cut -d ' ' -f $CONN`
  18. LINES_CMD=`sane-find-scanner | grep libusb | cut -d : -f 3 | cut -d ' ' -f $CONN`
  19. fi
  20. case "$1" in
  21. start)
  22. stat_busy "Starting share scanner"
  23. if [ $CONN -lt 1 ]; then
  24. stat_fail
  25. echo "No scanners found!"
  26. elif [ $CONN == 1 ]; then
  27. chmod g+rw /proc/bus/usb/$PORT/$LINE && chgrp $GROUP /proc/bus/usb/$PORT/$LINE
  28. if [ $? -gt 0 ]; then
  29. stat_fail
  30. else
  31. stat_done
  32. fi
  33. elif [ $CONN -gt 1 ]; then
  34. I=0
  35. for PORTS in $PORTS_CMD; do
  36. array=($PORTS $I)
  37. I=$[$I + 1]
  38. X=0
  39. for LINES in $LINES_CMD; do
  40. if [ $X == ${array[1]} ]; then
  41. chmod g+rw /proc/bus/usb/${array[0]}/$LINES && chgrp $GROUP /proc/bus/usb/${array[0]}/$LINES
  42. if [ $? -gt 0 ]; then
  43. stat_fail
  44. else
  45. stat_done
  46. fi
  47. fi
  48. X=$[$X + 1]
  49. done
  50. done
  51. fi
  52. ;;
  53. stop)
  54. stat_busy "Stopping share scanner"
  55. if [ $CONN -lt 1 ]; then
  56. stat_fail
  57. echo "No scanners found!"
  58. elif [ $CONN == 1 ]; then
  59. chgrp $GROUPD /proc/bus/usb/$PORT/$LINE
  60. if [ $? -gt 0 ]; then
  61. stat_fail
  62. else
  63. stat_done
  64. fi
  65. elif [ $CONN -gt 1 ]; then
  66. I=0
  67. for PORTS in $PORTS_CMD; do
  68. array=($PORTS $I)
  69. I=$[$I + 1]
  70. X=0
  71. for LINES in $LINES_CMD; do
  72. if [ $X == ${array[1]} ]; then
  73. chgrp $GROUPD /proc/bus/usb/${array[0]}/$LINES
  74.  
  75. if [ $? -gt 0 ]; then
  76. stat_fail
  77. else
  78. stat_done
  79. fi
  80. fi
  81. X=$[$X + 1]
  82. done
  83. done
  84. fi
  85. ;;
  86. *)
  87. echo "usage: $0 {start|stop}"
  88. esac
  89. exit 0

Skrypt sam wyszukuje skanery, nadaje prawa rw (zapis+odczyt) dla grupy GROUP (z pliku /etc/conf.d/scanner). Działa u mnie wyśmienicie, sprawdzałem na kilku skanerach też działa. Także myślę, że powinno być ok.

Po co napisałem ten skrypt? Czasami jest tak, że komputer chodzi sobie, a skaner się odpina od USB i wtedy zmienia się port (zależy) i linia (ja to tak nazwałem, co to dokłanie jest to nie wiem). Defaultowo jest powiedzmy /proc/bus/usb/004/003 (dla mojego skanera), ale kiedy odepne go od USB, podepne za chwilę ponownie to już mam /proc/bus/usb/004/011 (przykład) - właśnie dlatego powstał ten skrypt. W celu zautomatyzowania tego procesu, żeby się nie martwić. W każdej chwili można zdjąć prawa wywołując /etc/rc.d/scanner stop.