168 lines
5.4 KiB
Shell
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
|
|
}
|