Sane - подключаем сканер или МФУ к маршрутизатору

Используем пакеты, расширяющие возможности оборудования
Ant
Сообщения: 6
Зарегистрирован: 03 июн 2020, 11:46

Сообщение Ant » 03 июн 2020, 12:15

Надеюсь, информация кому-то пригодится.

Имеем - Keenetic Ultra (KN-1810). До этого много лет были самый первый (белый Keenetic), потом Giga II (черный).

До вчерашнего дня не имел каких-либо проблем со сканером (saned + xinetd + sanetwain.ozuzo.net).

Вчера внезапно все перестало работать. Из изменений в Keenetic: несколько дней назад была обновлена прошивка (3.3.16 -> 3.4.3), и вчера был установлен php7-cgi.

Что удалось понять: проблема в том, что saned не пускает клиента. Просто отказывает ему в доступе.

Лог при прямом запуске из консоли:

Код: Выделить всё

~ # saned -led128
[saned] read_config: searching for config file
[saned] read_config: done reading config
[saned] saned (AF-indep+IPv6) from sane-backends 1.0.29 starting up
[saned] do_bindings: trying to get port for service "sane-port" (getaddrinfo)
[saned] do_bindings: " sane-port " service unknown on your host; you should add
[saned] do_bindings:      sane-port 6566/tcp saned # SANE network scanner daemon
[saned] do_bindings: to your /etc/services file (or equivalent). Proceeding anyway.
[saned] do_bindings: [1] socket () using IPv6
[saned] do_bindings: [1] setsockopt ()
[saned] do_bindings: [1] bind () to port 6566
[saned] do_bindings: [1] listen ()
[saned] do_bindings: [0] socket () using IPv4
[saned] do_bindings: [0] setsockopt ()
[saned] do_bindings: [0] bind () to port 6566
[saned] do_bindings: [0] bind failed: Address already in use
[saned] run_standalone: waiting for control connection
[saned] handle_client: spawning child process
[saned] handle_connection: processing client connection
[saned] check_host: detected an IPv4-mapped address
[saned] check_host: access by remote host: ::ffff:192.168.1.48
[saned] check_host: remote host is not IN_LOOPBACK nor IN6_LOOPBACK
[saned] check_host: local hostname: Keenetic_Ultra
[saned] check_host: getaddrinfo for local hostname failed: Temporary failure in name resolution
[saned] init: access by host ::ffff:192.168.1.48 denied
[saned] quit: exiting


Лог при запуске через xinetd:

Код: Выделить всё

saned (AF-indep+IPv6) from sane-backends 1.0.29 starting up
check_host: access by remote host: 192.168.1.48
check_host: getaddrinfo for local hostname failed: Temporary failure in name resolution
init: access by host 192.168.1.48 denied
saned exiting


В файле конфигурации saned.conf IP явно разрешен.

В итоге танцев с бубном проблему удалось решить следующим путем: идем в админку кинетика -> "Общие настройки", находим блок "Параметры системы", меняем в поле "Имя системы" буквенное название на IP адрес. При чем, любой IP адрес. Но лучше все же поставить "192.168.1.1".

Смысл в том, что по какой-то неведомой причине saned отказывает в доступе клиенту (даже если IP клиента разрешен в конфиге), если ему не удается по имени кинетика установить IP адрес кинетика. Имя задается в поле "Имя системы" в админке кинетика. Там можно указать цифры с точками и тогда, видимо, saned удовлетворяется этим и работает дальше. При этом ему не важно, какой именно там IP указан. Прикол в том, что можно любые цифры там написать, главное, чтобы не было букв.

Почему saned прекращает работу если не удалось получить IP по имени - загадка, так как IP клиента у него есть, как и есть белый список. А IP кинетика ему нужен только для того, чтобы понять, не пришел ли запрос от локального клиента, запущенного на самом кинетике.

В общем, такая штука. Если есть возможность внутри saned поправить такое поведение - будет здорово!

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1913
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 03 июн 2020, 12:26

Ant, скорее всего достаточно имя прописать в /etc/hosts - прямо в скрипте запуска (xinetd или создать отдельный) дописать строку в конец этого файла (лучше с контролем, что строки нет).

Ant
Сообщения: 6
Зарегистрирован: 03 июн 2020, 11:46

Сообщение Ant » 03 июн 2020, 12:35

Zyxmon, это было бы идеально, но у кинетика, как я понимаю, /etc/hosts - в разделе файловой системы с readonly. И как туда что-то запишешь? Или что-то поменялось?

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1913
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 03 июн 2020, 12:59

