Введение
EasyCustom - инструмент кастомизации ПО EasyWRT, представляющий собой архив с набором файлов, команд и скриптов.
Позволяет провести ручное изменение настроек EasyWRT без повторной сборки прошивки, и записать измененные параметры в постоянную память маршрутизатора через загрузку собранного архива. При загрузке EasyCustom, системные файлы будут заменены на аналогичные файлы из архива, а при сбросе роутера к заводским настройкам - настройки будут взяты из загруженного архива, что позволяет оставлять записанные настройки "заводскими".
Описание структуры и использования EasyCustom
Структура
EasyCustom представляет собой архив .tar.gz, его cодержимое:
Обязательное:
Каталоги - /etc/ezcustom
Скрипт (текстовый файл без расширения) - custom
Необязательное (вносится при необходимости):
Скрипт обновления архива EasyCustom my_update.sh
Собственные shell-скрипты
Файл ограничений элементов WEB-UI luci.acl
Файл custom
Файл custom должен быть создан в Unix-формате. В ОС Linux это выполняется по умолчанию.
После установки собранных настроек на роутер, стандартный сброс к заводским настройкам их не удалит. Если вы хотите изменить какие-либо настройки в конфигурации ezcustom, но в custom-скрипте не предусмотрели обновление архива с сервера, вы можете воспользоваться командой:
firstboot -y && reboot
Команда удалит все настройки EasyCustom и вернет роутер в заводское состояние.
Представляет из себя linux shell скрипт, с помощью которого можно изменить конфигурацию маршрутизатора, или модифицировать логику выполнения скриптов (своих или штатных).
В ezcustom реализован набор команд, позволяющих менять конфигурацию маршрутизатора:
Команды учета модели и ПО
Команды внесения изменения в конфигурационные файлы
Команды персонализации WEB-UI
Команды настройки параметров Wi-Fi
Команды настройки учетных записей
Команды установки файлов
Кастомные скрипты
Кроме доступных в системе команд, EasyCustom позволяет интегрировать пользовательские shell скрипты, таким образом внедрить свою уникальную логику в ПО EasyWRT. Для примера рассмотрим задачу, когда нужно реализовать систему, которая бы обновляла ezcustom-архив с выделенного сервера.
Скрипт my_update.sh
Пример содержимого скрипта автоматического обновления приведен ниже. Для использования нужно изменить переменную "UPDATE_URL", указав ссылку на ваш сервер.
#!/bin/sh my_curl() { timeout 60 curl $@ } my_log() { logger -t "my_custom_updater" "$@" } die() { my_log "$@" exit } UPDATE_URL="<вставьте ссылку на сервер с архивом EasyCustom>" LAST_MODIFIED_FILE="/etc/ezcustom/.last_modified" NEW_CUSTOM="/tmp/custom.tar.gz" my_log "check '$UPDATE_URL' for updates..." HEADERS="$(my_curl -I "$UPDATE_URL")" LAST_MODIFIED="$(echo "$HEADERS" | grep -e '^Last-Modified:')" test -z "$LAST_MODIFIED" && die "unable to check for updates" my_log "last modified date: '$LAST_MODIFIED'" test "$LAST_MODIFIED" = "$(cat "$LAST_MODIFIED_FILE")" && die "already at last configuration version" my_log "downloading new version" my_curl -o "$NEW_CUSTOM" "$UPDATE_URL" || die "unable to download new configuration" sysupgrade --restore-backup "$NEW_CUSTOM" || die "unable to update configuration" echo "$LAST_MODIFIED" >"$LAST_MODIFIED_FILE" sync |
В файле custom нужно указать блок кода для обращения роутера к прописанному серверу:
- Скрипт установит новый архив только если веб сервер передаст заголовок Last-Modified с измененным значением (если у файла на сервере дата модификации не будет совпадать с установленным файлом, то произойдет обновление).
- Для корректной работы необходим веб сервер который умеет отвечать на HEAD запросы и корректно передает заголовок Last-Modified
Для того, чтобы скрипт проверял обновление периодически, необходимо установить скрипт в систему (например в директорию etc/) и включить периодический запуск скрипта через CRON, Блок кода в скрипте с проверкой обновлений раз в 5 минут:
# check for configuration update every 5 min INSTALL_FILE "my_update.sh" "/etc/my_update.sh" SET_CRONTAB <<EOF */5 * * * * sh "/etc/my_update.sh" EOF |
Модуль luci-acl - account manager
Модуль позволяет установить правила ограничения доступа к определенным элементам web-интерфейса для отдельных пользователей.
EasyWRT имеет два встроенных пользователя:
- Admin - административная учетная запись, имеет цифровой идентификатор - 0
- User - пользовательская учетная запись, имеет цифровой идентификатор - 2
Конфигурация модуля расположена по пути /etc/config/luci-acl и поддерживает две основные политики:
- deny - запрет чтения и редактирования указанной страницы.
- readonly - запрет редактирования, но не чтения указанной страницы.
Политики применяются к пользователям на основе цифрового идентификатора приведенного выше.
Пример управления элементами UI через luci-acl
Если вы подготовили и протестировали ограничения web-ui заранее, поэтому сейчас требуется загрузка этого файла в роутер вместе с архивом EasyCustom.
Для этого потребуется указать команду в файле custom.
# установка файла luci-acl из архива EasyCustom в каталог /etc/config/luci-acl INSTALL_FILE "luci-acl" "/etc/config/luci-acl"
Настройка ограничений командами EasyCustom, без файла luci-acl
Если вы не подготовили файл luci-acl, или вам нужно внести минимум изменений и вы не хотите загружать ограничения отдельным файлом, можно воспользоваться командой CONFIG_SET для файла custom.
# запрет на чтение и редактирование страницы cwmp для пользовательской учетной записи CONFIG_SET luci-acl.@user[0].deny='admin/status/log' 'admin/services/easycwmp' # запрет на редактирование страницы vlan для пользовательской учетной записи CONFIG_SET luci-acl.@user[0].readonly='admin/network/vlan/advanced'
Внешнее оформление UI. Файл style.css, редактирование и загрузка
Для отображения новых стилей, после установки архива ezcustom, нужно обновить вкладку со сбросом кэша: Ctrl + F5
Для большей совместимости с новыми версиями ПО мы не рекомендуем глубокую кастомизацию, по этому рассмотрим пример кастомизации UI на основе изменения стилей интерфейса через style.css
Файл стилей style.css
Для просмотра и редактирования стилей WEB-UI EasyWRT:
- Перейдите на страницу управления роутером через браузер.
- Авторизуйтесь на роутере.
- Перейдите в инструменты разработчика на странице ( возможность и способ перехода может различаться в зависимости от браузера).
- Измените стили нужных элементов.
- Перейдите в источники из инструментов разработчика, скачайте измененные стили.
Для загрузки новых стилей, укажите команду в файле custom с названием файла .css:
INSTALL_STYLES "style.css"
Файл logo.svg
Для изменения логотипа новый файл логотипа должен быть векторным изображением с расширением .svg.
После выбора логотипа и проверки его расширения, укажите его загрузку командой в файле custom:
INSTALL_LOGO "logo.svg"
Пример кастомизации
Описание
Рассмотрим использование EasyCustom на примере тестового технического требования:
Написание файла custom
Создаем каталог /etc, в нем создаем каталог /ezcustom. В /etc/ezcustom создаем текстовый файл без расширения "custom", сохраняем с форматом окончания строк Unix.
По вышеописанным требованиям, отредактируем файл custom, используя ранее перечисленные команды:
ВНИМАНИЕ!
Не добавляйте пробелы и комментарии после команд! Это помешает роутеру выполнить команду.
# НАСТРОЙКА УЧЕТНОЙ ЗАПИСИ АДМИНИСТРАТОРА # логин ADMIN_USERNAME "Admin1" # hash пароля SET_PASSWD_HASH "Admin1" '$1$GyDkBMuw$DMAIDu9YL8DyDTaVkiahS1' # НАСТРОЙКА УЧЕТНОЙ ЗАПИСИ ПОЛЬЗОВАТЕЛЯ # логин USER_USERNAME "User1" # hash пароля SET_PASSWD_HASH "User1" '$1$uhqRRzgo$LYXc1oYdHrHoh4BErjSEL/' # УСТАНОВКА ФАЙЛА ОГРАНИЧЕНИЙ WEB-ИНТЕРФЕЙСА luci-acl # установка файла luci-acl ограничений в web-ui INSTALL_FILE "luci-acl" "/etc/config/luci-acl" #ИЗМЕНЕНИЕ КОНТАКТНЫХ ДАННЫХ В WEB-UI # телефон службы поддержки клиентов оператора связи CONFIG_SET system.@system[0].snr_custom_support_phone='8-800-123-45-67' # сайт/интернет-ресурс оператора связи CONFIG_SET system.@system[0].snr_custom_support_url='http://support.myisp.com' # НАСТРОЙКИ NTP # включение ntp-клиента CONFIG_SET system.ntp.enabled='1' # включение ntp-сервера CONFIG_SET system.ntp.enable_server='1' # замена стандартного ntp сервера (0.ru.pool.ntp.org) CONFIG_SET system.ntp.server='new1.ntp.net' # добавление еще двух ntp-серверов в список CONFIG_ADD_LIST system.ntp.server='new2.ntp.net' CONFIG_ADD_LIST system.ntp.server='new3.ntp.net' # НАСТРОЙКА ПРАВИЛ ДЛЯ ДОСТУПА НА WAN ПО SSH # название правила CONFIG_SET firewall.ssh.name='Allow-SSH' # включение доступа по SSH на wan CONFIG_SET firewall.ssh.enabled='1' # зона доступности CONFIG_SET firewall.ssh.src='wan' # указываем новый порт 23 в конфиге dropbear и firewall CONFIG_SET dropbear.@dropbear[0].Port='23' CONFIG_SET firewall.ssh.dest_port='23' # протокол подключения CONFIG_SET firewall.ssh.proto='tcp' # тип правила CONFIG_SET firewall.ssh.target='ACCEPT' # разрешаем доступ с подсетей CONFIG_ADD_LIST firewall.ssh.src_ip='10.10.10.10' CONFIG_ADD_LIST firewall.ssh.src_ip='10.1.1.0/24' # НАСТРОЙКА ПРАВИЛА ДЛЯ ДОСТУПА НА WAN ПО HTTP # название правила CONFIG_SET firewall.http.name='Allow-HTTP' # включение доступа по HTTP на wan CONFIG_SET firewall.http.enabled='1' # зона доступности CONFIG_SET firewall.http.src='wan' # удаляем секцию стандартного конфига порта 80 в uhttpd для http CONFIG_DELETE uhttpd.main.listen_http # указываем новый порт 88 в конфиге uhttpd и firewall CONFIG_ADD_LIST uhttpd.main.listen_http='0.0.0.0:88' CONFIG_ADD_LIST uhttpd.main.listen_http='[::]:88' CONFIG_SET firewall.http.dest_port='88' # протокол подключения CONFIG_SET firewall.http.proto='tcp' # тип правила CONFIG_SET firewall.http.target='ACCEPT' # разрешаем доступ с подсетей CONFIG_ADD_LIST firewall.http.src_ip='10.10.10.10' CONFIG_ADD_LIST firewall.http.src_ip='10.1.1.0/24' # НАСТРОЙКА ПРАВИЛА ДЛЯ ДОСТУПА НА WAN ПО HTTPS # название правила CONFIG_SET firewall.https.name='Allow-HTTPS' # включение доступа по HTTPS на wan CONFIG_SET firewall.https.enabled='1' # зона доступности CONFIG_SET firewall.https.src='wan' # удаляем секцию стандартного конфига порта 443 в uhttpd для https CONFIG_DELETE uhttpd.main.listen_https # указываем новый порт 444 в конфиге uhttpd и firewall CONFIG_ADD_LIST uhttpd.main.listen_https='0.0.0.0:444' CONFIG_ADD_LIST uhttpd.main.listen_https='[::]:444' CONFIG_SET firewall.https.dest_port='444' # протокол подключения CONFIG_SET firewall.https.proto='tcp' # тип правила CONFIG_SET firewall.https.target='ACCEPT' # разрешаем доступ с подсетей CONFIG_ADD_LIST firewall.https.src_ip='10.10.10.10' CONFIG_ADD_LIST firewall.https.src_ip='10.1.1.0/24' # НАСТРОЙКА CWMP-ДЕМОН # включение CWMP-демона в режиме static CONFIG_SET easycwmp.@local[0].enable='3' # включение периодического информирования ACS-сервера CONFIG_SET easycwmp.@acs[0].periodic_enable='1' # адрес ACS-сервера CONFIG_SET easycwmp.@acs[0].url='http://10.1.1.6:7547' # CWMP-порт CONFIG_SET easycwmp.@local[0].port='7547' # интервал информирования ACS-сервера CONFIG_SET easycwmp.@acs[0].periodic_interval='4000' # НАСТРОЙКА STUN # порт клиента stun CONFIG_SET tr069_stun.stun.client_port='25565' # включение stun-запросы CONFIG_SET tr069_stun.stun.enable='1' # интервал отправки stun-сообщений CONFIG_SET tr069_stun.stun.min_keepalive='120' # пароль stun CONFIG_SET tr069_stun.stun.password='Admin' # адрес stun-сервера CONFIG_SET tr069_stun.stun.server_address='192.168.1.1' # порт stun-сервера CONFIG_SET tr069_stun.stun.server_port='19303' # имя пользователя stun CONFIG_SET tr069_stun.stun.username='Admin' # НАСТРОЙКА IGMP-PROXY # включение igmp-proxy CONFIG_SET igmpproxy.@igmpproxy[0].enable='1' # включение fastleave CONFIG_SET igmpproxy.@igmpproxy[0].quickleave='1' # включение respawn CONFIG_SET igmpproxy.@igmpproxy[0].respawn='1' # НАСТРОЙКА UPnP # включение upnp CONFIG_SET upnpd.config.enabled='1' CONFIG_SET upnpd.config.enable_upnp='1' # включить дополнительное журналирование upnp CONFIG_SET upnpd.config.log_output='1' # разрешить перенаправление только для запрашивающих IP-адресов CONFIG_SET upnpd.config.secure_mode='1' # СЕРВИСЫ ДЕАКТИВАЦИИ АВАРИЙ # восстановить работу WAN при поднятии интерфейса CONFIG_SET cpe-tools.services.wan_arping_watchdog='1' # проверка доступности шлюза через ARP-запросы и перезапрос реквизитов по dhcp CONFIG_SET cpe-tools.services.wan_arping_interval='35' # количество ARP-запросов CONFIG_SET cpe-tools.services.wan_arping_attempts='4' # включение режима обнаружения петель CONFIG_SET cpe-tools.services.lpdet_interval='1' # время в секундах до отключения порта при обнаружении петель CONFIG_SET cpe-tools.services.lpdet_shutdown='10' # НАСТРОЙКА LAN-ip # изменение LAN-ip CONFIG_SET network.lan.ipaddr='192.168.1.111' # НАСТРОЙКА DHCP LAN # минимальный адрес аренды CONFIG_SET dhcp.lan.start='10' # максимальное количество адресов для аренды CONFIG_SET dhcp.lan.limit='143' # максимальное время аренды (минимум 2m) CONFIG_SET dhcp.lan.leasetime='11h' # НАСТРОЙКИ WAN # dns-серверы для wan CONFIG_SET network.wan.dns='8.8.8.8 8.8.4.4' # адрес шлюза CONFIG_SET network.wan.gateway='10.1.1.1' # адрес WAN CONFIG_SET network.wan.ipaddr='10.1.1.111' # маска CONFIG_SET network.wan.netmask='255.255.255.0' # тип соединения для WAN CONFIG_SET network.wan.proto='static' # hostname роутера CONFIG_SET network.wan.hostname='SNR-CPE-ROUTER' # НАСТРОЙКИ VPN PPPOE НА WAN # маршрут по умолчанию CONFIG_SET network.vpn.defaultroute='1' # включение vpn на wan CONFIG_SET network.vpn.disabled='0' CONFIG_SET network.vpn.ifname='eth1' # пароль пользователя в туннеле CONFIG_SET network.vpn.password='Admin' # тип vpn-соединения CONFIG_SET network.vpn.proto='pppoe' # логин пользователя в туннеле CONFIG_SET network.vpn.username='Admin' # ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ WAN # mac-адрес WAN-порта CONFIG_SET network.wan.macaddr='F8:F0:82:1E:8C:A3' # изменение mtu на wan CONFIG_SET network.wan.mtu='1500' # НАСТРОЙКИ WI-FI 2.4Ghz # изменение SSID 2.4Ghz WIFI_SET_2GHZ "SSID1" "Network-2GHz" # изменение пароля 2.4Ghz WIFI_SET_2GHZ "WPAPSK1" "Password123" # вкл. автовыбора 2.4Ghz (тип: 1-по количеству станций, 2-по уровню шума, 3-по загрузке QBSS) # интервал указывается в часах WIFI_SET_2GHZ "Channel1" "0" WIFI_SET_2GHZ "AutoChannelSelect" "1" WIFI_SET_2GHZ "ACSCheckTime" "24" # исключение каналов из автовыбора (указывать каналы через ";") WIFI_SET_2GHZ "AutoChannelSkipList" "12;13;14" # ручной выбор канала (если выключен автовыбор) WIFI_SET_2GHZ "Channel1" "10" # тип шифрования 2.4Ghz WIFI_SET_2GHZ "AuthMode" "WPA2PSK" # PMF 2.4 GHz тип "обязательно" # ( Если "PMFMFPC = 1" + "PMFMFPR = 0", то будет тип "опционально".) # ( Если "PMFMFPC = 0" + "PMFMFPR = 0", то будет тип "выключить".) WIFI_SET_2GHZ "PMFMFPC" "1" WIFI_SET_2GHZ "PMFMFPR" "1" # PMF 2.4 GHz тип "обязательно" (coming soon with next update) WIFI_SET_PMF_2GHZ "mandatory" # ШИРИНА КАНАЛА 2.4 GHz = 20 Mhz # ( Если "HT_BW = 1" + "VHT_BW = 0" + "HT_BSSCoexistence = 0", то будет ширина 40 Mhz ) WIFI_SET_2GHZ "HT_BW" "0" WIFI_SET_2GHZ "VHT_BW" "0" WIFI_SET_2GHZ "HT_BSSCoexistence" "0" # ширина канала 20 МГц (coming soon with next update) WIFI_SET_BW_2GHZ "20" # НАСТРОЙКИ WI-FI 5Ghz # изменение SSID 5Ghz WIFI_SET_5GHZ "SSID1" "Network-5Ghz" # изменение пароля 5GHz WIFI_SET_5GHZ "WPAPSK1" "Password123" # вкл/выкл автовыбора 5Ghz (тип: 1-по количеству станций, 2-по уровню шума, 3-по загрузке QBSS) WIFI_SET_5GHZ "AutoChannelSelect" "1" # исключение каналов из автовыбора (указывать каналы через ";") WIFI_SET_5GHZ "AutoChannelSkipList" "132;136;140;144;149;153;157;161;165" # ручной выбор канала (если выключен автовыбор) WIFI_SET_5GHZ "Channel1" "36" # PMF 5 GHz тип "обязательно" # ( Если "PMFMFPC = 1" + "PMFMFPR = 0", то будет тип "опционально".) # ( Если "PMFMFPC = 0" + "PMFMFPR = 0", то будет тип "выключить".) WIFI_SET_5GHZ "PMFMFPC" "1" WIFI_SET_5GHZ "PMFMFPR" "1" # PMF 5 GHz тип "обязательно" (coming soon with next update) WIFI_SET_PMF_5GHZ "mandatory" # ШИРИНА КАНАЛА 5 GHz = 20 Mhz # ( Если "HT_BW = 1" + "VHT_BW = 0" + "HT_BSSCoexistence = 0", то будет ширина 40 Mhz.) # ( Если "HT_BW = 1" + "VHT_BW = 0" + "HT_BSSCoexistence = 1", то будет ширина 20/40 Mhz. ) # ( Если "HT_BW = 1" + "VHT_BW = 1" + "HT_BSSCoexistence = 1", то будет ширина 80 Mhz. ) WIFI_SET_5GHZ "HT_BW" "0" WIFI_SET_5GHZ "VHT_BW" "0" WIFI_SET_5GHZ "HT_BSSCoexistence" "1" # ширина канала 20 МГц (coming soon with next update) WIFI_SET_BW_5GHZ "20" # УСЛОВИЕ УЧЕТА МОДЕЛИ SNR-CPE if MODEL_IS "SNR-CPE-ME2-Lite" then INSTALL_LOGO "donut.svg" INSTALL_STYLES "pink.css" fi if MODEL_IS "SNR-CPE-MD2" then INSTALL_LOGO "arbuz.svg" INSTALL_STYLES "brown.css" fi if MODEL_IS "SNR-CPE-W4N-N" then INSTALL_LOGO "yagoda.svg" INSTALL_STYLES "blue.css" fi if MODEL_IS "SNR-CPE-AX1" then INSTALL_LOGO "cheese.svg" INSTALL_STYLES "yellow.css" fi if MODEL_IS "SNR-CPE-AX2" then INSTALL_LOGO "apple.svg" INSTALL_STYLES "dark.css" fi # УСТАНОВКА ФАЙЛА ПРОВЕРКИ ОБНОВЛЕНИЙ АРХИВА КАСТОМИЗАЦИИ # check for configuration update every 5 min # установка скрипта my_update.sh в каталог /etc # проверка раз в 5 минут INSTALL_FILE "my_update.sh" "/etc/my_update.sh" SET_CRONTAB <<EOF */5 * * * * sh "/etc/my_update.sh" EOF |
ВНИМАНИЕ!
Не добавляйте пробелы и комментарии после команд! Это помешает роутеру выполнить команду.
Сборка всех файлов в единый каталог
Соберем все необходимые и подготовленные файлы.
Добавьте файлы логотипов, стилей, скрипт обновления и файл ограничений luci-acl в каталог /etc/ezcustom.
Полученный каталог и его содержимое на скриншоте:
Создаем tar.gz архив
Для архивации можно использовать программу 7zip, свободное программное обеспечение. В корень архива помещаем каталог /etc.
Загрузка архива и результат применения стилей
При загрузке архива на роутер, он будет автоматически определен как EasyCustom-архив, никаких дополнительных действий не требуется.
Загрузить полученный архив можно двумя способами:
- через WEB-UI по пути Управление → Конфигурация → Восстановить резервную копию;
- через ACS, загрузив файл как обычный конфигурационный файл (по аналогии с резервной копией).
Результат применения стилей |
---|