feat: add outbounds checks to diagnostics

This commit is contained in:
divocat
2025-10-26 01:09:24 +03:00
parent 743cba8936
commit 788c539e16
12 changed files with 355 additions and 70 deletions

View File

@@ -117,6 +117,7 @@
"places": [
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27",
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:27",
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25"
]
},
@@ -127,6 +128,7 @@
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:15",
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15",
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:15",
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13"
]
},
@@ -512,12 +514,12 @@
"call": "Failed to execute!",
"key": "Failed to execute!",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:226",
"src/podkop/tabs/diagnostic/initController.ts:230",
"src/podkop/tabs/diagnostic/initController.ts:260",
"src/podkop/tabs/diagnostic/initController.ts:264",
"src/podkop/tabs/diagnostic/initController.ts:298",
"src/podkop/tabs/diagnostic/initController.ts:302"
"src/podkop/tabs/diagnostic/initController.ts:227",
"src/podkop/tabs/diagnostic/initController.ts:231",
"src/podkop/tabs/diagnostic/initController.ts:261",
"src/podkop/tabs/diagnostic/initController.ts:265",
"src/podkop/tabs/diagnostic/initController.ts:299",
"src/podkop/tabs/diagnostic/initController.ts:303"
]
},
{
@@ -545,7 +547,7 @@
"call": "Global check",
"key": "Global check",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:221"
"src/podkop/tabs/diagnostic/initController.ts:222"
]
},
{
@@ -805,7 +807,7 @@
"call": "Latest",
"key": "Latest",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:452"
"src/podkop/tabs/diagnostic/initController.ts:453"
]
},
{
@@ -878,6 +880,14 @@
"src/podkop/tabs/diagnostic/partials/renderCheckSection.ts:189"
]
},
{
"call": "Not responding",
"key": "Not responding",
"places": [
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:79"
]
},
{
"call": "Not running",
"key": "Not running",
@@ -885,7 +895,8 @@
"src/podkop/tabs/diagnostic/diagnostic.store.ts:55",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:63",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:71",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:79"
"src/podkop/tabs/diagnostic/diagnostic.store.ts:79",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:87"
]
},
{
@@ -920,7 +931,7 @@
"call": "Outdated",
"key": "Outdated",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:442"
"src/podkop/tabs/diagnostic/initController.ts:443"
]
},
{
@@ -962,10 +973,11 @@
"call": "Pending",
"key": "Pending",
"places": [
"src/podkop/tabs/diagnostic/diagnostic.store.ts:95",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:103",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:111",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:119"
"src/podkop/tabs/diagnostic/diagnostic.store.ts:119",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:127",
"src/podkop/tabs/diagnostic/diagnostic.store.ts:135"
]
},
{
@@ -1246,7 +1258,7 @@
"call": "Show sing-box config",
"key": "Show sing-box config",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:289",
"src/podkop/tabs/diagnostic/initController.ts:290",
"src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116"
]
},
@@ -1473,13 +1485,13 @@
"call": "unknown",
"key": "unknown",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:37",
"src/podkop/tabs/diagnostic/initController.ts:38",
"src/podkop/tabs/diagnostic/initController.ts:39",
"src/podkop/tabs/diagnostic/initController.ts:40",
"src/podkop/tabs/diagnostic/initController.ts:41",
"src/podkop/tabs/diagnostic/initController.ts:42",
"src/podkop/tabs/diagnostic/initController.ts:416"
"src/podkop/tabs/diagnostic/initController.ts:43",
"src/podkop/tabs/diagnostic/initController.ts:417"
]
},
{
@@ -1598,7 +1610,7 @@
"call": "View logs",
"key": "View logs",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:255",
"src/podkop/tabs/diagnostic/initController.ts:256",
"src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107"
]
},

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-23 17:43+0300\n"
"PO-Revision-Date: 2025-10-23 17:43+0300\n"
"POT-Creation-Date: 2025-10-25 22:08+0300\n"
"PO-Revision-Date: 2025-10-25 22:08+0300\n"
"Last-Translator: divocat <divocatt@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@@ -82,6 +82,7 @@ msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:27
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25
msgid "Cannot receive checks result"
msgstr ""
@@ -89,6 +90,7 @@ msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13
msgid "Checking, please wait"
msgstr ""
@@ -312,12 +314,12 @@ msgstr ""
msgid "Failed to copy!"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:226
#: src/podkop/tabs/diagnostic/initController.ts:230
#: src/podkop/tabs/diagnostic/initController.ts:260
#: src/podkop/tabs/diagnostic/initController.ts:264
#: src/podkop/tabs/diagnostic/initController.ts:298
#: src/podkop/tabs/diagnostic/initController.ts:302
#: src/podkop/tabs/diagnostic/initController.ts:227
#: src/podkop/tabs/diagnostic/initController.ts:231
#: src/podkop/tabs/diagnostic/initController.ts:261
#: src/podkop/tabs/diagnostic/initController.ts:265
#: src/podkop/tabs/diagnostic/initController.ts:299
#: src/podkop/tabs/diagnostic/initController.ts:303
msgid "Failed to execute!"
msgstr ""
@@ -333,7 +335,7 @@ msgstr ""
msgid "Get global check"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:221
#: src/podkop/tabs/diagnostic/initController.ts:222
msgid "Global check"
msgstr ""
@@ -482,7 +484,7 @@ msgstr ""
msgid "Issues detected"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:452
#: src/podkop/tabs/diagnostic/initController.ts:453
msgid "Latest"
msgstr ""
@@ -526,10 +528,16 @@ msgstr ""
msgid "Not implement yet"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:79
msgid "Not responding"
msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:55
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:63
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:71
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:79
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:87
msgid "Not running"
msgstr ""
@@ -549,7 +557,7 @@ msgstr ""
msgid "Outbound JSON must contain at least \"type\", \"server\" and \"server_port\" fields"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:442
#: src/podkop/tabs/diagnostic/initController.ts:443
msgid "Outdated"
msgstr ""
@@ -573,10 +581,11 @@ msgstr ""
msgid "Path must end with cache.db"
msgstr ""
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:95
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:103
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:111
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:119
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:127
#: src/podkop/tabs/diagnostic/diagnostic.store.ts:135
msgid "Pending"
msgstr ""
@@ -737,7 +746,7 @@ msgstr ""
msgid "Settings"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:289
#: src/podkop/tabs/diagnostic/initController.ts:290
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:116
msgid "Show sing-box config"
msgstr ""
@@ -868,13 +877,13 @@ msgstr ""
msgid "UDP over TCP"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:37
#: src/podkop/tabs/diagnostic/initController.ts:38
#: src/podkop/tabs/diagnostic/initController.ts:39
#: src/podkop/tabs/diagnostic/initController.ts:40
#: src/podkop/tabs/diagnostic/initController.ts:41
#: src/podkop/tabs/diagnostic/initController.ts:42
#: src/podkop/tabs/diagnostic/initController.ts:416
#: src/podkop/tabs/diagnostic/initController.ts:43
#: src/podkop/tabs/diagnostic/initController.ts:417
msgid "unknown"
msgstr ""
@@ -948,7 +957,7 @@ msgstr ""
msgid "Validation errors:"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:255
#: src/podkop/tabs/diagnostic/initController.ts:256
#: src/podkop/tabs/diagnostic/partials/renderAvailableActions.ts:107
msgid "View logs"
msgstr ""

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-23 20:43+0300\n"
"PO-Revision-Date: 2025-10-23 20:43+0300\n"
"POT-Creation-Date: 2025-10-25 01:08+0300\n"
"PO-Revision-Date: 2025-10-25 01:08+0300\n"
"Last-Translator: divocat\n"
"Language-Team: none\n"
"Language: ru\n"
@@ -386,6 +386,9 @@ msgstr "Другие правила маркировки не найдены"
msgid "Not implement yet"
msgstr "Ещё не реализовано"
msgid "Not responding"
msgstr "Не отвечает"
msgid "Not running"
msgstr "Не запущено"

