Compare commits

...

4 Commits

Author SHA1 Message Date
mercury 5e72452a8d improve template sign 2024-04-11 22:38:03 +04:00
mercury 668756f1c7 add https://community.antifilter.download/ in PAC 2024-04-11 21:05:41 +04:00
mercury 29e7be6cd8 improve xray config 2024-04-11 17:06:21 +04:00
mercury a5599118fc improve choice templae sing-box per user 2024-04-11 14:02:30 +04:00
3 changed files with 93 additions and 230 deletions
+84 -141
View File
@@ -138,6 +138,12 @@ class Bot
case preg_match('~^/mtproto$~', $this->input['callback'], $m):
$this->mtproto();
break;
case preg_match('~^/addCommunityFilter$~', $this->input['callback'], $m):
$this->addCommunityFilter();
break;
case preg_match('~^/pacMenu (\d+)$~', $this->input['callback'], $m):
$this->pacMenu($m[1]);
break;
case preg_match('~^/applyupdatebot$~', $this->input['callback'], $m):
$this->applyupdatebot();
break;
@@ -343,7 +349,7 @@ class Bot
case preg_match('~^/deldomain$~', $this->input['callback'], $m):
$this->delDomain();
break;
case preg_match('~^/(?P<action>change|delete)(?P<typelist>subzoneslist|reverselist|includelist|excludelist) (?P<arg>[^\s]+(?:_(?:-)?\d+)?)$~', $this->input['callback'], $m):
case preg_match('~^/(?P<action>change|delete)(?P<typelist>includelist) (?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):
@@ -481,6 +487,7 @@ class Bot
public function restartXray($c)
{
$c['inbounds'][0]['settings']['clients'] = array_values($c['inbounds'][0]['settings']['clients']);
$this->ssh('pkill xray', 'xr');
file_put_contents('/config/xray.json', json_encode($c, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
$this->ssh('xray run -config /xray.json > /dev/null 2>&1 &', 'xr');
@@ -2135,7 +2142,7 @@ DNS-over-HTTPS with IP:
$page = (int) floor(array_search($v, array_keys($conf['includelist'])) / $count);
}
$page = $page ?: -2;
$this->menu('includelist', $page);
$this->pacUpdate();
}
public function reverse(int $count)
@@ -2860,25 +2867,31 @@ DNS-over-HTTPS with IP:
return $r;
}
public function pacMenu()
public function addCommunityFilter()
{
$rmpac = stat(__DIR__ . '/zapretlists/rmpac');
$rpac = stat(__DIR__ . '/zapretlists/rpac');
$mpac = stat(__DIR__ . '/zapretlists/mpac');
$pac = stat(__DIR__ . '/zapretlists/pac');
$conf = $this->getPacConf();
$zapret = $conf['zapret'] ? $this->i18n('on') : $this->i18n('off');
$ip = $conf['domain'] ?: $this->ip;
$hash = substr(md5($this->key), 0, 8);
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
$text = <<<text
$pac = $this->getPacConf();
$l = array_filter(array_map(fn($e) => trim($e), explode("\n", file_get_contents('https://community.antifilter.download/list/domains.lst'))));
if (!empty($l)) {
foreach ($l as $k => $v) {
$pac['includelist'][$v] = true;
}
}
$this->setPacConf($pac);
$this->pacUpdate();
}
public function pacMenu($page = 0)
{
$rmpac = stat(__DIR__ . '/zapretlists/rmpac');
$rpac = stat(__DIR__ . '/zapretlists/rpac');
$mpac = stat(__DIR__ . '/zapretlists/mpac');
$pac = stat(__DIR__ . '/zapretlists/pac');
$conf = $this->getPacConf();
$ip = $conf['domain'] ?: $this->ip;
$hash = substr(md5($this->key), 0, 8);
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
$text = <<<text
Menu -> pac
<code>RU blacklist:</code> <code>https://github.com/zapret-info/z-i</code>
{$this->i18n('proxy')}{$this->i18n('self list explain')}
{$this->i18n('direct')}{$this->i18n('reverse list explain')}
text;
if ($pac) {
$pac['time'] = date('d.m.Y H:i:s', $pac['mtime']);
@@ -2890,12 +2903,8 @@ DNS-over-HTTPS with IP:
<code>$scheme://$ip/pac?h=$hash&a=127.0.0.1&p=1080</code>
text;
$urls[0][] = [
'text' => "PAC",
'url' => "$scheme://$ip/pac?h=$hash&a=127.0.0.1&p=1080",
];
$urls[1][] = [
'text' => "PAC Wireguard proxy",
'url' => "$scheme://$ip/pac?h=$hash&a=10.10.0.3&p=1080",
'text' => "PAC",
'web_app' => ['url' => "https://$ip/pac?h=$hash&a=127.0.0.1&p=1080"],
];
}
if ($mpac) {
@@ -2907,9 +2916,9 @@ DNS-over-HTTPS with IP:
<b>Shadowsocks-android PAC ({$mpac['time']} / {$mpac['sz']}):</b>
<code>$scheme://$ip/pac?h=$hash&t=mpac</code>
text;
$urls[2][] = [
'text' => "PAC ShadowSocks(Android)",
'url' => "$scheme://$ip/pac?h=$hash&t=mpac",
$urls[0][] = [
'text' => "PAC ShadowSocks(Android)",
'web_app' => ['url' => "https://$ip/pac?h=$hash&t=mpac"],
];
}
if ($rpac) {
@@ -2947,115 +2956,46 @@ DNS-over-HTTPS with IP:
if ($urls) {
$data = $urls;
}
if ($conf['zapret']) {
$data[] = [
[
'text' => "RU blacklist : $zapret",
'callback_data' => "/paczapret",
],
[
'text' => $this->i18n('blacklist exclude'),
'callback_data' => "/menu excludelist 0",
],
];
} else {
$data[] = [
[
'text' => "RU blacklist : $zapret",
'callback_data' => "/paczapret",
],
];
}
$data[] = [
[
'text' => $this->i18n('proxy'),
'callback_data' => "/menu includelist 0",
'callback_data' => "/menu includelist 0",
],
// [
// 'text' => $this->i18n('subzones'),
// 'callback_data' => "/menu subzoneslist 0",
// ],
[
'text' => $this->i18n('direct'),
'callback_data' => "/menu reverselist 0",
'text' => $this->i18n('add') . ' community antifilter',
'callback_data' => "/addCommunityFilter",
],
];
if ($conf['zapret'] || !empty($conf['includelist']) || !empty($conf['reverselist'])) {
$data[] = [
[
'text' => "{$this->i18n('update')} PAC",
'callback_data' => "/pacupdate",
],
[
'text' => $this->i18n('check url'),
'callback_data' => "/checkurl",
],
];
}
$data[] = [
[
'text' => $this->i18n('back'),
'callback_data' => "/menu",
],
];
return [
'text' => $text,
'data' => $data,
];
}
public function pacList($type, int $page, int $count = 5)
{
$count = $this->limit;
$name = str_replace('list', '', $type);
switch ($name) {
case 'include':
$additional = $this->i18n('self list explain');
break;
case 'reverse':
$additional = $this->i18n('reverse list explain');
break;
}
$text = "Menu -> pac -> {$name}list\n\n$additional";
$data[] = [
[
'text' => $this->i18n('add'),
'callback_data' => "/$name $count",
'callback_data' => "/include {$this->limit}",
],
];
$domains = $this->getPacConf()[$type];
$domains = $this->getPacConf()['includelist'];
if (!empty($domains)) {
ksort($domains);
$all = (int) ceil(count($domains) / $count);
$all = (int) ceil(count($domains) / $this->limit);
$page = min($page, $all - 1);
$page = $page == -2 ? $all - 1 : $page;
$domains = $page != -1 ? array_slice($domains, $page * $count, $count, true) : $domains;
$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') . ') ' . ($type == 'includelist' ? idn_to_utf8($k) : $k),
'callback_data' => "/change{$name}list {$k}_$count",
'text' => '(' . ($v ? 'ON' : 'OFF') . ') ' . idn_to_utf8($k),
'callback_data' => "/changeincludelist {$k}_{$this->limit}",
],
[
'text' => 'delete',
'callback_data' => "/delete{$name}list {$k}_$count",
'callback_data' => "/deleteincludelist {$k}_{$this->limit}",
],
];
}
if ($page != -1 && $all > 1) {
if ($all > 1) {
$data[] = [
[
'text' => '<<',
'callback_data' => "/menu $type " . ($page - 1 >= 0 ? $page - 1 : $all - 1),
'callback_data' => "/pacMenu " . ($page - 1 >= 0 ? $page - 1 : $all - 1),
],
// [
// 'text' => 'all',
// 'callback_data' => "/menu $type -1",
// ],
[
'text' => '>>',
'callback_data' => "/menu $type " . ($page < $all - 1 ? $page + 1 : 0),
'callback_data' => "/pacMenu " . ($page < $all - 1 ? $page + 1 : 0),
]
];
}
@@ -3063,13 +3003,15 @@ DNS-over-HTTPS with IP:
$data[] = [
[
'text' => $this->i18n('back'),
'callback_data' => "/menu pac",
'callback_data' => "/menu",
],
];
return [
'text' => $text,
'data' => $data,
];
$this->update(
$this->input['chat'],
$this->input['message_id'],
$text,
$data ?: false,
);
}
public function listPacChange($type, $action, $key, int $count)
@@ -3087,7 +3029,7 @@ DNS-over-HTTPS with IP:
break;
}
$this->setPacConf($conf);
$this->menu($type, $page);
$this->pacUpdate();
}
public function pacZapret()
@@ -3232,7 +3174,7 @@ DNS-over-HTTPS with IP:
],
[
'text' => $this->i18n('pac'),
'callback_data' => "/menu pac",
'callback_data' => "/pacMenu 0",
],
],
[
@@ -3258,12 +3200,8 @@ DNS-over-HTTPS with IP:
'wg' => $type == 'wg' ? $this->statusWg($arg) : false,
'client' => $type == 'client' ? $this->getClient(...explode('_', $arg)) : false,
'addpeer' => $type == 'addpeer' ? $this->addWg(...explode('_', $arg)) : false,
'pac' => $type == 'pac' ? $this->pacMenu() : false,
'pac' => $type == 'pac' ? $this->pacMenu($arg) : false,
'adguard' => $type == 'adguard' ? $this->adguardMenu() : false,
'includelist' => $type == 'includelist' ? $this->pacList($type, $arg) : false,
'excludelist' => $type == 'excludelist' ? $this->pacList($type, $arg) : false,
'reverselist' => $type == 'reverselist' ? $this->pacList($type, $arg) : false,
'subzoneslist' => $type == 'subzoneslist' ? $this->pacList($type, $arg) : false,
'config' => $type == 'config' ? $this->configMenu() : false,
'ss' => $type == 'ss' ? $this->menuSS() : false,
'lang' => $type == 'lang' ? $this->menuLang() : false,
@@ -3639,7 +3577,7 @@ DNS-over-HTTPS with IP:
];
$data[] = [
[
'text' => "default: " . $this->i18n('show'),
'text' => "origin",
'web_app' => ['url' => "https://$domain/pac?h=$hash&t=te"],
],
[
@@ -3650,7 +3588,7 @@ DNS-over-HTTPS with IP:
foreach ($templates as $k => $v) {
$data[] = [
[
'text' => "$k: " . $this->i18n('show'),
'text' => "$k",
'web_app' => ['url' => "https://$domain/pac?h=$hash&t=te&te=" . urlencode($k)],
],
[
@@ -3798,6 +3736,12 @@ DNS-over-HTTPS with IP:
'callback_data' => "/choiceTemplate $i",
],
];
$data[] = [
[
'text' => 'origin',
'callback_data' => "/choiceTemplate {$i}_" . base64_encode('origin'),
],
];
foreach ($templates as $k => $v) {
$data[] = [
[
@@ -3823,7 +3767,8 @@ DNS-over-HTTPS with IP:
public function userXr($i, $fs = 0, $fv = 0)
{
$c = $this->getXray();
$domain = $this->getPacConf()['domain'] ?: $this->ip;
$pac = $this->getPacConf() ?: $this->ip;
$domain = $pac['domain'] ?: $this->ip;
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
$hash = substr(md5($this->key), 0, 8);
$v2ray = "$scheme://{$domain}/pac?h=$hash&t=s&b=1&s={$c['inbounds'][0]['settings']['clients'][$i]['id']}";
@@ -3852,10 +3797,10 @@ DNS-over-HTTPS with IP:
'callback_data' => "/switchXr $i",
],
];
$template = $c['inbounds'][0]['settings']['clients'][$i]['template'] ? base64_decode($c['inbounds'][0]['settings']['clients'][$i]['template']) : 'default';
$template = $c['inbounds'][0]['settings']['clients'][$i]['template'] ? base64_decode($c['inbounds'][0]['settings']['clients'][$i]['template']) : 'default(' . ($pac['defaulttemplate'] ? base64_decode($pac['defaulttemplate']) : 'origin') . ')';
$data[] = [
[
'text' => $this->i18n('template') . ": $template",
'text' => $this->i18n('template singbox') . ": $template",
'callback_data' => "/templateUser $i",
],
];
@@ -3945,7 +3890,7 @@ DNS-over-HTTPS with IP:
if (empty($v['off'])) {
$flag = false;
}
$template = $v['template'];
$template = base64_decode($v['template']);
break;
}
}
@@ -3953,14 +3898,18 @@ DNS-over-HTTPS with IP:
return false;
}
if (!empty($template) && !empty($pac['singtemplates'][base64_decode($template)])) {
$c = $pac['singtemplates'][base64_decode($template)];
} else {
if (!empty($pac['defaulttemplate'])) {
$c = $pac['singtemplates'][base64_decode($pac['defaulttemplate'])];
} else {
switch (true) {
case !empty($template) && $template == 'origin':
case empty($template) && empty($pac['defaulttemplate']):
$c = json_decode(file_get_contents('/config/sing.json'), true);
}
break;
case !empty($template):
$c = $pac['singtemplates'][$template];
break;
default:
$c = $pac['singtemplates'][base64_decode($pac['defaulttemplate'])];
break;
}
if ($c['dns']['servers'][0]['address'] == '~dns~') {
@@ -4161,12 +4110,6 @@ DNS-over-HTTPS with IP:
],
],
];
$data[] = [
[
'text' => $this->i18n('reset settings'),
'callback_data' => "/adguardreset",
],
];
$data[] = [
[
'text' => $this->i18n('add upstream'),
+1 -89
View File
@@ -93,95 +93,7 @@ function start()
// check && exclude
$include = array_filter($conf['includelist'], fn($x) => $x == true);
if ($conf['zapret']) {
foreach ($source as $k => $v) {
$size = getSize($v['source']);
if ($size > 0) {
if (file_exists($v['dest'])) {
unlink($v['dest']);
}
touch($v['dest']);
$percent = 0;
$curr = 0;
exec("php updatepac.php download $k > /dev/null &");
$i = $j = 0;
while ($curr <= $size) {
$rotate = $curr != $size ? $load[$j % count($load)] : '';
$tail = <<<text
Downloading {$v['source']}
$curr/$size $percent% $rotate
text;
update($text . $tail);
if ($curr == $size || $i > 50) {
break;
}
usleep(50000);
clearstatcache();
if ($curr == filesize($v['dest'])) {
$i++;
}
$curr = filesize($v['dest']);
$percent = (int) ceil($curr * 100 / $size);
$j++;
}
if ($curr != $size) {
$text .= "\nError downloading {$v['source']}\nabort script";
endScript($text);
}
} else {
$text .= "\nError size {$v['source']}\nabort script";
endScript($text);
}
$text .= $tail ? "$tail\n" : '';
}
// prepare
$reg = '~^([^.*]+\.(?:(?:' . implode('|', $subzones) . ')\.)?[^.]+)$~';
foreach ($source as $k => $v) {
$size = filesize($v['dest']);
$curr = $j = 0;
$time = microtime(true);
$name = basename($v['dest']);
$f = fopen($v['dest'], 'r');
while (($s = fgets($f)) !== false) {
$curr += strlen($s);
$percent = (int) ceil($curr * 100 / $size);
$rotate = $curr != $size ? $load[$j % count($load)] : '';
$tail = <<<text
Prepare $name $percent% $rotate
text;
if (microtime(true) - $time > 0.1) {
update($text . $tail);
$time = microtime(true);
$j++;
}
if ($name == 'dump.csv') {
if (!preg_match('~;.*;~', $s)) {
continue;
}
$t = explode(';', iconv('CP1251', 'utf-8', $s));
if (empty($t[1])) {
continue;
}
if (preg_match($reg, idn_to_ascii(trim($t[1])), $m)) {
$domains[$m[1]] = 0;
}
} else {
if (preg_match($reg, idn_to_ascii(iconv('CP1251', 'utf-8', trim($s))), $m)) {
$domains[$m[1]] = 0;
}
}
}
fclose($f);
$text .= $tail ? "$tail\n" : '';
}
$exclude = array_keys(array_filter($conf['excludelist'], fn($x) => $x == true));
foreach ($include as $k => $v) {
$domains[$k] = 0;
}
} else {
$domains = $include;
}
$domains = $include;
if (empty($domains)) {
$text = "Empty domains. Delete pac files";
unlink(__DIR__ . '/zapretlists/mpac');
+8
View File
@@ -1,3 +1,11 @@
11.04.2024 v1.25
- подпись дефолтного шаблона в разделе пользователя xtls
11.04.2024 v1.24
- обновлен раздел PAC, добавлена возможность добавить домены из https://community.antifilter.download/
11.04.2024 v1.23
- фикс совместимости старого конфига xray из бэкапа
11.04.2024 v1.22
- улучшение гибкости выбора шаблона sing-box
11.04.2024 v1.21
- фикс доступности адгвард панели при первом запуске
10.04.2024 v1.20