Compare commits

...

13 Commits

Author SHA1 Message Date
mercury 6631ea5cc2 update version 2024-05-04 13:00:06 +04:00
mercury 09d49fd0fb remove duplicate image 2024-05-04 12:36:32 +04:00
mercury 6766a56440 warp on alpine 2024-05-04 12:31:39 +04:00
mercury 4fb039ffc4 fix choice default template sing-box update 2 2024-05-01 18:35:45 +04:00
mercury 0b7ae110fc fix choice default template sing-box update 2024-05-01 18:24:22 +04:00
mercury 6fb1931c2d fix choice default template sing-box 2024-05-01 17:52:17 +04:00
mercury 6a31985863 clear old images 2024-04-22 23:12:23 +04:00
mercury f4a9e63793 docker clean 2024-04-22 21:49:55 +04:00
mercury 581e3a9bd1 delete old image 2024-04-22 12:48:42 +04:00
mercury 8491ee9f51 fix star button freeze 2024-04-22 12:46:19 +04:00
Bkeenke 49cefc3231 Update "qrPeer" function (#11) 2024-04-21 12:06:32 +04:00
mercury b227431b7a singbox ruleset 2024-04-19 15:40:45 +04:00
mercury bb83ab0684 warp status on menu 2024-04-18 16:10:13 +04:00
12 changed files with 298 additions and 159 deletions
+138 -19
View File
@@ -1477,14 +1477,19 @@ class Bot
$cl = $client;
$client = $this->readClients()[$client];
$name = $this->getName($client['interface']);
$code = $this->createConfig($client);
if ($this->getWGType() == 'awg') {
$sl = $this->getAmneziaShortLink($client);
$code = preg_replace('/^vpn:\/\//', '', $sl);
} else {
$code = $this->createConfig($client);
}
$qr = preg_replace(['~\s+~', '~\(~', '~\)~'], ['_'], $name);
$qr_file = __DIR__ . "/qr/$qr.png";
exec("qrencode -t png -o $qr_file '$code'");
$r = $this->sendPhoto(
$this->input['chat'],
curl_file_create($qr_file),
$name,
($this->getWGType() == 'awg') ? "$name for AmneziaVPN" : $name
);
unlink($qr_file);
if ($this->getPacConf()['blinkmenu']) {
@@ -3281,7 +3286,7 @@ DNS-over-HTTPS with IP:
'callback_data' => "/menu ss",
],
[
'text' => $this->i18n('warp'),
'text' => $this->i18n('warp') . ': ' . $this->warpStatus(),
'callback_data' => "/warp",
],
],
@@ -3366,6 +3371,49 @@ DNS-over-HTTPS with IP:
return "vless://{$c['inbounds'][0]['settings']['clients'][$i]['id']}@$domain:443?security=reality&sni={$c['inbounds'][0]['streamSettings']['realitySettings']['serverNames'][0]}&fp=chrome&pbk={$pac['xray']}&sid={$c['inbounds'][0]['streamSettings']['realitySettings']['shortIds'][0]}&type=tcp&flow=xtls-rprx-vision#vpnbot";
}
public function dockerApi($url, $method = 'GET', $data = [])
{
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_POSTFIELDS => !empty($data) ? json_encode($data) : null,
CURLOPT_URL => "http://localhost$url",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_UNIX_SOCKET_PATH => '/var/run/docker.sock'
]);
$r = json_decode(curl_exec($ch), true);
curl_close($ch);
return $r;
}
public function cleanDocker()
{
$r = $this->dockerApi('/images/json');
foreach ($r as $v) {
if (!empty($v['RepoTags'])) {
foreach ($v['RepoTags'] as $j) {
if (preg_match('~^mercurykd/vpnbot~', $j)) {
$i[] = $v['Id'];
break;
}
}
}
}
$r = $this->dockerApi('/containers/json?all=1');
foreach ($r as $v) {
if (preg_match('~^mercurykd/vpnbot~', $v['Image'])) {
$c[] = $v['ImageID'];
}
}
if (!empty($d = array_diff($i, $c))) {
foreach ($d as $v) {
$this->dockerApi("/images/$v", 'DELETE');
}
}
$this->dockerApi('/images/prune', 'POST', ['dangling' => true]);
$this->dockerApi('/build/prune', 'POST');
}
public function naiveMenu()
{
$pac = $this->getPacConf();
@@ -3699,7 +3747,7 @@ DNS-over-HTTPS with IP:
'web_app' => ['url' => "https://$domain/pac?h=$hash&t=te&ty=$type"],
],
[
'text' => $this->i18n($pac["default{$type}template"] && !empty($pac["{$type}templates"][$pac["default{$type}template"]]) ? 'off' : 'on'),
'text' => $this->i18n($pac["default{$type}template"] && !empty($pac["{$type}templates"][base64_decode($pac["default{$type}template"])]) ? 'off' : 'on'),
'callback_data' => "/defaultTemplate $type",
],
];
@@ -3869,12 +3917,17 @@ DNS-over-HTTPS with IP:
$this->warp();
}
public function warpStatus()
{
$st = $this->ssh('curl -m 1 -x socks5://127.0.0.1:40000 https://cloudflare.com/cdn-cgi/trace', 'wp');
preg_match('~warp=(\w+)~', $st, $m);
return $m[1];
}
public function warp()
{
$st = $this->ssh('curl -x socks5://127.0.0.1:40000 https://cloudflare.com/cdn-cgi/trace', 'wp');
preg_match('~warp=(\w+)~', $st, $m);
$text[] = "Menu -> " . $this->i18n('warp');
$text[] = "status: {$m['1']}";
$text[] = "status: " . $this->warpStatus();
$data[] = [
[
'text' => $this->i18n('set key'),
@@ -3961,10 +4014,10 @@ DNS-over-HTTPS with IP:
$text[] = "<code>{$this->linkXray($i)}</code>\n";
$text[] = "import subscribe:";
$text[] = "<a href='$scheme://{$domain}/pac?h=$hash&t=s&r=v&s={$c['id']}'>v2rayng</a>";
$text[] = "<a href='$scheme://{$domain}/pac?h=$hash&t=si&r=si&s={$c['id']}'>sing-box</a>";
$text[] = "<a href='$scheme://{$domain}/pac?h=$hash&t=s&r=st&s={$c['id']}'>streisand</a>";
$text[] = "<a href='$scheme://{$domain}/pac?h=$hash&t=si&r=h&s={$c['id']}'>hiddify</a>";
$text[] = "<a href='$scheme://{$domain}/pac?h=$hash&t=s&r=v&s={$c['id']}#{$c['email']}'>v2rayng</a>";
$text[] = "<a href='$scheme://{$domain}/pac?h=$hash&t=si&r=si&s={$c['id']}#{$c['email']}'>sing-box</a>";
$text[] = "<a href='$scheme://{$domain}/pac?h=$hash&t=s&r=st&s={$c['id']}#{$c['email']}'>streisand</a>";
$text[] = "<a href='$scheme://{$domain}/pac?h=$hash&t=si&r=h&s={$c['id']}#{$c['email']}'>hiddify</a>";
$text[] = "\nv2ray config: <code>$scheme://{$domain}/pac?h=$hash&t=s&s={$c['id']}</code>";
$text[] = "sing-box config: <code>$scheme://{$domain}/pac?h=$hash&t=si&s={$c['id']}</code>";
@@ -4073,6 +4126,7 @@ DNS-over-HTTPS with IP:
public function subscription()
{
$type = $_GET['t'] == 's' ? 'v2ray' : 'sing';
$pac = $this->getPacConf();
$domain = $pac['domain'] ?: $this->ip;
$xr = $this->getXray();
@@ -4085,7 +4139,7 @@ DNS-over-HTTPS with IP:
if (empty($v['off'])) {
$flag = false;
}
$template = base64_decode($_GET['t'] == 's' ? $v['v2raytemplate'] : $v['singtemplate']);
$template = base64_decode($v["{$type}template"]);
$uid = $v['id'];
break;
}
@@ -4111,7 +4165,8 @@ DNS-over-HTTPS with IP:
header("Location: hiddify://install-config/?url=" . urlencode($si));
exit;
case 'w':
file_put_contents('/singbox/update.cmd', preg_replace('#~url~#', $si, file_get_contents('/singbox/update.cmd')));
$link = htmlspecialchars($si, ENT_XML1, 'UTF-8');
file_put_contents('/singbox/winsw3.xml', preg_replace('#~url~#', $link, file_get_contents('/singbox/winsw3.xml')));
$zip = new ZipArchive();
$n = "singbox_$uid.zip";
$zip->open($n, ZipArchive::CREATE | ZipArchive::OVERWRITE);
@@ -4127,19 +4182,19 @@ DNS-over-HTTPS with IP:
exit;
}
}
switch (true) {
case !empty($template) && $template == 'origin':
case empty($template) && empty($pac['default' . ($_GET['t'] == 's' ? 'v2ray' : 'sing') . 'template']):
case empty($template) && !empty($pac['default' . ($_GET['t'] == 's' ? 'v2ray' : 'sing') . 'template']) && empty($pac[($_GET['t'] == 's' ? 'v2ray' : 'sing') . 'templates'][$pac['default' . ($_GET['t'] == 's' ? 'v2ray' : 'sing') . 'template']]):
$c = json_decode(file_get_contents('/config/' . ($_GET['t'] == 's' ? 'v2ray' : 'sing') . '.json'), true);
case empty($template) && empty($pac["default{$type}template"]):
case empty($template) && empty($pac["{$type}templates"][base64_decode($pac["default{$type}template"])]):
case !empty($template) && empty($pac["{$type}templates"][$template]):
$c = json_decode(file_get_contents("/config/{$type}.json"), true);
break;
case !empty($template):
$c = $pac[$_GET['t'] == 's' ? 'v2raytemplates' : 'singtemplates'][$template];
$c = $pac["{$type}templates"][$template];
break;
default:
$c = $pac[$_GET['t'] == 's' ? 'v2raytemplates' : 'singtemplates'][base64_decode($pac['default' . ($_GET['t'] == 's' ? 'v2ray' : 'sing') . 'template'])];
$c = $pac["{$type}templates"][base64_decode($pac["default{$type}template"])];
break;
}
@@ -4180,6 +4235,7 @@ DNS-over-HTTPS with IP:
}
}
$c['route']['rules'] = array_values($c['route']['rules']);
$c['route'] = $this->createRuleSet($c['route'], $uid);
break;
}
@@ -4187,6 +4243,69 @@ DNS-over-HTTPS with IP:
echo json_encode($c);
}
public function createRuleSet($route, $uid)
{
$pac = $this->getPacConf();
$domain = $pac['domain'] ?: $this->ip;
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
$hash = substr(md5($this->key), 0, 8);
foreach ($route['rules'] as $k => $v) {
if (!empty($v['createruleset'])) {
foreach ($v['createruleset'] as $i => $r) {
foreach ($r['rules'] as $l => $n) {
if (array_key_exists('domain_suffix', $n) && $n['domain_suffix'] == '~pac~') {
$r['rules'][$l]['domain_suffix'] = array_keys(array_filter($pac['includelist'] ?: []));
if (empty($r['rules'][$l]['domain_suffix'])) {
unset($r['rules'][$l]);
}
}
}
if (!empty($_GET['r']) && $r['name'] == $_GET['r']) {
$f = "/tmp/{$r['name']}" . time() . rand(1, 100);
file_put_contents($f, json_encode([
'version' => 1,
'rules' => $r['rules'],
]));
exec("sing-box rule-set compile $f");
header("Content-Disposition: attachment; filename={$r['name']}.srs");
header('Content-Type: application/binary');
echo file_get_contents("$f.srs");
unlink($f);
unlink("$f.srs");
exit;
}
if (!empty($r['rules'])) {
$ruleset[] = [
"tag" => $r['name'],
"url" => "$scheme://{$domain}/pac?" . http_build_query([
'h' => $hash,
't' => 'si',
's' => $uid,
'r' => $r['name'],
]),
"update_interval" => $r['interval'],
"type" => "remote",
"format" => "binary",
"download_detour" => "direct",
];
$route['rules'][$k]['rule_set'][] = $r['name'];
}
}
unset($route['rules'][$k]['createruleset']);
if (empty($route['rules'][$k]['rule_set'])) {
unset($route['rules'][$k]);
}
}
}
$route['rules'] = array_values($route['rules']);
$route['rule_set'] = array_merge($route['rule_set'] ?: [], $ruleset ?: []);
if (empty($route['rule_set'])) {
unset($route['rule_set']);
}
return $route;
}
public function getXray()
{
return json_decode(file_get_contents('/config/xray.json'), true);
+1
View File
@@ -40,3 +40,4 @@ file_put_contents('/update/message', '');
file_put_contents('/update/reload_message', '');
$bot->restartTG();
$bot->sslip();
$bot->cleanDocker();
+1 -1
View File
@@ -16,7 +16,7 @@
<div style="position:absolute;top:0;right:0;width:35%;text-align:center;background-color: #17212b;">
<img src="toncoin.png" width="100%" alt="">
<a href="javascript:;" id="copy" style="color:white;text-decoration:none" data-id="UQCDDkaX3fCAFBek28Hx4TfvDDRqeizOW74blVMVAM4_m4OW">copy</a>
<iframe src="https://ghbtns.com/github-btn.html?user=mercurykd&repo=vpnbot&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>
<!-- <iframe src="https://ghbtns.com/github-btn.html?user=mercurykd&repo=vpnbot&type=star&count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe> -->
</div>
<a style="background-color: #8B3FFD;height: 46px;display:inline-block;padding:0 54px;color: white;border-radius: 12px;text-decoration: none;font-size: 20px;line-height: 46px;font-family: arial;" href="https://yoomoney.ru/to/410011827900450">
<svg style="width: 24px;fill: white;position: relative;top: 4px;" class="qa-fundraise-button-logo mui-m0okdh" viewBox="0 0 16 16"><path d="M4.638 8.5a5.67 5.67 0 015.681-5.68A5.693 5.693 0 0116 8.5a5.693 5.693 0 01-5.68 5.682A5.67 5.67 0 014.637 8.5zm3.56 0c0 1.151.97 2.122 2.121 2.122 1.15 0 2.085-.97 2.121-2.121 0-1.15-.97-2.121-2.12-2.121-1.151 0-2.122.97-2.122 2.12zm-3.596 4.243v-8.27H0l2.589 8.27h2.013z" clip-rule="evenodd"></path></svg>
+111 -87
View File
@@ -3,104 +3,128 @@
"level": "error",
"timestamp": true
},
"inbounds": [{
"type": "tun",
"tag": "tun-in",
"domain_strategy": "prefer_ipv4",
"interface_name": "sing-tun",
"inet4_address": "172.19.0.1\/30",
"mtu": 1400,
"gso": true,
"auto_route": true,
"strict_route": true,
"sniff": true,
"endpoint_independent_nat": false,
"stack": "mixed",
"platform": {
"http_proxy": {
"enabled": false,
"server": "127.0.0.1",
"server_port": 2080
"inbounds": [
{
"type": "tun",
"tag": "tun-in",
"domain_strategy": "prefer_ipv4",
"interface_name": "sing-tun",
"inet4_address": "172.19.0.1\/30",
"mtu": 1400,
"gso": true,
"auto_route": true,
"strict_route": true,
"sniff": true,
"endpoint_independent_nat": false,
"stack": "mixed",
"platform": {
"http_proxy": {
"enabled": false,
"server": "127.0.0.1",
"server_port": 2080
}
}
},
{
"type": "mixed",
"tag": "mixed-in",
"domain_strategy": "prefer_ipv4",
"listen": "127.0.0.1",
"listen_port": 2080,
"tcp_fast_open": true,
"sniff": true,
"sniff_override_destination": false,
"users": []
}
}, {
"type": "mixed",
"tag": "mixed-in",
"domain_strategy": "prefer_ipv4",
"listen": "127.0.0.1",
"listen_port": 2080,
"tcp_fast_open": true,
"sniff": true,
"sniff_override_destination": false,
"users": []
}],
],
"dns": {
"servers": [{
"tag": "dns_direct",
"address": "~dns~",
"address_resolver": "dns-remote",
"strategy": "prefer_ipv4",
"detour": "direct"
}, {
"tag": "dns-remote",
"address": "tcp:\/\/8.8.8.8",
"address_strategy": "prefer_ipv4",
"strategy": "prefer_ipv4",
"detour": "direct"
}],
"rules": [{
"outbound": "any",
"server": "dns-direct",
"disable_cache": false
}],
"servers": [
{
"tag": "dns_direct",
"address": "~dns~",
"address_resolver": "dns-remote",
"strategy": "prefer_ipv4",
"detour": "direct"
},
{
"tag": "dns-remote",
"address": "tcp:\/\/8.8.8.8",
"address_strategy": "prefer_ipv4",
"strategy": "prefer_ipv4",
"detour": "direct"
}
],
"rules": [
{
"outbound": "any",
"server": "dns-direct",
"disable_cache": false
}
],
"strategy": "ipv4_only",
"independent_cache": true
},
"outbounds": [{
"flow": "xtls-rprx-vision",
"packet_encoding": "",
"server": "",
"server_port": 443,
"tls": {
"enabled": true,
"insecure": false,
"reality": {
"outbounds": [
{
"flow": "xtls-rprx-vision",
"packet_encoding": "",
"server": "",
"server_port": 443,
"tls": {
"enabled": true,
"public_key": "",
"short_id": ""
"insecure": false,
"reality": {
"enabled": true,
"public_key": "",
"short_id": ""
},
"server_name": "",
"utls": {
"enabled": true,
"fingerprint": "chrome"
}
},
"server_name": "",
"utls": {
"enabled": true,
"fingerprint": "chrome"
}
"uuid": "",
"type": "vless",
"domain_strategy": "ipv4_only",
"tag": "proxy"
},
"uuid": "",
"type": "vless",
"domain_strategy": "ipv4_only",
"tag": "proxy"
}, {
"type": "direct",
"tag": "direct"
}, {
"type": "block",
"tag": "block"
}, {
"type": "dns",
"tag": "dns-out"
}],
{
"type": "direct",
"tag": "direct"
},
{
"type": "block",
"tag": "block"
},
{
"type": "dns",
"tag": "dns-out"
}
],
"route": {
"auto_detect_interface": true,
"override_android_vpn": true,
"rules": [{
"protocol": "dns",
"outbound": "dns-out"
}, {
"domain_suffix": "~pac~",
"outbound": "proxy"
}, {
"ip_cidr": ["0.0.0.0\/0"],
"outbound": "direct"
}]
"rules": [
{
"protocol": "dns",
"outbound": "dns-out"
},
{
"createruleset": [
{
"name": "selfpac",
"interval": "15s",
"rules": [
{
"domain_suffix": "~pac~"
}
]
}
],
"outbound": "proxy"
}
],
"final": "direct"
}
}
+12 -7
View File
@@ -19,7 +19,7 @@ volumes:
services:
up:
image: mercurykd/vpnbot-up:1.1
image: mercurykd/vpnbot-ng:1.1
build:
context: dockerfile
dockerfile: nginx.dockerfile
@@ -93,7 +93,7 @@ services:
ipv4_address: 10.10.1.2
logging: *default-logging
php:
image: mercurykd/vpnbot-php:1.4
image: mercurykd/vpnbot-php:1.5
build:
dockerfile: dockerfile/php.dockerfile
args:
@@ -116,6 +116,7 @@ services:
- ./update:/update
- ./.git:/.git
- ./singbox_windows:/singbox
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
IP: ${IP}
VER: ${VER}
@@ -142,7 +143,7 @@ services:
timeout: 5s
retries: 5
service:
image: mercurykd/vpnbot-php:1.2
image: mercurykd/vpnbot-php:1.5
build:
dockerfile: dockerfile/php.dockerfile
args:
@@ -157,6 +158,7 @@ services:
- ./logs/:/logs/
- ./update:/update
- ./scripts/start_service.sh:/start_service.sh
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
IP: ${IP}
VER: ${VER}
@@ -491,7 +493,7 @@ services:
ipv4_address: 10.10.0.12
logging: *default-logging
wp:
image: mercurykd/vpnbot-wp:1.1
image: mercurykd/vpnbot-wp:1.2
build:
dockerfile: dockerfile/warp.dockerfile
args:
@@ -501,7 +503,7 @@ services:
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- ./config/.profile:/root/.bashrc:ro
- ./config/.profile:/root/.ashrc:ro
- ./ssh:/ssh
- ./config/sshd_config:/etc/ssh/sshd_config
- ./config:/config
@@ -512,8 +514,11 @@ services:
depends_on:
php:
condition: service_healthy
environment:
TZ: ${TZ}
env_file:
- path: ./.env
required: true # default
- path: ./override.env
required: false
stop_grace_period: 1s
command: ["/bin/sh", "/start_wp.sh"]
networks:
+6 -1
View File
@@ -26,5 +26,10 @@ RUN apk add --no-cache --update php81 \
&& tar -xf dnslookup-linux-amd64-v1.9.1.tar.gz \
&& mv linux-amd64/dnslookup /usr/bin \
&& rm dnslookup-linux-amd64-v1.9.1.tar.gz \
&& rm -rf /linux-amd64
&& rm -rf /linux-amd64 \
&& wget https://github.com/SagerNet/sing-box/releases/download/v1.8.11/sing-box-1.8.11-linux-amd64.tar.gz \
&& tar -xf sing-box-1.8.11-linux-amd64.tar.gz \
&& mv sing-box-1.8.11-linux-amd64/sing-box /usr/bin \
&& rm sing-box-1.8.11-linux-amd64.tar.gz \
&& rm -rf /sing-box-1.8.11-linux-amd64
ENV ENV="/root/.ashrc"
+13 -3
View File
@@ -1,6 +1,16 @@
FROM ubuntu:22.04
RUN apt update && apt install -y curl gpg socat jq lsb-release openssh-server \
FROM ubuntu:22.04 AS build
RUN apt update && apt install -y curl gpg lsb-release \
&& curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg \
&& echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/cloudflare-client.list \
&& apt update && apt install -y cloudflare-warp \
&& apt update && apt install -y cloudflare-warp
FROM alpine:3.17
ARG GLIBC_VERSION=2.34-r0
COPY --from=build /usr/bin/warp-cli /usr/bin/warp-svc /usr/local/bin/
RUN apk add --no-cache dbus-libs wget socat openssh-server jq curl \
&& mkdir /tmp/glibc-pkgs \
&& for PKG in glibc-$GLIBC_VERSION.apk glibc-bin-$GLIBC_VERSION.apk; do wget -q --directory-prefix /tmp/glibc-pkgs https://github.com/sgerrand/alpine-pkg-glibc/releases/download/$GLIBC_VERSION/$PKG; done \
&& apk add --no-cache --allow-untrusted --force-overwrite /tmp/glibc-pkgs/* \
&& rm -rf /tmp/glibc-pkgs \
&& /usr/glibc-compat/sbin/ldconfig /lib /usr/glibc-compat/lib \
&& mkdir /root/.ssh
+2 -2
View File
@@ -9,7 +9,7 @@ d: # остановка контейнеров
docker compose down --remove-orphans
dv: # остановка контейнеров
docker compose down -v
r: d cleanf u cleanf
r: d u
ps: # список контейнеров
docker compose ps
l: # логи из контейнеров
@@ -31,7 +31,7 @@ up: # консоль сервиса
ad: # консоль сервиса
docker compose exec ad /bin/sh
wp: # консоль сервиса
docker compose exec wp bash
docker compose exec wp /bin/sh
proxy: # консоль сервиса
docker compose exec proxy /bin/sh
tg: # консоль сервиса
+2 -3
View File
@@ -1,7 +1,6 @@
cat /ssh/key.pub > /root/.ssh/authorized_keys
echo 'HostKeyAlgorithms +ssh-rsa' >> /etc/ssh/sshd_config
echo 'PubkeyAcceptedKeyTypes +ssh-rsa' >> /etc/ssh/sshd_config
service ssh start
ssh-keygen -A
exec /usr/sbin/sshd -D -e "$@" &
warp-svc > /dev/null &
sleep 3
warp-cli --accept-tos registration new
-35
View File
@@ -1,35 +0,0 @@
@echo off
setlocal
set "exe_path=sing-box.exe"
set "URL=~url~"
set "FileName=config.json"
set "PreviousHash="
taskkill /IM "%exe_path%" /F
powershell -command "(New-Object System.Net.WebClient).DownloadFile('%URL%', '%FileName%')"
for /F "skip=1 delims=" %%H in ('2^>nul CertUtil -hashfile "%FileName%" SHA256') do (
if not defined PreviousHash set "PreviousHash=%%H"
)
start "" /B "%CD%\%exe_path%" run -c "%FileName%"
echo "%PreviousHash%"
:loop
powershell -command "(New-Object System.Net.WebClient).DownloadFile('%URL%', '%FileName%')"
for /F "skip=1 delims=" %%H in ('2^>nul CertUtil -hashfile "%FileName%" SHA256') do (
if not defined HASH set "HASH=%%H"
)
set "CurrentHash=%HASH%"
set "HASH="
echo "%CurrentHash%"
if "%CurrentHash%" NEQ "%PreviousHash%" (
echo "change"
set "PreviousHash=%CurrentHash%"
taskkill /IM "%exe_path%" /F
start "" /B "%CD%\%exe_path%" run -c "%FileName%"
) else (
echo "not change"
)
timeout /t 15 /nobreak
goto :loop
+3 -1
View File
@@ -2,7 +2,8 @@
<id>singbox</id>
<name>singbox</name>
<description>singbox</description>
<executable>%BASE%\update.cmd</executable>
<executable>%BASE%\sing-box.exe</executable>
<arguments>run -c %BASE%\config.json</arguments>
<logmode>rotate</logmode>
<onfailure action="restart" delay="10 sec" />
<onfailure action="restart" delay="20 sec" />
@@ -12,4 +13,5 @@
<onexit action="restart" />
<onexit action="restart" />
<onexit action="none" />
<download from="~url~" to="%BASE%\config.json"/>
</service>
+9
View File
@@ -1,3 +1,12 @@
04.05.2024 v1.37.1
- warp на образе alpine (thx @zmeyzloy)
- фикс выбора шаблона singbox
22.04.2024 v1.35
- очистка старых образов
19.04.2024 v1.34
- формирование rule_set из шаблона singbox
18.04.2024 v1.33
- вывод статуса warp в меню
18.04.2024 v1.32
- фиксы в названии и отображении выбранного шаблона xtls
18.04.2024 v1.31