diff --git a/package/ctcgfw/luci-app-autoipsetadder/Makefile b/package/ctcgfw/luci-app-autoipsetadder/Makefile new file mode 100644 index 0000000000..06ee48de1e --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/Makefile @@ -0,0 +1,64 @@ +# Copyright (C) 2018-2019 Lienol +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-autoipsetadder +PKG_VERSION:=1.0 +PKG_RELEASE:=6 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/luci-app-autoipsetadder + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=LuCI Support for autoipsetadder + PKGARCH:=all + DEPENDS:= +coreutils-stdbuf +httping +curl +endef + +define Package/luci-app-autoipsetadder/description + LuCI support for autoipsetadder +endef + +define Build/Prepare +endef + +define Build/Compile +endef + +define Package/luci-app-autoipsetadder/conffiles +/etc/config/autoipsetadder +endef + +define Package/luci-app-autoipsetadder/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci + cp -pR ./luasrc/* $(1)/usr/lib/lua/luci + $(INSTALL_DIR) $(1)/ + cp -pR ./root/* $(1)/ +endef + +define Package/luci-app-autoipsetadder/postinst +#!/bin/sh + /etc/init.d/autoipsetadder enable >/dev/null 2>&1 + /etc/init.d/autoipsetadder start + rm -f /tmp/luci-indexcache + rm -f /tmp/luci-modulecache/* +exit 0 +endef + +define Package/luci-app-autoipsetadder/prerm +#!/bin/sh +if [ -z "$${IPKG_INSTROOT}" ]; then + /etc/init.d/autoipsetadder disable + /etc/init.d/autoipsetadder stop +fi +exit 0 +endef + +$(eval $(call BuildPackage,luci-app-autoipsetadder)) diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua b/package/ctcgfw/luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua new file mode 100644 index 0000000000..d14215327a --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua @@ -0,0 +1,46 @@ +module("luci.controller.autoipsetadder",package.seeall) +local io = require "io" +local fs=require"nixio.fs" +local sys=require"luci.sys" +local uci=require"luci.model.uci".cursor() +function index() + entry({"admin","services","autoipsetadder"},firstchild(),_("autoipsetadder"),30).dependent=true + entry({"admin","services","autoipsetadder","autoipsetadder"},cbi("autoipsetadder"),_("Base Setting"),1) + entry({"admin","services","autoipsetadder","status"},call("act_status")).leaf=true + entry({"admin", "services", "autoipsetadder", "getlog"}, call("get_log")) + entry({"admin", "services", "autoipsetadder", "dodellog"}, call("do_del_log")) + entry({"admin", "services", "autoipsetadder", "debugip"}, call("do_debug_ip")) +end + +function act_status() + local e={} + e.running=luci.sys.call("pgrep -f /usr/bin/autoipsetadder/autoaddlist.sh >/dev/null")==0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end +function do_del_log() +local logfile=uci:get("autoipsetadder","autoipsetadder","logfile") or "/tmp/addlist.log" +nixio.fs.writefile(logfile,"") +luci.http.prepare_content("application/json") +luci.http.write('') +end +function do_debug_ip() +luci.http.prepare_content("text/plain; charset=utf-8") +local a=sys.exec("/usr/bin/autoipsetadder/debugip.sh") +if (a=="") then +a="noproblem" +end +luci.http.write(a) +end +function get_log() + local logfile=uci:get("autoipsetadder","autoipsetadder","logfile") or "/tmp/addlist.log" + luci.http.prepare_content("text/plain; charset=utf-8") + local fdp=tonumber(fs.readfile("/var/run/lucilogpos_ipset")) or 0 + local f=io.open(logfile, "r+") + f:seek("set",fdp) + local a=f:read(2048000) or "" + fdp=f:seek() + fs.writefile("/var/run/lucilogpos_ipset",tostring(fdp)) + f:close() + luci.http.write(a) +end \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua b/package/ctcgfw/luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua new file mode 100644 index 0000000000..d9ec55504d --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua @@ -0,0 +1,97 @@ +require("luci.sys") +require("luci.util") +local fs=require"nixio.fs" +local uci=require"luci.model.uci".cursor() +local m,s,o +m = Map("autoipsetadder", translate("ipsetautoadder")) +m.description = translate("自动将联不通的域名加入ipset") +m:section(SimpleSection).template = "autoipsetadder/status" + +s = m:section(TypedSection, "autoipsetadder") +s.anonymous=true +s.addremove=false +---- enable +o = s:option(Flag, "enabled", translate("启用")) +o.default = 0 +o.rmempty = false +---- logview +o=s:option(TextValue, "show", "日志") +o.template = "autoipsetadder/check" +---- logpath +o = s:option(Value, "logfile", translate("Runtime log file")) +o.datatype = "string" +o.default="/tmp/addlist.log" +o.optional = false +o.validate=function(self, value) +if fs.stat(value,"type")=="dir" then + fs.rmdir(value) +end +if fs.stat(value,"type")=="dir" then + if m.message then + m.message =m.message.."\nerror!log file is a dir" + else + m.message ="error!log file is a dir" + end + return nil +end +return value +end +---- dnsmasq log +o = s:option(Value, "dnslogfile", translate("dnsmasq log file")) +o.datatype = "string" +o.optional = false +o.default="/tmp/dnsmasq.log" +o.validate=function(self, value) +if fs.stat(value,"type")=="dir" then + fs.rmdir(value) +end +if fs.stat(value,"type")=="dir" then + if m.message then + m.message =m.message.."\nerror!log file is a dir" + else + m.message ="error!log file is a dir" + end + return nil +end +return value +end +---- crontab +o = s:option(MultiValue, "crontab", translate("Crontab task"),translate("Please change time and args in crontab")) +o:value("autodeldnslog",translate("Auto del dnsmasq log")) +o:value("autotaillog",translate("Auto tail runtime log")) +o.widget = "checkbox" +o.default = "autodeldnslog autotaillog" +o.rmempty= true + +o = s:option(MultiValue, "config", translate("the way add to gfwlist")) +o:value("nochina",translate("no china ip")) +o:value("pingadd",translate("5ping loss1-4")) +o:value("packetpass",translate("packet >12 pass")) +o.widget = "checkbox" +o.default = "nochina pingadd packetpass" +o.rmempty=true +---- apply +nixio.fs.writefile("/var/run/lucilogpos_ipset","0") +function m.on_commit(map) + local ucitracktest=uci:get("autoipsetadder","autoipsetadder","ucitracktest") + if ucitracktest=="1" then + return + elseif ucitracktest=="0" then + io.popen("/etc/init.d/autoipsetadder reload &") + else + if (fs.access("/var/run/AdGucitest")) then + uci:set("autoipsetadder","autoipsetadder","ucitracktest","0") + io.popen("/etc/init.d/autoipsetadder reload &") + else + fs.writefile("/var/run/AdGucitest","") + if (ucitracktest=="2") then + uci:set("autoipsetadder","autoipsetadder","ucitracktest","1") + else + uci:set("autoipsetadder","autoipsetadder","ucitracktest","2") + end + end + uci:save("autoipsetadder") + uci:commit("autoipsetadder") + end +end +return m diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm new file mode 100644 index 0000000000..651d93d46f --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm @@ -0,0 +1,62 @@ +<%+cbi/valueheader%> +<%uci=require"luci.model.uci".cursor()%> +<%nixio=require"nixio"%> + +<%if uci:get("autoipsetadder","autoipsetadder","enabled")=="1" then%> + +<%:reverse%> + + + + + + + +<%end%> +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm new file mode 100644 index 0000000000..b9f123d6f1 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm @@ -0,0 +1,22 @@ + + +
\ No newline at end of file diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/etc/config/autoipsetadder b/package/ctcgfw/luci-app-autoipsetadder/root/etc/config/autoipsetadder new file mode 100644 index 0000000000..5110d5260b --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/etc/config/autoipsetadder @@ -0,0 +1,2 @@ +config autoipsetadder 'autoipsetadder' + option enabled '0' diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/etc/init.d/autoipsetadder b/package/ctcgfw/luci-app-autoipsetadder/root/etc/init.d/autoipsetadder new file mode 100755 index 0000000000..d4c4ea4cc1 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/etc/init.d/autoipsetadder @@ -0,0 +1,125 @@ +#!/bin/sh /etc/rc.common + +USE_PROCD=1 + +START=99 +STOP=01 +CRON_FILE=/etc/crontabs/root +CONFIGURATION=autoipsetadder +EXTRA_COMMANDS="test_crontab" +EXTRA_HELP=" + test_crontab" +set_dnsmasq_log() +{ + sed -i '/log-facility/d' /etc/dnsmasq.conf + sed -i '/log-queries/d' /etc/dnsmasq.conf + uci set dhcp.@dnsmasq[0].logfacility='/tmp/dnsmasq.log' + uci delete dhcp.@dnsmasq[0].logqueries + echo log-queries >> /etc/dnsmasq.conf + uci commit dhcp + /etc/init.d/dnsmasq reload +} + +stop_dnsmasq_log() +{ + sed -i '/log-queries/d' /etc/dnsmasq.conf + uci delete dhcp.@dnsmasq[0].logfacility + uci commit dhcp + /etc/init.d/dnsmasq reload +} + +reload_service() +{ + rm -f /var/run/AdGucitest 2>/dev/null + procd_kill $CONFIGURATION + kill $(cat /var/run/autoipsetadder.pid) + start +} + +start_service() { + # Reading config + config_load "${CONFIGURATION}" + mkdir -p /tmp/run/autoipsetadder + local enabled + config_get_bool enabled $CONFIGURATION enabled 0 + do_crontab + if [ "$enabled" == "1" ]; then + set_dnsmasq_log + procd_open_instance + procd_set_param respawn + # pass config to script on start + procd_set_param command sh /usr/bin/autoipsetadder/autoaddlist.sh + procd_close_instance + echo "autoipsetadder turn on" + echo "enabled=$enabled" + else + stop_dnsmasq_log + echo "autoipsetadder turn off" + echo "enabled=$enabled" + fi +} + +stop_service() +{ + config_load "${CONFIGURATION}" + stop_dnsmasq_log + do_crontab + kill $(cat /var/run/autoipsetadder.pid) + echo "autoipsetadder turn off" + echo "enabled="$enabled"" +} +do_crontab(){ + config_get_bool enabled $CONFIGURATION enabled 0 + config_get logfile $CONFIGURATION logfile "/tmp/addlist.log" + config_get dnslogfile $CONFIGURATION dnslogfile "/tmp/dnsmasq.log" + config_get crontab $CONFIGURATION crontab "" + cronreload=0 + findstr="echo qingkong > $dnslogfile" + default="0 * * * * echo qingkong > $dnslogfile" + [ -n "$lastdnslogfile" ] && findstr="echo qingkong > $lastdnslogfile" && [ "$lastdnslogfile" != "$dnslogfile" ] && replace="${lastdnslogfile//\//\\/}/${dnslogfile//\//\\/}" + [ "$enabled" == "0" ] || [ "${crontab//autodeldnslog/}" == "$crontab" ] && cronenable=0 || cronenable=1 + crontab_editor + [ "$lastdnslogfile" != "$dnslogfile" ] && uci set autoipsetadder.autoipsetadder.lastdnslogfile="$dnslogfile" && commit=1 + + findstr="/usr/bin/autoipsetadder/tailto.sh [0-9]* $logfile" + default="0 0 * * * /usr/bin/autoipsetadder/tailto.sh 2000 $logfile" + [ -n "$lastlogfile" ] && findstr="/usr/bin/autoipsetadder/tailto.sh [0-9]* $lastlogfile" && [ "$lastlogfile" != "$logfile" ] && replace="${lastlogfile//\//\\/}/${logfile//\//\\/}" + [ "$enabled" == "0" ] || [ "${crontab//autotaillog/}" == "$crontab" ] && cronenable=0 || cronenable=1 + crontab_editor + [ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && uci set autoipsetadder.autoipsetadder.lastlogfile="$logfile" && commit=1 + + [ "$cronreload" -gt 0 ] && /etc/init.d/cron restart + [ "$commit" -gt 0 ] && uci commit autoipsetadder +} +crontab_editor(){ + local testline reload + local line="$(grep "$findstr" $CRON_FILE)" + [ -n "$replace" ] && [ -n "$line" ] && eval testline="\${line//$replace}" && [ "$testline" != "$line" ] && line="$testline" && reload="1" && replace="" + if [ "${line:0:1}" != "#" ]; then + if [ $cronenable -eq 1 ]; then + [ -z "$line" ] && line="$default" && reload="1" + if [ -n "$reload" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "$line" >> $CRON_FILE + cronreload=$((cronreload+1)) + fi + elif [ -n "$line" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "#$line" >> $CRON_FILE + cronreload=$((cronreload+1)) + fi + else + if [ $cronenable -eq 1 ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "${line:1}" >> $CRON_FILE + cronreload=$((cronreload+1)) + elif [ -z "$reload" ]; then + sed -i "\,$findstr,d" $CRON_FILE + echo "$line" >> $CRON_FILE + fi + fi +} +test_crontab(){ +config_load "${CONFIGURATION}" +do_crontab +} diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder b/package/ctcgfw/luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder new file mode 100755 index 0000000000..d1a8ee4577 --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@autoipsetadder[-1] + add ucitrack autoipsetadder + set ucitrack.@autoipsetadder[-1].init=autoipsetadder + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh new file mode 100755 index 0000000000..0fddc1d44a --- /dev/null +++ b/package/ctcgfw/luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh @@ -0,0 +1,164 @@ +#!/bin/sh +PATH="/usr/sbin:/usr/bin:/sbin:/bin" +logfile=$(uci get autoipsetadder.autoipsetadder.logfile) +[ -z "$logfile" ] && logfile="/tmp/addlist.log" +dnslogfile=$(uci get autoipsetadder.autoipsetadder.dnslogfile) +[ -z "$logfile" ] && dnslogfile="/tmp/dnsmasq.log" +config=$(uci get autoipsetadder.autoipsetadder.config 2>/dev/null) +[ "${config//nochina/}" == "$config" ] && nochina="0" || nochina="1" +[ "${config//packetpass/}" == "$config" ] && packetpass="0" || packetpass="1" +( stdbuf -oL tail -F $dnslogfile & echo $! >/var/run/autoipsetadder.pid ) | awk -v nochina="$nochina" -v packetpass="$packetpass" -F "[, ]+" '/reply/{ +ip=$8; +if (ip=="" || ip=="127.0.0.1"|| ip=="0.0.0.0") +{ +next; +} +if (index(ip,"