fix(podkop): add dont touch my dhcp logic to fake IP check functions

This commit is contained in:
Ivan K
2025-05-15 11:31:33 +03:00
parent dcc12cf920
commit 2488bc30b1
2 changed files with 128 additions and 76 deletions

View File

@@ -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,

View File

@@ -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