mirror of
https://github.com/itdoginfo/podkop.git
synced 2025-12-07 12:06:56 +03:00
refactor: Add version checks and service existence validation for required packages before starting podkop
This commit is contained in:
@@ -29,22 +29,77 @@ check_required_file "$PODKOP_LIB/logging.sh"
|
||||
|
||||
config_load "$PODKOP_CONFIG"
|
||||
|
||||
start_main() {
|
||||
log "Starting podkop"
|
||||
check_requirements() {
|
||||
log "Check Requirements"
|
||||
|
||||
# checking
|
||||
sing_box_version=$(sing-box version | head -n 1 | awk '{print $3}')
|
||||
required_version="1.12.0"
|
||||
local sing_box_version curl_version jq_version kmod_nft_tproxy_version coreutils_base64_version
|
||||
sing_box_version="$(get_package_version "sing-box")"
|
||||
curl_version="$(get_package_version "curl")"
|
||||
jq_version="$(get_package_version "jq")"
|
||||
kmod_nft_tproxy_version="$(get_package_version "kmod-nft-tproxy")"
|
||||
coreutils_base64_version="$(get_package_version "coreutils-base64")"
|
||||
|
||||
if [ "$(echo -e "$sing_box_version\n$required_version" | sort -V | head -n 1)" != "$required_version" ]; then
|
||||
log "The version of sing-box ($sing_box_version) is lower than the minimum version. Update sing-box: opkg update && opkg remove sing-box && opkg install sing-box" "critical"
|
||||
if [ -z "$sing_box_version" ]; then
|
||||
log "Package 'sing-box' is not installed." "error"
|
||||
exit 1
|
||||
else
|
||||
if ! is_min_package_version "$sing_box_version" "$SB_REQUIRED_VERSION"; then
|
||||
log "Package 'sing-box' version ($sing_box_version) is lower than the required minimum ($SB_REQUIRED_VERSION). Update sing-box: opkg update && opkg remove sing-box && opkg install sing-box" "error"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! service_exists "sing-box"; then
|
||||
log "Service 'sing-box' is missing. Please install the official package to ensure the service is available." "error"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$curl_version" ]; then
|
||||
log "Package 'curl' is not installed." "error"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$jq_version" ]; then
|
||||
log "Package 'jq' is not installed." "error"
|
||||
exit 1
|
||||
elif ! is_min_package_version "$jq_version" "$JQ_REQUIRED_VERSION"; then
|
||||
log "Package 'jq' version ($jq_version) is lower than the required minimum ($JQ_REQUIRED_VERSION)." "error"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$kmod_nft_tproxy_version" ]; then
|
||||
log "Package 'kmod-nft-tproxy' is not installed." "error"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$coreutils_base64_version" ]; then
|
||||
log "Package 'coreutils-base64' is not installed." "error"
|
||||
exit 1
|
||||
elif ! is_min_package_version "$coreutils_base64_version" "$COREUTILS_BASE64_REQUIRED_VERSION"; then
|
||||
log "Package 'coreutils-base64' version ($coreutils_base64_version) is lower than the required minimum ($COREUTILS_BASE64_REQUIRED_VERSION). This may cause issues when decoding base64 streams with missing padding, as automatic padding support is not available in older versions." "warn"
|
||||
fi
|
||||
|
||||
if grep -qE 'doh_backup_noresolv|doh_backup_server|doh_server' /etc/config/dhcp; then
|
||||
log "Detected https-dns-proxy in dhcp config. Edit /etc/config/dhcp" "warn"
|
||||
fi
|
||||
|
||||
local proxy_string interface outbound_json urltest_proxy_links dont_touch_dhcp
|
||||
config_get proxy_string "main" "proxy_string"
|
||||
config_get interface "main" "interface"
|
||||
config_get outbound_json "main" "outbound_json"
|
||||
config_get urltest_proxy_links "main" "urltest_proxy_links"
|
||||
|
||||
if [ -z "$proxy_string" ] && [ -z "$interface" ] && [ -z "$outbound_json" ] && [ -z "$urltest_proxy_links" ]; then
|
||||
log "Required options (proxy_string, interface, outbound_json, urltest_proxy_links) are missing in 'main' section. Aborted." "error"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
start_main() {
|
||||
log "Starting podkop"
|
||||
|
||||
check_requirements
|
||||
|
||||
migration
|
||||
|
||||
config_foreach process_validate_service
|
||||
@@ -82,17 +137,6 @@ start_main() {
|
||||
}
|
||||
|
||||
start() {
|
||||
local proxy_string interface outbound_json urltest_proxy_links dont_touch_dhcp
|
||||
config_get proxy_string "main" "proxy_string"
|
||||
config_get interface "main" "interface"
|
||||
config_get outbound_json "main" "outbound_json"
|
||||
config_get urltest_proxy_links "main" "urltest_proxy_links"
|
||||
|
||||
if [ -z "$proxy_string" ] && [ -z "$interface" ] && [ -z "$outbound_json" ] && [ -z "$urltest_proxy_links" ]; then
|
||||
log "Required options (proxy_string, interface, outbound_json, urltest_proxy_links) are missing in 'main' section. Aborted." "fatal"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
start_main
|
||||
config_get_bool dont_touch_dhcp "main" "dont_touch_dhcp" 0
|
||||
if [ "$dont_touch_dhcp" -eq 0 ]; then
|
||||
|
||||
@@ -9,6 +9,8 @@ FAKEIP_TEST_DOMAIN="fakeip.podkop.fyi"
|
||||
TMP_SING_BOX_FOLDER="/tmp/sing-box"
|
||||
TMP_RULESET_FOLDER="$TMP_SING_BOX_FOLDER/rulesets"
|
||||
CLOUDFLARE_OCTETS="8.47 162.159 188.114" # Endpoints https://github.com/ampetelin/warp-endpoint-checker
|
||||
JQ_REQUIRED_VERSION="1.7.1"
|
||||
COREUTILS_BASE64_REQUIRED_VERSION="9.7"
|
||||
|
||||
## nft
|
||||
NFT_TABLE_NAME="PodkopTable"
|
||||
@@ -18,6 +20,7 @@ NFT_DISCORD_SET_NAME="podkop_discord_subnets"
|
||||
NFT_INTERFACE_SET_NAME="interfaces"
|
||||
|
||||
## sing-box
|
||||
SB_REQUIRED_VERSION="1.12.0"
|
||||
# Log
|
||||
SB_DEFAULT_LOG_LEVEL="warn"
|
||||
# DNS
|
||||
|
||||
@@ -48,6 +48,15 @@ is_shadowsocks_userinfo_format() {
|
||||
[[ "$str" =~ $regex ]]
|
||||
}
|
||||
|
||||
# Compares the current package version with the required minimum
|
||||
is_min_package_version() {
|
||||
local current="$1"
|
||||
local required="$2"
|
||||
|
||||
lowest="$(printf '%s\n' "$current" "$required" | sort -V | head -n1)"
|
||||
[ "$lowest" = "$required" ]
|
||||
}
|
||||
|
||||
# Checks if the given file exists
|
||||
file_exists() {
|
||||
local filepath="$1"
|
||||
@@ -59,6 +68,17 @@ file_exists() {
|
||||
fi
|
||||
}
|
||||
|
||||
# Checks if a service script exists in /etc/init.d
|
||||
service_exists() {
|
||||
local service="$1"
|
||||
|
||||
if [ -x "/etc/init.d/$service" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Returns the inbound tag name by appending the postfix to the given section
|
||||
get_inbound_tag_by_section() {
|
||||
local section="$1"
|
||||
@@ -106,6 +126,13 @@ get_ruleset_format_by_file_extension() {
|
||||
echo "$format"
|
||||
}
|
||||
|
||||
# Retrieves the installed package version from opkg
|
||||
get_package_version() {
|
||||
local package="$1"
|
||||
|
||||
opkg status "$package" 2>/dev/null | awk '/^Version:/ {print $2}' | cut -d'-' -f1
|
||||
}
|
||||
|
||||
# Converts a comma-separated string into a JSON array string
|
||||
comma_string_to_json_array() {
|
||||
local input="$1"
|
||||
|
||||
Reference in New Issue
Block a user