add sTGWS
This commit is contained in:
1 parent
d347c47271
commit
c5dd32c1f9
1 file changed
+213
-4
+213
-4
@@ -1455,6 +1455,8 @@ exclusions_clear() {
|
|||||||
|
|
||||||
|
|
||||||
TG_MTPROTO_VER="0.10"
|
TG_MTPROTO_VER="0.10"
|
||||||
|
TGWS_INSTALL_URL="https://gitlab.com/xyzmean/brb/-/raw/main/install-tgws.sh"
|
||||||
|
TGWS_VERSION_URL="https://gitlab.com/xyzmean/brb/-/raw/main/VERSION"
|
||||||
TG_GO_VER="1.4.1"
|
TG_GO_VER="1.4.1"
|
||||||
TG_RS_VER="2.3.3"
|
TG_RS_VER="2.3.3"
|
||||||
TG_BIN_GO="/usr/bin/tg-ws-proxy-go"
|
TG_BIN_GO="/usr/bin/tg-ws-proxy-go"
|
||||||
@@ -1639,9 +1641,124 @@ tg_restart_all() {
|
|||||||
[ -x /etc/init.d/tg-ws-proxy ] && /etc/init.d/tg-ws-proxy restart >/dev/null 2>&1
|
[ -x /etc/init.d/tg-ws-proxy ] && /etc/init.d/tg-ws-proxy restart >/dev/null 2>&1
|
||||||
[ -x "$TG_INIT_GO" ] && "$TG_INIT_GO" restart >/dev/null 2>&1
|
[ -x "$TG_INIT_GO" ] && "$TG_INIT_GO" restart >/dev/null 2>&1
|
||||||
[ -x "$TG_INIT_RS" ] && "$TG_INIT_RS" restart >/dev/null 2>&1
|
[ -x "$TG_INIT_RS" ] && "$TG_INIT_RS" restart >/dev/null 2>&1
|
||||||
|
[ -x /etc/init.d/tgws ] && /etc/init.d/tgws restart >/dev/null 2>&1
|
||||||
printf '{"ok":true}\n'
|
printf '{"ok":true}\n'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_tgws_domain() {
|
||||||
|
tgws status 2>/dev/null | sed -n 's/^[[:space:]]*домен:[[:space:]]*//p' | head -n1
|
||||||
|
}
|
||||||
|
|
||||||
|
tgws_status() {
|
||||||
|
local installed="not_installed" ver="" domain="" running="false" latest=""
|
||||||
|
if [ "$PKG" = "apk" ]; then
|
||||||
|
ver=$(apk info -v 2>/dev/null | grep '^tgws-' | sed -E 's/^tgws-([0-9.]+).*/\1/')
|
||||||
|
else
|
||||||
|
ver=$(opkg list-installed 2>/dev/null | awk '$1=="tgws"{print $3}' | sed 's/-r[0-9]\+$//')
|
||||||
|
fi
|
||||||
|
if [ -x /etc/init.d/tgws ]; then
|
||||||
|
installed="installed"
|
||||||
|
[ -n "$(tgws status 2>/dev/null)" ] && running="true"
|
||||||
|
domain=$(_tgws_domain)
|
||||||
|
fi
|
||||||
|
latest=$(curl -fsSL --connect-timeout 4 --max-time 6 "$TGWS_VERSION_URL" 2>/dev/null | tr -d '[:space:]')
|
||||||
|
printf '{"installed":"%s","running":%s,"version":"%s","latest":"%s","domain":"%s"}\n' "$installed" "$running" "$(esc "$ver")" "$(esc "$latest")" "$(esc "$domain")"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_tgws_install() {
|
||||||
|
echo "==> Устанавливаем sTGWS"
|
||||||
|
rm -f /tmp/tgws_install.sh
|
||||||
|
wget -q -U "Mozilla/5.0" -O /tmp/tgws_install.sh "$TGWS_INSTALL_URL" || { echo "ОШИБКА: не удалось скачать установщик sTGWS"; rm -f /tmp/tgws_install.sh; return 1; }
|
||||||
|
sh /tmp/tgws_install.sh >/dev/null 2>&1
|
||||||
|
rm -f /tmp/tgws_install.sh
|
||||||
|
if [ ! -x /etc/init.d/tgws ]; then
|
||||||
|
echo "ОШИБКА: установка sTGWS не удалась"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "==> Подбираем домен"
|
||||||
|
/etc/init.d/tgws enable >/dev/null 2>&1
|
||||||
|
/etc/init.d/tgws restart >/dev/null 2>&1
|
||||||
|
tgws pick >/dev/null 2>&1
|
||||||
|
local i started=0
|
||||||
|
for i in $(seq 1 20); do
|
||||||
|
if [ -n "$(tgws status 2>/dev/null)" ]; then
|
||||||
|
started=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
if [ "$started" != "1" ]; then
|
||||||
|
echo "ОШИБКА: не удалось подобрать домен"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
local domain
|
||||||
|
domain=$(_tgws_domain)
|
||||||
|
echo "==> Используем домен: ${domain:-не определён}"
|
||||||
|
echo "==> Готово, sTGWS установлен и запущен"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_tgws_remove() {
|
||||||
|
echo "==> Удаляем sTGWS"
|
||||||
|
/etc/init.d/tgws disable >/dev/null 2>&1
|
||||||
|
/etc/init.d/tgws stop >/dev/null 2>&1
|
||||||
|
$DELETE tgws >/dev/null 2>&1
|
||||||
|
/usr/sbin/stgws apply --spec /dev/null --state-dir /var/lib/stgws >/dev/null 2>&1
|
||||||
|
/usr/sbin/tgws apply --spec /dev/null --state-dir /var/lib/tgws >/dev/null 2>&1
|
||||||
|
killall tgws >/dev/null 2>&1
|
||||||
|
killall stgws >/dev/null 2>&1
|
||||||
|
nft delete table inet stgws >/dev/null 2>&1
|
||||||
|
nft delete table inet tgws >/dev/null 2>&1
|
||||||
|
rm -rf /etc/*tgws*
|
||||||
|
rm -rf /var/lib/*tgws*
|
||||||
|
rm -rf /var/lock/*tgws*
|
||||||
|
rm -rf /etc/rc.d/*tgws*
|
||||||
|
rm -rf /etc/init.d/*tgws*
|
||||||
|
rm -rf /usr/sbin/*tgws*
|
||||||
|
rm -rf /usr/bin/*tgws*
|
||||||
|
rm -rf /etc/config/*tgws*
|
||||||
|
echo "==> Готово, sTGWS удалён"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_tgws_restart() {
|
||||||
|
[ -x /etc/init.d/tgws ] || { echo "ОШИБКА: sTGWS не установлен"; return 1; }
|
||||||
|
echo "==> Перезапускаем sTGWS"
|
||||||
|
/etc/init.d/tgws restart >/dev/null 2>&1
|
||||||
|
sleep 5
|
||||||
|
if [ -z "$(tgws status 2>/dev/null)" ]; then
|
||||||
|
echo "ОШИБКА: sTGWS не запущен после перезапуска"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "==> Готово, sTGWS перезапущен"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_tgws_reconfigure() {
|
||||||
|
[ -x /etc/init.d/tgws ] || { echo "ОШИБКА: sTGWS не установлен"; return 1; }
|
||||||
|
echo "==> Подбираем новый домен"
|
||||||
|
tgws pick >/dev/null 2>&1
|
||||||
|
sleep 6
|
||||||
|
/etc/init.d/tgws restart >/dev/null 2>&1
|
||||||
|
sleep 3
|
||||||
|
local domain
|
||||||
|
domain=$(_tgws_domain)
|
||||||
|
if [ -z "$(tgws status 2>/dev/null)" ] || [ -z "$domain" ]; then
|
||||||
|
echo "ОШИБКА: не удалось подобрать домен"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "==> Новый домен: $domain"
|
||||||
|
echo "==> Готово, домен перенастроен"
|
||||||
|
}
|
||||||
|
|
||||||
|
tgws_action() {
|
||||||
|
local action="$1"
|
||||||
|
case "$action" in
|
||||||
|
install|update) job_start tgws_install do_tgws_install ;;
|
||||||
|
remove) job_start tgws_remove do_tgws_remove ;;
|
||||||
|
restart) job_start tgws_restart do_tgws_restart ;;
|
||||||
|
reconfigure) job_start tgws_reconfigure do_tgws_reconfigure ;;
|
||||||
|
*) echo '{"error":"неизвестное действие"}' ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
_doh_file="/etc/config/https-dns-proxy"
|
_doh_file="/etc/config/https-dns-proxy"
|
||||||
|
|
||||||
@@ -1779,6 +1896,8 @@ case "$cmd" in
|
|||||||
tg_status) tg_status ;;
|
tg_status) tg_status ;;
|
||||||
tg_action) tg_action "$1" "$2" ;;
|
tg_action) tg_action "$1" "$2" ;;
|
||||||
tg_restart_all) tg_restart_all ;;
|
tg_restart_all) tg_restart_all ;;
|
||||||
|
tgws_status) tgws_status ;;
|
||||||
|
tgws_action) tgws_action "$1" ;;
|
||||||
hosts_status) hosts_status ;;
|
hosts_status) hosts_status ;;
|
||||||
hosts_toggle) hosts_toggle "$1" ;;
|
hosts_toggle) hosts_toggle "$1" ;;
|
||||||
hosts_replace_geohide) hosts_replace_geohide "$1" ;;
|
hosts_replace_geohide) hosts_replace_geohide "$1" ;;
|
||||||
@@ -1837,6 +1956,8 @@ list_methods() {
|
|||||||
json_add_object "tg_status"; json_close_object
|
json_add_object "tg_status"; json_close_object
|
||||||
json_add_object "tg_action"; json_add_string "variant" "string"; json_add_string "action" "string"; json_close_object
|
json_add_object "tg_action"; json_add_string "variant" "string"; json_add_string "action" "string"; json_close_object
|
||||||
json_add_object "tg_restart_all"; json_close_object
|
json_add_object "tg_restart_all"; json_close_object
|
||||||
|
json_add_object "tgws_status"; json_close_object
|
||||||
|
json_add_object "tgws_action"; json_add_string "action" "string"; json_close_object
|
||||||
json_add_object "hosts_status"; json_close_object
|
json_add_object "hosts_status"; json_close_object
|
||||||
json_add_object "hosts_toggle"; json_add_string "block" "string"; json_close_object
|
json_add_object "hosts_toggle"; json_add_string "block" "string"; json_close_object
|
||||||
json_add_object "hosts_replace_geohide"; json_add_string "region" "string"; json_close_object
|
json_add_object "hosts_replace_geohide"; json_add_string "region" "string"; json_close_object
|
||||||
@@ -1890,6 +2011,8 @@ call_method() {
|
|||||||
tg_status) "$BACKEND" tg_status ;;
|
tg_status) "$BACKEND" tg_status ;;
|
||||||
tg_action) json_get_var variant variant; json_get_var action action; "$BACKEND" tg_action "$variant" "$action" ;;
|
tg_action) json_get_var variant variant; json_get_var action action; "$BACKEND" tg_action "$variant" "$action" ;;
|
||||||
tg_restart_all) "$BACKEND" tg_restart_all ;;
|
tg_restart_all) "$BACKEND" tg_restart_all ;;
|
||||||
|
tgws_status) "$BACKEND" tgws_status ;;
|
||||||
|
tgws_action) json_get_var action action; "$BACKEND" tgws_action "$action" ;;
|
||||||
hosts_status) "$BACKEND" hosts_status ;;
|
hosts_status) "$BACKEND" hosts_status ;;
|
||||||
hosts_toggle) json_get_var block block; "$BACKEND" hosts_toggle "$block" ;;
|
hosts_toggle) json_get_var block block; "$BACKEND" hosts_toggle "$block" ;;
|
||||||
hosts_replace_geohide) json_get_var region region; "$BACKEND" hosts_replace_geohide "$region" ;;
|
hosts_replace_geohide) json_get_var region region; "$BACKEND" hosts_replace_geohide "$region" ;;
|
||||||
@@ -1921,7 +2044,7 @@ cat > '/usr/share/rpcd/acl.d/luci-app-zapret-manager.json' << 'ZM_INSTALLER_EOF'
|
|||||||
"status", "job_status", "log_tail", "system_info",
|
"status", "job_status", "log_tail", "system_info",
|
||||||
"strategy_list_v", "strategy_list_flowseal", "strategy_list_youtube",
|
"strategy_list_v", "strategy_list_flowseal", "strategy_list_youtube",
|
||||||
"discord_status", "hosts_status", "doh_status", "game_status",
|
"discord_status", "hosts_status", "doh_status", "game_status",
|
||||||
"system_status", "mirror_status", "exclusions_status", "tg_status",
|
"system_status", "mirror_status", "exclusions_status", "tg_status", "tgws_status",
|
||||||
"zapret_latest_version"
|
"zapret_latest_version"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1937,7 +2060,7 @@ cat > '/usr/share/rpcd/acl.d/luci-app-zapret-manager.json' << 'ZM_INSTALLER_EOF'
|
|||||||
"system_check_connectivity", "system_toggle_quic", "system_toggle_ipv6",
|
"system_check_connectivity", "system_toggle_quic", "system_toggle_ipv6",
|
||||||
"system_toggle_flow_offloading_fix", "system_toggle_expert_mode", "system_uninstall_panel",
|
"system_toggle_flow_offloading_fix", "system_toggle_expert_mode", "system_uninstall_panel",
|
||||||
"mirror_set", "exclusions_toggle", "exclusions_clear",
|
"mirror_set", "exclusions_toggle", "exclusions_clear",
|
||||||
"tg_action", "tg_restart_all"
|
"tg_action", "tg_restart_all", "tgws_action"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2051,6 +2174,8 @@ var callExclusionsClear = rpc.declare({ object: 'zapret-manager', method: 'exclu
|
|||||||
var callTgStatus = rpc.declare({ object: 'zapret-manager', method: 'tg_status', expect: {} });
|
var callTgStatus = rpc.declare({ object: 'zapret-manager', method: 'tg_status', expect: {} });
|
||||||
var callTgAction = rpc.declare({ object: 'zapret-manager', method: 'tg_action', params: ['variant', 'action'], expect: {} });
|
var callTgAction = rpc.declare({ object: 'zapret-manager', method: 'tg_action', params: ['variant', 'action'], expect: {} });
|
||||||
var callTgRestartAll = rpc.declare({ object: 'zapret-manager', method: 'tg_restart_all', expect: {} });
|
var callTgRestartAll = rpc.declare({ object: 'zapret-manager', method: 'tg_restart_all', expect: {} });
|
||||||
|
var callTgwsStatus = rpc.declare({ object: 'zapret-manager', method: 'tgws_status', expect: {} });
|
||||||
|
var callTgwsAction = rpc.declare({ object: 'zapret-manager', method: 'tgws_action', params: ['action'], expect: {} });
|
||||||
var callHostsStatus = rpc.declare({ object: 'zapret-manager', method: 'hosts_status', expect: {} });
|
var callHostsStatus = rpc.declare({ object: 'zapret-manager', method: 'hosts_status', expect: {} });
|
||||||
var callHostsToggle = rpc.declare({ object: 'zapret-manager', method: 'hosts_toggle', params: ['block'], expect: {} });
|
var callHostsToggle = rpc.declare({ object: 'zapret-manager', method: 'hosts_toggle', params: ['block'], expect: {} });
|
||||||
var callHostsReplaceGeohide = rpc.declare({ object: 'zapret-manager', method: 'hosts_replace_geohide', params: ['region'], expect: {} });
|
var callHostsReplaceGeohide = rpc.declare({ object: 'zapret-manager', method: 'hosts_replace_geohide', params: ['region'], expect: {} });
|
||||||
@@ -2246,6 +2371,8 @@ return baseclass.extend({
|
|||||||
tgStatus: callTgStatus,
|
tgStatus: callTgStatus,
|
||||||
tgAction: callTgAction,
|
tgAction: callTgAction,
|
||||||
tgRestartAll: callTgRestartAll,
|
tgRestartAll: callTgRestartAll,
|
||||||
|
tgwsStatus: callTgwsStatus,
|
||||||
|
tgwsAction: callTgwsAction,
|
||||||
hostsStatus: callHostsStatus,
|
hostsStatus: callHostsStatus,
|
||||||
hostsToggle: callHostsToggle,
|
hostsToggle: callHostsToggle,
|
||||||
hostsReplaceGeohide: callHostsReplaceGeohide,
|
hostsReplaceGeohide: callHostsReplaceGeohide,
|
||||||
@@ -3684,11 +3811,13 @@ function fallbackCopy(text) {
|
|||||||
return view.extend({
|
return view.extend({
|
||||||
load: function() {
|
load: function() {
|
||||||
zm.injectCss();
|
zm.injectCss();
|
||||||
return zm.tgStatus();
|
return Promise.all([ zm.tgStatus(), zm.tgwsStatus().catch(function() { return {}; }) ]);
|
||||||
},
|
},
|
||||||
|
|
||||||
render: function(data) {
|
render: function(all) {
|
||||||
var view = this;
|
var view = this;
|
||||||
|
var data = all[0];
|
||||||
|
var tgwsData = all[1] || {};
|
||||||
var wrap = E('div', { 'class': 'zm-wrap' });
|
var wrap = E('div', { 'class': 'zm-wrap' });
|
||||||
var cards = E('div', { 'class': 'zm-cards' });
|
var cards = E('div', { 'class': 'zm-cards' });
|
||||||
var linksWrap = E('div', {});
|
var linksWrap = E('div', {});
|
||||||
@@ -3800,6 +3929,85 @@ return view.extend({
|
|||||||
wrap.appendChild(cards);
|
wrap.appendChild(cards);
|
||||||
wrap.appendChild(logEl);
|
wrap.appendChild(logEl);
|
||||||
|
|
||||||
|
var tgwsCard = E('div', { 'class': 'zm-card' });
|
||||||
|
var tgwsBusy = false;
|
||||||
|
|
||||||
|
function renderTgws(d) {
|
||||||
|
var installed = d.installed === 'installed';
|
||||||
|
var actions = [];
|
||||||
|
if (installed) {
|
||||||
|
actions.push(E('button', {
|
||||||
|
'class': 'cbi-button cbi-button-remove',
|
||||||
|
'click': function() { doTgwsAction('remove'); }
|
||||||
|
}, 'Удалить'));
|
||||||
|
if (d.version && d.latest && d.version !== d.latest) {
|
||||||
|
actions.push(E('button', {
|
||||||
|
'class': 'cbi-button',
|
||||||
|
'click': function() { doTgwsAction('update'); }
|
||||||
|
}, 'Обновить до ' + d.latest));
|
||||||
|
}
|
||||||
|
actions.push(E('button', {
|
||||||
|
'class': 'cbi-button',
|
||||||
|
'click': function() { doTgwsAction('restart'); }
|
||||||
|
}, 'Перезапустить'));
|
||||||
|
actions.push(E('button', {
|
||||||
|
'class': 'cbi-button',
|
||||||
|
'click': function() { doTgwsAction('reconfigure'); }
|
||||||
|
}, 'Подобрать новый домен'));
|
||||||
|
} else {
|
||||||
|
actions.push(E('button', {
|
||||||
|
'class': 'cbi-button cbi-button-positive',
|
||||||
|
'click': function() { doTgwsAction('install'); }
|
||||||
|
}, 'Установить'));
|
||||||
|
}
|
||||||
|
tgwsCard.innerHTML = '';
|
||||||
|
tgwsCard.appendChild(E('h3', {}, 'sTGWS (бета)'));
|
||||||
|
tgwsCard.appendChild(E('p', { 'class': 'zm-hint' }, 'Бета-версия. В отдельных случаях может потребоваться сброс роутера до заводских настроек. Не устанавливайте, если не уверены, что сможете устранить возможные проблемы — рекомендуется использовать другие варианты TG WS Proxy выше.'));
|
||||||
|
tgwsCard.appendChild(E('div', { 'class': 'zm-row' }, [
|
||||||
|
E('span', { 'class': 'zm-label' }, 'Статус'),
|
||||||
|
installed ? zm.badge(d.running === true, 'запущен', 'остановлен') : zm.badge(false, '', 'не установлен')
|
||||||
|
]));
|
||||||
|
if (installed && d.version) {
|
||||||
|
tgwsCard.appendChild(E('div', { 'class': 'zm-row' }, [
|
||||||
|
E('span', { 'class': 'zm-label' }, 'Версия'), E('span', {}, d.version)
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
if (installed && d.domain) {
|
||||||
|
tgwsCard.appendChild(E('div', { 'class': 'zm-row' }, [
|
||||||
|
E('span', { 'class': 'zm-label' }, 'Домен'), E('span', {}, d.domain)
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
tgwsCard.appendChild(E('div', { 'class': 'zm-actions' }, actions));
|
||||||
|
}
|
||||||
|
|
||||||
|
function doTgwsAction(action) {
|
||||||
|
if (tgwsBusy) { zm.toast('Дождитесь завершения текущей операции', 'warning'); return; }
|
||||||
|
tgwsBusy = true;
|
||||||
|
var job = action === 'remove' ? 'tgws_remove'
|
||||||
|
: action === 'restart' ? 'tgws_restart'
|
||||||
|
: action === 'reconfigure' ? 'tgws_reconfigure' : 'tgws_install';
|
||||||
|
var label = action === 'remove' ? 'Удаляем sTGWS'
|
||||||
|
: action === 'restart' ? 'Перезапускаем sTGWS'
|
||||||
|
: action === 'reconfigure' ? 'Подбираем новый домен sTGWS'
|
||||||
|
: action === 'update' ? 'Обновляем sTGWS' : 'Устанавливаем sTGWS';
|
||||||
|
zm.toast(label, 'warning');
|
||||||
|
zm.tgwsAction(action).then(function(res) {
|
||||||
|
if (res.error) { tgwsBusy = false; zm.toast(res.error, 'error'); return; }
|
||||||
|
if (res.started) {
|
||||||
|
zm.pollJob(job, logEl, function(ok) {
|
||||||
|
tgwsBusy = false;
|
||||||
|
zm.toast(ok ? 'Готово' : 'Ошибка', ok ? 'info' : 'error');
|
||||||
|
zm.tgwsStatus().then(function(d) { renderTgws(d); });
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
tgwsBusy = false;
|
||||||
|
}
|
||||||
|
}).catch(function() { tgwsBusy = false; });
|
||||||
|
}
|
||||||
|
|
||||||
|
renderTgws(tgwsData);
|
||||||
|
wrap.appendChild(tgwsCard);
|
||||||
|
|
||||||
var restartBusy = false;
|
var restartBusy = false;
|
||||||
wrap.appendChild(E('div', { 'class': 'zm-card' }, [
|
wrap.appendChild(E('div', { 'class': 'zm-card' }, [
|
||||||
E('h3', {}, 'Общие действия'),
|
E('h3', {}, 'Общие действия'),
|
||||||
@@ -3813,6 +4021,7 @@ return view.extend({
|
|||||||
zm.tgRestartAll().then(function() {
|
zm.tgRestartAll().then(function() {
|
||||||
restartBusy = false;
|
restartBusy = false;
|
||||||
zm.toast('Все запущенные TG WS Proxy перезапущены', 'info');
|
zm.toast('Все запущенные TG WS Proxy перезапущены', 'info');
|
||||||
|
zm.tgwsStatus().then(function(d) { renderTgws(d); });
|
||||||
}).catch(function() { restartBusy = false; });
|
}).catch(function() { restartBusy = false; });
|
||||||
}
|
}
|
||||||
}, 'Перезапустить все')
|
}, 'Перезапустить все')
|
||||||
|
|||||||
Reference in new issue
Block a user