Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c3e850b102 | |||
| 3a89a1543b | |||
| 2a3e8e393c | |||
| 332b74e366 |
+174
-53
@@ -123,7 +123,6 @@ class Bot
|
||||
case preg_match('~^/menu (?P<type>wg) (?P<arg>(?:-)?\d+)$~', $this->input['callback'], $m):
|
||||
case preg_match('~^/menu (?P<type>client) (?P<arg>\d+(?:_(?:-)?\d+)?)$~', $this->input['callback'], $m):
|
||||
case preg_match('~^/menu (?P<type>pac|adguard|config|ss|lang|oc|naive|mirror|update)$~', $this->input['callback'], $m):
|
||||
case preg_match('~^/menu (?P<type>subzoneslist|reverselist|includelist|excludelist) (?P<arg>(?:-)?\d+)$~', $this->input['callback'], $m):
|
||||
$this->menu(type: $m['type'] ?? false, arg: $m['arg'] ?? false);
|
||||
break;
|
||||
case preg_match('~^/changeWG (\d+)$~', $this->input['callback'], $m):
|
||||
@@ -349,7 +348,7 @@ class Bot
|
||||
case preg_match('~^/deldomain$~', $this->input['callback'], $m):
|
||||
$this->delDomain();
|
||||
break;
|
||||
case preg_match('~^/(?P<action>change|delete)(?P<typelist>includelist) (?P<arg>[^\s]+(?:_(?:-)?\d+)?)$~', $this->input['callback'], $m):
|
||||
case preg_match('~^/(?P<action>change|delete)(?P<typelist>\w+) (?P<arg>[^\s]+(?:_(?:-)?\d+)?)$~', $this->input['callback'], $m):
|
||||
$this->listPacChange($m['typelist'], $m['action'], ...explode('_', $m['arg']));
|
||||
break;
|
||||
case preg_match('~^/paczapret$~', $this->input['callback'], $m):
|
||||
@@ -370,6 +369,12 @@ class Bot
|
||||
case preg_match('~^/xray(?: (\d+))?$~', $this->input['callback'], $m):
|
||||
$this->xray($m[1] ?: 0);
|
||||
break;
|
||||
case preg_match('~^/xtlsblock(?: (\d+))?$~', $this->input['callback'], $m):
|
||||
$this->xtlsblock($m[1] ?: 0);
|
||||
break;
|
||||
case preg_match('~^/xtlswarp(?: (\d+))?$~', $this->input['callback'], $m):
|
||||
$this->xtlswarp($m[1] ?: 0);
|
||||
break;
|
||||
case preg_match('~^/delTemplate(?: (.+))?$~', $this->input['callback'], $m):
|
||||
$this->delTemplate($m[1] ?: 0);
|
||||
break;
|
||||
@@ -397,7 +402,7 @@ class Bot
|
||||
case preg_match('~^/changeTGDomain$~', $this->input['callback'], $m):
|
||||
$this->changeTGDomain();
|
||||
break;
|
||||
case preg_match('~^/include (\d+)$~', $this->input['callback'], $m):
|
||||
case preg_match('~^/include (\w+)$~', $this->input['callback'], $m):
|
||||
$this->include($m[1]);
|
||||
break;
|
||||
case preg_match('~^/exclude (\d+)$~', $this->input['callback'], $m):
|
||||
@@ -1051,7 +1056,10 @@ class Bot
|
||||
foreach ($items as $k => $v) {
|
||||
if (($t = gmdate($k, $seconds) - $v['diff']) > 0) {
|
||||
$text .= " $t{$v['sign']}";
|
||||
break;
|
||||
if (!empty($i)) {
|
||||
break;
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
return trim($text) ?: '♾';
|
||||
@@ -2113,7 +2121,7 @@ DNS-over-HTTPS with IP:
|
||||
$this->setSSL('self');
|
||||
}
|
||||
|
||||
public function include(int $count)
|
||||
public function include($type)
|
||||
{
|
||||
$r = $this->send(
|
||||
$this->input['chat'],
|
||||
@@ -2124,25 +2132,86 @@ DNS-over-HTTPS with IP:
|
||||
$_SESSION['reply'][$r['result']['message_id']] = [
|
||||
'start_message' => $this->input['message_id'],
|
||||
'callback' => 'addInclude',
|
||||
'args' => [$count],
|
||||
'args' => [$type],
|
||||
];
|
||||
}
|
||||
|
||||
public function addInclude(string $domains, int $count)
|
||||
public function addInclude(string $domains, $type)
|
||||
{
|
||||
$domains = explode(',', $domains);
|
||||
$domains = array_filter($domains, fn($x) => !empty(trim($x)));
|
||||
if (!empty($domains)) {
|
||||
$conf = $this->getPacConf();
|
||||
foreach ($domains as $k => $v) {
|
||||
$conf['includelist'][idn_to_ascii(trim($v))] = true;
|
||||
$conf[$type][idn_to_ascii(trim($v))] = true;
|
||||
}
|
||||
ksort($conf['includelist']);
|
||||
ksort($conf[$type]);
|
||||
$this->setPacConf($conf);
|
||||
$page = (int) floor(array_search($v, array_keys($conf['includelist'])) / $count);
|
||||
$page = (int) floor(array_search($v, array_keys($conf[$type])) / $this->limit);
|
||||
}
|
||||
$page = $page ?: -2;
|
||||
$this->pacUpdate();
|
||||
$this->backXtlsList($type);
|
||||
}
|
||||
|
||||
public function backXtlsList($type)
|
||||
{
|
||||
switch ($type) {
|
||||
case 'includelist':
|
||||
$this->pacUpdate();
|
||||
break;
|
||||
case 'blocklist':
|
||||
$this->xrayUpdateRules();
|
||||
$this->xtlsblock();
|
||||
break;
|
||||
case 'warplist':
|
||||
$this->xrayUpdateRules();
|
||||
$this->xtlswarp();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public function xrayUpdateRules()
|
||||
{
|
||||
$c = $this->getPacConf();
|
||||
$xr = $this->getXray();
|
||||
$xr['outbounds'] = [
|
||||
[
|
||||
"protocol" => "freedom",
|
||||
"tag" => "direct",
|
||||
],
|
||||
[
|
||||
"protocol" => "blackhole",
|
||||
"tag" => "block",
|
||||
],
|
||||
[
|
||||
"protocol" => "socks",
|
||||
"tag" => "warp",
|
||||
"settings" => [
|
||||
'servers' => [
|
||||
[
|
||||
"address" => "10.10.0.13",
|
||||
"port" => 4000,
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
if (!empty($c['blocklist']) && !empty(array_filter($c['blocklist']))) {
|
||||
$rules[] = [
|
||||
"type" => "field",
|
||||
"outboundTag" => "block",
|
||||
"domain" => array_keys(array_filter($c['blocklist'])),
|
||||
];
|
||||
}
|
||||
if (!empty($c['warplist']) && !empty(array_filter($c['warplist']))) {
|
||||
$rules[] = [
|
||||
"type" => "field",
|
||||
"outboundTag" => "warp",
|
||||
"domain" => array_keys(array_filter($c['warplist'])),
|
||||
];
|
||||
}
|
||||
$xr['routing']['rules'] = $rules ?: [];
|
||||
$this->restartXray($xr);
|
||||
}
|
||||
|
||||
public function reverse(int $count)
|
||||
@@ -2962,44 +3031,7 @@ DNS-over-HTTPS with IP:
|
||||
'callback_data' => "/addCommunityFilter",
|
||||
],
|
||||
];
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('add'),
|
||||
'callback_data' => "/include {$this->limit}",
|
||||
],
|
||||
];
|
||||
$domains = $this->getPacConf()['includelist'];
|
||||
if (!empty($domains)) {
|
||||
ksort($domains);
|
||||
$all = (int) ceil(count($domains) / $this->limit);
|
||||
$page = min($page, $all - 1);
|
||||
$page = $page < 0 ? $all - 1 : $page;
|
||||
$domains = array_slice($domains, $page * $this->limit, $this->limit, true);
|
||||
foreach ($domains as $k => $v) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => '(' . ($v ? 'ON' : 'OFF') . ') ' . idn_to_utf8($k),
|
||||
'callback_data' => "/changeincludelist {$k}_{$this->limit}",
|
||||
],
|
||||
[
|
||||
'text' => 'delete',
|
||||
'callback_data' => "/deleteincludelist {$k}_{$this->limit}",
|
||||
],
|
||||
];
|
||||
}
|
||||
if ($all > 1) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => '<<',
|
||||
'callback_data' => "/pacMenu " . ($page - 1 >= 0 ? $page - 1 : $all - 1),
|
||||
],
|
||||
[
|
||||
'text' => '>>',
|
||||
'callback_data' => "/pacMenu " . ($page < $all - 1 ? $page + 1 : 0),
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
$data = array_merge($data, $this->listPac('includelist', $page, 'pacMenu'));
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('back'),
|
||||
@@ -3014,22 +3046,101 @@ DNS-over-HTTPS with IP:
|
||||
);
|
||||
}
|
||||
|
||||
public function listPacChange($type, $action, $key, int $count)
|
||||
public function xtlsblock($page = 0)
|
||||
{
|
||||
$text[] = "Menu -> " . $this->i18n('xray') . ' -> block list';
|
||||
|
||||
$data = $this->listPac('blocklist', $page, 'xtlsblock');
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('back'),
|
||||
'callback_data' => "/xray",
|
||||
],
|
||||
];
|
||||
$this->update(
|
||||
$this->input['chat'],
|
||||
$this->input['message_id'],
|
||||
implode("\n", $text ?: ['...']),
|
||||
$data ?: false,
|
||||
);
|
||||
}
|
||||
|
||||
public function xtlswarp($page = 0)
|
||||
{
|
||||
$text[] = "Menu -> " . $this->i18n('xray') . ' -> warp list';
|
||||
|
||||
$data = $this->listPac('warplist', $page, 'xtlswarp');
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('back'),
|
||||
'callback_data' => "/xray",
|
||||
],
|
||||
];
|
||||
$this->update(
|
||||
$this->input['chat'],
|
||||
$this->input['message_id'],
|
||||
implode("\n", $text ?: ['...']),
|
||||
$data ?: false,
|
||||
);
|
||||
}
|
||||
|
||||
public function listPac($type, $page, $menu)
|
||||
{
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('add'),
|
||||
'callback_data' => "/include $type",
|
||||
],
|
||||
];
|
||||
$domains = $this->getPacConf()[$type];
|
||||
if (!empty($domains)) {
|
||||
ksort($domains);
|
||||
$all = (int) ceil(count($domains) / $this->limit);
|
||||
$page = min($page, $all - 1);
|
||||
$page = $page < 0 ? $all - 1 : $page;
|
||||
$domains = array_slice($domains, $page * $this->limit, $this->limit, true);
|
||||
foreach ($domains as $k => $v) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => '(' . ($v ? 'ON' : 'OFF') . ') ' . idn_to_utf8($k),
|
||||
'callback_data' => "/change$type {$k}_{$this->limit}",
|
||||
],
|
||||
[
|
||||
'text' => 'delete',
|
||||
'callback_data' => "/delete$type {$k}_{$this->limit}",
|
||||
],
|
||||
];
|
||||
}
|
||||
if ($all > 1) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => '<<',
|
||||
'callback_data' => "/$menu " . ($page - 1 >= 0 ? $page - 1 : $all - 1),
|
||||
],
|
||||
[
|
||||
'text' => '>>',
|
||||
'callback_data' => "/$menu " . ($page < $all - 1 ? $page + 1 : 0),
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function listPacChange($type, $action, $key)
|
||||
{
|
||||
$conf = $this->getPacConf();
|
||||
ksort($conf[$type]);
|
||||
$page = (int) floor(array_search($key, array_keys($conf[$type])) / $count);
|
||||
switch ($action) {
|
||||
case 'change':
|
||||
$conf[$type][$key] = !$conf[$type][$key];
|
||||
$page = (int) floor(array_search($key, array_keys($conf[$type])) / $count);
|
||||
break;
|
||||
case 'delete':
|
||||
unset($conf[$type][$key]);
|
||||
break;
|
||||
}
|
||||
$this->setPacConf($conf);
|
||||
$this->pacUpdate();
|
||||
$this->backXtlsList($type);
|
||||
}
|
||||
|
||||
public function pacZapret()
|
||||
@@ -3644,6 +3755,16 @@ DNS-over-HTTPS with IP:
|
||||
'callback_data' => "/singbox",
|
||||
],
|
||||
];
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('block'),
|
||||
'callback_data' => "/xtlsblock",
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n('warp'),
|
||||
'callback_data' => "/xtlswarp",
|
||||
],
|
||||
];
|
||||
$data[] = [
|
||||
];
|
||||
foreach ($c['inbounds'][0]['settings']['clients'] as $k => $v) {
|
||||
|
||||
+1
-2
@@ -55,8 +55,7 @@ if ($hash == substr(md5($c['key']), 0, 8)) {
|
||||
header("Location: $fs");
|
||||
exit;
|
||||
case '2':
|
||||
$link = htmlspecialchars($bot->singboxSubscription($_GET['s'], a: 1), ENT_XML1, 'UTF-8');
|
||||
file_put_contents('/singbox/winsw.xml', preg_replace('#~url~#', $link, file_get_contents('/singbox/winsw.xml')));
|
||||
file_put_contents('/singbox/update.cmd', preg_replace('#~url~#', $bot->singboxSubscription($_GET['s'], a: 1), file_get_contents('/singbox/update.cmd')));
|
||||
$zip = new ZipArchive();
|
||||
$n = "singbox_$v.zip";
|
||||
$zip->open($n, ZipArchive::CREATE | ZipArchive::OVERWRITE);
|
||||
|
||||
@@ -490,3 +490,33 @@ services:
|
||||
default:
|
||||
ipv4_address: 10.10.0.12
|
||||
logging: *default-logging
|
||||
wp:
|
||||
image: mercurykd/vpnbot-wp:1
|
||||
build:
|
||||
dockerfile: dockerfile/warp.dockerfile
|
||||
args:
|
||||
image: ${IMAGE}
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
devices:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
volumes:
|
||||
- ./config/.profile:/root/.bashrc:ro
|
||||
- ./ssh:/ssh
|
||||
- ./config/sshd_config:/etc/ssh/sshd_config
|
||||
- ./config:/config
|
||||
- ./certs:/certs
|
||||
- ./scripts/start_wp.sh:/start_wp.sh
|
||||
hostname: warp
|
||||
container_name: warp-${VER}
|
||||
depends_on:
|
||||
php:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
TZ: ${TZ}
|
||||
stop_grace_period: 1s
|
||||
command: ["/bin/sh", "/start_wp.sh"]
|
||||
networks:
|
||||
default:
|
||||
ipv4_address: 10.10.0.13
|
||||
logging: *default-logging
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
FROM ubuntu:22.04
|
||||
RUN apt update && apt install -y curl gpg socat 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
|
||||
@@ -0,0 +1,6 @@
|
||||
warp-svc > /dev/null &
|
||||
sleep 3
|
||||
warp-cli --accept-tos registration new
|
||||
warp-cli --accept-tos mode proxy
|
||||
warp-cli --accept-tos connect
|
||||
socat TCP-LISTEN:4000,fork TCP:127.0.0.1:40000
|
||||
@@ -1,2 +1,2 @@
|
||||
winsw.exe install
|
||||
winsw3.exe install
|
||||
pause
|
||||
@@ -1 +1 @@
|
||||
winsw.exe start
|
||||
winsw3.exe start
|
||||
@@ -1,2 +1,2 @@
|
||||
winsw.exe status
|
||||
winsw3.exe status
|
||||
pause
|
||||
@@ -1 +1 @@
|
||||
winsw.exe stop
|
||||
winsw3.exe stop
|
||||
@@ -1,2 +1,2 @@
|
||||
winsw.exe uninstall
|
||||
winsw3.exe uninstall
|
||||
pause
|
||||
@@ -0,0 +1,35 @@
|
||||
@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
|
||||
Binary file not shown.
@@ -2,8 +2,7 @@
|
||||
<id>singbox</id>
|
||||
<name>singbox</name>
|
||||
<description>singbox</description>
|
||||
<executable>%BASE%\sing-box.exe</executable>
|
||||
<arguments>run -c %BASE%\config.json</arguments>
|
||||
<executable>%BASE%\update.cmd</executable>
|
||||
<logmode>rotate</logmode>
|
||||
<onfailure action="restart" delay="10 sec" />
|
||||
<onfailure action="restart" delay="20 sec" />
|
||||
@@ -13,7 +12,4 @@
|
||||
<onexit action="restart" />
|
||||
<onexit action="restart" />
|
||||
<onexit action="none" />
|
||||
<configuration>
|
||||
<download from="~url~" to="%BASE%\config.json" interval="1 minute" />
|
||||
</configuration>
|
||||
</service>
|
||||
@@ -1,3 +1,8 @@
|
||||
15.04.2024 v1.28
|
||||
- xtls: список блокировки, список warp
|
||||
- улучшение отображения таймера
|
||||
14.04.2024 v1.27.1
|
||||
- singbox windows: замена winsw на winsw3, + скрипт обновления подписки
|
||||
13.04.2024 v1.27
|
||||
- архив сингбокса для windows, работает как служба
|
||||
12.04.2024 v1.26
|
||||
|
||||
Reference in New Issue
Block a user