Описание компонента OPKG
Менеджер пакетов opkg предназначен для расширения возможностей устройств Keenetic путем установки дополнительных пакетов программного обеспечения. С помощью opkg опытные пользователи могут устанавливать и обновлять модули, не входящие в стандартную прошивку устройства, что позволяет гибко настраивать функциональность роутера для конкретных задач.
В этой статье описаны принципы использования opkg в KeeneticOS, включая процедуру установки, способы подключения внешних накопителей и рекомендации по использованию пакетов из репозитория.
Для использования открытых пакетов на устройстве должен быть установлен компонент Поддержка открытых пакетов.
Компонент позволит:
- добавить команды конфигурации - opkg,
- смонтировать файловую систему USB в - /opt,
- распаковать файлы - *.ipkи- *.tar.gzиз каталога- /opt/install,
- выполнить хук-скрипты. 
Конфигурация
Команда opkg disk используется для указания файловой системы /opt. Файловая система может быть идентифицирована по UUID или метке тома. Например,
(config)>opkg disk OPT_LABEL:Opkg::Manager: Disk is set to: OPT_LABEL. (config)>system configuration save
Поддерживаются файловые системы NTFS и EXT2/3. После настройки opkg disk и подключения хранилища компонент opkg выполнит следующие действия:
- Смонтирует файловую систему - OPT_LABELв- /opt.
- Если каталог - /opt/installсуществует, распакует все файлы- /opt/install/*.ipkв- /opt. Распаковка должна быть завершена в течение 120 секунд, иначе она будет прервана по истечении времени ожидания.
- Выполнит - /opt/etc/initrc.
Хук-скрипты
Скрипты расположены в:
- /opt/etc/initrc— скрипт запуска по умолчанию (может быть определен с помощью команды- opkg initrc),
- /opt/etc/ndm/*.d/— обработчики событий.
Каталоги скриптов и переменные среды описаны в соответствующих разделах ниже.
Переменные PATH и LD_LIBRARY_PATH предопределены для выбора исполняемых файлов и динамических библиотек из /opt:
PATH=/opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin LD_LIBRARY_PATH=/opt/lib:/opt/usr/lib:/lib:/usr/lib
Префикс /opt всегда подразумевается в шебанге хука. То есть, как #!/bin/sh, так и #!/opt/bin/sh будут запускать интерпретатор /opt/bin/sh.
Для каждого выполняемого скрипта установлен 24-секундный тайм-аут.
Все хук-скрипты запускаются в одной очереди, т. е. пока /opt/etc/ndm/wan.d/01-one.sh все еще выполняется, никакие другие скрипты не будут запускаться ни из /opt/etc/ndm/wan.d/, ни из /opt/etc/ndm/netfilter.d/.
initrc
Скрипт инициализации /opt/etc/initrc выполняется после монтирования /opt. Он может выполнять другие скрипты инициализации, такие как /opt/etc/init.d/* для запуска фоновых процессов. Если /opt/etc/initrc отсутствует, компонент OPKG будет выполнять /opt/etc/init.d/* в алфавитном порядке.
Например, скрипт запуска dropbear может выглядеть следующим образом:
#!/bin/sh
if [ ! -d /opt/etc/dropbear ]; then
    mkdir /opt/etc/dropbear
fi
if [ ! -f /opt/etc/dropbear/dropbear_dss_host_key ]; then
    dropbearkey -t dss -f /opt/etc/dropbear/dropbear_dss_host_key
fi
if [ ! -f /opt/etc/dropbear/dropbear_rsa_host_key ]; then
    dropbearkey -t rsa -f /opt/etc/dropbear/dropbear_rsa_host_key
fi
dropbearЧтобы обеспечить совместимость с системами инициализации типа Sys-V, скрипты /opt/etc/initrc и /opt/etc/init.d вызываются с аргументом командной строки start. Когда пользователь хочет извлечь хранилище /opt, вызывается скрипт /opt/etc/initrc с аргументом stop.
ndm/wan.d
Скрипты событий /opt/etc/ndm/wan.d/ выполняются после установления нового подключения к интернету.
| 1-й параметр | Описание | 
|---|---|
| 
 | Установлено подключение к интернету | 
| 
 | Подключение к интернету прервано | 
| Переменная | Описание | 
|---|---|
| 
 | WAN-интерфейс, например  | 
| 
 | IP-адрес интерфейса | 
| 
 | Маска подсети интерфейса | 
| 
 | IP-адрес шлюза WAN | 
Когда интернет-соединение отсутствует, скрипты wan.d выполняются с недоопределенными вышеуказанными переменными.
Если подключение к интернету было установлено до монтирования /opt, скрипты wan.d выполняются сразу после initrc.
ndm/user.d
Скрипты /opt/etc/ndm/user.d выполняются при обновлении файлов /etc/passwd и /etc/group основной системой. Добавьте скрипты в user.d, если вам нужно изменить файлы /etc/passwd или /etc/group. В противном случае любые изменения в этих файлах будут перезаписаны.
| Переменная | Описание | 
|---|---|
| 
 | Имя пользователя с доступом к  | 
Когда пользователь удаляется, скрипты user.d выполняются с неопределенным $user.
Например, вы можете создать домашние каталоги с помощью хука user.d следующим образом:
#!/bin/sh
home=/opt/home
[ -z "$user" ] && exit 0       # $user is undefined
[ -d $home/$user ] && exit 0   # home already exists
if mkdir -p $home/$user; then
    chmod 0755 $home
    chmod 0700 $home/$user
    chown $user $home/$user
findm/netfilter.d
Скрипты /opt/etc/ndm/netfilter.d выполняются, когда система перезаписывает таблицу netfilter. Хуки netfilter.d способны изменять таблицу с помощью iptables. Переменные $table и $type следует проверять, чтобы избежать дублирования правил.
| Переменная | Описание | 
|---|---|
| 
 | Протокол netfilter, например  | 
| 
 | Таблица netfilter, например  | 
Например, вы можете добавить несколько правил mangle следующим образом:
#!/bin/sh [ "$type" == "ip6tables" ] && exit 0 # check the protocol type in backward-compatible way [ "$table" != "mangle" ] && exit 0 # check the table name iptables -A PREROUTING -i br0 -t mangle -p tcp --dport 22 -j MARK --set-mark 1 iptables -A PREROUTING -i br0 -t mangle -p tcp --dport 23 -j MARK --set-mark 1
ndm/usb.d
Скрипты /opt/etc/ndm/usb.d выполняются при подключении или отключении устройства USB.
| 1-й параметр | Описание | 
|---|---|
| 
 | USB-устройство подключено | 
| 
 | USB-устройство отключено | 
Следующие переменные окружения определены для идентификации донгла.
| Переменная | Описание | Пример | 
|---|---|---|
| 
 | Путь к устройству  | 
 | 
| 
 | Имя устройства в  | 
 | 
| 
 | Путь в sysfs | 
 | 
| 
 | Идентификатор модели USB | 
 | 
| 
 | Номер порта USB | 
 | 
| 
 | Идентификатор производителя USB | 
 | 
Любое устройство, подключенное до запуска скрипта OPKG init, запустит эти скрипты обратного вызова, запланированные для запуска при выполнении скрипта OPKG init.
ndm/fs.d
Скрипты /opt/etc/ndm/fs.d вызываются при монтировании файловой системы, при подготовке к ее размонтированию или при неожиданном извлечении.
| 1-й параметр | Описание | 
|---|---|
| 
 | Файловая система смонтирована | 
| 
 | Файловая система готовится к размонтированию или незапланированно извлечена | 
Тип файловой системы может быть любым из следующих: VFAT, EXFAT, NTFS, EXT2, EXT3, EXT4 или HFSP.
| Переменная | Описание | Пример | 
|---|---|---|
| 
 | Тип файловой системы | 
 | 
| 
 | Идентификатор файловой системы | 
 | 
| 
 | Метка файловой системы / раздела | 
 | 
| 
 | Каталог монтирования файловой системы (абсолютный путь) | 
 | 
Любая файловая система, смонтированная до выполнения скрипта OPKG init, запустит эти скрипты обратного вызова, запланированные для запуска при выполнении скрипта OPKG init.
ndm/time.d
Скрипты /opt/etc/ndm/time.d вызываются при изменении системного времени (синхронизация через NTP).
ndm/button.d
Скрипты /opt/etc/ndm/button.d вызываются при нажатии кнопки FN и/или кнопки (кнопок) WPS.
| Переменная | Описание | Пример | 
|---|---|---|
| 
 | Какая кнопка была нажата | 
 | 
| 
 | Тип нажатия | 
 | 
Сначала необходимо настроить некоторые параметры в веб-конфигураторе.
ndm/schedule.d
Скрипты /opt/etc/ndm/schedule.d вызываются с запланированными событиями (если расписания определены через CLI).
| 1-й параметр | Описание | 
|---|---|
| 
 | Начало запланированной задачи | 
| 
 | Окончание запланированной задачи | 
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Название расписания | 
| 
 | Время (в секундах), затраченное на выполнение действия | 
ndm/neighbour.d
Скрипты /opt/etc/ndm/neighbour.d вызываются при определенных событиях, связанных с соседствующими сетевыми устройствами. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Уникальный идентификатор соседствующего устройства с момента загрузки | 
| 
 | Действие соседствующего устройства ( | 
| 
 | Тип обновления (если есть):  | 
| 
 | Семейство адресов — ipv4 или ipv6 | 
ndm/ifcreated.d
Скрипты /opt/etc/ndm/ifcreated.d вызываются при создании интерфейса NDM. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Идентификатор интерфейса NDM | 
| 
 | Обозначение интерфейса Linux | 
ndm/ifdestroyed.d
Скрипты /opt/etc/ndm/ifdestroyed.d вызываются при удалении интерфейса NDM. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Идентификатор интерфейса NDM | 
| 
 | Обозначение интерфейса Linux | 
ndm/ifipchanged.d
Скрипты /opt/etc/ndm/ifipchanged.d вызываются при изменении IPv4-адреса или подсети интерфейса NDM. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Идентификатор интерфейса NDM | 
| 
 | Обозначение интерфейса Linux | 
| 
 | Новый IPv4-адрес | 
| 
 | Новая маска сети IPv4 | 
| 
 | Текущее состояние соединения интерфейса, может быть  | 
| 
 | Текущее состояние подключения интерфейса, может быть  | 
| 
 | Текущее состояние интерфейса, может быть  | 
| 
 | Текущий глобальный приоритет интерфейса, может быть равен нулю для неглобальных интерфейсов и > 0, если интерфейс является глобальным (global) | 
ndm/ifip6changed.d (since 4.0)
Скрипты /opt/etc/ndm/ifip6changed.d вызываются при изменении IPv6-адреса или подсети интерфейса NDM. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Идентификатор интерфейса NDM | 
| 
 | Обозначение интерфейса Linux | 
| 
 | Адрес IPv6 | 
| 
 | Маска сети IPv6 | 
| 
 | Текущее состояние соединения интерфейса, может быть  | 
| 
 | Текущее состояние подключения интерфейса, может быть  | 
| 
 | Текущее состояние интерфейса, может быть  | 
| 
 | Текущее действия по изменению, может быть  | 
| 
 | Текущий глобальный приоритет интерфейса, может быть равен нулю для неглобальных интерфейсов и > 0, если интерфейс является глобальным (global) | 
ndm/ifstatechanged.d (устарело с версии 4.0, сохраняется только для обратной совместимости)
Скрипты /opt/etc/ndm/ifstatechanged.d вызываются при изменении состояния интерфейса NDM. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Идентификатор интерфейса NDM | 
| 
 | Обозначение интерфейса Linux | 
| 
 | Текущее состояние соединения интерфейса, может быть  | 
| 
 | Текущее состояние подключения интерфейса, может быть  | 
| 
 | Текущее состояние интерфейса, может быть  | 
| 
 | Источник изменений, может быть  | 
ndm/iflayerchanged.d (новый и основной с версии 4.0)
Скрипты /opt/etc/ndm/iflayerchanged.d вызываются при изменении состояния интерфейсного уровня NDM. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Идентификатор интерфейса NDM | 
| 
 | Обозначение интерфейса Linux | 
| 
 | Уровень интерфейса, может быть  | 
| 
 | Текущий статус уровня интерфейса, может быть  | 
ndm/sms.d
Скрипты /opt/etc/ndm/sms.d вызываются при получении SMS на интерфейсе UsbQmi. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Идентификатор интерфейса NDM | 
| 
 | Идентификатор SMS | 
Фактическое содержание SMS можно получить с помощью ci/rci (команды ndmq / jq), используя предоставленный интерфейс и идентификаторы сообщений.
ndm/pptp_vpn_up.d
Скрипты /opt/etc/ndm/pptp_vpn_up.d вызываются, когда пользователь подключается к серверу PPTP VPN. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Имя пользователя | 
| 
 | Системный интерфейс (обычно vpn*) | 
| 
 | Внешний IPv4-адрес удаленного узла | 
| 
 | IPv4-адрес удаленного узла внутри туннеля | 
ndm/pptp_vpn_down.d
Скрипты /opt/etc/ndm/pptp_vpn_down.d вызываются, когда пользователь отключается от сервера PPTP VPN. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Имя пользователя | 
| 
 | Системный интерфейс (обычно sstp*) | 
| 
 | Внешний IPv4-адрес удаленного узла | 
| 
 | IPv4-адрес удаленного узла внутри туннеля | 
ndm/l2tp_ipsec_vpn_up.d
Скрипты /opt/etc/ndm/l2tp_ipsec_vpn_up.d вызываются, когда пользователь подключается к серверу L2TP/IPsec VPN. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| $ndm_opkg_id | Имя пользователя | 
| $iface | Системный интерфейс (обычно l2tp*) | 
| $remote | Внешний IPv4-адрес удаленного узла | 
| $local | IPv4-адрес удаленного узла внутри туннеля | 
ndm/l2tp_ipsec_vpn_down.d
Скрипты /opt/etc/ndm/l2tp_ipsec_vpn_down.d вызываются, когда пользователь отключается от сервера L2TP/IPsec VPN. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Имя пользователя | 
| 
 | Системный интерфейс (обычно lt2p*) | 
| 
 | Внешний IPv4-адрес удаленного узла | 
| 
 | IPv4-адрес удаленного узла внутри туннеля | 
ndm/vip_vpn_up.d
Скрипты /opt/etc/ndm/vip_vpn_up.d вызываются, когда пользователь подключается к серверу Virtual IP VPN. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Имя пользователя | 
| 
 | Внешний IPv4-адрес удаленного узла | 
| 
 | IPv4-адрес удаленного узла внутри туннеля | 
ndm/vip_vpn_down.d
Скрипты /opt/etc/ndm/vip_vpn_down.d вызываются, когда пользователь отключается от сервера Virtual IP VPN. Скрипты вызываются с первым параметром ($1) == hook.
Следующие переменные среды определены для того, чтобы вы могли идентифицировать детали задачи.
| Переменная | Описание | 
|---|---|
| 
 | Имя пользователя | 
| 
 | Внешний IPv4-адрес удаленного узла | 
| 
 | IPv4-адрес удаленного узла внутри туннеля | 
ndm/openvpn-*.d
Скрипты /opt/etc/ndm/openvpn-*.d/ вызываются, когда OpenVPN в NDMS выполняет скрипт-хук (2.10+, только если установлен и настроен ndm-mod-openvpn).
Список сценариев:
- /opt/etc/ndm/openvpn-up.d/
- /opt/etc/ndm/openvpn-tls-verify.d/
- /opt/etc/ndm/openvpn-ipchange.d/
- /opt/etc/ndm/openvpn-client-connect.d/
- /opt/etc/ndm/openvpn-route-up.d/
- /opt/etc/ndm/openvpn-client-disconnect.d/
- /opt/etc/ndm/openvpn-down.d/
- /opt/etc/ndm/openvpn-learn-address.d/
Значение скриптов можно уточнить на официальной странице справочника OpenVPN (раздел SCRIPTING AND ENVIRONMENTAL VARIABLES).
Все переменные окружения, установленные самим OpenVPN (описанные здесь), сохраняются без изменений и передаются хук-скриптам OPKG. Скрипты вызываются с первым параметром ($1) == hook. Все аргументы из исходного выполнения хука передаются в качестве дополнительных переменных окружения.
| Переменная | Описание | 
|---|---|
| 
 | Идентификатор интерфейса NDMS, например,  | 
| 
 | Количество аргументов в исходном вызове хука | 
| 
 | Значение аргумента  |