Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 28c5b9d506 | |||
| 9cc42fd34a | |||
| 5eef9581c7 | |||
| 1d9d992361 | |||
| e1f14d85e0 | |||
| dc65e65e20 |
+91
-36
@@ -145,6 +145,9 @@ 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;
|
||||
@@ -431,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;
|
||||
@@ -1776,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();
|
||||
@@ -2422,7 +2428,7 @@ DNS-over-HTTPS with IP:
|
||||
if (!empty($domains)) {
|
||||
$conf = $this->getPacConf();
|
||||
foreach ($domains as $k => $v) {
|
||||
$conf[$type][$type == 'rulessetlist' ? trim($v) : idn_to_ascii(trim($v))] = true;
|
||||
$conf[$type][in_array($type, ['rulessetlist', 'packagelist', 'processlist']) ? trim($v) : idn_to_ascii(trim($v))] = true;
|
||||
}
|
||||
ksort($conf[$type]);
|
||||
$this->setPacConf($conf);
|
||||
@@ -2446,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();
|
||||
@@ -3425,6 +3435,9 @@ DNS-over-HTTPS with IP:
|
||||
case 'packagelist':
|
||||
$this->xtlsapp();
|
||||
break;
|
||||
case 'processlist':
|
||||
$this->xtlsprocess();
|
||||
break;
|
||||
case 'rulessetlist':
|
||||
$this->xtlsrulesset();
|
||||
break;
|
||||
@@ -3570,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';
|
||||
@@ -3596,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';
|
||||
@@ -3633,7 +3680,7 @@ DNS-over-HTTPS with IP:
|
||||
foreach ($domains as $k => $v) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n($v ? 'on' : 'off') . ' ' . ($basename ? basename($k) . ' ' : '') . idn_to_utf8($k),
|
||||
'text' => $this->i18n($v ? 'on' : 'off') . ' ' . ($basename ? basename($k) . ' ' : '') . (in_array($type, ['rulessetlist', 'packagelist', 'processlist']) ? $k : idn_to_utf8($k)),
|
||||
'callback_data' => "/change$type " . ($i + $page * $this->limit),
|
||||
],
|
||||
[
|
||||
@@ -4496,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",
|
||||
@@ -4871,8 +4922,7 @@ DNS-over-HTTPS with IP:
|
||||
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);
|
||||
@@ -4982,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;
|
||||
@@ -5003,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) {
|
||||
@@ -5048,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']) {
|
||||
@@ -5097,6 +5147,11 @@ DNS-over-HTTPS with IP:
|
||||
"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'])) {
|
||||
|
||||
@@ -110,6 +110,34 @@
|
||||
"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": [
|
||||
{
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
14.10.2024 v1.70
|
||||
- xray route: учет регистра в process_name, package_name
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user