RKNnoVPN/module/scripts/lib/rknnovpn_env.sh
2026-05-07 19:44:47 +03:00

168 lines
5.4 KiB
Shell

#!/system/bin/sh
# Shared RKNnoVPN module runtime helpers.
# POSIX sh compatible; safe to source from boot/install/rescue scripts.
RKNNOVPN_DIR="${RKNNOVPN_DIR:-${MODDIR:-${MODPATH:-/data/adb/modules/rknnovpn}}}"
RKNNOVPN_GID="${RKNNOVPN_GID:-23333}"
BIN_DIR="${BIN_DIR:-${RKNNOVPN_DIR}/bin}"
CONFIG_DIR="${CONFIG_DIR:-${RKNNOVPN_DIR}/config}"
RENDERED_CONFIG_DIR="${RENDERED_CONFIG_DIR:-${CONFIG_DIR}/rendered}"
SCRIPTS_DIR="${SCRIPTS_DIR:-${RKNNOVPN_DIR}/scripts}"
RUN_DIR="${RUN_DIR:-${RKNNOVPN_DIR}/run}"
DATA_DIR="${DATA_DIR:-${RKNNOVPN_DIR}/data}"
LOG_DIR="${LOG_DIR:-${RKNNOVPN_DIR}/logs}"
RELEASES_DIR="${RELEASES_DIR:-${RKNNOVPN_DIR}/releases}"
RUNTIME_CONFIG_FILE="${RUNTIME_CONFIG_FILE:-${CONFIG_DIR}/config.json}"
RESET_LOCK="${RESET_LOCK:-${RUN_DIR}/reset.lock}"
ACTIVE_FILE="${ACTIVE_FILE:-${RUN_DIR}/active}"
MANUAL_FLAG="${MANUAL_FLAG:-${CONFIG_DIR}/manual}"
SINGBOX_PID_FILE="${SINGBOX_PID_FILE:-${RUN_DIR}/singbox.pid}"
XRAY_PID_FILE="${XRAY_PID_FILE:-${RUN_DIR}/xray.pid}"
FWMARK="${FWMARK:-0x2023}"
ROUTE_TABLE="${ROUTE_TABLE:-2023}"
ROUTE_TABLE_V6="${ROUTE_TABLE_V6:-2024}"
ROUTE_RULE_PREF="${ROUTE_RULE_PREF:-10000}"
ROUTE_RULE_PREF_V6="${ROUTE_RULE_PREF_V6:-10001}"
IPT_WAIT="${IPT_WAIT:--w 10}"
rknnovpn_module_version_from_env() {
_module_path="${1:-${RKNNOVPN_DIR:-}}"
if [ -n "$_module_path" ] && [ -f "${_module_path}/module.prop" ]; then
awk -F= '$1=="version"{print $2; exit}' "${_module_path}/module.prop" 2>/dev/null
fi
}
rknnovpn_module_version() {
rknnovpn_module_version_from_env "$@"
}
rknnovpn_log() {
_level="$1"
shift
_tag="${RKNNOVPN_LOG_TAG:-${TAG:-rknnovpn}}"
_msg="$*"
case "$_level" in
e|E|error|ERROR) _prio="e"; _prefix="ERROR" ;;
w|W|warn|WARN) _prio="w"; _prefix="WARN" ;;
*) _prio="i"; _prefix="INFO" ;;
esac
if [ -n "${RKNNOVPN_LOG_FILE:-}" ]; then
_ts="$(date '+%Y-%m-%d %H:%M:%S' 2>/dev/null || echo '----')"
echo "$_ts [$_prefix] $_msg" >> "$RKNNOVPN_LOG_FILE" 2>/dev/null || true
fi
/system/bin/log -t "$_tag" -p "$_prio" "$_msg" 2>/dev/null || true
if [ "$_prio" = "e" ] || [ "$_prio" = "w" ]; then
echo "[$_tag] $_prefix: $_msg" >&2
else
echo "[$_tag] $_prefix: $_msg"
fi
}
rknnovpn_log_info() { rknnovpn_log i "$@"; }
rknnovpn_log_warn() { rknnovpn_log w "$@"; }
rknnovpn_log_error() { rknnovpn_log e "$@"; }
rknnovpn_ensure_layout() {
for _dir in "$BIN_DIR" "$CONFIG_DIR" "$RENDERED_CONFIG_DIR" "$SCRIPTS_DIR" "$RUN_DIR" "$DATA_DIR" "$LOG_DIR" "$RELEASES_DIR"; do
mkdir -p "$_dir" 2>/dev/null || return 1
done
}
rknnovpn_apply_data_permissions() {
chown 0:0 "$RKNNOVPN_DIR" 2>/dev/null || true
chmod 0755 "$RKNNOVPN_DIR" 2>/dev/null || true
chown -R 0:"$RKNNOVPN_GID" "$BIN_DIR" 2>/dev/null || true
chmod 0750 "$BIN_DIR" 2>/dev/null || true
find "$BIN_DIR" -type f -exec chmod 0750 {} \; 2>/dev/null || true
chown -R 0:0 "$SCRIPTS_DIR" 2>/dev/null || true
chmod 0755 "$SCRIPTS_DIR" 2>/dev/null || true
find "$SCRIPTS_DIR" -type d -exec chmod 0755 {} \; 2>/dev/null || true
find "$SCRIPTS_DIR" -type f -exec chmod 0755 {} \; 2>/dev/null || true
chown -R 0:0 "$CONFIG_DIR" 2>/dev/null || true
chmod 0700 "$CONFIG_DIR" 2>/dev/null || true
find "$CONFIG_DIR" -type f -exec chmod 0600 {} \; 2>/dev/null || true
chmod 0700 "$RENDERED_CONFIG_DIR" 2>/dev/null || true
chown -R 0:"$RKNNOVPN_GID" "$RUN_DIR" 2>/dev/null || true
chmod 0750 "$RUN_DIR" 2>/dev/null || true
chown -R 0:0 "$DATA_DIR" "$LOG_DIR" "$RELEASES_DIR" 2>/dev/null || true
chmod 0700 "$DATA_DIR" "$LOG_DIR" "$RELEASES_DIR" 2>/dev/null || true
find "$LOG_DIR" -type f -exec chmod 0600 {} \; 2>/dev/null || true
[ -f "$RUNTIME_CONFIG_FILE" ] && chmod 0600 "$RUNTIME_CONFIG_FILE" 2>/dev/null || true
}
rknnovpn_enter_reset_mode() {
mkdir -p "$RUN_DIR" 2>/dev/null || true
touch "$RESET_LOCK" 2>/dev/null || true
rm -f "$ACTIVE_FILE" 2>/dev/null || true
}
rknnovpn_leave_reset_mode() {
rm -f "$RESET_LOCK" 2>/dev/null || true
}
rknnovpn_is_reset_active() {
[ -f "$RESET_LOCK" ]
}
rknnovpn_set_manual_mode() {
mkdir -p "$CONFIG_DIR" "$RUN_DIR" 2>/dev/null || true
touch "$MANUAL_FLAG" 2>/dev/null || true
rm -f "$ACTIVE_FILE" 2>/dev/null || true
}
rknnovpn_clear_manual_mode() {
rm -f "$MANUAL_FLAG" 2>/dev/null || true
}
rknnovpn_is_manual_mode() {
[ -f "$MANUAL_FLAG" ]
}
rknnovpn_mark_active() {
mkdir -p "$RUN_DIR" 2>/dev/null || true
touch "$ACTIVE_FILE" 2>/dev/null || true
}
rknnovpn_clear_active() {
rm -f "$ACTIVE_FILE" 2>/dev/null || true
}
rknnovpn_is_active() {
[ -f "$ACTIVE_FILE" ]
}
rknnovpn_compact_json_file() {
_file="$1"
[ -f "$_file" ] || return 1
tr -d '\n\r\t ' < "$_file" 2>/dev/null
}
rknnovpn_has_runtime_profile() {
_profile_file="${1:-${RUNTIME_CONFIG_FILE}}"
_profile_json="$(rknnovpn_compact_json_file "$_profile_file" 2>/dev/null)"
case "$_profile_json" in
*'"profile":{'*'"nodes":[{'*)
return 0
;;
esac
return 1
}
rknnovpn_remove_runtime_snapshots() {
rm -f "$SINGBOX_PID_FILE" 2>/dev/null || true
rm -f "$XRAY_PID_FILE" 2>/dev/null || true
rm -f "$RUN_DIR/net_change.lock" 2>/dev/null || true
rm -f "$RUN_DIR/env.sh" 2>/dev/null || true
rm -f "$RUN_DIR/iptables.rules" "$RUN_DIR/ip6tables.rules" 2>/dev/null || true
rm -f "$RUN_DIR/iptables_backup.rules" "$RUN_DIR/ip6tables_backup.rules" 2>/dev/null || true
}