zapret2-mcp 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/LICENSE +21 -0
- package/README.md +238 -0
- package/build/executor/docker.d.ts +7 -0
- package/build/executor/docker.js +22 -0
- package/build/executor/docker.js.map +1 -0
- package/build/executor/factory.d.ts +2 -0
- package/build/executor/factory.js +27 -0
- package/build/executor/factory.js.map +1 -0
- package/build/executor/index.d.ts +6 -0
- package/build/executor/index.js +5 -0
- package/build/executor/index.js.map +1 -0
- package/build/executor/local.d.ts +5 -0
- package/build/executor/local.js +17 -0
- package/build/executor/local.js.map +1 -0
- package/build/executor/ssh.d.ts +13 -0
- package/build/executor/ssh.js +33 -0
- package/build/executor/ssh.js.map +1 -0
- package/build/executor/types.d.ts +8 -0
- package/build/executor/types.js +2 -0
- package/build/executor/types.js.map +1 -0
- package/build/executorInstance.d.ts +3 -0
- package/build/executorInstance.js +11 -0
- package/build/executorInstance.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +75 -0
- package/build/index.js.map +1 -0
- package/build/logStore.d.ts +12 -0
- package/build/logStore.js +76 -0
- package/build/logStore.js.map +1 -0
- package/build/prompts.d.ts +2 -0
- package/build/prompts.js +156 -0
- package/build/prompts.js.map +1 -0
- package/build/resources.d.ts +2 -0
- package/build/resources.js +41 -0
- package/build/resources.js.map +1 -0
- package/build/tools/checkPrerequisites.d.ts +19 -0
- package/build/tools/checkPrerequisites.js +116 -0
- package/build/tools/checkPrerequisites.js.map +1 -0
- package/build/tools/configureDns.d.ts +35 -0
- package/build/tools/configureDns.js +106 -0
- package/build/tools/configureDns.js.map +1 -0
- package/build/tools/createSystemdService.d.ts +27 -0
- package/build/tools/createSystemdService.js +74 -0
- package/build/tools/createSystemdService.js.map +1 -0
- package/build/tools/detectSystem.d.ts +19 -0
- package/build/tools/detectSystem.js +89 -0
- package/build/tools/detectSystem.js.map +1 -0
- package/build/tools/getConfig.d.ts +27 -0
- package/build/tools/getConfig.js +30 -0
- package/build/tools/getConfig.js.map +1 -0
- package/build/tools/getStatus.d.ts +19 -0
- package/build/tools/getStatus.js +35 -0
- package/build/tools/getStatus.js.map +1 -0
- package/build/tools/installZapret.d.ts +31 -0
- package/build/tools/installZapret.js +84 -0
- package/build/tools/installZapret.js.map +1 -0
- package/build/tools/restartService.d.ts +19 -0
- package/build/tools/restartService.js +24 -0
- package/build/tools/restartService.js.map +1 -0
- package/build/tools/runBlockcheck.d.ts +31 -0
- package/build/tools/runBlockcheck.js +44 -0
- package/build/tools/runBlockcheck.js.map +1 -0
- package/build/tools/startService.d.ts +19 -0
- package/build/tools/startService.js +24 -0
- package/build/tools/startService.js.map +1 -0
- package/build/tools/stopService.d.ts +19 -0
- package/build/tools/stopService.js +24 -0
- package/build/tools/stopService.js.map +1 -0
- package/build/tools/updateConfig.d.ts +31 -0
- package/build/tools/updateConfig.js +50 -0
- package/build/tools/updateConfig.js.map +1 -0
- package/build/tools/verifyBypass.d.ts +31 -0
- package/build/tools/verifyBypass.js +62 -0
- package/build/tools/verifyBypass.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getExecutor } from "../executorInstance.js";
|
|
3
|
+
import { saveLog } from "../logStore.js";
|
|
4
|
+
export const createSystemdServiceTool = {
|
|
5
|
+
name: "createSystemdService",
|
|
6
|
+
description: "Create a systemd service unit for zapret2 on Linux desktop systems. Generates /etc/systemd/system/zapret2.service, runs daemon-reload, and optionally enables the service for autostart. Requires systemd — use detectSystem first to verify.",
|
|
7
|
+
schema: z.object({
|
|
8
|
+
enable: z.boolean().default(true).describe("Enable service for autostart (default: true)"),
|
|
9
|
+
}),
|
|
10
|
+
handler: async (args) => {
|
|
11
|
+
const enable = args.enable !== false;
|
|
12
|
+
const unitContent = `[Unit]
|
|
13
|
+
Description=zapret2 network packet processing service
|
|
14
|
+
After=network-online.target
|
|
15
|
+
Wants=network-online.target
|
|
16
|
+
|
|
17
|
+
[Service]
|
|
18
|
+
Type=forking
|
|
19
|
+
ExecStart=/opt/zapret2/init.d/sysv/zapret2 start
|
|
20
|
+
ExecStop=/opt/zapret2/init.d/sysv/zapret2 stop
|
|
21
|
+
ExecReload=/opt/zapret2/init.d/sysv/zapret2 restart
|
|
22
|
+
RemainAfterExit=yes
|
|
23
|
+
Restart=on-failure
|
|
24
|
+
RestartSec=5
|
|
25
|
+
|
|
26
|
+
[Install]
|
|
27
|
+
WantedBy=multi-user.target`;
|
|
28
|
+
const b64Unit = Buffer.from(unitContent).toString("base64");
|
|
29
|
+
const script = `
|
|
30
|
+
set -e
|
|
31
|
+
|
|
32
|
+
if ! command -v systemctl >/dev/null 2>&1; then
|
|
33
|
+
echo "ERROR: systemctl not found. This tool requires systemd."
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
if ! systemctl --version >/dev/null 2>&1; then
|
|
38
|
+
echo "ERROR: systemd is not running."
|
|
39
|
+
exit 1
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
if [ ! -d /opt/zapret2 ]; then
|
|
43
|
+
echo "ERROR: /opt/zapret2 not found. Run installZapret first."
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
# Write unit file
|
|
48
|
+
printf '%s' '${b64Unit}' | base64 -d > /etc/systemd/system/zapret2.service
|
|
49
|
+
|
|
50
|
+
systemctl daemon-reload
|
|
51
|
+
|
|
52
|
+
${enable ? 'systemctl enable zapret2.service' : 'echo "Service not enabled (enable=false)"'}
|
|
53
|
+
|
|
54
|
+
echo "UNIT_CREATED"
|
|
55
|
+
echo "Path: /etc/systemd/system/zapret2.service"
|
|
56
|
+
echo "Enabled: ${enable}"
|
|
57
|
+
systemctl status zapret2.service --no-pager 2>&1 || true
|
|
58
|
+
`;
|
|
59
|
+
try {
|
|
60
|
+
const { stdout, stderr } = await getExecutor().exec(script, 30000);
|
|
61
|
+
const output = (stdout + stderr).trim();
|
|
62
|
+
saveLog("service", output, { action: "createSystemdService", enable: String(enable) });
|
|
63
|
+
return { content: [{ type: "text", text: output }] };
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const e = err;
|
|
67
|
+
return {
|
|
68
|
+
content: [{ type: "text", text: `Error: ${e.stderr || e.stdout || e.error?.message || "unknown error"}` }],
|
|
69
|
+
isError: true,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=createSystemdService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSystemdService.js","sourceRoot":"","sources":["../../src/tools/createSystemdService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,+OAA+O;IAC5P,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KAC3F,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAA0B,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC;QAErC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;2BAeG,CAAC;QAExB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;qBAmBE,OAAO;;;;QAIpB,MAAM,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,2CAA2C;;;;uBAI1E,MAAM;;KAExB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAExC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAEvF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACnH,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const detectSystemTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
6
|
+
handler: () => Promise<{
|
|
7
|
+
content: {
|
|
8
|
+
type: "text";
|
|
9
|
+
text: string;
|
|
10
|
+
}[];
|
|
11
|
+
isError?: undefined;
|
|
12
|
+
} | {
|
|
13
|
+
content: {
|
|
14
|
+
type: "text";
|
|
15
|
+
text: string;
|
|
16
|
+
}[];
|
|
17
|
+
isError: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getExecutor } from "../executorInstance.js";
|
|
3
|
+
export const detectSystemTool = {
|
|
4
|
+
name: "detectSystem",
|
|
5
|
+
description: "Detect the target system environment: OS (id, version, pretty name), CPU architecture, init system (systemd/procd/sysv), default WAN interface, DNS resolvers, NFQUEUE kernel module availability, and whether running inside a container. Use this as a first step to determine which workflow (router vs desktop) to follow.",
|
|
6
|
+
schema: z.object({}),
|
|
7
|
+
handler: async () => {
|
|
8
|
+
const script = `
|
|
9
|
+
# OS detection
|
|
10
|
+
OS_ID="unknown"
|
|
11
|
+
OS_VERSION=""
|
|
12
|
+
OS_PRETTY=""
|
|
13
|
+
if [ -f /etc/os-release ]; then
|
|
14
|
+
OS_ID=$(. /etc/os-release && echo "\${ID:-unknown}")
|
|
15
|
+
OS_VERSION=$(. /etc/os-release && echo "\${VERSION_ID:-}")
|
|
16
|
+
OS_PRETTY=$(. /etc/os-release && echo "\${PRETTY_NAME:-}")
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
ARCH=$(uname -m)
|
|
20
|
+
|
|
21
|
+
# Init system
|
|
22
|
+
INIT_SYSTEM="unknown"
|
|
23
|
+
if command -v systemctl >/dev/null 2>&1 && systemctl --version >/dev/null 2>&1; then
|
|
24
|
+
INIT_SYSTEM="systemd"
|
|
25
|
+
elif [ -d /etc/rc.d ] || [ -f /etc/init.d/boot ]; then
|
|
26
|
+
INIT_SYSTEM="procd"
|
|
27
|
+
else
|
|
28
|
+
INIT_SYSTEM="sysv"
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# WAN interface
|
|
32
|
+
WAN_IFACE=$(ip route get 8.8.8.8 2>/dev/null | awk '/dev/{for(i=1;i<=NF;i++){if($i=="dev"){print $(i+1);exit}}}')
|
|
33
|
+
WAN_IFACE=\${WAN_IFACE:-""}
|
|
34
|
+
|
|
35
|
+
# DNS resolvers
|
|
36
|
+
DNS_RESOLVERS=""
|
|
37
|
+
if [ -f /etc/resolv.conf ]; then
|
|
38
|
+
DNS_RESOLVERS=$(awk '/^nameserver/{printf "%s,", $2}' /etc/resolv.conf | sed 's/,$//')
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
# NFQUEUE kernel module
|
|
42
|
+
NFQUEUE_MODULE="false"
|
|
43
|
+
if modinfo xt_NFQUEUE >/dev/null 2>&1 || modinfo nfnetlink_queue >/dev/null 2>&1; then
|
|
44
|
+
NFQUEUE_MODULE="true"
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
# Container detection
|
|
48
|
+
IN_CONTAINER="false"
|
|
49
|
+
if [ -f /.dockerenv ] || grep -q 'docker\\|lxc\\|containerd' /proc/1/cgroup 2>/dev/null; then
|
|
50
|
+
IN_CONTAINER="true"
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# systemd-resolved detection
|
|
54
|
+
RESOLVED_ACTIVE="false"
|
|
55
|
+
if command -v systemctl >/dev/null 2>&1 && systemctl is-active systemd-resolved >/dev/null 2>&1; then
|
|
56
|
+
RESOLVED_ACTIVE="true"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
cat <<EOJSON
|
|
60
|
+
{
|
|
61
|
+
"os": {
|
|
62
|
+
"id": "$OS_ID",
|
|
63
|
+
"version": "$OS_VERSION",
|
|
64
|
+
"pretty": "$OS_PRETTY"
|
|
65
|
+
},
|
|
66
|
+
"arch": "$ARCH",
|
|
67
|
+
"initSystem": "$INIT_SYSTEM",
|
|
68
|
+
"wanInterface": "$WAN_IFACE",
|
|
69
|
+
"dnsResolvers": "$DNS_RESOLVERS",
|
|
70
|
+
"nfqueueModule": $NFQUEUE_MODULE,
|
|
71
|
+
"inContainer": $IN_CONTAINER,
|
|
72
|
+
"systemdResolved": $RESOLVED_ACTIVE
|
|
73
|
+
}
|
|
74
|
+
EOJSON
|
|
75
|
+
`;
|
|
76
|
+
try {
|
|
77
|
+
const { stdout } = await getExecutor().exec(script, 10000);
|
|
78
|
+
return { content: [{ type: "text", text: stdout.trim() }] };
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
const e = err;
|
|
82
|
+
return {
|
|
83
|
+
content: [{ type: "text", text: `Error: ${e.stderr || e.error?.message || "unknown error"}` }],
|
|
84
|
+
isError: true,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=detectSystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectSystem.js","sourceRoot":"","sources":["../../src/tools/detectSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,gUAAgU;IAC7U,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmEd,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACvG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const getConfigTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
schema: z.ZodObject<{
|
|
6
|
+
key: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
key?: string | undefined;
|
|
9
|
+
}, {
|
|
10
|
+
key?: string | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
handler: (args: {
|
|
13
|
+
key?: string;
|
|
14
|
+
}) => Promise<{
|
|
15
|
+
content: {
|
|
16
|
+
type: "text";
|
|
17
|
+
text: string;
|
|
18
|
+
}[];
|
|
19
|
+
isError?: undefined;
|
|
20
|
+
} | {
|
|
21
|
+
content: {
|
|
22
|
+
type: "text";
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
isError: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getExecutor } from "../executorInstance.js";
|
|
3
|
+
export const getConfigTool = {
|
|
4
|
+
name: "getConfig",
|
|
5
|
+
description: "Read zapret2 configuration from /opt/zapret2/config. Optionally filter by a specific key. Common keys: NFQWS2_ENABLE, NFQWS2_OPT, MODE, FWTYPE.",
|
|
6
|
+
schema: z.object({
|
|
7
|
+
key: z.string().optional().describe("Optional config key to read (e.g. NFQWS2_ENABLE, NFQWS2_OPT). If omitted, returns full config."),
|
|
8
|
+
}),
|
|
9
|
+
handler: async (args) => {
|
|
10
|
+
try {
|
|
11
|
+
let command;
|
|
12
|
+
if (args.key) {
|
|
13
|
+
command = `grep -E '^${args.key}=' /opt/zapret2/config || echo "Key '${args.key}' not found"`;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
command = "cat /opt/zapret2/config";
|
|
17
|
+
}
|
|
18
|
+
const { stdout } = await getExecutor().exec(command);
|
|
19
|
+
return { content: [{ type: "text", text: stdout.trim() }] };
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
const e = err;
|
|
23
|
+
return {
|
|
24
|
+
content: [{ type: "text", text: `Error: ${e.stderr || e.error?.message || "unknown error"}` }],
|
|
25
|
+
isError: true,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=getConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getConfig.js","sourceRoot":"","sources":["../../src/tools/getConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,iJAAiJ;IAC9J,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gGAAgG,CAAC;KACtI,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAsB,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,IAAI,OAAe,CAAC;YACpB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,OAAO,GAAG,aAAa,IAAI,CAAC,GAAG,wCAAwC,IAAI,CAAC,GAAG,cAAc,CAAC;YAChG,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,yBAAyB,CAAC;YACtC,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACvG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const getStatusTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
6
|
+
handler: () => Promise<{
|
|
7
|
+
content: {
|
|
8
|
+
type: "text";
|
|
9
|
+
text: string;
|
|
10
|
+
}[];
|
|
11
|
+
isError?: undefined;
|
|
12
|
+
} | {
|
|
13
|
+
content: {
|
|
14
|
+
type: "text";
|
|
15
|
+
text: string;
|
|
16
|
+
}[];
|
|
17
|
+
isError: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getExecutor } from "../executorInstance.js";
|
|
3
|
+
export const getStatusTool = {
|
|
4
|
+
name: "getStatus",
|
|
5
|
+
description: "Get zapret2 service status: running state, PID, nftables rules count, nfqws2 enabled flag. Use this first to check if zapret2 is running before making changes.",
|
|
6
|
+
schema: z.object({}),
|
|
7
|
+
handler: async () => {
|
|
8
|
+
const script = `
|
|
9
|
+
PID=$(pgrep -x nfqws2 2>/dev/null || echo "")
|
|
10
|
+
RUNNING=false
|
|
11
|
+
if [ -n "$PID" ]; then RUNNING=true; fi
|
|
12
|
+
|
|
13
|
+
NFT_COUNT=0
|
|
14
|
+
if command -v nft >/dev/null 2>&1; then
|
|
15
|
+
NFT_COUNT=$(nft list ruleset 2>/dev/null | grep -c zapret 2>/dev/null || echo 0)
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
ENABLED=$(grep -E '^NFQWS2_ENABLE=' /opt/zapret2/config 2>/dev/null | cut -d= -f2 || echo "unknown")
|
|
19
|
+
|
|
20
|
+
echo "{\\"running\\": $RUNNING, \\"pid\\": \\"$PID\\", \\"nftRulesCount\\": $NFT_COUNT, \\"nfqws2Enabled\\": \\"$ENABLED\\"}"
|
|
21
|
+
`;
|
|
22
|
+
try {
|
|
23
|
+
const { stdout } = await getExecutor().exec(script);
|
|
24
|
+
return { content: [{ type: "text", text: stdout.trim() }] };
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const e = err;
|
|
28
|
+
return {
|
|
29
|
+
content: [{ type: "text", text: `Error: ${e.stderr || e.error?.message || "unknown error"}` }],
|
|
30
|
+
isError: true,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=getStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getStatus.js","sourceRoot":"","sources":["../../src/tools/getStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,iKAAiK;IAC9K,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,MAAM,GAAG;;;;;;;;;;;;;KAad,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACvG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const installZapretTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
schema: z.ZodObject<{
|
|
6
|
+
version: z.ZodDefault<z.ZodString>;
|
|
7
|
+
force: z.ZodDefault<z.ZodBoolean>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
version: string;
|
|
10
|
+
force: boolean;
|
|
11
|
+
}, {
|
|
12
|
+
version?: string | undefined;
|
|
13
|
+
force?: boolean | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
handler: (args: {
|
|
16
|
+
version?: string;
|
|
17
|
+
force?: boolean;
|
|
18
|
+
}) => Promise<{
|
|
19
|
+
content: {
|
|
20
|
+
type: "text";
|
|
21
|
+
text: string;
|
|
22
|
+
}[];
|
|
23
|
+
isError?: undefined;
|
|
24
|
+
} | {
|
|
25
|
+
content: {
|
|
26
|
+
type: "text";
|
|
27
|
+
text: string;
|
|
28
|
+
}[];
|
|
29
|
+
isError: boolean;
|
|
30
|
+
}>;
|
|
31
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getExecutor } from "../executorInstance.js";
|
|
3
|
+
import { saveLog } from "../logStore.js";
|
|
4
|
+
export const installZapretTool = {
|
|
5
|
+
name: "installZapret",
|
|
6
|
+
description: "Install zapret2 from scratch: clone repo, download binaries from GitHub releases, run install_bin.sh, create base config. Skips interactive install_easy.sh. Run checkPrerequisites first. After install, configure with updateConfig and startService.",
|
|
7
|
+
schema: z.object({
|
|
8
|
+
version: z.string().default("v0.9.4.1").describe("zapret2 release version (default: v0.9.4.1)"),
|
|
9
|
+
force: z.boolean().default(false).describe("Force reinstall even if /opt/zapret2 already exists"),
|
|
10
|
+
}),
|
|
11
|
+
handler: async (args) => {
|
|
12
|
+
const version = args.version || "v0.9.4.1";
|
|
13
|
+
const force = args.force || false;
|
|
14
|
+
const script = `
|
|
15
|
+
set -e
|
|
16
|
+
|
|
17
|
+
if [ -d "/opt/zapret2/.git" ] && [ "${force}" != "true" ]; then
|
|
18
|
+
echo "ALREADY_INSTALLED"
|
|
19
|
+
exit 0
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
# Clone repo
|
|
23
|
+
if [ ! -d "/opt/zapret2/.git" ]; then
|
|
24
|
+
rm -rf /opt/zapret2/*
|
|
25
|
+
cd /opt && git clone --depth 1 https://github.com/bol-van/zapret2.git zapret2
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# Download and extract binaries
|
|
29
|
+
ARCHIVE="zapret2-${version}.tar.gz"
|
|
30
|
+
cd /tmp
|
|
31
|
+
curl -sLO "https://github.com/bol-van/zapret2/releases/download/${version}/$ARCHIVE"
|
|
32
|
+
tar xzf "$ARCHIVE"
|
|
33
|
+
EXTRACT_DIR=$(echo "$ARCHIVE" | sed 's/.tar.gz//')
|
|
34
|
+
cp -r "$EXTRACT_DIR/binaries/"* /opt/zapret2/binaries/
|
|
35
|
+
rm -rf "$EXTRACT_DIR" "$ARCHIVE"
|
|
36
|
+
|
|
37
|
+
# Install binaries
|
|
38
|
+
cd /opt/zapret2 && sh install_bin.sh
|
|
39
|
+
|
|
40
|
+
# Create base config if missing
|
|
41
|
+
if [ ! -f /opt/zapret2/config ]; then
|
|
42
|
+
WAN_IFACE=$(ip route get 8.8.8.8 2>/dev/null | awk '/dev/{for(i=1;i<=NF;i++){if($i=="dev"){print $(i+1);exit}}}')
|
|
43
|
+
WAN_IFACE=\${WAN_IFACE:-}
|
|
44
|
+
printf '%s\\n' \
|
|
45
|
+
"FWTYPE=nftables" \
|
|
46
|
+
"MODE=nfqws2" \
|
|
47
|
+
"NFQWS2_ENABLE=0" \
|
|
48
|
+
'NFQWS2_OPT="--payload=http_req --lua-desync=fake"' \
|
|
49
|
+
"FLOWOFFLOAD=none" \
|
|
50
|
+
"IFACE_WAN=$WAN_IFACE" \
|
|
51
|
+
"IFACE_LAN=" \
|
|
52
|
+
"DISABLE_IPV6=1" \
|
|
53
|
+
> /opt/zapret2/config
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
echo "INSTALL_OK"
|
|
57
|
+
echo "Version: ${version}"
|
|
58
|
+
echo "Binary: $(ls -la /opt/zapret2/nfqws2 2>/dev/null || echo 'not found')"
|
|
59
|
+
`;
|
|
60
|
+
try {
|
|
61
|
+
const { stdout, stderr } = await getExecutor().exec(script, 120000);
|
|
62
|
+
const output = (stdout + stderr).trim();
|
|
63
|
+
if (output.startsWith("ALREADY_INSTALLED")) {
|
|
64
|
+
return {
|
|
65
|
+
content: [{ type: "text", text: "zapret2 is already installed at /opt/zapret2. Use force=true to reinstall." }],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
saveLog("service", output, { action: "install", version });
|
|
69
|
+
return { content: [{ type: "text", text: output }] };
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
const e = err;
|
|
73
|
+
const output = (e.stdout || "") + (e.stderr || "");
|
|
74
|
+
if (output) {
|
|
75
|
+
saveLog("service", output, { action: "install", version, error: "true" });
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
content: [{ type: "text", text: `Error installing zapret2: ${output || e.error?.message || "unknown error"}` }],
|
|
79
|
+
isError: true,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=installZapret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installZapret.js","sourceRoot":"","sources":["../../src/tools/installZapret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,yPAAyP;IACtQ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAC/F,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KAClG,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAA2C,EAAE,EAAE;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QAElC,MAAM,MAAM,GAAG;;;4CAGyB,KAAK;;;;;;;;;;;;yBAYxB,OAAO;;wEAEwC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;uBA0BxD,OAAO;;KAEzB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAExC,IAAI,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC3C,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4EAA4E,EAAE,CAAC;iBACzH,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YACnD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACxH,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const restartServiceTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
6
|
+
handler: () => Promise<{
|
|
7
|
+
content: {
|
|
8
|
+
type: "text";
|
|
9
|
+
text: string;
|
|
10
|
+
}[];
|
|
11
|
+
isError?: undefined;
|
|
12
|
+
} | {
|
|
13
|
+
content: {
|
|
14
|
+
type: "text";
|
|
15
|
+
text: string;
|
|
16
|
+
}[];
|
|
17
|
+
isError: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getExecutor } from "../executorInstance.js";
|
|
3
|
+
import { saveLog } from "../logStore.js";
|
|
4
|
+
export const restartServiceTool = {
|
|
5
|
+
name: "restartService",
|
|
6
|
+
description: "Restart zapret2 service (nfqws2 daemon). Logs saved to resources. Use after updateConfig to apply changes.",
|
|
7
|
+
schema: z.object({}),
|
|
8
|
+
handler: async () => {
|
|
9
|
+
try {
|
|
10
|
+
const { stdout, stderr } = await getExecutor().exec("/opt/zapret2/init.d/sysv/zapret2 restart");
|
|
11
|
+
const output = (stdout + stderr).trim() || "Service restarted";
|
|
12
|
+
saveLog("service", output, { action: "restart" });
|
|
13
|
+
return { content: [{ type: "text", text: output }] };
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
const e = err;
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: "text", text: `Error: ${(e.stdout || "") + (e.stderr || "") || e.error?.message || "unknown error"}` }],
|
|
19
|
+
isError: true,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=restartService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restartService.js","sourceRoot":"","sources":["../../src/tools/restartService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,4GAA4G;IACzH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YAChG,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,mBAAmB,CAAC;YAC/D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBAClI,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const runBlockcheckTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
schema: z.ZodObject<{
|
|
6
|
+
domain: z.ZodDefault<z.ZodString>;
|
|
7
|
+
scanLevel: z.ZodDefault<z.ZodEnum<["quick", "standard"]>>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
domain: string;
|
|
10
|
+
scanLevel: "quick" | "standard";
|
|
11
|
+
}, {
|
|
12
|
+
domain?: string | undefined;
|
|
13
|
+
scanLevel?: "quick" | "standard" | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
handler: (args: {
|
|
16
|
+
domain?: string;
|
|
17
|
+
scanLevel?: "quick" | "standard";
|
|
18
|
+
}) => Promise<{
|
|
19
|
+
content: {
|
|
20
|
+
type: "text";
|
|
21
|
+
text: string;
|
|
22
|
+
}[];
|
|
23
|
+
isError?: undefined;
|
|
24
|
+
} | {
|
|
25
|
+
content: {
|
|
26
|
+
type: "text";
|
|
27
|
+
text: string;
|
|
28
|
+
}[];
|
|
29
|
+
isError: boolean;
|
|
30
|
+
}>;
|
|
31
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getExecutor } from "../executorInstance.js";
|
|
3
|
+
import { saveLog } from "../logStore.js";
|
|
4
|
+
export const runBlockcheckTool = {
|
|
5
|
+
name: "runBlockcheck",
|
|
6
|
+
description: "Run blockcheck2.sh to find working network strategies for a domain. Stops zapret2 before running, collects AVAILABLE results. Heavy operation (~5 min). Full log saved to resources. Apply results via updateConfig NFQWS2_OPT.",
|
|
7
|
+
schema: z.object({
|
|
8
|
+
domain: z.string().default("example.com").describe("Domain to test against (default: example.com)"),
|
|
9
|
+
scanLevel: z.enum(["quick", "standard"]).default("quick").describe("Scan depth: quick or standard (default: quick)"),
|
|
10
|
+
}),
|
|
11
|
+
handler: async (args) => {
|
|
12
|
+
const domain = args.domain || "example.com";
|
|
13
|
+
const scanLevel = args.scanLevel || "quick";
|
|
14
|
+
const scanNum = scanLevel === "quick" ? "1" : "2";
|
|
15
|
+
const script = `
|
|
16
|
+
/opt/zapret2/init.d/sysv/zapret2 stop 2>/dev/null || true
|
|
17
|
+
|
|
18
|
+
printf '%s\\n' "${domain}" "${scanNum}" "Y" | /opt/zapret2/blockcheck2.sh 2>&1
|
|
19
|
+
`;
|
|
20
|
+
try {
|
|
21
|
+
const { stdout } = await getExecutor().exec(script, 300000);
|
|
22
|
+
const fullOutput = stdout.trim();
|
|
23
|
+
const ts = saveLog("blockcheck", fullOutput, { domain, scanLevel });
|
|
24
|
+
const filtered = fullOutput
|
|
25
|
+
.split("\n")
|
|
26
|
+
.filter((line) => /AVAILABLE|summary|strategy|nfqws2/i.test(line))
|
|
27
|
+
.join("\n") || "No AVAILABLE strategies found";
|
|
28
|
+
const response = `${filtered}\n\nFull log: zapret2://logs/blockcheck/${ts}`;
|
|
29
|
+
return { content: [{ type: "text", text: response }] };
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
const e = err;
|
|
33
|
+
const output = (e.stdout || "") + (e.stderr || "");
|
|
34
|
+
if (output) {
|
|
35
|
+
saveLog("blockcheck", output, { domain, scanLevel, error: "true" });
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: `Error running blockcheck2: ${output || e.error?.message || "unknown error"}` }],
|
|
39
|
+
isError: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=runBlockcheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runBlockcheck.js","sourceRoot":"","sources":["../../src/tools/runBlockcheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,iOAAiO;IAC9O,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QACnG,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC;KACrH,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAA2D,EAAE,EAAE;QAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;QAE5C,MAAM,OAAO,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAElD,MAAM,MAAM,GAAG;;;wBAGK,MAAM,MAAM,OAAO;KACtC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAEjC,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAEpE,MAAM,QAAQ,GAAG,UAAU;iBACxB,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACjE,IAAI,CAAC,IAAI,CAAC,IAAI,+BAA+B,CAAC;YAEjD,MAAM,QAAQ,GAAG,GAAG,QAAQ,2CAA2C,EAAE,EAAE,CAAC;YAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAClE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAEnD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACtE,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8BAA8B,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACzH,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const startServiceTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
6
|
+
handler: () => Promise<{
|
|
7
|
+
content: {
|
|
8
|
+
type: "text";
|
|
9
|
+
text: string;
|
|
10
|
+
}[];
|
|
11
|
+
isError?: undefined;
|
|
12
|
+
} | {
|
|
13
|
+
content: {
|
|
14
|
+
type: "text";
|
|
15
|
+
text: string;
|
|
16
|
+
}[];
|
|
17
|
+
isError: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getExecutor } from "../executorInstance.js";
|
|
3
|
+
import { saveLog } from "../logStore.js";
|
|
4
|
+
export const startServiceTool = {
|
|
5
|
+
name: "startService",
|
|
6
|
+
description: "Start zapret2 service (nfqws2 daemon). Logs saved to resources. After starting, use verifyBypass to confirm.",
|
|
7
|
+
schema: z.object({}),
|
|
8
|
+
handler: async () => {
|
|
9
|
+
try {
|
|
10
|
+
const { stdout, stderr } = await getExecutor().exec("/opt/zapret2/init.d/sysv/zapret2 start");
|
|
11
|
+
const output = (stdout + stderr).trim() || "Service started";
|
|
12
|
+
saveLog("service", output, { action: "start" });
|
|
13
|
+
return { content: [{ type: "text", text: output }] };
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
const e = err;
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: "text", text: `Error: ${(e.stdout || "") + (e.stderr || "") || e.error?.message || "unknown error"}` }],
|
|
19
|
+
isError: true,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=startService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startService.js","sourceRoot":"","sources":["../../src/tools/startService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,8GAA8G;IAC3H,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YAC9F,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,iBAAiB,CAAC;YAC7D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBAClI,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const stopServiceTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
6
|
+
handler: () => Promise<{
|
|
7
|
+
content: {
|
|
8
|
+
type: "text";
|
|
9
|
+
text: string;
|
|
10
|
+
}[];
|
|
11
|
+
isError?: undefined;
|
|
12
|
+
} | {
|
|
13
|
+
content: {
|
|
14
|
+
type: "text";
|
|
15
|
+
text: string;
|
|
16
|
+
}[];
|
|
17
|
+
isError: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
};
|