Описание компонента 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, например,   | 
  | Количество аргументов в исходном вызове хука  | 
  | Значение аргумента   |