По ходу обнаружилась некоторая неожиданность (тестировалось на hp deskjet 6122). Если принтер воткнут в usb, то, независимо от того включен он или выключен, он корректно определяется роутером, ему присваевается определенный порт, который за ним сохраняется. Если принтер откллчить от хаба и подключить к уже загруженному роутеру, то он не определяется никак. Требуется в любом случае перезагрузка. Скорее всего так оно и должно быть. В принципе приведенная программа должна корректно переназначить принтеры даже если бы их порядок изменился в процессе работы роутера. Так что вероятно она несколько переусложнена.
Принцип действия --- найти последнюю запись о назначении порта, проверить, что такой порт существует, если нет, то искать вторую с конца и т.д.
Исползьование:
кладем ее в /usr/local/sbin , не забываем сделать
PHP Code:
chmod +x detect_printer
и прописываем запуск в post-boot (для целей отладки можно запускать вручную)
detect_printer:
PHP Code:
#! /bin/sh
PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/bin:/usr/sbin
set -x
#Next line: last parameter from the output of: dmesg | awk '/printer\.c/ && /pid/{ print $0 }'
#
ppid0="0x1084" #pid of the printer which will be available on the port 9100
ppid1="0x1091" #pid of the printer which will be available on the port 9101
pname0="Canon i250" #symbolic name of the printer which will be available on the port 9100
pname1="Canon iP1500" #symbolic name of the printer which will be available on the port 9101
daemon="p910nd"
devprefix="/dev/usb/lp"
dmesg=`dmesg`
#dmesg=`cat /tmp/syslog.log`
#dmesg=`cat detect_printer.test`
#---------------------------------
#End of user configurable settings
#---------------------------------
#
#get all the lines which contain printer.c and pid in reverse order
a=`echo "$dmesg" | sort -r | awk '/printer\.c/ && /pid/{ print $0 }'`
IFS_old=$IFS
IFS="
"
for i in "$a" ; do
#check if there is /dev/usb/lp[01] entry corresponding to usblp[01] field
p=`expr "$i" : '.*usblp\([01]\).*'`
[ -c "$devprefix$p" ] && \
break
done
IFS=$IFS_old
[ "$i" = "" ] && \
logger -t detect_printer "No printers detected." && exit 1 || \
logger -t detect_printer "Detected: $i"
pid=`expr "$i" : '.*usblp[01].*pid[[:space:]]\(0x[[:xdigit:]]*\)'`
[ "$pid" != $ppid0 -a "$pid" != $ppid1 ] && \
logger -t detect_printer "Detected pid=$pid doesn't correspond to any of the listed ones." && exit 2
killall $daemon
case $pid in
$ppid0)
$daemon -f "$devprefix$p" 0 && \
logger -t detect_printer "$pname0 [pid=$ppid0] is attached as $devprefix$p. Listening on port 9100."
[ -c "$devprefix$((1-p))" ] && { \
$daemon -f "$devprefix$((1-p))" 1 && \
logger -t detect_printer "$pname1 [pid=$ppid1] is attached as $devprefix$((1-p)). Listening on port 9101."
} || \
logger -t detect_printer "$pname1 [pid=$ppid1] is not attached."
;;
$ppid1)
$daemon -f "$devprefix$p" 1 && \
logger -t detect_printer "$pname1 [pid=$ppid1] is attached as $devprefix$p. Listening on port 9101."
[ -c "$devprefix$((1-p))" ] && { \
$daemon -f "$devprefix$((1-p))" 0 && \
logger -t detect_printer "$pname0 [pid=$ppid0] is attached as $devprefix$((1-p)). Listening on port 9100."
} || \
logger -t detect_printer "$pname0 [pid=$ppid0] is not attached."
;;
esac
exit 0
Тестируйте во всех вариантах, докладывайте результаты.