From 2488bc30b1dee01fe8ad81f097e5f31ce0cfe94e Mon Sep 17 00:00:00 2001 From: Ivan K Date: Thu, 15 May 2025 11:31:33 +0300 Subject: [PATCH] fix(podkop): add dont touch my dhcp logic to fake IP check functions --- .../resources/view/podkop/podkop.js | 168 ++++++++++-------- podkop/files/usr/bin/podkop | 36 +++- 2 files changed, 128 insertions(+), 76 deletions(-) diff --git a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js index 383b84a..cb48305 100644 --- a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js +++ b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js @@ -1126,6 +1126,99 @@ function stopErrorPolling() { } } +async function checkFakeIP() { + const createStatus = (state, message, color) => ({ + state, + message: _(message), + color: STATUS_COLORS[color] + }); + + try { + const singboxStatusResult = await safeExec('/usr/bin/podkop', ['get_sing_box_status']); + const singboxStatus = JSON.parse(singboxStatusResult.stdout || '{"running":0,"dns_configured":0}'); + + if (!singboxStatus.running) { + return createStatus('not_working', 'sing-box not running', 'ERROR'); + } + + // Load UCI config to check dont_touch_dhcp + let dontTouchDhcp = false; + try { + const data = await uci.load('podkop'); + dontTouchDhcp = uci.get('podkop', 'main', 'dont_touch_dhcp') === '1'; + } catch (e) { + console.error('Error loading UCI config:', e); + } + + // If dont_touch_dhcp is enabled, we don't check dns_configured + if (!dontTouchDhcp && !singboxStatus.dns_configured) { + return createStatus('not_working', 'DNS not configured', 'ERROR'); + } + + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT); + + try { + const response = await fetch('https://fakeip.podkop.fyi/check', { signal: controller.signal }); + const data = await response.json(); + clearTimeout(timeoutId); + + if (data.fakeip === true) { + return createStatus('working', 'working', 'SUCCESS'); + } else { + return createStatus('not_working', 'not working', 'ERROR'); + } + } catch (fetchError) { + clearTimeout(timeoutId); + const message = fetchError.name === 'AbortError' ? 'timeout' : 'check error'; + return createStatus('error', message, 'WARNING'); + } + } catch (error) { + return createStatus('error', 'check error', 'WARNING'); + } +} + +async function checkFakeIPCLI() { + const createStatus = (state, message, color) => ({ + state, + message: _(message), + color: STATUS_COLORS[color] + }); + + try { + const singboxStatusResult = await safeExec('/usr/bin/podkop', ['get_sing_box_status']); + const singboxStatus = JSON.parse(singboxStatusResult.stdout || '{"running":0,"dns_configured":0}'); + + if (!singboxStatus.running) { + return createStatus('not_working', 'sing-box not running', 'ERROR'); + } + + // Load UCI config to check dont_touch_dhcp + let dontTouchDhcp = false; + try { + const data = await uci.load('podkop'); + dontTouchDhcp = uci.get('podkop', 'main', 'dont_touch_dhcp') === '1'; + } catch (e) { + console.error('Error loading UCI config:', e); + } + + // If dont_touch_dhcp is enabled, we don't check dns_configured + if (!dontTouchDhcp && !singboxStatus.dns_configured) { + return createStatus('not_working', 'DNS not configured', 'ERROR'); + } + + const result = await safeExec('nslookup', ['-timeout=2', 'fakeip.podkop.fyi', '127.0.0.42']); + + if (result.stdout && result.stdout.includes('198.18')) { + return createStatus('working', 'working on router', 'SUCCESS'); + } else { + return createStatus('not_working', 'not working on router', 'ERROR'); + } + } catch (error) { + return createStatus('error', 'CLI check error', 'WARNING'); + } +} + return view.extend({ async render() { document.head.insertAdjacentHTML('beforeend', ` @@ -1374,81 +1467,6 @@ return view.extend({ } } - function checkFakeIP() { - const createStatus = (state, message, color) => ({ - state, - message: _(message), - color: STATUS_COLORS[color] - }); - - return new Promise(async (resolve) => { - try { - const singboxStatusResult = await safeExec('/usr/bin/podkop', ['get_sing_box_status']); - const singboxStatus = JSON.parse(singboxStatusResult.stdout || '{"running":0,"dns_configured":0}'); - - if (!singboxStatus.running) { - return resolve(createStatus('not_working', 'sing-box not running', 'ERROR')); - } - if (!singboxStatus.dns_configured) { - return resolve(createStatus('not_working', 'DNS not configured', 'ERROR')); - } - - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT); - - try { - const response = await fetch('https://fakeip.podkop.fyi/check', { signal: controller.signal }); - const data = await response.json(); - clearTimeout(timeoutId); - - if (data.fakeip === true) { - return resolve(createStatus('working', 'working', 'SUCCESS')); - } else { - return resolve(createStatus('not_working', 'not working', 'ERROR')); - } - } catch (fetchError) { - clearTimeout(timeoutId); - const message = fetchError.name === 'AbortError' ? 'timeout' : 'check error'; - return resolve(createStatus('error', message, 'WARNING')); - } - } catch (error) { - return resolve(createStatus('error', 'check error', 'WARNING')); - } - }); - } - - function checkFakeIPCLI() { - const createStatus = (state, message, color) => ({ - state, - message: _(message), - color: STATUS_COLORS[color] - }); - - return new Promise(async (resolve) => { - try { - const singboxStatusResult = await safeExec('/usr/bin/podkop', ['get_sing_box_status']); - const singboxStatus = JSON.parse(singboxStatusResult.stdout || '{"running":0,"dns_configured":0}'); - - if (!singboxStatus.running) { - return resolve(createStatus('not_working', 'sing-box not running', 'ERROR')); - } - if (!singboxStatus.dns_configured) { - return resolve(createStatus('not_working', 'DNS not configured', 'ERROR')); - } - - const result = await safeExec('nslookup', ['-timeout=2', 'fakeip.podkop.fyi', '127.0.0.42']); - - if (result.stdout && result.stdout.includes('198.18')) { - return resolve(createStatus('working', 'working on router', 'SUCCESS')); - } else { - return resolve(createStatus('not_working', 'not working on router', 'ERROR')); - } - } catch (error) { - return resolve(createStatus('error', 'CLI check error', 'WARNING')); - } - }); - } - function checkBypass() { const createStatus = (state, message, color) => ({ state, diff --git a/podkop/files/usr/bin/podkop b/podkop/files/usr/bin/podkop index 6b20f0a..21e1518 100755 --- a/podkop/files/usr/bin/podkop +++ b/podkop/files/usr/bin/podkop @@ -2464,6 +2464,40 @@ global_check() { fi } +show_help() { + cat << EOF +Usage: $0 COMMAND + +Available commands: + start Start podkop service + stop Stop podkop service + reload Reload podkop configuration + restart Restart podkop service + enable Enable podkop autostart + disable Disable podkop autostart + main Run main podkop process + list_update Update domain lists + check_proxy Check proxy connectivity + check_nft Check NFT rules + check_github Check GitHub connectivity + check_logs Show podkop logs from system journal + check_sing_box_connections Show active sing-box connections + check_sing_box_logs Show sing-box logs + check_fakeip Check FakeIP DNS functionality + check_dnsmasq Check DNSMasq configuration + show_config Display current podkop configuration + show_version Show podkop version + show_sing_box_config Show sing-box configuration + show_luci_version Show LuCI app version + show_sing_box_version Show sing-box version + show_system_info Show system information + get_status Get podkop service status + get_sing_box_status Get sing-box service status + check_dns_available Check DNS server availability + global_check Run global system check +EOF +} + case "$1" in start) start @@ -2538,7 +2572,7 @@ case "$1" in global_check ;; *) - echo "Usage: $0 {start|stop|reload|restart|enable|disable|main|list_update|check_proxy|check_nft|check_github|check_logs|check_sing_box_connections|check_sing_box_logs|check_fakeip|check_dnsmasq|show_config|show_version|show_sing_box_config|show_luci_version|show_sing_box_version|show_system_info|get_status|get_sing_box_status|check_dns_available|global_check}" + show_help exit 1 ;; esac \ No newline at end of file