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