From f13937e69af90218c5d2cebd28b6e7933a540d45 Mon Sep 17 00:00:00 2001 From: gSpot Date: Mon, 1 Feb 2021 02:38:08 +0300 Subject: [PATCH] Packages --- autoinstall/autoinstall.sh | 257 ++++++++---------- autoinstall/uninstall.sh | 108 ++------ luci-app-ruantiblock/Makefile | 15 + luci-i18n-ruantiblock-ru/Makefile | 15 + .../luasrc/i18n}/ruantiblock.ru.lmo | Bin .../luci-app-ruantiblock_0.9.0-1_all.ipk | Bin 0 -> 11675 bytes .../luci-i18n-ruantiblock-ru_0.9.0-1_all.ipk | Bin 0 -> 4347 bytes .../19.07/ruantiblock-mod-lua_0.9.0-1_all.ipk | Bin 0 -> 6727 bytes .../19.07/ruantiblock-mod-py_0.9.0-1_all.ipk | Bin 0 -> 5776 bytes packages/19.07/ruantiblock_0.9.0-1_all.ipk | Bin 0 -> 11675 bytes ruantiblock-mod-lua/Makefile | 39 +++ ruantiblock-mod-py/Makefile | 39 +++ ruantiblock/Makefile | 112 ++++++++ 13 files changed, 366 insertions(+), 219 deletions(-) create mode 100644 luci-app-ruantiblock/Makefile create mode 100644 luci-i18n-ruantiblock-ru/Makefile rename {translations => luci-i18n-ruantiblock-ru/luasrc/i18n}/ruantiblock.ru.lmo (100%) create mode 100644 packages/19.07/luci-app-ruantiblock_0.9.0-1_all.ipk create mode 100644 packages/19.07/luci-i18n-ruantiblock-ru_0.9.0-1_all.ipk create mode 100644 packages/19.07/ruantiblock-mod-lua_0.9.0-1_all.ipk create mode 100644 packages/19.07/ruantiblock-mod-py_0.9.0-1_all.ipk create mode 100644 packages/19.07/ruantiblock_0.9.0-1_all.ipk create mode 100644 ruantiblock-mod-lua/Makefile create mode 100644 ruantiblock-mod-py/Makefile create mode 100644 ruantiblock/Makefile diff --git a/autoinstall/autoinstall.sh b/autoinstall/autoinstall.sh index 61c8e53..84248f4 100755 --- a/autoinstall/autoinstall.sh +++ b/autoinstall/autoinstall.sh @@ -8,79 +8,54 @@ RAM_CONFIG=0 LUA_MODULE=1 LUCI_APP=1 -### ruantiblock -URL_CONFIG="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock/files/etc/ruantiblock/ruantiblock.conf" -URL_FQDN_FILTER="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock/files/etc/ruantiblock/fqdn_filter" -URL_CONFIG_SCRIPT="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock/files/etc/ruantiblock/scripts/config_script" -URL_INFO_OUTPUT="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock/files/etc/ruantiblock/scripts/info_output" -URL_IPT_FUNCTIONS="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock/files/etc/ruantiblock/scripts/ipt_functions" -URL_START_SCRIPT="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock/files/etc/ruantiblock/scripts/start_script" -URL_UCI_CONFIG="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock/files/etc/config/ruantiblock" -URL_INIT_SCRIPT="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock/files/etc/init.d/ruantiblock" -URL_MAIN_SCRIPT="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock/files/usr/bin/ruantiblock" -URL_VPN_UP="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock/files/etc/hotplug.d/iface/40-ruantiblock" +OWRT_VERSION="19.07" +RUAB_VERSION="0.9.0-1" +BASE_URL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master" +PKG_DIR="/tmp" + +if [ -n "$1" ]; then + OWRT_VERSION="$1" +fi + +### URLs + +### packages +URL_RUAB_PKG="${BASE_URL}/packages/${OWRT_VERSION}/ruantiblock_${RUAB_VERSION}_all.ipk" +URL_MOD_LUA_PKG="${BASE_URL}/packages/${OWRT_VERSION}/ruantiblock-mod-lua_${RUAB_VERSION}_all.ipk" +URL_LUCI_APP_PKG="${BASE_URL}/packages/${OWRT_VERSION}/luci-app-ruantiblock_${RUAB_VERSION}_all.ipk" +URL_LUCI_APP_RU_PKG="${BASE_URL}/packages/${OWRT_VERSION}/luci-i18n-ruantiblock-ru_${RUAB_VERSION}_all.ipk" ### tor -URL_TORRC="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/tor/etc/tor/torrc" +URL_TORRC="${BASE_URL}/tor/etc/tor/torrc" ### ruantiblock-mod-lua -URL_PARSER_LUA="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock-mod-lua/files/usr/bin/ruab_parser.lua" URL_LUA_IPTOOL="https://raw.githubusercontent.com/gSpotx2f/iptool-lua/master/5.1/iptool.lua" -URL_LUA_SUM_IP="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/ruantiblock-mod-lua/files/usr/lib/lua/ruab_sum_ip.lua" URL_LUA_IDN="https://raw.githubusercontent.com/haste/lua-idn/master/idn.lua" -### luci-app-ruantiblock -URL_LUCI_CONTROLLER="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/luci-app-ruantiblock/luasrc/controller/ruantiblock.lua" -URL_LUCI_MENU="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/luci-app-ruantiblock/root/usr/share/luci/menu.d/luci-app-ruantiblock.json" -URL_LUCI_RPCD_ACL="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/luci-app-ruantiblock/root/usr/share/rpcd/acl.d/luci-app-ruantiblock.json" -URL_LUCI_JS_CRON="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/cron.js" -URL_LUCI_JS_INFO="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/info.js" -URL_LUCI_JS_SERVICE="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/service.js" -URL_LUCI_JS_SETTINGS="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/settings.js" -URL_LUCI_JS_TOOLS="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/tools.js" -URL_LUCI_JS_LOG="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/luci-app-ruantiblock/htdocs/luci-static/resources/view/ruantiblock/log.js" -URL_LUCI_JS_STATUS="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/luci-app-ruantiblock/htdocs/luci-static/resources/view/status/include/80_ruantiblock.js" -URL_LUCI_I18N_RU="https://raw.githubusercontent.com/gSpotx2f/ruantiblock_openwrt/master/translations/ruantiblock.ru.lmo" + +### Local files RUAB_CFG_DIR="${PREFIX}/etc/ruantiblock" EXEC_DIR="${PREFIX}/usr/bin" -LUCI_ROOT="${PREFIX}/usr/lib/lua/luci" -HTDOCS_VIEW="${PREFIX}/www/luci-static/resources/view" -HTDOCS_RUAB="${HTDOCS_VIEW}/ruantiblock" BACKUP_DIR="${RUAB_CFG_DIR}/autoinstall.bak" DATA_DIR="${RUAB_CFG_DIR}/var" DATA_DIR_RAM="/var/ruantiblock" RC_LOCAL="/etc/rc.local" - +### packages +FILE_RUAB_PKG="${PKG_DIR}/ruantiblock_${RUAB_VERSION}_all.ipk" +FILE_MOD_LUA_PKG="${PKG_DIR}/ruantiblock-mod-lua_${RUAB_VERSION}_all.ipk" +FILE_LUCI_APP_PKG="${PKG_DIR}/luci-app-ruantiblock_${RUAB_VERSION}_all.ipk" +FILE_LUCI_APP_RU_PKG="${PKG_DIR}/luci-i18n-ruantiblock-ru_${RUAB_VERSION}_all.ipk" ### ruantiblock FILE_CONFIG="${RUAB_CFG_DIR}/ruantiblock.conf" FILE_FQDN_FILTER="${RUAB_CFG_DIR}/fqdn_filter" FILE_IP_FILTER="${RUAB_CFG_DIR}/ip_filter" FILE_USER_ENTRIES="${RUAB_CFG_DIR}/user_entries" -FILE_CONFIG_SCRIPT="${RUAB_CFG_DIR}/scripts/config_script" -FILE_INFO_OUTPUT="${RUAB_CFG_DIR}/scripts/info_output" -FILE_IPT_FUNCTIONS="${RUAB_CFG_DIR}/scripts/ipt_functions" -FILE_START_SCRIPT="${RUAB_CFG_DIR}/scripts/start_script" FILE_UCI_CONFIG="${PREFIX}/etc/config/ruantiblock" FILE_INIT_SCRIPT="${PREFIX}/etc/init.d/ruantiblock" FILE_MAIN_SCRIPT="${EXEC_DIR}/ruantiblock" -FILE_VPN_UP="${PREFIX}/etc/hotplug.d/iface/40-ruantiblock" ### tor FILE_TORRC="${PREFIX}/etc/tor/torrc" ### ruantiblock-mod-lua -FILE_PARSER_LUA="${EXEC_DIR}/ruab_parser.lua" FILE_LUA_IPTOOL="${PREFIX}/usr/lib/lua/iptool.lua" -FILE_LUA_SUM_IP="${PREFIX}/usr/lib/lua/ruab_sum_ip.lua" FILE_LUA_IDN="${PREFIX}/usr/lib/lua/idn.lua" -### luci-app-ruantiblock -FILE_LUCI_CONTROLLER="${LUCI_ROOT}/controller/ruantiblock.lua" -FILE_LUCI_I18N_RU="${LUCI_ROOT}/i18n/ruantiblock.ru.lmo" -FILE_LUCI_MENU="${PREFIX}/usr/share/luci/menu.d/luci-app-ruantiblock.json" -FILE_LUCI_RPCD_ACL="${PREFIX}/usr/share/rpcd/acl.d/luci-app-ruantiblock.json" -FILE_LUCI_JS_CRON="${HTDOCS_RUAB}/cron.js" -FILE_LUCI_JS_INFO="${HTDOCS_RUAB}/info.js" -FILE_LUCI_JS_SERVICE="${HTDOCS_RUAB}/service.js" -FILE_LUCI_JS_SETTINGS="${HTDOCS_RUAB}/settings.js" -FILE_LUCI_JS_TOOLS="${HTDOCS_RUAB}/tools.js" -FILE_LUCI_JS_LOG="${HTDOCS_RUAB}/log.js" -FILE_LUCI_JS_STATUS="${HTDOCS_VIEW}/status/include/80_ruantiblock.js" AWK_CMD="awk" WGET_CMD=`which wget` @@ -100,20 +75,6 @@ if [ $? -ne 0 ]; then exit 1 fi -InstallPackages() { - local _pkg - for _pkg in $@ - do - if [ -z "`$OPKG_CMD list-installed $_pkg`" ]; then - $OPKG_CMD --force-overwrite install $_pkg - if [ $? -ne 0 ]; then - echo "Error during installation of the package (${_pkg})" >&2 - exit 1 - fi - fi - done -} - FileExists() { test -e "$1" } @@ -130,8 +91,11 @@ ChmodExec() { chmod 755 "$1" } -UpdatePackagesList() { - $OPKG_CMD update +RemoveFile() { + if [ -e "$1" ]; then + echo "Removing ${1}" + rm -f "$1" + fi } DlFile() { @@ -164,18 +128,61 @@ BackupCurrentConfig() { done } +RunAtStartup() { + $FILE_INIT_SCRIPT enable +} + +AppStop() { + FileExists "$FILE_MAIN_SCRIPT" && $FILE_MAIN_SCRIPT destroy +} + +AppStart() { + modprobe ip_set > /dev/null + modprobe ip_set_hash_ip > /dev/null + modprobe ip_set_hash_net > /dev/null + modprobe ip_set_list_set > /dev/null + modprobe xt_set > /dev/null + $FILE_INIT_SCRIPT start +} + +SetCronTask() { + echo "0 3 */3 * * ${FILE_MAIN_SCRIPT} update" >> /etc/crontabs/root + /etc/init.d/cron restart 2> /dev/null + /etc/init.d/cron enable +} + +Reboot() { + reboot +} + +UpdatePackagesList() { + $OPKG_CMD update +} + +InstallPackages() { + local _pkg + for _pkg in $@ + do + if [ -z "`$OPKG_CMD list-installed $_pkg`" ]; then + $OPKG_CMD --force-overwrite install $_pkg + if [ $? -ne 0 ]; then + echo "Error during installation of the package (${_pkg})" >&2 + exit 1 + fi + else + : + fi + done +} + InstallBaseConfig() { + _return_code=1 InstallPackages "ipset" "kmod-ipt-ipset" "dnsmasq-full" - DlFile "$URL_CONFIG" "$FILE_CONFIG" - DlFile "$URL_FQDN_FILTER" "$FILE_FQDN_FILTER" - DlFile "$URL_CONFIG_SCRIPT" "$FILE_CONFIG_SCRIPT" - DlFile "$URL_INFO_OUTPUT" "$FILE_INFO_OUTPUT" - DlFile "$URL_IPT_FUNCTIONS" "$FILE_IPT_FUNCTIONS" - DlFile "$URL_START_SCRIPT" "$FILE_START_SCRIPT" && ChmodExec "$FILE_START_SCRIPT" - DlFile "$URL_UCI_CONFIG" "$FILE_UCI_CONFIG" - DlFile "$URL_INIT_SCRIPT" "$FILE_INIT_SCRIPT" && ChmodExec "$FILE_INIT_SCRIPT" - DlFile "$URL_MAIN_SCRIPT" "$FILE_MAIN_SCRIPT" && ChmodExec "$FILE_MAIN_SCRIPT" - DlFile "$URL_VPN_UP" "$FILE_VPN_UP" && ChmodExec "$FILE_VPN_UP" + RemoveFile "$FILE_RUAB_PKG" > /dev/null + DlFile "$URL_RUAB_PKG" "$FILE_RUAB_PKG" && $OPKG_CMD install "$FILE_RUAB_PKG" > /dev/null + _return_code=$? + AppStop + return $_return_code } InstallVPNConfig() { @@ -229,60 +236,25 @@ RamConfigPrepare() { InstallLuaModule() { InstallPackages "lua" "luasocket" "luasec" "luabitop" - DlFile "$URL_PARSER_LUA" "$FILE_PARSER_LUA" && ChmodExec "$FILE_PARSER_LUA" - DlFile "$URL_LUA_IPTOOL" "$FILE_LUA_IPTOOL" - DlFile "$URL_LUA_SUM_IP" "$FILE_LUA_SUM_IP" + RemoveFile "$FILE_MOD_LUA_PKG" > /dev/null + DlFile "$URL_MOD_LUA_PKG" "$FILE_MOD_LUA_PKG" && $OPKG_CMD install "$FILE_MOD_LUA_PKG" + FileExists "$FILE_LUA_IPTOOL" || DlFile "$URL_LUA_IPTOOL" "$FILE_LUA_IPTOOL" FileExists "$FILE_LUA_IDN" || DlFile "$URL_LUA_IDN" "$FILE_LUA_IDN" $UCI_CMD set ruantiblock.config.bllist_module="/usr/bin/ruab_parser.lua" $UCI_CMD commit } InstallLuciApp() { - InstallPackages "luci-mod-rpc" "rpcd-mod-luci" "uhttpd-mod-ubus" - DlFile "$URL_LUCI_CONTROLLER" "$FILE_LUCI_CONTROLLER" - DlFile "$URL_LUCI_I18N_RU" "$FILE_LUCI_I18N_RU" - DlFile "$URL_LUCI_MENU" "$FILE_LUCI_MENU" - DlFile "$URL_LUCI_RPCD_ACL" "$FILE_LUCI_RPCD_ACL" - DlFile "$URL_LUCI_JS_CRON" "$FILE_LUCI_JS_CRON" - DlFile "$URL_LUCI_JS_INFO" "$FILE_LUCI_JS_INFO" - DlFile "$URL_LUCI_JS_SERVICE" "$FILE_LUCI_JS_SERVICE" - DlFile "$URL_LUCI_JS_SETTINGS" "$FILE_LUCI_JS_SETTINGS" - DlFile "$URL_LUCI_JS_TOOLS" "$FILE_LUCI_JS_TOOLS" - DlFile "$URL_LUCI_JS_LOG" "$FILE_LUCI_JS_LOG" - DlFile "$URL_LUCI_JS_STATUS" "$FILE_LUCI_JS_STATUS" + RemoveFile "$FILE_LUCI_APP_PKG" > /dev/null + RemoveFile "$FILE_LUCI_APP_RU_PKG" > /dev/null + DlFile "$URL_LUCI_APP_PKG" "$FILE_LUCI_APP_PKG" && $OPKG_CMD install "$FILE_LUCI_APP_PKG" && \ + DlFile "$URL_LUCI_APP_RU_PKG" "$FILE_LUCI_APP_RU_PKG" && $OPKG_CMD install "$FILE_LUCI_APP_RU_PKG" rm -f /tmp/luci-modulecache/* rm -f /tmp/luci-indexcache /etc/init.d/rpcd restart /etc/init.d/uhttpd restart } -RunAtStartup() { - $FILE_INIT_SCRIPT enable -} - -AppStop() { - FileExists "$FILE_MAIN_SCRIPT" && $FILE_MAIN_SCRIPT destroy -} - -AppStart() { - modprobe ip_set > /dev/null - modprobe ip_set_hash_ip > /dev/null - modprobe ip_set_hash_net > /dev/null - modprobe ip_set_list_set > /dev/null - modprobe xt_set > /dev/null - $FILE_INIT_SCRIPT start -} - -SetCronTask() { - echo "0 3 */3 * * ${FILE_MAIN_SCRIPT} update" >> /etc/crontabs/root - /etc/init.d/cron restart 2> /dev/null - /etc/init.d/cron enable -} - -Reboot() { - reboot -} - PrintBold() { printf "\033[1m - ${1}\033[0m\n" } @@ -400,7 +372,6 @@ ConfirmProxyMode ConfirmRamConfig ConfirmLuciApp ConfirmProcessing - AppStop PrintBold "Updating packages list..." UpdatePackagesList @@ -408,34 +379,38 @@ PrintBold "Saving current configuration..." BackupCurrentConfig PrintBold "Installing basic configuration..." InstallBaseConfig +if [ $? -eq 0 ]; then -if [ $PROXY_MODE = 2 ]; then - PrintBold "Installing VPN configuration..." - InstallVPNConfig -else - PrintBold "Installing Tor configuration..." - InstallTorConfig - if `/etc/init.d/tor enabled`; then - /etc/init.d/tor restart + if [ $PROXY_MODE = 2 ]; then + PrintBold "Installing VPN configuration..." + InstallVPNConfig + else + PrintBold "Installing Tor configuration..." + InstallTorConfig + if `/etc/init.d/tor enabled`; then + /etc/init.d/tor restart + fi fi -fi -if [ $RAM_CONFIG = 1 ]; then - PrintBold "Setting the RAM-configuration..." - RamConfigPrepare -fi + if [ $RAM_CONFIG = 1 ]; then + PrintBold "Setting the RAM-configuration..." + RamConfigPrepare + fi -if [ $LUA_MODULE = 1 ]; then - PrintBold "Installing lua module..." - InstallLuaModule -fi + if [ $LUA_MODULE = 1 ]; then + PrintBold "Installing lua module..." + InstallLuaModule + fi -if [ $LUCI_APP = 1 ]; then - PrintBold "Installing luci app..." - InstallLuciApp -fi + if [ $LUCI_APP = 1 ]; then + PrintBold "Installing luci app..." + InstallLuciApp + fi -RunAtStartup -SetCronTask + RunAtStartup + SetCronTask +else + PrintBold "An error occurred while installing the ruantiblock package!" +fi exit 0 diff --git a/autoinstall/uninstall.sh b/autoinstall/uninstall.sh index bbf3319..23f49d0 100755 --- a/autoinstall/uninstall.sh +++ b/autoinstall/uninstall.sh @@ -2,9 +2,10 @@ PREFIX="" +### Local files + RUAB_CFG_DIR="${PREFIX}/etc/ruantiblock" EXEC_DIR="${PREFIX}/usr/bin" -LUCI_ROOT="${PREFIX}/usr/lib/lua/luci" HTDOCS_VIEW="${PREFIX}/www/luci-static/resources/view" HTDOCS_RUAB="${HTDOCS_VIEW}/ruantiblock" CRONTAB_FILE="/etc/crontabs/root" @@ -12,45 +13,19 @@ DATA_DIR="${RUAB_CFG_DIR}/var" DATA_DIR_RAM="/var/ruantiblock" RC_LOCAL="/etc/rc.local" DNSMASQ_CONF_LINK="/tmp/dnsmasq.d/ruantiblock.conf" - ### ruantiblock -FILE_CONFIG="${RUAB_CFG_DIR}/ruantiblock.conf" -FILE_FQDN_FILTER="${RUAB_CFG_DIR}/fqdn_filter" -FILE_IP_FILTER="${RUAB_CFG_DIR}/ip_filter" -FILE_USER_ENTRIES="${RUAB_CFG_DIR}/user_entries" -FILE_CONFIG_SCRIPT="${RUAB_CFG_DIR}/scripts/config_script" -FILE_INFO_OUTPUT="${RUAB_CFG_DIR}/scripts/info_output" -FILE_IPT_FUNCTIONS="${RUAB_CFG_DIR}/scripts/ipt_functions" -FILE_START_SCRIPT="${RUAB_CFG_DIR}/scripts/start_script" -FILE_STOP_SCRIPT="${RUAB_CFG_DIR}/scripts/stop_script" -FILE_UCI_CONFIG="${PREFIX}/etc/config/ruantiblock" FILE_INIT_SCRIPT="${PREFIX}/etc/init.d/ruantiblock" FILE_MAIN_SCRIPT="${EXEC_DIR}/ruantiblock" -FILE_VPN_UP="${PREFIX}/etc/hotplug.d/iface/40-ruantiblock" ### tor FILE_TORRC="${PREFIX}/etc/tor/torrc" ### ruantiblock-mod-lua -FILE_PARSER_LUA="${EXEC_DIR}/ruab_parser.lua" -FILE_LUA_IPTOOL="${PREFIX}/usr/lib/lua/iptool.lua" -FILE_LUA_SUM_IP="${PREFIX}/usr/lib/lua/ruab_sum_ip.lua" -FILE_LUA_IDN="${PREFIX}/usr/lib/lua/idn.lua" -### ruantiblock-mod-py -FILE_PARSER_PY="${EXEC_DIR}/ruab_parser.py" -FILE_PY_SUM_IP="${PREFIX}/usr/lib/python3.7/ruab_sum_ip.py" -### luci-app-ruantiblock -FILE_LUCI_CONTROLLER="${LUCI_ROOT}/controller/ruantiblock.lua" -FILE_LUCI_I18N_RU="${LUCI_ROOT}/i18n/ruantiblock.ru.lmo" -FILE_LUCI_MENU="${PREFIX}/usr/share/luci/menu.d/luci-app-ruantiblock.json" -FILE_LUCI_RPCD_ACL="${PREFIX}/usr/share/rpcd/acl.d/luci-app-ruantiblock.json" -FILE_LUCI_JS_CRON="${HTDOCS_RUAB}/cron.js" -FILE_LUCI_JS_INFO="${HTDOCS_RUAB}/info.js" -FILE_LUCI_JS_SERVICE="${HTDOCS_RUAB}/service.js" -FILE_LUCI_JS_SETTINGS="${HTDOCS_RUAB}/settings.js" -FILE_LUCI_JS_TOOLS="${HTDOCS_RUAB}/tools.js" -FILE_LUCI_JS_LOG="${HTDOCS_RUAB}/log.js" -FILE_LUCI_JS_STATUS="${HTDOCS_VIEW}/status/include/80_ruantiblock.js" AWK_CMD="awk" +OPKG_CMD=`which opkg` +if [ $? -ne 0 ]; then + echo " Error! opkg doesn't exists" >&2 + exit 1 +fi FileExists() { test -e "$1" @@ -63,51 +38,6 @@ RemoveFile() { fi } -RestoreTorConfig() { - [ -e "${FILE_TORRC}.bak" ] && mv -f "${FILE_TORRC}.bak" "$FILE_TORRC" - if `/etc/init.d/tor enabled`; then - /etc/init.d/tor restart - fi -} - -RemoveAppFiles() { - RestoreTorConfig - rm -rf "$DATA_DIR" - rm -rf "$DATA_DIR_RAM" - RemoveFile "$FILE_VPN_UP" - RemoveFile "$FILE_CONFIG_SCRIPT" - RemoveFile "$FILE_INFO_OUTPUT" - RemoveFile "$FILE_IPT_FUNCTIONS" - RemoveFile "$FILE_START_SCRIPT" - RemoveFile "$FILE_STOP_SCRIPT" - rmdir "${RUAB_CFG_DIR}/scripts" 2> /dev/null - RemoveFile "$FILE_UCI_CONFIG" - RemoveFile "$FILE_INIT_SCRIPT" - RemoveFile "$FILE_MAIN_SCRIPT" - RemoveFile "$FILE_SEARCH_SCRIPT" - RemoveFile "$FILE_PARSER_LUA" - RemoveFile "$FILE_LUA_IPTOOL" - RemoveFile "$FILE_LUA_SUM_IP" - RemoveFile "$FILE_PARSER_PY" - RemoveFile "$FILE_PY_SUM_IP" - RemoveFile "$FILE_LUCI_CONTROLLER" - RemoveFile "$FILE_LUCI_I18N_RU" - RemoveFile "$FILE_LUCI_MENU" - RemoveFile "$FILE_LUCI_RPCD_ACL" - RemoveFile "$FILE_LUCI_JS_CRON" - RemoveFile "$FILE_LUCI_JS_INFO" - RemoveFile "$FILE_LUCI_JS_SERVICE" - RemoveFile "$FILE_LUCI_JS_SETTINGS" - RemoveFile "$FILE_LUCI_JS_TOOLS" - RemoveFile "$FILE_LUCI_JS_LOG" - RemoveFile "$FILE_LUCI_JS_STATUS" - rmdir "$HTDOCS_RUAB" 2> /dev/null - rm -f /tmp/luci-modulecache/* - rm -f /tmp/luci-indexcache - /etc/init.d/rpcd restart - /etc/init.d/uhttpd restart -} - AppStop() { rm -f $DNSMASQ_CONF_LINK FileExists "$FILE_MAIN_SCRIPT" && $FILE_MAIN_SCRIPT destroy @@ -130,13 +60,35 @@ RemoveRcLocalEntry() { }' "$RC_LOCAL" > "${RC_LOCAL}.tmp" && mv -f "${RC_LOCAL}.tmp" "$RC_LOCAL" } +RestoreTorConfig() { + [ -e "${FILE_TORRC}.bak" ] && mv -f "${FILE_TORRC}.bak" "$FILE_TORRC" + if [ -x "/etc/init.d/tor" ]; then + if `/etc/init.d/tor enabled`; then + /etc/init.d/tor restart + fi + fi +} + +RemoveAppFiles() { + RestoreTorConfig + rm -rf "$DATA_DIR" + rm -rf "$DATA_DIR_RAM" + $OPKG_CMD remove ruantiblock-mod-py ruantiblock-mod-lua luci-i18n-ruantiblock-ru luci-app-ruantiblock ruantiblock + rmdir "${RUAB_CFG_DIR}/scripts" 2> /dev/null + rmdir "$HTDOCS_RUAB" 2> /dev/null + rm -f /tmp/luci-modulecache/* + rm -f /tmp/luci-indexcache + /etc/init.d/rpcd restart + /etc/init.d/uhttpd restart +} + InputError () { printf "\033[1;31m Wrong input! Try again...\033[m\n"; $1 } ConfirmRemove() { local _reply - printf " Files will be removed... Continue? [y|n] (default: y, quit: q) > " + printf " Application will be removed... Continue? [y|n] (default: y, quit: q) > " read _reply case $_reply in y|Y|"") diff --git a/luci-app-ruantiblock/Makefile b/luci-app-ruantiblock/Makefile new file mode 100644 index 0000000..1821eec --- /dev/null +++ b/luci-app-ruantiblock/Makefile @@ -0,0 +1,15 @@ +# +# (с) 2020 gSpot (https://github.com/gSpotx2f/ruantiblock_openwrt) +# + +include $(TOPDIR)/rules.mk + +PKG_VERSION:=0.9.0 +PKG_RELEASE:=1 +LUCI_TITLE:=LuCI support for ruantiblock +LUCI_DEPENDS:=+ruantiblock +luci-mod-admin-full +LUCI_PKGARCH:=all + +include ../../luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-i18n-ruantiblock-ru/Makefile b/luci-i18n-ruantiblock-ru/Makefile new file mode 100644 index 0000000..d8e334c --- /dev/null +++ b/luci-i18n-ruantiblock-ru/Makefile @@ -0,0 +1,15 @@ +# +# (с) 2020 gSpot (https://github.com/gSpotx2f/ruantiblock_openwrt) +# + +include $(TOPDIR)/rules.mk + +PKG_VERSION:=0.9.0 +PKG_RELEASE:=1 +LUCI_TITLE:=Translation for luci-app-ruantiblock - Русский (Russian) +LUCI_DEPENDS:=+luci-app-ruantiblock +LUCI_PKGARCH:=all + +include ../../luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/translations/ruantiblock.ru.lmo b/luci-i18n-ruantiblock-ru/luasrc/i18n/ruantiblock.ru.lmo similarity index 100% rename from translations/ruantiblock.ru.lmo rename to luci-i18n-ruantiblock-ru/luasrc/i18n/ruantiblock.ru.lmo diff --git a/packages/19.07/luci-app-ruantiblock_0.9.0-1_all.ipk b/packages/19.07/luci-app-ruantiblock_0.9.0-1_all.ipk new file mode 100644 index 0000000000000000000000000000000000000000..6114c2dca0c0cd9927cf03c6891827bf147358d5 GIT binary patch literal 11675 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 literal 0 HcmV?d00001 diff --git a/packages/19.07/luci-i18n-ruantiblock-ru_0.9.0-1_all.ipk b/packages/19.07/luci-i18n-ruantiblock-ru_0.9.0-1_all.ipk new file mode 100644 index 0000000000000000000000000000000000000000..abad7f2cb856f68f135031efa83f442edd6f7efa GIT binary patch literal 4347 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 O7XJkijBLjMC;$LAR(fp! literal 0 HcmV?d00001 diff --git a/packages/19.07/ruantiblock_0.9.0-1_all.ipk b/packages/19.07/ruantiblock_0.9.0-1_all.ipk new file mode 100644 index 0000000000000000000000000000000000000000..e03f8f025cf764264d35ee20ddaaa3035dea370f GIT binary patch literal 11675 zcmV;MEo9OkiwFP!000001MS*HY@N-vCSWr&GsR5X%*@Qp7&9|&Gc#k%OffS<%#N9z zm>FW`-M{({x^)KkPWtp!tMg3OlD?9vChJp`^fCi1EX{089huB*98Fz)!2TUr{=vn; z@jvT7{qa+-hP;pT4YN=63e>g449pRN0^ zzW+apjhO}Ezxxb-{r6!8SeUw-GXFCJ%vQetrak`i`Df!`W8?gn`Df++r~IA&{|iWC z;r^q6yb!Q++tl*>)O(L1%xX^Y9IbeW%6Aovli<&jNy{kS<7mQ(kWmqnfY1R;qv$?+ zZj^0HwODlAw6V(N3bWMLkQ_nY@q~ub2EylIORRIOUf; zVZ{5y0K0nd%=3Y$eGmA^>*wNiVJaYGP*51Uo0t&WMZgyZF4P;G^3~g7x{h)wKJj#< zj)BA)6tvt3kL@9?R)pX4iTam7k_HMO%{^HaDZ_7>#91UrlDnK z>@_zJ5?cU$wfm_(iLfB<1js1N>k@vjLx~<*U(oSMRqnf>>Jf_6m`ff#V5wK{NHEeg zquiF3u)Z{|B4i2`C+WZt-&T)bj|n}`B<*IZqV51KH0aGNu%os?KV8#l*BFe92(wj> zPU5Vn@8YoRj5XC_$mTA{jRV7i{H$#Q5wu~yA);c+mKqAW)owT*YX}zs7dhq2sRKK0 zs~@clWi@f~&}=U8=WNZ`%VB0w3P%fYDcfEl)^?e$-v(=3-%fAa(D`8{YogHBg`J$Y zu)^O(D0%75PrSTxZ5QK+Ok#I3?#mq0Sk`XH#Pyq_x9S$t9&BPrRr0NL{)&rp)P{RP zMgP}NA(#xL)_j|+{CyF9TXB8XnTOQhTuNaY5I}OoMbvV~pP08^(nl=92zr>e zg_#Fq_U0FXkY$BEJGy#yZbolGIj4G;SGMIo%v8VE&-;gTn1Q+=!x8M|{)D18Wc|VQ z2cUz!fL9eLwjB)La~6IIpXx zO0~RgE|^aSqa$X56JI<;rB}ajiAjbJy+-p=WVfDglDM+$PEgcEKOt-D%7*#qGCU@c zB_yC@Nt^htx2chf&)~ZG$W}9D>@ZEr4ytERVwLa^$u z)5S!@NM$y8%=C7_7l)49aC$;T^WtwSkifpU+UG@_UKVJi3H8Um^cPOL$w2%n`HaN5 zVf!>5!CvkEo^T&=Bmzy^{8Y(km0}QEXav_wX>Ys*Va5sG`E*#*mN6;r=Qrq{irV8`5{r< znpDrbw8QRR;l{vdFqhC4DXe*t6Edj9Rc)cal@wwhfix*Hd?r`H8?= zf91LDAq`mo{C7=7B!#k?ilGlap0M9!p5lWb+x!!=F^>gBT(x-&qi-91!1;3TeQ{qRI zH{*L@s^Q*iljra4(y*kD1q0hPpSZn(5ITuqC+)ofVCyuB!>5(APEzaIVNl=hjh;xq zN|m0f^_D7V+p1VgF}aDi9-5!5T??P}M#vfsaTquI1XFl>2cZR#nD}+8y$s)C6$EKF z5uK8nK4Tw3^N6(>QLL<{W%lm4;rVO>LrzT6QUQwExL@TF`_*hM^_Usdn-}w(chp=& z8fpa-0=af`Hf<_8*^)9oKCM0ga6(|jg5^*bL0PD(r9wYG0Dg0-D_}Qps+TFe^6Xb@ zS5fyy0iF@f-JP9uZjzt43ZGVJlME0I!e#1$&~hZ|+mN%w&)IS_=Ekdk7I$fwC0kRT| zi@36e0&L9>$PFPlzrcsoP6N^gAFU?Kav%zDVtA=Xh3|#KwZ9EA0#Ut) z6$A^l(dI zV;$Fl3Ig1v32ow*VW~w({pZAuOla1hg|J+Gp>iYbGQ?hV)BDuWDn)i1p5_wObIWPI zbsB~$N5|hgXX9CAMe$_c9uYyWT5}Yrwve4XVX|J8!a^mDF;aRdMfxP;EJ>^sGnx!; zn$S0NWv4dIuQ!jd!taIo7jO|Rkvep#(|#y$U@WAY74@A{B(L)kLK{VsVSWVIPlL9p z?@&ukkh;(x0<9e?^>n|jTjhL2J2kWEXml`B;M&C1jOazSi&R6G;LEOfeQDyqqy<3| z5C@aVZ~)#}2OCz;S9@Ae`*)+53(FwvIC+dt9wMCOn8c&*+T%rqbP+yg$ z*h-&()20wyyGL|kJ66`33V;v`a@PW>dZ8(bXfj2)qyYiqM;+m@ubyOtL5KH1TnX@R zrJdUdkIn3IWPE>!j-mG|Dz#c{a5~tzWfn(>#X5K-p1*=AtNwyIAXceu=t%WOa#ef@ z8L9N}kbrp8kZ_|Vxkj+!>^04(v)Opp%L{;=j$?Zk;L>)2)qIaPv3J*tgBo8)PJF1@ zUj@4|{;kPDcrQIqGC;t>zFQ(bRB{{3V{C&o6B$M`CfGtk?Wl!jBH_mv{tm5zWqCCO z+>;8FYLsDxRj6#1__4eAQR9?p%!ccaAbZA&d^XV63|+Tl8^SPbpJeRxi+QzYgdU5; zC}WqJE)C3RZ2wIB&viIrXP7&)HKlM&Ft~GZDcywFL(l|{9Ib5j&u?G3aYTh7p{!X8%zMbHCIw1IpXAbQ@8f?6(0LcZ-p_09;Q_6F4VgkLKeh!^(o#KqjRXIyR*fWGiP=Xk#uu{w$jDKA1+U`w# z$_4ZpzjNg%-U@Rtnp6!hqFa)sq3`F&#cfdZJ^|q+O(Nw; zf!nGz?qSiu>_cXt{2a-i6=8RO%oHJA8Sz`fVFfNw_y8qB`b=HQYnO0pLr{jT(ezj^*2$%J4Q0KKTYc9u?4#`_N1IU&HB?1+7&@`9V&#&JZxD zx)%3HLZX@E{0edO!$U%=s;@}W`+T)IW3-taWq@G!X(nTJD4D+r;``HrTtP_t8pag zke{EF7t`8olBgoKT2wqH$M+>|!W!Ag zkC&~`pmaK%dT>&W5#$LmT=ECOAOlc%t48L+6tRc}7vzDUq9%zCLC@;?tP0}fwz%Nu z#bL2U^3Afcabq$m>>40?j!PHxx0JPRePlbJhu0eRJcYmm1bf;%^y6M3F2V~^)@%;N zcVK1si=plpcqW+-F4Q=Yf*)0g(fB`pKV`Zi!Q=@gq0EZLTHx>snip2sPdSN3=ZMxK zXJ%Ho>&Pl7oMxU@@Z$~tia|cKHw->+H^4R^L)!v&R!qbTFE+AI5|)2T_Wm2jw1ORu zKSXqm7jXzh9nI4$T?1Y{MuqcCJ!8mph>y>G zTwR6JwlS*7*(c2$%4r)q>kqfazd9(o8SsDMV8@Sg(Oq6>CJeVPvD?hq{Yp3s zgC|V^5j4F<(Bes`w_#)hSw52a$MAbH`!upg2#eGG_Tb{{b%2JfiT3t%?b(%{7xXFu zVfijZINtYWvCYihf|X`8{sF3{8OI-!ENm$^jj1V2GEf9%+r`(#qvdYvPm^V*wTK3< zI*t$)(jKuQ5sc}Mqn)>#GYX4a9L~cgIEN{ko0m+@cGi0Ai(`S9J7s+VUG3`x9mB>S zaC}Wwou_gSTwlSk>b+47VA|F1UWUBCDbWnQul@Si$NmM{<*?s&&FAhwy}5V;jg0~3 zfQHkYI-m=r$RS7IPa=2F+}ax1$1%;=9r}kd4z+9M8<2S~Mb2x-s#|Mm#zR*xubLLo z(pLgD^Qf4{7jFQzj6kDz2o;j@14HEEL|FKIPWe%K_K&pEXZl15XtzYTlRr)N+s=cfT^VKTV1f{4T?|t} zk>g&1T|G5bt(@AJyt0RxkVy{7v92C^SqQW?c4O7uT#PBV@+q+k`%|hxh~Oj9E4(wN zzJg{ESNYnFEIgm)@D*8xt7o4-JG{i+0Sa--68k`AAU+6iP#u)(d@<6 zTF$wGdjc=F+fnA!$3!9A!O)DE;dMypWjQlYr#I7mdt%s$T-Lw$L@BpwTU`&Mf@(2X zGL9kJ&T=rLoOxzxS!7fVXo`p5#r(E&_+zLDmNgLqRJ%g~R2TPrLoJMQVT?5{b$LYMYl%>$Q$`n{&^^_&>oC@I=ViO|ViG!-XDL$e0C)iBFmmr!I zZ^TQmyzg?}q{FO}y|Ai^^PP!|{1WK}ZGH>m+sbAo?#iDw5Zyb8Z4JzPGYc7qTG}m3 z*c}laPV{?*fS9A$6>SpXjZ>fmP8r>p0!W?5HxixUr@UvI0J=jY8q#QKSWmFF%9z+` z3Lm1BZ#FQM+1@$nBl4LkNUb0rRT%!N5QrSF6*l)i_52%rdlxsV-6rBAbRV{Lo-`?0 zU50!KNhOX)uO+KP)Izj-!WZKn+UNON=5bZCwZt+tfU#JxI*(8uo;dbDUTdk;R#A& z={wcU_8rfix58&+b=xv0!LyslENaev*t@XMx5RIt{GN<{&ukE2Z^&uE`YlqQ`oxpd zbC`k`7{=dIle3tTf)lCwW z=G590;6+7~O!GtKpbl33;Yjw@@k?QAFvAyZBL+v3+!;vVNe(5e@t<)+*Q9445k*=Q@570*@_IU?HcQY(A8NkuH7f07NfM_fcxnSNV1F$S8Ehd_z)<9 zLn>0-MvDJub=NnIKVTkDEy|3!v+sy0{WRea+~V+|5RL+2C`dpPd`|1I7BzOBxCGa_ zY253wED&0ky(qh*`X<@Cw4BUtCMDvNZpo%&Bt88}JqPz2n4dAPd_SIV66q)aFBB#V zH@9ktU*b)|s}c5qEjR@q5k*R@M`4A)j(S4WGQHKlIoYEvk5Q>ypU~W06);sbwXvfX zp#$zatz>tJ_97JbqcOgQVSvlVflVJVo1h3hOb`nKg3WTHt6TE6Batow)2du1S5N*j z#K-=Gem4(A1m8lMP9gAS7@Yi~&U00lA4NNAkUGi~%-&mUh4RIXjd&YTSuxWK22LvN zLGW{tdyCqwIQZzLr&*;m76$)xTTLKCd{>%5n#8jZt@hTBK;r;2h~eD`PKj+I^@N?^ zdlp4l4i7d|PNh}k&^YT|rr1b|dnDPFd(Jo2F`i@Gjw)*tr0%CG3Xc(Jksi~1vFz9g z4?X7c)KVUuh*0!xzSt|FI7lEV9VH9|Ge(}n&Xkq{w^Mk_J{5Wq)5ejk;u7|eT2@m+ zO~+kF)SGxI<7B4#j|be}xPr$P=ct<>WO>POEO?g+c$bBg$vb4MyV#g-3PH7|C>7Go z6DstuA4*7Z0yn0vo3-3yJ$wBV-S`01oqH@KR@=Zopv~@;vbK~j@5aikL}6c6WKJNw zzcgHUJLsr44vtc3(kaAg5s5%|Nu(g7EF|{Gk&p|k`NYi-TKd)twtoS~`2CQ*&Bk{; z-CFSvt0TLKD)3P#xIZXRKkXbp3etK6oMd$>C`HZk?k@4f(^3s$I06(@?f{-Nfz93= zyAPz@4Fd6({f%$^Wt@bdH(eXfUJwufz6%QIvTmERo4+kwPG4P7RA6a?$FpSKpahC# zYTo9+b(c?Exqj8fF%yohDpFl>6Bo)^ca$Pk??L7s?5wj1TJ`_ffzW8SrW6(VDjb zx~2*P%vxZ$fU6;2J)t99`2Mk<>InaA*Q+YM1qq3X8UhLo@wu--YGqlEpx&?$)LEZN zOUfsZo~6g=4yd8F{J8&`hU{(bJxwg)Q`(b*d%j`|^w}vhIqI66cjd_snUd<|@JvPF z=@u2xNncmNq6wZMW}50saE_UABti9&Y*lxciY$6bHZ4K^!~n zqw_%5m7|QDPOVn#E274!XJ(nXmS^P=rK+D@8ClQ%`n0@HN(nY_+uH^du6{D?CPF#F zMfp^IVhoX|q8oH-hF&}&q>=5Aq7c`O zT7_pjG(gjpag+twG;1>az9fVVJKYyfLcQYT8h=eAu^`t31p?APG%D27{GXTlHNw6| zLioB^zAxoZuSD;&qKOai0*b|P^C2N@j+a0(m2DV5$psD*l|vaI9EXO*mp4xl)iU0v z`n5{hf^N~$n7Atl_n4**=&w~Wf|e(0vIYEL31^IsvHUS`p^XwAv4(4^hO|n_9rx4? z_&dLjjfj5>V|ewRQW%=>6s02ULAVY2*39x=^p%JD&1H}nolHde6_chy{nCofntE-7 z=QG6qWecu++9ujFr&Ab>;9BA7?z3W_=YsthRU&R-oZ`<lwi*m z|I~r`vE5X8U_Kg3n zR-)U((Gd~*S%%51dvb+l{}I3zTVu^ElO;=s((@Qyf+&fP{xN(+7;X7kwxfR);3%Jh zP}(Ne?!)-QNX&xk#(S&xQnnEaicLKE3KnS%X)Wf;E+H91+xXr79)9{X%cOGXMxP zv&3@8+F=1R$dG^+ROX_t;%<1`d@i1<7vVmGyj@hb2=MzN{`mH=*kOy}J=7KGy>QC8 zCjdeg^YBJ;KFDtncbT;tUzZ)hM7=NY{ifvU0*un(`(=}xNJGPs>FF;E%VvRs#Q1p- zEE@6hj$c<7K@ff`lYTK|jI>D2AX822STR-X>F%rQ_9sU`6Obixo$C9R#Ui0EcI*M+ zKvs)P4>@mdW|5;b>$*eYb$a- zvq-IS=WIb}N#O!NG1$o(4NAQv*(4BSnCzw%m&S6+hpka7T9xA*h9Ya4TedVc72ZsD z`ap&6UG>2pM&g(@)yG&kv8uimlbf&CJPhrC-dkb>xA9IEuYR0?`$X}o{?^PoQCT;7970^+*vMndmHcYt0{UmPc|@yh=t663i<>x z?Pu#=rQ%+0#3Q(^^O1$_bPIwj+l{7KiH}QglF44MAv(|Cou+oUAX{AN&nlSih)Rl} zMC<{=L;PHi#fOcRHEI})Bo}&03bzn^Lj^L(!XK7MG#L^qYE(n6l%L(LM9HFz@;zCi zVp!5r5auSy)=gn>7$^(Z!A3DG@o23|N?(=hZwOp4s(-E*1&UVO?KjveEu3>_tiix5 zO)6Ttm{WAq(UdoZ=NyP?xLTrEG7vZ&v*%+ui-AXTwGD@SSc>9Vs)$Pju83Bt72R56uKi=OiJd)p-v%u%$+KHoZ*y(4R*ZDtp?L&Pz19iSB{Rin^w54 zYR;wsS320Q7A+aTsv$v?wR<;ag^aB60lK&lgv4koBz2hGr^-GxH5R}5@1#k~!rY&Thn-=FXdL<^((D;fsxy;& zg#waYFM4On0=IqXFb1ycb|_}dUq->+)cSQoHqT@wQorEVq9F#n3KI`8&SQW>F2&+f z{u~bGdo|8YFI9|~$Xvbd*jBDCcw88zSh3Y;Q4^)wsp?wC?V{|a^knz`R+AhiFqCht zX=ksRGJTOJ-q69c(iJo*aMUHlYH zl96O$lCmi}lXuh4lM6=;Li`fUU|;op%7ELYuMh9S)*lEh<%jRP>KkEs0*pKaMy+=~ z=({(kW>-N()U8}zEP$P~OfBhH0IqTMBO56&gDAgrRE^6*K4V{msDqoyD&~pdt$zek zdl^@*xrmg(3in3cq50|HDzPY`k$Z@zfRn?kvonEgBO3_2PY_=d?<`H=3mEr=vZUl* z-hq0;hb`Bl(^S_!U7jJo?yQ*EIp#vYCtJ6Z%~4IyTe4A1oDhB7s9Zc@ng7XCW}t~H zdrZp4eh2}@Z5TLRu&^M2+bfoKVm#uqDib`z-Q$-ONvqz_nz17E`j%IShosFfcN<3o zEmY>P^)6OL&5Wgect1mYtT`~O*RpJy>xf>3LC;ZbfB6ITefXN~1KDczx7X-C-*q)_ z)^zfAa$>qQD&Y)4e4`}ISVkSSw7vfO>5z+Qk*3bGUEr>R$L%8my z2AhCjjvAn)Skn(y4kfn!f*rnEnW*uQLYOI;vMDyDYn+*aF%rkLhIt(;vFVH4y_1c^ z?E)IruOS=0g)1Zx=T_6`h0|od0HIjFcR28@P}zz>rEa})`olfwjKFPd#Z*uMUu7G~vZS<_Ho2ZlgdO%by19JD+Y8iH8SvzK9Y}aR> zc+m6aHkO9!cBF#rna@G(=)#?5Z^qd;7kXRWiwd)65qUv>+x6#xR)g4*r+)TGej8tj zZostB2nzpA&IP$^-N~uJDcJ%*umi=qBMPgJQrUbsv(##Vs}#l-;vAyEO9sy0MjHb< zRx(eLDzHo2gMY)#i=XInqnnhIuA}zBX*1r+yqA%TG&X%ww2G>RJ`ZVlN=wt<--xb# zCH&a)ao0STT7ouJb3^TeBP4M}7B9-Qm*7+&4w8qDeV;SdQK1NJK2QDBcjV%w>Lr02 zck!S1ZY$Ajy@c~yJ|KDmtuFdBR1Zr!_M0N<68V8)K0R;0-kDPRcx#7hdKGWDGOczC z8YXUh+>Kfq{?+#y5dgzRYZ9ZjE%?{u8zO}jFV8lwBN<1#fDhz#ziy?G!DY#bq-diH z%|3=YMV}^;EiXAC*ucK%0zWwBMC-%{a7@lSKRC!17<4;MHB&MC+R6-koa=Z}Hm+2Q zs+Qu?jx_L5nS9Jr(>PuFm&sgN6!&fsdNM7Bm-UstIw z*unc!5g$9D-+ov0pbfbx_eeuqvC)}xkNt|tpR-U{POUp#A0gLzn0=t@HAshbOv8`- z@)faR0N$4ks=inpX2o}69>7YzF5id{UPBg3t5xAwaWMjo&M!?nTGbi^)9)c$7?1F2&dW+^Ei7Wy=yFEy9Jb&RQ)-nw+L$Boeqp27m`((}xot_*%Ih(7+8o$Ba zaaBnVM=3e7jf^-xc`r2(ysAko&O4m5S z0XTF1eHYI~_S#TNe6PfDqxpi**hT~8z#J3cN~{B z%T(=JMRy!mZLzl)g<9pP5IRR$>REmr8!zzxbKOLcZ3{?b|HZ^2)iYQpwcq^q%bL^k z$yoE;qctQQ!foR>>@QG}C7>4n)C5PDqylrb9rpy;l>DI=MXU5Ug`)Z-4r;`02*vYs zBrw9sDol8o18#rH?3AAZxg%?b->9Qy=xL9`)zIP@y?M~@JIWWouwSqCmCx)G3#M!-EM!hny#;*Y6?v zW5&hI&Btk>t5Kq~h$%|~-mnIlJjJ3QsO;(`U?7SeiUZ8KT*$sEbD2}G6^NRW_eNZ) z2x4@UhZAInY}pUWZS`CSp#~R_Okti)>=N~kiai(+8X0B14siH>ao{n6e}=}<00#vZ z2n-%1xYh=J^Nv(kROB8j88qohF=ZKF9GCayOdI0O@_$XsmZ^A17BAO2aAo%+cF`PM z{`INd`zQ$UT99nE3DN-7w7w?a^{YOD#7#Cq*6xb|mXEW5X?BNuu_XBRJJ`yg*ZwEJ z(`H(W#_S*?55G+A;no)4f~W5(by08b0WETvh(vjI+5yenKj&Iw#V-wLc}99|ssle? z6}WddJAjlBYYNk+em~eNmJY+pxHfL4a5&bM`&nPVG&dwl>-~C;lf}aLia|D+7M884 zyvaySr0B2tqV$9BKph&S;=Oh>EYh|M|`{deStojge!F?z5sT$M4SArd|H?iER9? z-^|DGJtw{N%1?X)WcED^8)qL2R6}~(PhFY$0RkKU({KLnI0NhM(6bAGUoIj!Ou1Xu zsNg0zG5@X8C@b|X>)OQ*W6~ubn&T{6JJjfje!r*oPR?11Y4|FiiAqXu$t{ zHJG_iIuSyu_gVWEVEusAG`^}a05Gpl$E~BRR7+XE9nMK5_Uk!@IppTwA)l7nV(zJw zwAlQ{Ox7)!^1f4&cN!s-@k1dRgGw%qR<&5-Kbqt{r~FX+3ozRM-k;B3fBp5>Uw{4e l*I$4A_19m2{q@&hfBp5>Uw{4e*I)m~{SPDXo5=uB002R%*X{rS literal 0 HcmV?d00001 diff --git a/ruantiblock-mod-lua/Makefile b/ruantiblock-mod-lua/Makefile new file mode 100644 index 0000000..3302d61 --- /dev/null +++ b/ruantiblock-mod-lua/Makefile @@ -0,0 +1,39 @@ +# +# (с) 2020 gSpot (https://github.com/gSpotx2f/ruantiblock_openwrt) +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=ruantiblock-mod-lua +PKG_VERSION:=0.9.0 +PKG_RELEASE:=1 +PKG_MAINTAINER:=gSpot +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=net + CATEGORY:=Network + TITLE:=Lua module for ruantiblock + URL:=https://github.com/gSpotx2f/ruantiblock_openwrt + PKGARCH:=all + DEPENDS:=+ruantiblock +lua +luasocket +luasec +luabitop +iconv +idn +endef + +define Package/$(PKG_NAME)/description + +endef + +define Build/Prepare + $(CP) -r ./files $(PKG_BUILD_DIR)/files +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/usr/bin/ruab_parser.lua $(1)/usr/bin/ruab_parser.lua + $(INSTALL_DIR) $(1)/usr/lib/lua + $(INSTALL_DATA) $(PKG_BUILD_DIR)/files/usr/lib/lua/ruab_sum_ip.lua $(1)/usr/lib/lua/ruab_sum_ip.lua +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/ruantiblock-mod-py/Makefile b/ruantiblock-mod-py/Makefile new file mode 100644 index 0000000..5b230d5 --- /dev/null +++ b/ruantiblock-mod-py/Makefile @@ -0,0 +1,39 @@ +# +# (с) 2020 gSpot (https://github.com/gSpotx2f/ruantiblock_openwrt) +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=ruantiblock-mod-py +PKG_VERSION:=0.9.0 +PKG_RELEASE:=1 +PKG_MAINTAINER:=gSpot +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=net + CATEGORY:=Network + TITLE:=Python module for ruantiblock + URL:=https://github.com/gSpotx2f/ruantiblock_openwrt + PKGARCH:=all + DEPENDS:=+ruantiblock +python3 +python3-setuptools +python3-openssl +endef + +define Package/$(PKG_NAME)/description + +endef + +define Build/Prepare + $(CP) -r ./files $(PKG_BUILD_DIR)/files +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/usr/bin/ruab_parser.py $(1)/usr/bin/ruab_parser.py + $(INSTALL_DIR) $(1)/usr/lib/python3.7 + $(INSTALL_DATA) $(PKG_BUILD_DIR)/files/usr/lib/python3.7/ruab_sum_ip.py $(1)/usr/lib/python3.7/ruab_sum_ip.py +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/ruantiblock/Makefile b/ruantiblock/Makefile new file mode 100644 index 0000000..ccf8dd2 --- /dev/null +++ b/ruantiblock/Makefile @@ -0,0 +1,112 @@ +# +# (с) 2020 gSpot (https://github.com/gSpotx2f/ruantiblock_openwrt) +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=ruantiblock +PKG_VERSION:=0.9.0 +PKG_RELEASE:=1 +PKG_MAINTAINER:=gSpot +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=net + CATEGORY:=Network + TITLE:=Ruantiblock + URL:=https://github.com/gSpotx2f/ruantiblock_openwrt + PKGARCH:=all + DEPENDS:=+wget +ipset +kmod-ipt-ipset +dnsmasq-full +endef + +define Package/$(PKG_NAME)/description + +endef + +define Package/$(PKG_NAME)/conffiles + /etc/config/ruantiblock + /etc/ruantiblock/fqdn_filter + /etc/ruantiblock/ip_filter + /etc/ruantiblock/user_entries +endef + +define Build/Prepare + $(CP) -r ./files $(PKG_BUILD_DIR)/files +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/usr/bin/ruantiblock $(1)/usr/bin/ruantiblock + $(INSTALL_DIR) $(1)/etc/ruantiblock + $(INSTALL_CONF) $(PKG_BUILD_DIR)/files/etc/ruantiblock/ruantiblock.conf $(1)/etc/ruantiblock/ruantiblock.conf + $(INSTALL_CONF) $(PKG_BUILD_DIR)/files/etc/ruantiblock/fqdn_filter $(1)/etc/ruantiblock/fqdn_filter + $(INSTALL_DIR) $(1)/etc/hotplug.d/iface + $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/etc/hotplug.d/iface/40-ruantiblock $(1)/etc/hotplug.d/iface/40-ruantiblock + $(INSTALL_DIR) $(1)/etc/ruantiblock/scripts + $(INSTALL_DATA) $(PKG_BUILD_DIR)/files/etc/ruantiblock/scripts/config_script $(1)/etc/ruantiblock/scripts/config_script + $(INSTALL_DATA) $(PKG_BUILD_DIR)/files/etc/ruantiblock/scripts/info_output $(1)/etc/ruantiblock/scripts/info_output + $(INSTALL_DATA) $(PKG_BUILD_DIR)/files/etc/ruantiblock/scripts/ipt_functions $(1)/etc/ruantiblock/scripts/ipt_functions + $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/etc/ruantiblock/scripts/start_script $(1)/etc/ruantiblock/scripts/start_script + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_CONF) $(PKG_BUILD_DIR)/files/etc/config/ruantiblock $(1)/etc/config/ruantiblock + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/etc/init.d/ruantiblock $(1)/etc/init.d/ruantiblock +endef + +define Package/$(PKG_NAME)/preinst +#!/bin/sh + +RUAB_CFG_DIR="/etc/ruantiblock" +EXEC_DIR="/usr/bin" +BACKUP_DIR="$${RUAB_CFG_DIR}/autoinstall.bak" +FILE_CONFIG="$${RUAB_CFG_DIR}/ruantiblock.conf" +FILE_FQDN_FILTER="$${RUAB_CFG_DIR}/ruab_fqdn_filter" +FILE_IP_FILTER="$${RUAB_CFG_DIR}/ruab_ip_filter" +FILE_USER_ENTRIES="$${RUAB_CFG_DIR}/ruab_user_entries" +FILE_UCI_CONFIG="/etc/config/ruantiblock" +FILE_MAIN_SCRIPT="$${EXEC_DIR}/ruantiblock" + + +test -e "$$FILE_MAIN_SCRIPT" && $$FILE_MAIN_SCRIPT destroy + +mkdir -p "$$BACKUP_DIR" +for _file in "$$FILE_CONFIG" "$$FILE_FQDN_FILTER" "$$FILE_IP_FILTER" "$$FILE_USER_ENTRIES" "$$FILE_UCI_CONFIG" +do + [ -e "$$_file" ] && cp -f "$$_file" "$${BACKUP_DIR}/`basename $$_file`" +done + +exit 0 +endef + +define Package/$(PKG_NAME)/prerm +#!/bin/sh + +EXEC_DIR="/usr/bin" +FILE_INIT_SCRIPT="/etc/init.d/ruantiblock" +FILE_MAIN_SCRIPT="$${EXEC_DIR}/ruantiblock" +CRONTAB_FILE="/etc/crontabs/root" +RC_LOCAL="/etc/rc.local" +DNSMASQ_CONF_LINK="/tmp/dnsmasq.d/ruantiblock.conf" + + +rm -f $$DNSMASQ_CONF_LINK +test -e "$$FILE_MAIN_SCRIPT" && $$FILE_MAIN_SCRIPT destroy + +test -e "$$FILE_INIT_SCRIPT" && $$FILE_INIT_SCRIPT disable + +awk -v FILE_MAIN_SCRIPT="$$FILE_MAIN_SCRIPT" '$$0 !~ FILE_MAIN_SCRIPT { + print $$0; +}' "$$CRONTAB_FILE" > "$${CRONTAB_FILE}.tmp" && mv -f "$${CRONTAB_FILE}.tmp" "$$CRONTAB_FILE" +/etc/init.d/cron restart + +awk -v FILE_MAIN_SCRIPT="$$FILE_MAIN_SCRIPT" '$$0 !~ FILE_MAIN_SCRIPT { + print $$0; +}' "$$RC_LOCAL" > "$${RC_LOCAL}.tmp" && mv -f "$${RC_LOCAL}.tmp" "$$RC_LOCAL" + +exit 0 + +endef + +$(eval $(call BuildPackage,$(PKG_NAME)))