Не секрет, что OPENWRT роутер, на простейшем железе (напр TP-LInk 1043ND), может быть далеко не только роутером, но и принт-сервером, и сервером накопителей данных (правда в этом случае медленноватым - 400МГЦ проца это 400 мгц), и офисной АТС, и выполнять множество других функций, и это все на одном устройстве ценой менее 500 гривень.
Сегодня речь пойдет о подключении принтеров. В самом по себе подключении принтеров никаких особых проблем нет, и как это делается легко можно найти опасание в факах по самому проекту OPENWRT (http://wiki.openwrt.org/ru/toh/start). Но проблема возникает когда Вы хотите подключить несколько принтеров и все разные. Самому рутеру все равно - он их подключает "на раз", но вот при перезагрузке, они могут меняться местами, а все клиентские машины, с которых вы печатаете, предаолагают использование определенных драйверов к определенному принтеру, и как только "они поменялись местами" - "печати приходит каюк". При чем это собсно касается почти любого линукс сервера.
Ниже предложен небольшой скрипт, "раз и навсегда" решающий эту проблему.
Сначала находим нужные нам данные по каждому принтеру. Вставляем кабель каждого принтера в гнездо USB USB-хаба, подключенного к рутеру,, после чего в строке лога, ищем строку приблизительно такого вида:
"usb-modeswitch: 1-1.1:1.0: Manufacturer=Hewlett-Packard Product=hp_LaserJet_1300n Serial=00CNBB043995"
После чего, для каждого принтера, создаем в каталоге /etc/hotplug.d/usb/, скрипт, с имеенем принтера (чтобы самим понятнее было), только перед названием ставим 21-. В данном примере это файл 21-hp1300. Не забываем сделать его исполняемым.
В начале скрипта, параметры:
SYMLINK="HP1300N"
PRODUCT="hp_LaserJet_1300n"
SERIAL="00CNBB043995"
Заменяем на те что мы получили из анализа строки лога для каждого конкретного принтера. Ну и понятно, что для каждого подключенного принтера, копируем этот же скрипт, переименовываем в название нового принтера, и меняем указанные 3 параметра. Первый параметр - это имя, которое получит данный конкретный принтер в каталоге /dev/usb (в данном случае имя девайса для принтера из примера всегда будет /dev/usb/HP1300N). Соответственно, после расшаривания, клиенты всегда будут обращаться к выбранному ими принтеру, не зависимо от того, сколько принтеров Вы физически подключили к серверу, и проблем "несовпадения драйверов" и "того что принтеры меняются местами" пропадет навсегда. Да, параметры PRODUCT и SERIAL - это данные из строки лога, о которой выше, по которым ведется поиск принтера, который необходимо подключить на указанный в строке SYMLINK порт.
Ну и сам скрипт:
Сегодня речь пойдет о подключении принтеров. В самом по себе подключении принтеров никаких особых проблем нет, и как это делается легко можно найти опасание в факах по самому проекту OPENWRT (http://wiki.openwrt.org/ru/toh/start). Но проблема возникает когда Вы хотите подключить несколько принтеров и все разные. Самому рутеру все равно - он их подключает "на раз", но вот при перезагрузке, они могут меняться местами, а все клиентские машины, с которых вы печатаете, предаолагают использование определенных драйверов к определенному принтеру, и как только "они поменялись местами" - "печати приходит каюк". При чем это собсно касается почти любого линукс сервера.
Ниже предложен небольшой скрипт, "раз и навсегда" решающий эту проблему.
Сначала находим нужные нам данные по каждому принтеру. Вставляем кабель каждого принтера в гнездо USB USB-хаба, подключенного к рутеру,, после чего в строке лога, ищем строку приблизительно такого вида:
"usb-modeswitch: 1-1.1:1.0: Manufacturer=Hewlett-Packard Product=hp_LaserJet_1300n Serial=00CNBB043995"
После чего, для каждого принтера, создаем в каталоге /etc/hotplug.d/usb/, скрипт, с имеенем принтера (чтобы самим понятнее было), только перед названием ставим 21-. В данном примере это файл 21-hp1300. Не забываем сделать его исполняемым.
В начале скрипта, параметры:
SYMLINK="HP1300N"
PRODUCT="hp_LaserJet_1300n"
SERIAL="00CNBB043995"
Заменяем на те что мы получили из анализа строки лога для каждого конкретного принтера. Ну и понятно, что для каждого подключенного принтера, копируем этот же скрипт, переименовываем в название нового принтера, и меняем указанные 3 параметра. Первый параметр - это имя, которое получит данный конкретный принтер в каталоге /dev/usb (в данном случае имя девайса для принтера из примера всегда будет /dev/usb/HP1300N). Соответственно, после расшаривания, клиенты всегда будут обращаться к выбранному ими принтеру, не зависимо от того, сколько принтеров Вы физически подключили к серверу, и проблем "несовпадения драйверов" и "того что принтеры меняются местами" пропадет навсегда. Да, параметры PRODUCT и SERIAL - это данные из строки лога, о которой выше, по которым ведется поиск принтера, который необходимо подключить на указанный в строке SYMLINK порт.
Ну и сам скрипт:
#!/bin/shТеги для поиска: OPENWRT connect several different printers, подключение несколькоих принтеров, расшаривание нескольких принтеров, принтера меняются местами, несовпадение драйверов принтера. подключение usb принтера на определенный порт.
SYMLINK="HP1300N"
PRODUCT="hp_LaserJet_1300n"
SERIAL="00CNBB043995"
ISPRINTER="/usb/lp"
sanitize() {
sed -e 's/:space:\+$//; s/:space:\+/_/g' "$@"
}
local usb_dir="/sys/$DEVPATH"
info_dir=${usb_dir%/*}
info_dir=${info_dir%/*}
info_dir=${info_dir%/*}
echo $usb_dir | grep $ISPRINTER > /dev/null
#Exit if not a printer at the stage, where we can set or remove symlink
if [ "$?" -ne "0" ]; then
exit
fi
#==============================ACTION BEGIN $ACTION===================================
if [ "${ACTION}" = "add" ];
then
ADDDEV=`expr match "$usb_dir" '.*\(/lp[0-9]*\)'`
ADDDEV=/dev/usb$ADDDEV
Cproduct=$(sanitize "$info_dir/product")
Cserial=$(sanitize "$info_dir/serial")
echo $Cproduct | grep $PRODUCT > /dev/null
#Exit if it is other product
if [ "$?" -ne "0" ]; then
exit
fi
echo $Cserial | grep $SERIAL > /dev/null
#Exit if it is other serial
if [ "$?" -ne "0" ]; then
exit
fi
logger -t Connect $ADDDEV as printer /dev/usb/$SYMLINK
ln -s $ADDDEV /dev/usb/$SYMLINK
fi
if [ "${ACTION}" = "remove" ];
then
REMDEV=`expr match "$usb_dir" '.*\(/lp[0-9]*\)'`
ls -l /dev/usb | grep $REMDEV| grep $SYMLINK > /dev/null
if [ "$?" -eq "0" ]; then
logger -t Delete printer /dev/usb/$SYMLINK
rm /dev/usb/$SYMLINK
fi
fi
Комментариев нет:
Отправить комментарий