Compare commits

...

12 Commits

Author SHA1 Message Date
mercury 9cc42fd34a xray route: добавлен список process_name 2024-10-14 01:11:21 +04:00
mercury 5eef9581c7 singbox template: package_name -> ruleset 2024-10-14 00:38:58 +04:00
mercury 1d9d992361 sslip.io -> nip.io 2024-10-14 00:00:25 +04:00
mercury e1f14d85e0 порядок правил маршрутизации для singbox 2024-10-13 23:58:02 +04:00
mercury dc65e65e20 fix create windows service box 2 2024-10-10 00:19:59 +04:00
mercury 486a2c5959 fix create windows service box 2024-10-09 21:03:15 +04:00
mercury 39643bf681 add html fake from settings menu 2024-10-06 23:19:05 +04:00
mercury 5f1fc6d912 override html mock 2024-10-06 21:04:13 +04:00
mercury 0538d04397 sing-box template: block rule first 2024-10-06 20:49:24 +04:00
mercury af9933676d karing import url 2024-09-30 17:13:32 +04:00
mercury 7bfebe8096 fix unset warp key 2024-09-30 09:58:48 +04:00
mercury ae61a38dbc on/off warp-svc 2024-09-29 16:10:16 +04:00
8 changed files with 274 additions and 75 deletions
+2 -1
View File
@@ -19,4 +19,5 @@ mirror/.env
update/*
!update/update.sh
override.env
override.env
override.html
+187 -49
View File
@@ -145,6 +145,12 @@ class Bot
case preg_match('~^/appOutbound$~', $this->input['callback'], $m):
$this->appOutbound();
break;
case preg_match('~^/processOutbound$~', $this->input['callback'], $m):
$this->processOutbound();
break;
case preg_match('~^/offWarp$~', $this->input['callback'], $m):
$this->offWarp();
break;
case preg_match('~^/addSubdomain$~', $this->input['callback'], $m):
$this->addSubdomain();
break;
@@ -428,6 +434,9 @@ class Bot
case preg_match('~^/xtlsapp(?: (\d+))?$~', $this->input['callback'], $m):
$this->xtlsapp($m[1] ?: 0);
break;
case preg_match('~^/xtlsprocess(?: (\d+))?$~', $this->input['callback'], $m):
$this->xtlsprocess($m[1] ?: 0);
break;
case preg_match('~^/xtlsrulesset(?: (\d+))?$~', $this->input['callback'], $m):
$this->xtlsrulesset($m[1] ?: 0);
break;
@@ -479,8 +488,8 @@ class Bot
case preg_match('~^/proxy$~', $this->input['callback'], $m):
$this->proxy();
break;
case preg_match('~^/showpac$~', $this->input['callback'], $m):
$this->showpac();
case preg_match('~^/addOverrideHtml$~', $this->input['callback'], $m):
$this->addOverrideHtml();
break;
case preg_match('~^/export$~', $this->input['callback'], $m):
$this->exportManual();
@@ -806,6 +815,30 @@ class Bot
];
}
public function addOverrideHtml()
{
$r = $this->send(
$this->input['chat'],
"@{$this->input['username']} attach html",
$this->input['message_id'],
reply: 'attach html',
);
$_SESSION['reply'][$r['result']['message_id']] = [
'start_message' => $this->input['message_id'],
'start_callback' => $this->input['callback_id'],
'callback' => 'setOverrideHtml',
'args' => [],
];
}
public function setOverrideHtml()
{
$r = $this->request('getFile', ['file_id' => $this->input['file_id']]);
if (!empty($f = file_get_contents($this->file . $r['result']['file_path']))) {
file_put_contents('/app/webapp/override.html', $f);
}
}
public function restartOcserv($conf)
{
file_put_contents('/config/ocserv.conf', $conf);
@@ -1749,7 +1782,7 @@ class Bot
{
$c = $this->getPacConf();
if (empty($c['domain'])) {
$this->addDomain(str_replace('.', '-', $this->ip) . '.sslip.io', 1);
$this->addDomain(str_replace('.', '-', $this->ip) . '.nip.io', 1);
$this->setSSL('letsencrypt');
} else {
$this->menu();
@@ -2419,6 +2452,10 @@ DNS-over-HTTPS with IP:
$this->xrayUpdateRules();
$this->xtlswarp();
break;
case 'processlist':
$this->xrayUpdateRules();
$this->xtlsprocess();
break;
case 'packagelist':
$this->xrayUpdateRules();
$this->xtlsapp();
@@ -3398,6 +3435,9 @@ DNS-over-HTTPS with IP:
case 'packagelist':
$this->xtlsapp();
break;
case 'processlist':
$this->xtlsprocess();
break;
case 'rulessetlist':
$this->xtlsrulesset();
break;
@@ -3543,6 +3583,14 @@ DNS-over-HTTPS with IP:
$this->xtlsapp();
}
public function processOutbound()
{
$p = $this->getPacConf();
$p['process_outbound'] = !$p['process_outbound'];
$p = $this->setPacConf($p);
$this->xtlsprocess();
}
public function xtlsapp($page = 0)
{
$text[] = "Menu -> " . $this->i18n('xray') . ' -> ' . $this->i18n('routes') . ' -> package list';
@@ -3569,6 +3617,32 @@ DNS-over-HTTPS with IP:
);
}
public function xtlsprocess($page = 0)
{
$text[] = "Menu -> " . $this->i18n('xray') . ' -> ' . $this->i18n('routes') . ' -> process list';
$data = $this->listPac('processlist', $page, 'xtlsprocess');
$p = $this->getPacConf();
$data[] = [
[
'text' => 'set to ' . ($p['process_outbound'] ? 'proxy' : 'direct'),
'callback_data' => "/processOutbound",
],
];
$data[] = [
[
'text' => $this->i18n('back'),
'callback_data' => "/routes",
],
];
$this->update(
$this->input['chat'],
$this->input['message_id'],
implode("\n", $text ?: ['...']),
$data ?: false,
);
}
public function xtlsrulesset($page = 0)
{
$text[] = "Menu -> " . $this->i18n('xray') . ' -> ' . $this->i18n('routes') . ' -> rulesset list';
@@ -4469,6 +4543,10 @@ DNS-over-HTTPS with IP:
'text' => $this->i18n('warp'),
'callback_data' => "/xtlswarp",
]],
[[
'text' => $this->i18n('process'),
'callback_data' => "/xtlsprocess",
]],
[[
'text' => $this->i18n('package'),
'callback_data' => "/xtlsapp",
@@ -4510,33 +4588,67 @@ DNS-over-HTTPS with IP:
public function addWarpPlus($key)
{
$c = $this->getPacConf();
$c['warp'] = $key;
$c = $this->getPacConf();
if (!empty($key)) {
$c['warp'] = $key;
$this->send($this->input['chat'], 'Warp registration license: ' . $this->ssh("warp-cli --accept-tos registration license $key 2>&1", 'wp'));
} else {
unset($c['warp']);
}
$this->setPacConf($c);
$this->send($this->input['chat'], 'Warp registration license: ' . $this->ssh("warp-cli --accept-tos registration license $key", 'wp'));
sleep(1);
$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];
if (!empty($this->ssh('pgrep warp-svc', 'wp'))) {
$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];
}
return 'off';
}
public function offWarp()
{
$p = $this->getPacConf();
if (empty($p['warpoff'])) {
$this->ssh('pkill warp-svc', 'wp');
$p['warpoff'] = 1;
} else {
$this->ssh('warp-svc > /dev/null 2>&1 &', 'wp');
sleep(3);
$this->send($this->input['chat'], 'Registration: ' . $this->ssh('warp-cli --accept-tos registration new 2>&1', 'wp'));
if (!empty($p['warp'])) {
$this->send($this->input['chat'], 'License: ' . $this->ssh("warp-cli --accept-tos registration license {$p['warp']} 2>&1", 'wp'));
}
$this->send($this->input['chat'], 'Proxy mode: ' . $this->ssh('warp-cli --accept-tos mode proxy 2>&1', 'wp'));
$this->send($this->input['chat'], 'Connect: ' . $this->ssh('warp-cli --accept-tos connect 2>&1', 'wp'));
unset($p['warpoff']);
}
$this->setPacConf($p);
$this->warp();
}
public function warp()
{
$p = $this->getPacConf();
$text[] = "Menu -> " . $this->i18n('warp');
$text[] = "status: " . $this->warpStatus();
$text[] = "key: " . $this->getPacConf()['warp'];
$data[] = [
[
'text' => $this->i18n($p['warpoff'] ? 'off' : 'on'),
'callback_data' => "/offWarp",
],
];
$data[] = [
[
'text' => $this->i18n('set key'),
'callback_data' => "/warpPlus",
],
];
$data[] = [
[
'text' => $this->i18n('back'),
@@ -4620,14 +4732,27 @@ DNS-over-HTTPS with IP:
$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[] = "<a href='$scheme://{$domain}/pac?h=$hash&t=si&r=k&s={$c['id']}#{$c['email']}'>karing</a>";
$si = "$scheme://{$domain}/pac/" . base64_encode(serialize([
'h' => $hash,
't' => 'si',
's' => $c['id'],
]));
$xr = "$scheme://{$domain}/pac/" . base64_encode(serialize([
'h' => $hash,
't' => 's',
's' => $c['id'],
]));
$text[] = "\nxray config: <pre><code>$xr</code></pre>";
$text[] = "sing-box config: <pre><code>$si</code></pre>";
$text[] = "\nv2ray config: <pre><code>$scheme://{$domain}/pac?h=$hash&t=s&s={$c['id']}</code></pre>";
$text[] = "sing-box config: <pre><code>$scheme://{$domain}/pac?h=$hash&t=si&s={$c['id']}</code></pre>";
$text[] = "sing-box windows: <a href='$scheme://{$domain}/pac?h=$hash&t=si&r=w&s={$c['id']}'>windows service</a>";
$data[] = [
[
'text' => 'v2ray',
'text' => 'xray',
'web_app' => ['url' => "https://{$domain}/pac?h=$hash&t=s&s={$c['id']}"],
],
[
@@ -4789,17 +4914,19 @@ DNS-over-HTTPS with IP:
case 'v':
header("Location: v2rayng://install-config?url=$v2");
exit;
case 'k':
header("Location: karing://install-config?url=$si");
exit;
case 'h':
header("Location: hiddify://install-config/?url=$si");
exit;
case 'w':
$link = htmlspecialchars($si, ENT_XML1, 'UTF-8');
file_put_contents('/singbox/winsw3.xml', preg_replace('#~url~#', $link, file_get_contents('/singbox/winsw3.xml')));
$n = "singbox_$uid.zip";
$n = "singbox_$uid.zip";
copy('/singbox/singbox.zip', $n);
$zip = new ZipArchive();
$zip->open($n, ZipArchive::CREATE);
$zip->addFile('/singbox/winsw3.xml', 'winsw3.xml');
$zip->addFromString('winsw3.xml', preg_replace('#~url~#', $link, file_get_contents('/singbox/winsw3.xml')));
$zip->close();
header('Content-Disposition: attachment; filename="singbox.zip"');
echo file_get_contents($n);
@@ -4905,7 +5032,6 @@ DNS-over-HTTPS with IP:
}
$c['route']['rules'] = array_values($c['route']['rules']);
$c['route'] = $this->addRuleSet($c['route']);
$c['route'] = $this->addPackageRule($c['route']);
$c['route'] = $this->createRuleSet($c['route'], $uid, $domain);
$c['route'] = $this->clearEmptyRules($c['route']);
break;
@@ -4926,18 +5052,6 @@ DNS-over-HTTPS with IP:
return $route;
}
public function addPackageRule($route)
{
$p = $this->getPacConf();
if (!empty($t = array_filter($p['packagelist'] ?: []))) {
$route['rules'][] = [
'package_name' => array_keys($t),
'outbound' => $p['app_outbound'] ? 'direct' : 'proxy',
];
}
return $route;
}
public function addRuleSet($route)
{
foreach ($route['rules'] as $k => $v) {
@@ -4971,25 +5085,38 @@ DNS-over-HTTPS with IP:
foreach ($route['rules'] as $k => $v) {
if (!empty($v['createruleset'])) {
foreach ($v['createruleset'] as $i => $r) {
foreach ($v['createruleset'] as $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 (array_key_exists('domain_suffix', $n) && $n['domain_suffix'] == '~warp~') {
$r['rules'][$l]['domain_suffix'] = array_keys(array_filter($pac['warplist'] ?: []));
if (empty($r['rules'][$l]['domain_suffix'])) {
unset($r['rules'][$l]);
}
}
if (array_key_exists('domain_suffix', $n) && $n['domain_suffix'] == '~block~') {
$r['rules'][$l]['domain_suffix'] = array_keys(array_filter($pac['blocklist'] ?: []));
if (empty($r['rules'][$l]['domain_suffix'])) {
unset($r['rules'][$l]);
}
switch (true) {
case array_key_exists('domain_suffix', $n):
switch ($n['domain_suffix']) {
case '~pac~':
$t = 'includelist';
break;
case '~warp~':
$t = 'warplist';
break;
case '~block~':
$t = 'blocklist';
break;
}
$r['rules'][$l]['domain_suffix'] = array_keys(array_filter($pac[$t] ?: []));
if (empty($r['rules'][$l]['domain_suffix'])) {
unset($r['rules'][$l]);
}
break;
case array_key_exists('package_name', $n):
$r['rules'][$l]['package_name'] = array_keys(array_filter($pac['packagelist'] ?: []));
if (empty($r['rules'][$l]['package_name'])) {
unset($r['rules'][$l]);
}
break;
case array_key_exists('process_name', $n):
$r['rules'][$l]['process_name'] = array_keys(array_filter($pac['processlist'] ?: []));
if (empty($r['rules'][$l]['process_name'])) {
unset($r['rules'][$l]);
}
break;
}
}
if (!empty($_GET['r']) && $r['name'] == $_GET['r']) {
@@ -5008,18 +5135,23 @@ DNS-over-HTTPS with IP:
}
$ruleset[] = [
"tag" => $r['name'],
"url" => "$scheme://{$domain}/pac?" . http_build_query([
"url" => "$scheme://{$domain}/pac/" . base64_encode(serialize([
'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'];
switch (true) {
case preg_match('#~(.+)~#', $route['rules'][$k]['outbound'], $m):
$route['rules'][$k]['outbound'] = $pac[$m[1]] ? 'direct' : 'proxy';
break;
}
}
unset($route['rules'][$k]['createruleset']);
if (empty($route['rules'][$k]['rule_set'])) {
@@ -5465,6 +5597,12 @@ DNS-over-HTTPS with IP:
'callback_data' => "/backup",
],
];
$data[] = [
[
'text' => $this->i18n('fake html'),
'callback_data' => "/addOverrideHtml",
],
];
$data[] = [
[
'text' => $this->i18n('logs'),
+4
View File
@@ -337,4 +337,8 @@ $i = [
'en' => '🟢 have updates',
'ru' => '🟢 есть обновления',
],
'fake html' => [
'en' => 'fake html',
'ru' => 'фейк заглушка',
],
];
+2 -2
View File
@@ -31,7 +31,7 @@ http {
location / {
root /app;
index login.html;
index override.html login.html;
try_files $uri $uri/ =404;
}
location /adguard/ {
@@ -123,7 +123,7 @@ http {
# location / {
# root /app;
# index login.html;
# index override.html login.html;
# try_files $uri $uri/ =404;
# }
# location /adguard/ {
+2 -2
View File
@@ -31,7 +31,7 @@ http {
location / {
root /app;
index login.html;
index override.html login.html;
try_files $uri $uri/ =404;
}
location /adguard/ {
@@ -123,7 +123,7 @@ http {
# location / {
# root /app;
# index login.html;
# index override.html login.html;
# try_files $uri $uri/ =404;
# }
# location /adguard/ {
+42 -14
View File
@@ -110,6 +110,48 @@
"protocol": "dns",
"outbound": "dns-out"
},
{
"createruleset": [
{
"name": "package",
"interval": "15s",
"rules": [
{
"package_name": "~package~"
}
]
}
],
"outbound": "~app_outbound~"
},
{
"createruleset": [
{
"name": "process",
"interval": "15s",
"rules": [
{
"process_name": "~process~"
}
]
}
],
"outbound": "~process_outbound~"
},
{
"createruleset": [
{
"name": "block",
"interval": "15s",
"rules": [
{
"domain_suffix": "~block~"
}
]
}
],
"outbound": "block"
},
{
"createruleset": [
{
@@ -133,20 +175,6 @@
],
"outbound": "proxy"
},
{
"createruleset": [
{
"name": "block",
"interval": "15s",
"rules": [
{
"domain_suffix": "~block~"
}
]
}
],
"outbound": "block"
},
{
"outbound": "direct"
}
+11 -7
View File
@@ -1,14 +1,18 @@
cat /ssh/key.pub > /root/.ssh/authorized_keys
ssh-keygen -A
exec /usr/sbin/sshd -D -e "$@" &
warp-svc > /dev/null &
sleep 3
warp-cli --accept-tos registration new
off=$(cat /config/pac.json | jq -r .warpoff)
key=$(cat /config/pac.json | jq -r .warp)
if [ ! -z "$key" ]
if [ "$off" == 'null' ]
then
warp-cli --accept-tos registration license $key
warp-svc > /dev/null &
sleep 3
warp-cli --accept-tos registration new
if [ ! -z "$key" ]
then
warp-cli --accept-tos registration license $key
fi
warp-cli --accept-tos mode proxy
warp-cli --accept-tos connect
fi
warp-cli --accept-tos mode proxy
warp-cli --accept-tos connect
socat TCP-LISTEN:4000,fork TCP:127.0.0.1:40000
+24
View File
@@ -1,3 +1,27 @@
14.10.2024 v1.69
- xray route: добавлен список process_name
14.10.2024 v1.68
- singbox template: package_name -> ruleset
13.10.2024 v1.67
- sslip.io -> nip.io
13.10.2024 v1.66
- singbox template: изменен порядок правил маршрутизации для package_name
10.10.2024 v1.65.1
- фикс создания архива windows service singbox 2
09.10.2024 v1.65
- фикс создания архива windows service singbox
06.10.2024 v1.64.1
- добавление html заглушки через меню
06.10.2024 v1.64
- возможность установить свою html-заглушку
06.10.2024 v1.63
- приоритет правила block над остальными в стандартном шаблоне sing-box
30.09.2024 v1.62
- импорт профиля xray в karing
30.09.2024 v1.61.1
- фикс удаления ключа варпа через ноль
29.09.2024 v1.61
- включение/отключение процесса warp
29.09.2024 v1.60
- ускорение сборки архива sing-box windows
23.09.2024 v1.59