Хотите поблагодарить автора блога - жмите здесь !
1 2 0
1 2 0

Нажмите на рекламный баннер выше, если хотите поблагодарить автора блога !
Написание каждой статьи заняло в сотни раз больше времени, чем один клик.

среда, июля 10, 2013

Подключение нескольких РАЗНЫХ принтеров к одному OPENWRT рутеру (серверу под линуксом).

Не секрет, что 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 порт.


Ну и сам скрипт:
#!/bin/sh

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
 Теги для поиска: OPENWRT connect several different printers, подключение несколькоих принтеров, расшаривание нескольких принтеров, принтера меняются местами, несовпадение драйверов принтера. подключение usb принтера на определенный порт.

Комментариев нет:

Отправить комментарий

Закрыть окно X
Пожалуйста, потратьте несколько секунд на поддержку блога и его автора
Нажмите на рекламную ссылку: Рекламная ссылка для поддержки блога, или на баннер вверху справа страницы.