Ant писал(а):Источник цитаты /etc/hosts - в разделе файловой системы с readonly

Нет это ссылка на /var (в tmpfs).

Ant
Сообщения: 6
Зарегистрирован: 03 июн 2020, 11:46

Сообщение Ant » 03 июн 2020, 13:12

Zyxmon, вы меня простите великодушно, но я не очень дружу с администрированием nix систем. Так, на уровне что-то поставить, настроить. Но глубже - ничего не понимаю. Если есть возможность, ткните носом в инструкцию, как можно писать hosts (желательно без перемонтирования).

И судя по теме на форуме кинетика, эта проблема действительно связана с обновлением прошивки. Не у меня одного перестал работать saned и именно с выходом прошивки 3.4.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1913
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 03 июн 2020, 13:39

Ant писал(а):Источник цитаты как можно писать hosts

Обычным способом. Файл не readonly. Например

Код: Выделить всё

cat "192.168.1.1 MyKeenetic" >> /etc/hosts

Ant
Сообщения: 6
Зарегистрирован: 03 июн 2020, 11:46

Сообщение Ant » 03 июн 2020, 16:34

Zyxmon, огромное спасибо за наводку! Действительно, на время работы кинетика можно в hosts дописать что угодно. После перезагрузки изменения пропадут, но нам ничего не мешает при загрузке вызывать скрипт добавляющий нужные нам данные.

По аналогии с содержимым S01sane-backends (этот файл создается при установке saned), получилось следующее:

Код: Выделить всё

#!/bin/sh

PATH=/sbin:/bin:/usr/bin:/usr/sbin:/opt/bin:/opt/sbin

hn=$(hostname)
ip=$(ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | head -1);

if !( grep -q $hn /etc/hosts ); then
	echo "$ip $hn" >> /etc/hosts
fi


Единственное, что меня смущает, - строка получения IP. По "hostname -i" IP не получить. Я нашел в интернете указанный код. Он берет результат работы ifconfig, выделяет оттуда только все IP адреса, удаляет из списка 127.0.0.1, и в итоге отдает самый первый результат. У меня это как раз 192.168.1.1.

А нет ли какого-то более изысканного способа получить IP адрес?

Ant
Сообщения: 6
Зарегистрирован: 03 июн 2020, 11:46

Сообщение Ant » 03 июн 2020, 16:50

Ну и недостаток еще в том, что "head -1", как я понимаю, требует установленного BusyBox. А это не очень красиво...

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1913
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 03 июн 2020, 18:29

Изыскано - это так https://github.com/ndmsystems/packages/ ... nt#ndmwand
Busybox устанавливается вместе с Entware. Без этого и Sane не будет.

Ant
Сообщения: 6
Зарегистрирован: 03 июн 2020, 11:46

Сообщение Ant » 07 июн 2020, 01:38

В итоге, если у вас ошибка "check_host: getaddrinfo for local hostname failed: Temporary failure in name resolution" и sane не работает, есть два варианта решения проблемы:

1). Идем в админку кинетика -> "Общие настройки", находим блок "Параметры системы", меняем в поле "Имя системы". На цифры (и точки). Только не буквы. Можно указать IP адрес роутера.

2). В папку /opt/etc/init.d размещаем файл S01sane-backends со следующим содержимым:

Код: Выделить всё

#!/bin/sh

PATH=/sbin:/bin:/usr/bin:/usr/sbin:/opt/bin:/opt/sbin

ip=$(ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | head -1);
hn=$(hostname)

if ( echo "$hn" | grep -Eq "[^0-9.]" ) && !( grep -Eq "^[0-9.]+ +$hn" /etc/hosts ); then
	echo "$ip $hn" >> /etc/hosts
fi


У файла не забываем установить атрибут исполнения.

Скрипт берет первый локальный IP кинетика, определяет hostname (это как раз содержимое поля "Имя системы" в админке кинетика). Далее он проверяет, содержит ли hostname что-то кроме цифр или точек и проверяет, нет ли в /etc/hosts упоминания hostname. При удачной проверке, в /etc/hosts добавляется соответствие hostname локальному IP. После чего sane начинает нормально работать.


Вернуться в «Entware/Qnapware/Optware/Zyxware - обсуждаем репозитории пакетов»

Кто сейчас на конференции

Всего 5 посетителей :: 0 зарегистрированных, 0 скрытых и 5 гостей (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (162) здесь было 16 ноя 2019, 18:33

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей