Self-written network filter module installation script

Wrote following script for devices that cannot handle AdGuard Home or Pi-Hole.

Minimal requirements 20 MB of storage.

This script should just be run once and it will setup LuCI web interface automatically.

I will be very pleased if you will share your fixes or other information.


#!/bin/sh

FILTERING_PACKAGE="adblock"
UPDATE_SCRIPT="/usr/bin/adblock-update.sh"
AUTO_UPDATE_SCRIPT="/usr/bin/adblock-auto-update.sh"

if [ ! -d "/usr/local" ]; then
    mkdir -p /usr/local/bin
fi

LUA_PACKAGES="lua luci-lib-jsonc"

is_lua_package_installed() {
    local package=$1
    if opkg list-installed | grep -q "^${package}$"; then
        return 0
    else
        return 1
    fi
}

install_lua_packages() {
    for package in $LUA_PACKAGES; do
        if ! is_lua_package_installed "$package"; then
            echo "Installing ${package}..."
            opkg update
            opkg install "${package}"
        else
            echo "${package} is already installed."
        fi
    done
}

install_package() {
 if ! opkg list-installed | grep -q "^${FILTERING_PACKAGE}$"; then
    opkg update
    opkg install "${FILTERING_PACKAGE}"
 fi
}

enable_service() {
 if ! /etc/init.d/"${FILTERING_PACKAGE}" enabled; then
    /etc/init.d/"${FILTERING_PACKAGE}" enable 
 fi
}

configure_package() {
 uci set "${FILTERING_PACKAGE}".config.auto_update=0
 uci set "${FILTERING_PACKAGE}".config.block_malware=0
 uci set "${FILTERING_PACKAGE}".config.block_iploggers=0
 uci set "${FILTERING_PACKAGE}".config.enable_adblock=0
 uci commit "${FILTERING_PACKAGE}"
}

create_update_script() {
 cat > "${UPDATE_SCRIPT}" << EOF
#!/bin/sh
URL="https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/Filters/filter.txt"
MALWARE_URLS="https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Alternate%20versions%20Anti-Malware%20List/AntiMalwareAdGuardHome.txt https://raw.githubusercontent.com/AdguardTeam/FiltersRegistry/master/filters/ThirdParty/filter_255_Phishing_URL_Blocklist/filter.txt https://raw.githubusercontent.com/AdguardTeam/FiltersRegistry/master/filters/ThirdParty/filter_256_Scam_Blocklist/filter.txt"
IPLOGGER_URL="https://raw.githubusercontent.com/Konnor88/anti-grabify/master/url_list.txt"
FILE="/etc/adblock/adblock.conf"
. /etc/uci-defaults/40-adblock
update_filter() {
 if [ "\$(uci get ${FILTERING_PACKAGE}.config.auto_update)" = "1" ]; then
    wget -O /tmp/filter.txt "\$URL"
    sed -i '/^!/d' "\$FILE"
    cat /tmp/filter.txt >> "\$FILE"
    if [ "\$(uci get ${FILTERING_PACKAGE}.config.block_malware)" = "1" ]; then
      for url in \$MALWARE_URLS; do
        wget -O - "\$url" >> "\$FILE"
      done
    fi
    if [ "\$(uci get ${FILTERING_PACKAGE}.config.block_iploggers)" = "1" ]; then
      wget -O - "\$IPLOGGER_URL" >> "\$FILE"
    fi
 fi
}
restart_service() {
 /etc/init.d/${FILTERING_PACKAGE} restart
}
update_filter
restart_service
EOF
 chmod +x "${UPDATE_SCRIPT}"
}

create_auto_update_script() {
 if ! /etc/init.d/cron enabled; then
    /etc/init.d/cron enable
    /etc/init.d/cron start
 fi

 cat > "${AUTO_UPDATE_SCRIPT}" << EOF
#!/bin/sh
if [ "\$(uci get ${FILTERING_PACKAGE}.config.auto_update)" = "1" ]; then
    (crontab -l 2>/dev/null; echo "0 0 */5 * * /usr/bin/adblock-update.sh") | crontab -
else
    (crontab -l | grep -v '/usr/bin/adblock-update.sh' || true) | crontab -
fi
EOF
 chmod +x "${AUTO_UPDATE_SCRIPT}"
}

create_luci_interface() {
 cat > "/usr/lib/lua/luci/controller/network_filtering.lua" << EOF
module("luci.controller.network_filtering", package.seeall)
function index()
 entry({"admin", "network", "network_filtering"}, cbi("network_filtering"), _("Network filtering"))  
end
EOF

 cat > "/usr/lib/lua/luci/view/network_filtering/cbi.lua" << EOF
require "luci.util"
m = Map("adblock", translate("Network filtering"))
s = m:section(TypedSection, "adblock")
s.anonymous = true
btn = s:option(Button, "update", translate("Update"))
btn.inputtitle = translate("Update")
btn.inputstyle = "apply"
btn.write = function()
 luci.sys.call("/usr/bin/adblock-update.sh")
 luci.http.redirect(luci.dispatcher.build_url("admin", "network", "network_filtering"))
end
auto_update = s:option(Flag, "auto_update", translate("Auto Update"))
auto_update.default = 0
block_malware = s:option(Flag, "block_malware", translate("Block Malicious Websites"))
block_malware.default = 0
block_iploggers = s:option(Flag, "block_iploggers", translate("Block IP Loggers"))
block_iploggers.default = 0
enable_adblock = s:option(Flag, "enable_adblock", translate("Enable AdBlocking"))
enable_adblock.default = 0
return m
EOF
}

install_lua_packages
install_package
enable_service  
configure_package
create_update_script
create_auto_update_script

/etc/init.d/luci-module load network_filtering
/etc/init.d/luci-mod-admin restart

echo "Installation complete. Please configure the Network filtering settings through the LuCI web interface."
echo "This script is one-time use for installation. Manual updates can be performed through the GUI."

rm -- "$0"

exit 0

Uninstalling script:


#!/bin/sh

FILTERING_PACKAGE="adblock"
UPDATE_SCRIPT="/usr/bin/adblock-update.sh" # Changed to /usr/bin
AUTO_UPDATE_SCRIPT="/usr/bin/adblock-auto-update.sh" # Changed to /usr/bin

uninstall_package() {
 if opkg list-installed | grep -q "^${FILTERING_PACKAGE}$"; then
    opkg remove "${FILTERING_PACKAGE}"
 fi
}

disable_service() {
 if /etc/init.d/"${FILTERING_PACKAGE}" enabled; then
    /etc/init.d/"${FILTERING_PACKAGE}" disable 
 fi
}

remove_update_script() {
 if [ -f "${UPDATE_SCRIPT}" ]; then
    rm "${UPDATE_SCRIPT}"
 fi
}

remove_auto_update_script() {
 if [ -f "${AUTO_UPDATE_SCRIPT}" ]; then
    rm "${AUTO_UPDATE_SCRIPT}"
 fi
}

remove_luci_interface() {
 rm -f "/usr/lib/lua/luci/controller/network_filtering.lua"
 rm -f "/usr/lib/lua/luci/view/network_filtering/cbi.lua"
}

remove_cron_jobs() {
 crontab -l | grep -v '/usr/bin/adblock-update.sh' | crontab -
}

remove_unused_dependencies() {
 opkg autoremove
}

echo "Starting Network Filtering uninstallation..."

uninstall_package
disable_service
remove_update_script
remove_auto_update_script
remove_luci_interface
remove_cron_jobs
remove_unused_dependencies # Added step to remove unused dependencies

echo "Uninstallation complete. Network Filtering has been removed."

rm -- "$0"

exit 0