Enhance Podkop functionality with global check feature and improved diagnostics. Added support for FakeIP tests in both browser and router contexts. Updated UI elements for better status reporting and added localization for new messages.

This commit is contained in:
Ivan K
2025-05-01 17:18:07 +03:00
parent f29b97e495
commit 48716e7156
4 changed files with 391 additions and 183 deletions

View File

@@ -1953,9 +1953,7 @@ show_sing_box_config() {
)' "$SING_BOX_CONFIG"
}
show_config() {
nolog "📄 Current podkop configuration:"
show_config() {
if [ ! -f /etc/config/podkop ]; then
nolog "Configuration file not found"
return 1
@@ -2046,36 +2044,18 @@ get_sing_box_status() {
}
get_status() {
local running=0
local enabled=0
local status=""
# Check if service is enabled
if [ -x /etc/rc.d/S99podkop ]; then
enabled=1
fi
# Check if service is running
if pgrep -f "sing-box" >/dev/null; then
running=1
fi
# Format status message
if [ $running -eq 1 ]; then
if [ $enabled -eq 1 ]; then
status="running & enabled"
else
status="running but disabled"
fi
status="enabled"
else
if [ $enabled -eq 1 ]; then
status="stopped but enabled"
else
status="stopped & disabled"
fi
status="disabled"
fi
echo "{\"running\":$running,\"enabled\":$enabled,\"status\":\"$status\"}"
echo "{\"enabled\":$enabled,\"status\":\"$status\"}"
}
check_dns_available() {
@@ -2171,71 +2151,39 @@ sing_box_add_secure_dns_probe_domain() {
log "DNS probe domain ${domain} configured with override to port ${override_port}"
}
print_global() {
local message="$1"
echo "$message"
}
global_check() {
nolog "📡 Global check run!"
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print_global " SYSTEM INFO"
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print_global "📦 Podkop: $(opkg list-installed podkop | awk '{print $3}')"
print_global "📦 LuCI App: $(opkg list-installed luci-app-podkop | awk '{print $3}')"
print_global "📦 Sing-box: $(sing-box version | head -n 1 | awk '{print $3}')"
print_global "🔧 OpenWrt: $(grep OPENWRT_RELEASE /etc/os-release | cut -d'"' -f2)"
print_global "💻 Device: $(cat /tmp/sysinfo/model)"
print_global ""
nolog "Podkop $(opkg list-installed podkop | awk '{print $3}')"
nolog "LuCi App $(opkg list-installed luci-app-podkop | awk '{print $3}')"
nolog "Sing-box $(sing-box version | head -n 1 | awk '{print $3}')"
nolog "$(grep OPENWRT_RELEASE /etc/os-release | cut -d'"' -f2)"
nolog "Device: $(cat /tmp/sysinfo/model)"
printf "\n"
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print_global " PODKOP CONFIGURATION"
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
show_config
printf "\n"
print_global ""
nolog "Checking fakeip functionality..."
nolog "➡️ DNS resolution: system DNS server"
nslookup -timeout=2 $TEST_DOMAIN
local working_resolver=$(find_working_resolver)
if [ -z "$working_resolver" ]; then
nolog "❌ No working resolver found, skipping resolver check"
else
nolog "➡️ DNS resolution: external resolver ($working_resolver)"
nslookup -timeout=2 $TEST_DOMAIN $working_resolver
fi
# Main FakeIP check
nolog "➡️ DNS resolution: sing-box DNS server (127.0.0.42)"
local result=$(nslookup -timeout=2 $TEST_DOMAIN 127.0.0.42 2>&1)
echo "$result"
if echo "$result" | grep -q "198.18"; then
nolog "✅ FakeIP is working correctly! Domain resolved to FakeIP range (198.18.x.x)"
else
nolog "❌ FakeIP test failed. Domain did not resolve to FakeIP range"
nolog "Checking if sing-box is running..."
if ! pgrep -f "sing-box" >/dev/null; then
nolog "sing-box is not running"
else
nolog "sing-box is running, but FakeIP might not be configured correctly"
nolog "Checking DNS configuration in sing-box..."
if [ -f "$SING_BOX_CONFIG" ]; then
local fakeip_enabled=$(jq -r '.dns.fakeip.enabled' "$SING_BOX_CONFIG")
local fakeip_range=$(jq -r '.dns.fakeip.inet4_range' "$SING_BOX_CONFIG")
nolog "FakeIP enabled: $fakeip_enabled"
nolog "FakeIP range: $fakeip_range"
local dns_rules=$(jq -r '.dns.rules[] | select(.server == "fakeip-server") | .domain' "$SING_BOX_CONFIG")
nolog "FakeIP domain: $dns_rules"
else
nolog "sing-box config file not found"
fi
fi
fi
printf "\n"
print_global ""
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print_global " SYSTEM CHECKS"
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
if grep -E "^nameserver\s+([0-9]{1,3}\.){3}[0-9]{1,3}" "$RESOLV_CONF" | grep -vqE "127\.0\.0\.1|0\.0\.0\.0"; then
nolog "❌ /etc/resolv.conf contains an external nameserver:"
cat /etc/resolv.conf
print_global "❌ /etc/resolv.conf contains external nameserver:"
cat /etc/resolv.conf | sed 's/^/ /'
echo ""
else
nolog "✅ /etc/resolv.conf OK"
print_global "✅ /etc/resolv.conf - OK"
fi
cachesize="$(uci get dhcp.@dnsmasq[0].cachesize 2>/dev/null)"
@@ -2243,29 +2191,35 @@ global_check() {
server="$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)"
if [ "$cachesize" != "0" ] || [ "$noresolv" != "1" ] || [ "$server" != "127.0.0.42" ]; then
nolog "❌ The configuration differs from the template. 📄 DHCP config:"
awk '/^config /{p=($2=="dnsmasq")} p' /etc/config/dhcp
print_global "❌ DHCP configuration differs from template:"
awk '/^config /{p=($2=="dnsmasq")} p' /etc/config/dhcp | sed 's/^/ /'
elif [ "$(uci get podkop.main.dont_touch_dhcp 2>/dev/null)" = "1" ]; then
nolog "⚠️ Enable dont_touch_dhcp. 📄 DHCP config:"
awk '/^config /{p=($2=="dnsmasq")} p' /etc/config/dhcp
print_global "⚠️ dont_touch_dhcp is enabled:"
awk '/^config /{p=($2=="dnsmasq")} p' /etc/config/dhcp | sed 's/^/ /'
else
nolog "✅ /etc/config/dhcp"
print_global "✅ DHCP configuration - OK"
fi
if ! pgrep -f "sing-box" >/dev/null; then
nolog "❌ sing-box is not running"
print_global "❌ sing-box process - not running"
else
nolog "✅ sing-box is running"
print_global "✅ sing-box process - running"
fi
nolog "📄 NFT Table Podkop"
print_global ""
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print_global " NFT RULES"
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
if ! nft list table inet PodkopTable >/dev/null 2>&1; then
nolog "PodkopTable not found"
print_global "❌ PodkopTable not found"
else
nft list table inet PodkopTable
nft list table inet PodkopTable | sed 's/^/ /'
fi
nolog "📄 WAN config"
print_global ""
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print_global " WAN CONFIG"
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
if uci show network.wan >/dev/null 2>&1; then
awk '
/^config / {
@@ -2284,28 +2238,82 @@ global_check() {
print
}
}
' /etc/config/network
' /etc/config/network | sed 's/^/ /'
else
nolog "WAN not exists"
print_global "❌ WAN configuration not found"
fi
print_global ""
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print_global " WARP DETECTION"
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
CLOUDFLARE_OCTETS="103.21 103.22 103.31 104.16 104.17 104.18 104.19 104.20 104.21 104.22 104.23 \
104.24 104.25 104.26 104.27 104.28 108.162 131.0 141.101 162.158 162.159 172.64 172.65 172.66 \
172.67 172.68 172.69 172.70 172.71 173.245 188.114 190.93 197.234 198.41"
local warp_found=0
if uci show network | grep -q endpoint_host; then
uci show network | grep endpoint_host | cut -d'=' -f2 | tr -d "'\" " | while read -r host; do
if [ "$host" = "engage.cloudflareclient.com" ]; then
nolog "⚠️ WARP detected ($host)"
print_global "⚠️ WARP detected: $host"
warp_found=1
continue
fi
ip_prefix=$(echo "$host" | cut -d'.' -f1,2)
if echo "$CLOUDFLARE_OCTETS" | grep -wq "$ip_prefix"; then
nolog "⚠️ WARP detected ($host)"
print_global "⚠️ WARP detected: $host"
warp_found=1
fi
done
fi
if [ "$warp_found" -eq 0 ]; then
print_global "✅ No WARP configurations detected"
fi
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print_global " FAKEIP ROUTER TEST"
print_global "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print_global "🔍 Testing system DNS resolver..."
nslookup -timeout=2 $TEST_DOMAIN
local working_resolver=$(find_working_resolver)
if [ -z "$working_resolver" ]; then
print_global "❌ No working external resolver found"
else
print_global "🔍 Testing external resolver ($working_resolver)..."
nslookup -timeout=2 $TEST_DOMAIN $working_resolver
fi
print_global "🔍 Testing sing-box DNS server (127.0.0.42)..."
local result=$(nslookup -timeout=2 $TEST_DOMAIN 127.0.0.42 2>&1)
echo "$result"
if echo "$result" | grep -q "198.18"; then
print_global "✅ FakeIP is working correctly on router (198.18.x.x)"
else
print_global "❌ FakeIP test failed - domain did not resolve to FakeIP range"
if ! pgrep -f "sing-box" >/dev/null; then
print_global " └─ sing-box is not running"
else
print_global " └─ sing-box is running, checking configuration..."
if [ -f "$SING_BOX_CONFIG" ]; then
local fakeip_enabled=$(jq -r '.dns.fakeip.enabled' "$SING_BOX_CONFIG")
local fakeip_range=$(jq -r '.dns.fakeip.inet4_range' "$SING_BOX_CONFIG")
local dns_rules=$(jq -r '.dns.rules[] | select(.server == "fakeip-server") | .domain' "$SING_BOX_CONFIG")
print_global " ├─ FakeIP enabled: $fakeip_enabled"
print_global " ├─ FakeIP range: $fakeip_range"
print_global " └─ FakeIP domain: $dns_rules"
else
print_global " └─ sing-box config file not found"
fi
fi
fi
}
case "$1" in