Несколько лет назад я писал статью про создание роутера с функционалом аналогичным обычному домашнему роутеру:
http://www.lissyara.su/articles/freebsd ... fi_router/
Прошло время, сдохла старая материнка, да и Wi-fi мне перестал быть нужным. На земену ей была куплена материнка
http://www.intel.com/content/www/us/en/ ... 500cc.html
На ней также был запилен роутер. Но одна недоработка все это время меня немного напрягала. Эта недоработка заключалась в том, что моя МФУшка Canon PIXMA MP540 была подключена к моей машине. Соответственно все, кому нужно было что-нибудь отсканировать, прибегали ко мне...
К тому же моя машина работает под linux, а второй домашний компьютер работает под Win7. Поэтому принтер был расшарен через Samba и периодически отваливался (Да, у меня кривые руки и я не могу настроить Самбу нормально
![Smile :)](./images/smilies/smile.gif)
Что было решено сделать:
1) подключить МФУ к FreeBSD роутеру через USB
2) Расшарить принтер при помощи CUPS и печатать при помощи кроссплатформенного протокола IPP
3) Дать доступ к сканеру через WEB (сначала была идея расшарить сканер при помощи встроенных сетевых средств sane, но потом я решил, что через веб-морду будет удобнее).
Приступаем. Предполагаем, что внутреняя подсеть 192.168.0.0/24, а шлюз с фряхой - 192.168.0.1
По устройствам в ядре точно сказать не могу, но думаю, что понадобятся такие:
Код: Выделить всё
device usb # USB Bus (required)
device ulpt # Printer
# Эти устройства вам нужны, если вы собираетесь пользоваться встроенным в МФУ кардридером
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device umass # Disks/Mass storage - Requires scbus and da
Код: Выделить всё
# dmesg | grep -i canon
ugen4.5: <Canon> at usbus4 # как выяснилось позднее - это сканер
ulpt0: <Canon MP540 series, class 0/0, rev 2.00/1.02, addr 5> on usbus4 # это принтер
umass3: <Canon MP540 series, class 0/0, rev 2.00/1.02, addr 5> on usbus4 # у MP540 есть встроенный кардидер, я им не пользуюсь
da3: <Canon MP540 series 0102> Removable Direct Access SCSI-2 device # теоретически если воткнуть в кардридер чего-нибудь - это устройство потом можно будет смонтировать
1) CUPS (Common Unix Printing System) - Сам сервер печати
Код: Выделить всё
# cd /usr/ports/print/cups-base/ && make install clean
Предупреждение: сборка этого порта тянет за собой чертову кучу графбиблиотек, будьте готовы к долгому процессу сборки. Также при сборке этого пакета будут подтянуты библиотеки pango и cairo (Внимание: ОБЯЗАТЕЛЬНО соберите их с поддержкой X11, иначе последующие пакеты будут ругаться на ее отсутствие у этих библиотек)
Код: Выделить всё
# cd /usr/ports/print/gutenprint-base/ && make install clean
Код: Выделить всё
# Важный момент: Без директивы ServerName вы, скорее всего, не сможете печатать с других компьютеров, а по умолчанию она не прописана.
# Она отвечает за то, с каким именем хоста принимать запросы от клиентов. Когда директива не прописана - в качестве имени хоста используется имя машины. Сюда лучше вписать IP адрес, на котором будет слушать CUPS
# Симптомы: Работает печать с локальной машины, работает тестовая печать, но не работает печать с других компов.
# Отдельные индивидуумы на форумах советуют при такой проблеме патчить файл hosts на клиенте. Не поддавайтесь на провокации, все можно сделать гораздо проще и правильнее :)
ServerName 192.168.72.1
SystemGroup wheel
# По умолчанию стоит localhost:631, т.е. доступ будет только с локальной машины.
Listen 192.168.72.1:631
Listen /var/run/cups.sock
LogLevel error
# Обнаружение принтера мне нафиг не нужно, поэтому отключаю.
Browsing Off
# По умолчанию включаем авторизацию (используются системные пользователи)
DefaultAuthType Basic
WebInterface Yes
<Location />
# За доступ к принтерам отвечает этот подраздел конфига. Я разрешаю доступ к нему без аутентификации и только из локальной сети.
AuthType None
Order allow,deny
Allow 192.168.0.0/24
</Location>
<Location /admin>
# Доступ к администрированию принтеров. Кому попало и что попало менять нельзя. Поэтому тут уже аутентификация (определено директивой BrowseLocalProtocols) и доступ только из локальной сети.
AuthType Default
Order allow,deny
Allow 192.168.0.0/24
</Location>
<Location /admin/conf>
# Непонятно, за что отвечает этот раздел. Сделал такой же доступ как к администрированию.
AuthType Default
Order allow,deny
Allow 192.168.0.0/24
</Location>
# Далее идут всевозможные разграничения, кому и что можно делать. Меня вполне устраивают стандартные.
<Policy default>
JobPrivateAccess default
JobPrivateValues default
SubscriptionPrivateAccess default
SubscriptionPrivateValues default
<Limit Create-Job Print-Job Print-URI Validate-Job>
Order deny,allow
</Limit>
<Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job CUPS-Get-Document>
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
<Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default CUPS-Get-Devices>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Cancel-Job CUPS-Authenticate-Job>
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
<Limit All>
Order deny,allow
</Limit>
</Policy>
<Policy authenticated>
JobPrivateAccess default
JobPrivateValues default
SubscriptionPrivateAccess default
SubscriptionPrivateValues default
<Limit Create-Job Print-Job Print-URI Validate-Job>
AuthType Default
Order deny,allow
</Limit>
<Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job CUPS-Get-Document>
AuthType Default
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
<Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Cancel-Job CUPS-Authenticate-Job>
AuthType Default
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
<Limit All>
Order deny,allow
</Limit>
</Policy>
BrowseWebIF Yes
Код: Выделить всё
# echo 'cupsd_enable="YES"' >> /etc/rc.conf
Код: Выделить всё
# /usr/local/etc/rc.d/cupsd restart
Код: Выделить всё
# sockstat -l | grep cups
root cupsd 3047 7 tcp4 192.168.0.1:631 *:*
root cupsd 3047 8 stream /var/run/cups.sock
https://192.168.0.1:631/admin
Тут вас спросят пароль от root. Внимание: после ручной правки конфига cups большинство "галочек" в веб-морде показывают хрен пойми чего. Поэтому не очень-то им доверяйте
Нажимаем кнопку "Добавить принтер": Ага, принтер определился, но почему-то в двух ипостасях. Выбираем первую: Даем принтеру имя. Внимание: это имя будет использоваться при обращении к принтеру из клиента печати!
Поэтому для удобства даем ему достаточно короткое и простое имя в латинской раскладке. Обращаем внимание на строку "Подключение" и ее значение "usb:/dev/ulpt0"
/dev/ulpt0 - это и есть устройство принтера. Разумеется, включаем общий доступ к принтеру. В этом окне выбираем драйвер принтера (Производитель Canon, модель MP540). так как я без понятия - какой из драйверов мне надо, то выбираем тот, где есть подпись "ru"
![Smile :)](./images/smilies/smile.gif)
<<Здесь должен был быть скриншот... К сожалению не больше 5 вложений в сообщение>>
Все, принтер настроен:
<<Здесь должен был быть скриншот... К сожалению не больше 5 вложений в сообщение>>
Конфигурации всех принтеров будут храниться в /usr/local/etc/cups/printers.conf. После добавления принтера он будет выглядить подобным образом:
Код: Выделить всё
# Printer configuration file for CUPS v1.5.4
# Written by cupsd on
# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING
<Printer Canon>
UUID urn:uuid:127948e7-0ba2-311b-6e44-1b2c87d04d7a
Info Canon MP540 series
Location GATE
MakeModel Canon PIXMA MP540 - CUPS+Gutenprint v5.2.8
DeviceURI usb:/dev/ulpt0
State Idle
StateTime 1376160812
Type 36876
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy stop-printer
</Printer>
Нам надо "инструктировать" devfs, чтобы она назначала определенные права устройству "/dev/ulpt0". Это делается при помощи файла /etc/devfs.rules и /etc/rc.conf . Приводим его к такому виду:
Код: Выделить всё
[operator=5]
add path ulpt0 mode 0660 group cups
Код: Выделить всё
devfs_system_ruleset="operator"
Перезапускаем devfs:
Код: Выделить всё
# /etc/rc.d/devfs restart
Проверяем, подхватились ли правила:
Код: Выделить всё
# devfs rule show
100 path ulpt0 group cups mode 660
Код: Выделить всё
# chown root:cups /dev/ulpt0
Проверяем, есть ли права на запись в устройство у группы "cups":
Код: Выделить всё
# ls -la /dev/ulpt0
crw-rw---- 1 root cups 0, 137 10 авг 23:02 /dev/ulpt0
Ниже привожу примеры настройки и скриншоты клиентов печати Windows 7 и Ubuntu (KDE):
1) KDE
<<Здесь должен был быть скриншот... К сожалению не больше 5 вложений в сообщение>>
2) Windows 7
<<Здесь должен был быть скриншот... К сожалению не больше 5 вложений в сообщение>>
Предположим, что принтер настроен и печать работает. Теперь настраиваем сканер и веб-интерфейс к нему.
Устанавливаем пакеты:
1) sane-backends (Собственно сам пакет sane и утилиты для работы со сканером из командой строки)
Код: Выделить всё
# cd /usr/ports/graphics/sane-backends && make install clean
Код: Выделить всё
# cd /usr/ports/graphics/sane-frontends && make install clean
Код: Выделить всё
# cd /usr/ports/graphics/ImageMagick-nox11 && make install clean
Если наткнетесь - пожалуйста напишите в обсуждение и я добавлю информацию в статью.
В качестве веб-морды я использую phpsane, так как он достаточно прост в настройке и освоении. Однако для его работы необходим веб-сервер и установленный php. Лично я использую lighttpd+php53( Внимание: сначала я пытался использовать yaws, однако там были косяки с скачиванием файлов, поэтому я вернулся к lighttpd). Поскольку настройка и установка php и lighttpd неоднократно рассматривалась и обсасывалась, я только распишу моменты, в которых могут возникнуть вопросы:
- создатель phpsane обозвал главную страницу "phpsane.php", а не index.php. Я хотел обращаться к веб-серверу без принудительного указания страницы,
поэтому в конфиг lighttpd я добавил такую строку:
Код: Выделить всё
index-file.names += ( "phpsane.php" )
Я повесил веб-сервер на порт 8800 и запустил его:
Код: Выделить всё
# sockstat -l
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
www lighttpd 10479 4 tcp4 192.168.0.1:8800 *:*
http://sourceforge.net/projects/phpsane/
Внутри архива находится папка, к которой надо предоставить доступ веб-серверу. Если вы все запустили правильно, то при заходе на веб-интерфейс у вас будет отображаться что-то вроде:
![Изображение](http://a.fsdn.com/con/app/proj/phpsane/screenshots/phpSANE.png)
Однако это еще не все, ведь сервер работает с правами пользователя www, у которого нет прав на чтение со сканера! Для этого добавляем пользователя www во встроенную группу "operator":
Код: Выделить всё
# pw groupmod operator -m www
Пробуем найти наш сканер:
Код: Выделить всё
# sane-find-scanner -q
found USB scanner (vendor=0x04a9 [Canon], product=0x1730 [MP540 series]) at libusb:/dev/usb:/dev/ugen4.5
Сканер нашелся. Ключевое устройство - /dev/ugen4.5. Однако это устройство является ссылкой на "/dev/usb/4.5.0":
Код: Выделить всё
# ls -la /dev/ugen4.5
lrw-rw---- 1 root wheel 9 9 авг 23:20 /dev/ugen4.5 -> usb/4.5.0
Код: Выделить всё
[operator=5]
# это добавлено для сканера
add path ugen4.5 mode 0660 group operator
add path usb/4.5.0 mode 0660 group operator
# это было добавлено для принтера
add path ulpt0 mode 0660 group cups
Как видно - мы в одном профиле устанавливаем права как для устройства принтера, так и для устройства сканера.
После добавления правил для сканера лучше сразу перезагрузиться, чтобы избежать пересоздания ссылок и установки прав в ручном режиме.
Проверяем, что получилось:
Код: Выделить всё
# ls -la /dev/ugen4.5
lrw-rw---- 1 root operator 9 11 авг 00:10 /dev/ugen4.5 -> usb/4.5.0
# ls -la /dev/usb/4.5.0
crw-rw---- 1 root operator 0, 124 11 авг 00:10 /dev/usb/4.5.0
Теперь все в порядке, можно сканировать. Заходим на
http://192.168.0.1:8800
Выбираем нужные настройки, имя файла и т.д. и нажимаем кнопку "Сканировать". Если все сделано верно - под кнопками будут появляться ссылки на файлы сканов.
Если нет - ковыряем лог веб-сервера на предмет ошибок.
Жду ваших комментариев