View File

@@ -29,15 +29,15 @@ export const PodkopShellMethods = {
Podkop.AvailableClashAPIMethods.GET_PROXIES,
]),
getClashApiProxyLatency: async (tag: string) =>
callBaseMethod<unknown>(Podkop.AvailableMethods.CLASH_API, [
Podkop.AvailableClashAPIMethods.GET_PROXY_LATENCY,
tag,
]),
callBaseMethod<Podkop.GetClashApiProxyLatency>(
Podkop.AvailableMethods.CLASH_API,
[Podkop.AvailableClashAPIMethods.GET_PROXY_LATENCY, tag],
),
getClashApiGroupLatency: async (tag: string) =>
callBaseMethod<unknown>(Podkop.AvailableMethods.CLASH_API, [
Podkop.AvailableClashAPIMethods.GET_GROUP_LATENCY,
tag,
]),
callBaseMethod<Podkop.GetClashApiGroupLatency>(
Podkop.AvailableMethods.CLASH_API,
[Podkop.AvailableClashAPIMethods.GET_GROUP_LATENCY, tag],
),
setClashApiGroupProxy: async (group: string, proxy: string) =>
callBaseMethod<unknown>(Podkop.AvailableMethods.CLASH_API, [
Podkop.AvailableClashAPIMethods.SET_GROUP_PROXY,

View File

@@ -5,6 +5,7 @@ export enum DIAGNOSTICS_CHECKS {
SINGBOX = 'SINGBOX',
NFT = 'NFT',
FAKEIP = 'FAKEIP',
OUTBOUNDS = 'OUTBOUNDS',
}
export const DIAGNOSTICS_CHECKS_MAP: Record<
@@ -26,8 +27,13 @@ export const DIAGNOSTICS_CHECKS_MAP: Record<
title: getCheckTitle('Nftables'),
code: DIAGNOSTICS_CHECKS.NFT,
},
[DIAGNOSTICS_CHECKS.FAKEIP]: {
[DIAGNOSTICS_CHECKS.OUTBOUNDS]: {
order: 4,
title: getCheckTitle('Outbounds'),
code: DIAGNOSTICS_CHECKS.OUTBOUNDS,
},
[DIAGNOSTICS_CHECKS.FAKEIP]: {
order: 5,
title: getCheckTitle('FakeIP'),
code: DIAGNOSTICS_CHECKS.FAKEIP,
},

View File

@@ -0,0 +1,111 @@
import { DIAGNOSTICS_CHECKS_MAP } from './contstants';
import { PodkopShellMethods } from '../../../methods';
import { updateCheckStore } from './updateCheckStore';
import { getMeta } from '../helpers/getMeta';
import { getDashboardSections } from '../../../methods/custom/getDashboardSections';
import { IDiagnosticsChecksItem } from '../../../services';
export async function runSectionsCheck() {
const { order, title, code } = DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS;
updateCheckStore({
order,
code,
title,
description: _('Checking, please wait'),
state: 'loading',
items: [],
});
const sections = await getDashboardSections();
if (!sections.success) {
updateCheckStore({
order,
code,
title,
description: _('Cannot receive checks result'),
state: 'error',
items: [],
});
throw new Error('Sections checks failed');
}
const items = (await Promise.all(
sections.data.map(async (section) => {
async function getLatency() {
if (section.withTagSelect) {
const latencyGroup = await PodkopShellMethods.getClashApiGroupLatency(
section.code,
);
console.log('Latency group', latencyGroup);
const success = latencyGroup.success && !latencyGroup.data.message;
if (success) {
const latency = Object.values(latencyGroup.data)
.map((item) => (item ? `${item}ms` : 'n/a'))
.join(' / ');
return {
success: true,
latency,
};
}
return {
success: true,
latency: _('Not responding'),
};
}
const latencyProxy = await PodkopShellMethods.getClashApiProxyLatency(
section.code,
);
console.log('Latency proxy', latencyProxy);
const success = latencyProxy.success && !latencyProxy.data.message;
if (success) {
return {
success: true,
latency: `${latencyProxy.data.delay} ms`,
};
}
return {
success: false,
latency: _('Not responding'),
};
}
const { latency, success } = await getLatency();
return {
state: success ? 'success' : 'error',
key: section.displayName,
value: latency,
};
}),
)) as Array<IDiagnosticsChecksItem>;
const allGood = items.every((item) => item.state === 'success');
const atLeastOneGood = items.some((item) => item.state === 'success');
const { state, description } = getMeta({ atLeastOneGood, allGood });
updateCheckStore({
order,
code,
title,
description,
state,
items,
});
if (!atLeastOneGood) {
throw new Error('Sections checks failed');
}
}

View File

@@ -72,6 +72,14 @@ export const initialDiagnosticStore: Pick<
items: [],
state: 'skipped',
},
{
code: DIAGNOSTICS_CHECKS.OUTBOUNDS,
title: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.title,
order: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.order,
description: _('Not running'),
items: [],
state: 'skipped',
},
{
code: DIAGNOSTICS_CHECKS.FAKEIP,
title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title,
@@ -112,6 +120,14 @@ export const loadingDiagnosticsChecksStore: Pick<
items: [],
state: 'skipped',
},
{
code: DIAGNOSTICS_CHECKS.OUTBOUNDS,
title: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.title,
order: DIAGNOSTICS_CHECKS_MAP.OUTBOUNDS.order,
description: _('Pending'),
items: [],
state: 'skipped',
},
{
code: DIAGNOSTICS_CHECKS.FAKEIP,
title: DIAGNOSTICS_CHECKS_MAP.FAKEIP.title,

View File

@@ -19,6 +19,7 @@ import { renderModal } from '../../../partials';
import { PODKOP_LUCI_APP_VERSION } from '../../../constants';
import { showToast } from '../../../helpers/showToast';
import { renderWikiDisclaimer } from './partials/renderWikiDisclaimer';
import { runSectionsCheck } from './checks/runSectionsCheck';
async function fetchSystemInfo() {
const systemInfo = await PodkopShellMethods.getSystemInfo();
@@ -518,6 +519,8 @@ async function runChecks() {
await runNftCheck();
await runSectionsCheck();
await runFakeIPCheck();
} catch (e) {
logger.error('[DIAGNOSTIC]', 'runChecks - e', e);

View File

@@ -196,4 +196,11 @@ export namespace Podkop {
openwrt_version: string;
device_model: string;
}
export interface GetClashApiProxyLatency {
delay: number;
message?: string;
}
export type GetClashApiGroupLatency = Record<string, number>;
}