From aa86445332a00549d615a70abac629cd6375d219 Mon Sep 17 00:00:00 2001 From: Ivan K Date: Sat, 15 Feb 2025 16:55:51 +0300 Subject: [PATCH 1/4] feat(podkop): add show config feature - Add new button to show config with masked sensitive data - Update init script with new command `show_config` - Implement `show_config` function to mask sensitive data - Update version in config file to 0.3.3 - Update proxy check logic for better error handling --- .../resources/view/podkop/podkop.js | 62 +++++++++++++++++ podkop/files/etc/config/podkop | 1 + podkop/files/etc/init.d/podkop | 69 +++++++++++++++---- 3 files changed, 118 insertions(+), 14 deletions(-) diff --git a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js index d4affbf..ac7d235 100644 --- a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js +++ b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js @@ -7,10 +7,28 @@ return view.extend({ async render() { + document.getElementsByTagName('head')[0].insertAdjacentHTML('beforeend', ` + + + + `); + var m, s, o; m = new form.Map('podkop', _('Podkop configuration'), null, ['main', 'second']); + m = new form.Map('podkop', _('Podkop'), null, ['main', 'second']); + L.uci.load('podkop').then(() => { + const version = L.uci.get('podkop', 'main', 'version') || ''; + if (version) { + m.title = _('Podkop') + ' v' + version; + if (!window.location.search.includes('v=')) { + const newUrl = window.location.pathname + '?v=' + version; + window.history.replaceState(null, '', newUrl); + } + } + }); + s = m.section(form.TypedSection, 'main'); s.anonymous = true; @@ -552,6 +570,50 @@ return view.extend({ }); }; + o = s.taboption('diagnostics', form.Button, '_show_config'); + o.title = _('Show Config'); + o.description = _('Show current podkop configuration with masked sensitive data'); + o.inputtitle = _('Show Config'); + o.inputstyle = 'apply'; + o.onclick = function () { + return fs.exec('/etc/init.d/podkop', ['show_config']) + .then(function (res) { + const formattedOutput = formatDiagnosticOutput(res.stdout || _('No output')); + + const modalElement = ui.showModal(_('Podkop Configuration'), [ + E('div', { class: 'cbi-section' }, [ + E('pre', { class: 'cbi-value-field' }, formattedOutput) + ]), + E('div', { style: 'display: flex; justify-content: space-between; margin-top: 1em;' }, [ + E('button', { + 'class': 'btn cbi-button-save', + 'click': function () { + const textarea = document.createElement('textarea'); + textarea.value = '```\n' + formattedOutput + '\n```'; + document.body.appendChild(textarea); + textarea.select(); + try { + document.execCommand('copy'); + ui.hideModal(); + } catch (err) { + ui.addNotification(null, E('p', {}, _('Failed to copy: ') + err.message)); + } + document.body.removeChild(textarea); + } + }, _('Copy to Clipboard')), + E('button', { + 'class': 'btn cbi-button-neutral', + 'click': ui.hideModal + }, _('Close')) + ]) + ], 'large'); + + if (modalElement && modalElement.parentElement) { + modalElement.parentElement.classList.add('modal-overlay-large'); + } + }); + }; + o = s.taboption('diagnostics', form.Button, '_list_update'); o.title = _('Update lists'); o.description = _('Update all lists in config'); diff --git a/podkop/files/etc/config/podkop b/podkop/files/etc/config/podkop index 0976aa8..8c86dfe 100644 --- a/podkop/files/etc/config/podkop +++ b/podkop/files/etc/config/podkop @@ -1,4 +1,5 @@ config main 'main' + option version '0.3.3' option mode 'proxy' #option interface '' option proxy_config_type '' diff --git a/podkop/files/etc/init.d/podkop b/podkop/files/etc/init.d/podkop index 2aefab0..b73b9fe 100755 --- a/podkop/files/etc/init.d/podkop +++ b/podkop/files/etc/init.d/podkop @@ -7,7 +7,7 @@ script=$(readlink "$initscript") NAME="$(basename ${script:-$initscript})" config_load "$NAME" -EXTRA_COMMANDS="list_update check_proxy check_nft check_github check_logs check_all check_three main" +EXTRA_COMMANDS="list_update check_proxy check_nft check_github check_logs check_all check_three main show_config" EXTRA_HELP=" list_update Updating domain and subnet lists sing_box_config_vless For test vless string check_proxy Check if sing-box proxy works correctly @@ -16,7 +16,8 @@ EXTRA_HELP=" list_update Updating domain and subnet lists check_logs Show podkop logs from system journal check_all Run all checks check_three Run check_proxy, check_nft and check_github - main Main function" + main Main function + show_config Show current configuration with masked sensitive data" [ ! -L /usr/sbin/podkop ] && ln -s /etc/init.d/podkop /usr/sbin/podkop @@ -767,7 +768,7 @@ sing_box_config_vless() { get_param() { local param="$1" local value=$(echo "$STRING" | sed -n "s/.*[?&]$param=\([^&?#]*\).*/\1/p") - value=$(echo "$value" | sed 's/%2F/\//g; s/%2C/,/g; s/%3D/=/g; s/%2B/+/g; s/%20/ /g' | tr -d '\n' | tr -d '\r') + value=$(uhttpd -d "$value" | tr -d '\n' | tr -d '\r') echo "$value" } @@ -1309,18 +1310,31 @@ check_proxy() { nolog "Checking proxy connection..." - for attempt in `seq 1 5`; do - response=$(sing-box tools fetch ifconfig.me -D /etc/sing-box 2>/dev/null) - if ! echo "$response" | grep -q "403 Forbidden"; then - nolog "Proxy check completed successfully" - #echo "$response" | sed 's/\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)/XXX.\2.\3.\4/' - echo "$response" | sed -n 's/^[0-9]\+\.[0-9]\+\.[0-9]\+\.\([0-9]\+\)$/X.X.X.\1/p' - return 0 - fi - done - nolog "Failed to get a non-403 response after 5 attempts" - return 1 + for attempt in `seq 1 5`; do + response=$(sing-box tools fetch ifconfig.me -D /etc/sing-box 2>/dev/null) + if echo "$response" | grep -q "^ "$tmp_config" + + cat "$tmp_config" + rm -f "$tmp_config" +} From eb185373708a9ca1bedd382d370e2e4e22f89982 Mon Sep 17 00:00:00 2001 From: Ivan K Date: Sat, 15 Feb 2025 17:30:14 +0300 Subject: [PATCH 2/4] feat(podkop): add show_version command - Update init script to include show_version command - Add show_version function to display current version - Update EXTRA_COMMANDS to include show_version - Remove version from web and config --- .../luci-static/resources/view/podkop/podkop.js | 12 ------------ podkop/files/etc/config/podkop | 1 - podkop/files/etc/init.d/podkop | 12 +++++++++--- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js index ac7d235..af18360 100644 --- a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js +++ b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js @@ -17,18 +17,6 @@ return view.extend({ m = new form.Map('podkop', _('Podkop configuration'), null, ['main', 'second']); - m = new form.Map('podkop', _('Podkop'), null, ['main', 'second']); - L.uci.load('podkop').then(() => { - const version = L.uci.get('podkop', 'main', 'version') || ''; - if (version) { - m.title = _('Podkop') + ' v' + version; - if (!window.location.search.includes('v=')) { - const newUrl = window.location.pathname + '?v=' + version; - window.history.replaceState(null, '', newUrl); - } - } - }); - s = m.section(form.TypedSection, 'main'); s.anonymous = true; diff --git a/podkop/files/etc/config/podkop b/podkop/files/etc/config/podkop index 8c86dfe..0976aa8 100644 --- a/podkop/files/etc/config/podkop +++ b/podkop/files/etc/config/podkop @@ -1,5 +1,4 @@ config main 'main' - option version '0.3.3' option mode 'proxy' #option interface '' option proxy_config_type '' diff --git a/podkop/files/etc/init.d/podkop b/podkop/files/etc/init.d/podkop index b73b9fe..7e885d1 100755 --- a/podkop/files/etc/init.d/podkop +++ b/podkop/files/etc/init.d/podkop @@ -7,7 +7,7 @@ script=$(readlink "$initscript") NAME="$(basename ${script:-$initscript})" config_load "$NAME" -EXTRA_COMMANDS="list_update check_proxy check_nft check_github check_logs check_all check_three main show_config" +EXTRA_COMMANDS="list_update check_proxy check_nft check_github check_logs check_all check_three main show_config show_version" EXTRA_HELP=" list_update Updating domain and subnet lists sing_box_config_vless For test vless string check_proxy Check if sing-box proxy works correctly @@ -17,7 +17,8 @@ EXTRA_HELP=" list_update Updating domain and subnet lists check_all Run all checks check_three Run check_proxy, check_nft and check_github main Main function - show_config Show current configuration with masked sensitive data" + show_config Show current configuration with masked sensitive data + show_version Show current version" [ ! -L /usr/sbin/podkop ] && ln -s /etc/init.d/podkop /usr/sbin/podkop @@ -1082,7 +1083,7 @@ sing_box_rules() { local rule_set="$1" local outbound="$2" - # Check if there is an outbound rule for “tproxy-in” + # Check if there is an outbound rule for "tproxy-in" local rule_exists=$(jq -r '.route.rules[] | select(.outbound == "'"$outbound"'" and .inbound == ["tproxy-in"])' "$SING_BOX_CONFIG") if [[ -n "$rule_exists" ]]; then @@ -1447,3 +1448,8 @@ show_config() { cat "$tmp_config" rm -f "$tmp_config" } + +show_version() { + local version=$(opkg info podkop | grep -m 1 "Version:" | cut -d' ' -f2) + echo "$version" +} \ No newline at end of file From a30752d2e9ee64be5c28d56dfccfc3dd09bfc68b Mon Sep 17 00:00:00 2001 From: Ivan K Date: Sat, 15 Feb 2025 17:47:09 +0300 Subject: [PATCH 3/4] fix(init.d): decode URL-encoded characters in get_param - Replaced `uhttpd` with `sed` for URL decoding --- podkop/files/etc/init.d/podkop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/podkop/files/etc/init.d/podkop b/podkop/files/etc/init.d/podkop index 7e885d1..eaccdd0 100755 --- a/podkop/files/etc/init.d/podkop +++ b/podkop/files/etc/init.d/podkop @@ -769,7 +769,7 @@ sing_box_config_vless() { get_param() { local param="$1" local value=$(echo "$STRING" | sed -n "s/.*[?&]$param=\([^&?#]*\).*/\1/p") - value=$(uhttpd -d "$value" | tr -d '\n' | tr -d '\r') + value=$(echo "$value" | sed 's/%2F/\//g; s/%2C/,/g; s/%3D/=/g; s/%2B/+/g; s/%20/ /g' | tr -d '\n' | tr -d '\r') echo "$value" } From 18d466e166df9c3f3d0f2a00cf6fff108b7b25af Mon Sep 17 00:00:00 2001 From: Ivan K Date: Sat, 15 Feb 2025 17:58:39 +0300 Subject: [PATCH 4/4] feat(podkop): add version display in UI - Added version display in Podkop UI - Updated init script to fetch and display version --- .../htdocs/luci-static/resources/view/podkop/podkop.js | 6 +++++- podkop/files/etc/init.d/podkop | 5 ----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js index af18360..541dd43 100644 --- a/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js +++ b/luci-app-podkop/htdocs/luci-static/resources/view/podkop/podkop.js @@ -16,7 +16,11 @@ return view.extend({ var m, s, o; m = new form.Map('podkop', _('Podkop configuration'), null, ['main', 'second']); - + fs.exec('/etc/init.d/podkop', ['show_version']).then(function (res) { + if (res.stdout) { + m.title = _('Podkop') + ' v' + res.stdout.trim(); + } + }); s = m.section(form.TypedSection, 'main'); s.anonymous = true; diff --git a/podkop/files/etc/init.d/podkop b/podkop/files/etc/init.d/podkop index eaccdd0..6442df5 100755 --- a/podkop/files/etc/init.d/podkop +++ b/podkop/files/etc/init.d/podkop @@ -1346,7 +1346,6 @@ check_nft() { nolog "Checking PodkopTable rules..." - # Список всех возможных сетов local sets="podkop_domains podkop_subnets podkop_subnets_discord localv4" nolog "Sets statistics:" @@ -1359,7 +1358,6 @@ check_nft() { fi done - # Показываем правила с счетчиками nolog "Current chains and rules:" nft list table inet PodkopTable | grep "chain\|counter" @@ -1392,7 +1390,6 @@ check_logs() { nolog "Showing podkop logs from system journal..." if command -v logread >/dev/null 2>&1; then - # Попытка получить последние 50 записей logread -e "podkop" | tail -n 50 else nolog "Error: logread command not found" @@ -1430,10 +1427,8 @@ show_config() { return 1 fi - # Создаем временный файл для обработанного конфига tmp_config=$(mktemp) - # Копируем и маскируем конфиденциальные данные cat /etc/config/podkop | sed \ -e 's/\(option proxy_string\).*/\1 '\''MASKED'\''/g' \ -e 's/\(option outbound_json\).*/\1 '\''MASKED'\''/g' \