mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-10-26 18:12:51 +08:00
🤞 Sync 2026-08-09 18:27:19
This commit is contained in:
1 parent
59356ee7dd
commit
df29e10344
54 files changed
+424
-239
No files matched your search
+2
-2
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=gecoosac
|
PKG_NAME:=gecoosac
|
||||||
PKG_VERSION:=2.2.20251015
|
PKG_VERSION:=2.2.20251015
|
||||||
PKG_RELEASE:=17
|
PKG_RELEASE:=18
|
||||||
|
|
||||||
PKG_MAINTAINER:=Roc Lai <laipeng668@qq.com>
|
PKG_MAINTAINER:=Roc Lai <laipeng668@qq.com>
|
||||||
PKG_LICENSE:=AGPL-3.0-only
|
PKG_LICENSE:=AGPL-3.0-only
|
||||||
@@ -44,7 +44,7 @@ define Package/$(PKG_NAME)
|
|||||||
TITLE:=gecoosac server (version $(PKG_VERSION))
|
TITLE:=gecoosac server (version $(PKG_VERSION))
|
||||||
URL:=http://www.cnrouter.com/
|
URL:=http://www.cnrouter.com/
|
||||||
DEPENDS:=@(aarch64||arm||i386||mips||mipsel||x86_64) +openssl-util
|
DEPENDS:=@(aarch64||arm||i386||mips||mipsel||x86_64) +openssl-util
|
||||||
REPLACES:=luci-app-gecoosac
|
PROVIDES:=gecoosac-files
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/$(PKG_NAME)/conffiles
|
define Package/$(PKG_NAME)/conffiles
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
changed=0
|
changed=0
|
||||||
DEFAULT_DB_DIR=/etc/gecoosac
|
DEFAULT_DB_DIR=/etc/gecoosac
|
||||||
DEFAULT_UPLOAD_DIR=/tmp/gecoosac/upload
|
DEFAULT_UPLOAD_DIR=/tmp/gecoosac/upload
|
||||||
|
LEGACY_UPLOAD_DIR=/etc/gecoosac/upload
|
||||||
DEFAULT_CRT_FILE=/etc/gecoosac/tls/gecoosac.crt
|
DEFAULT_CRT_FILE=/etc/gecoosac/tls/gecoosac.crt
|
||||||
DEFAULT_KEY_FILE=/etc/gecoosac/tls/gecoosac.key
|
DEFAULT_KEY_FILE=/etc/gecoosac/tls/gecoosac.key
|
||||||
DEFAULT_PID_DIR=/var/run
|
DEFAULT_PID_DIR=/var/run
|
||||||
@@ -123,6 +124,23 @@ is_path_in_dir() {
|
|||||||
[ "${path#"$root"/}" != "$path" ]
|
[ "${path#"$root"/}" != "$path" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
path_has_mount() {
|
||||||
|
local root line mount_path
|
||||||
|
|
||||||
|
root="$(normalize_path "$1")" || return 2
|
||||||
|
[ -r /proc/self/mountinfo ] || return 2
|
||||||
|
|
||||||
|
while IFS= read -r line; do
|
||||||
|
mount_path="$(printf '%s\n' "$line" | cut -d ' ' -f 5)" || return 2
|
||||||
|
[ -n "$mount_path" ] || return 2
|
||||||
|
mount_path="$(printf '%b\n' "$mount_path" 2>/dev/null)" || return 2
|
||||||
|
mount_path="$(normalize_path "$mount_path")" || return 2
|
||||||
|
is_path_in_dir "$mount_path" "$root" && return 0
|
||||||
|
done < /proc/self/mountinfo
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
is_safe_db_dir() {
|
is_safe_db_dir() {
|
||||||
local path upload_root physical physical_upload_root
|
local path upload_root physical physical_upload_root
|
||||||
|
|
||||||
@@ -175,6 +193,58 @@ normalize_upload_dir() {
|
|||||||
changed=1
|
changed=1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
configured_path_in_legacy_upload() {
|
||||||
|
local option path resolved
|
||||||
|
|
||||||
|
for option in db_dir piddir crt_file key_file; do
|
||||||
|
path="$(uci -q get "gecoosac.config.${option}")"
|
||||||
|
[ -n "$path" ] || continue
|
||||||
|
path="$(normalize_path "$path")" || return 0
|
||||||
|
is_path_in_dir "$path" "$LEGACY_UPLOAD_DIR" && return 0
|
||||||
|
|
||||||
|
if [ -e "$path" ] || [ -L "$path" ]; then
|
||||||
|
resolved="$(readlink -f "$path" 2>/dev/null)" || return 0
|
||||||
|
resolved="$(normalize_path "$resolved")" || return 0
|
||||||
|
is_path_in_dir "$resolved" "$LEGACY_UPLOAD_DIR" && return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup_legacy_upload_dir() {
|
||||||
|
local mount_state
|
||||||
|
|
||||||
|
[ -e "$LEGACY_UPLOAD_DIR" ] || [ -L "$LEGACY_UPLOAD_DIR" ] || return 0
|
||||||
|
if [ ! -d "$LEGACY_UPLOAD_DIR" ] || [ -L "$LEGACY_UPLOAD_DIR" ]; then
|
||||||
|
logger -t gecoosac "refusing to remove unsafe legacy upload path: $LEGACY_UPLOAD_DIR"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if configured_path_in_legacy_upload; then
|
||||||
|
logger -t gecoosac "preserving legacy upload path referenced by configuration: $LEGACY_UPLOAD_DIR"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
path_has_mount "$LEGACY_UPLOAD_DIR"
|
||||||
|
mount_state="$?"
|
||||||
|
case "$mount_state" in
|
||||||
|
0)
|
||||||
|
logger -t gecoosac "preserving legacy upload path containing a mount: $LEGACY_UPLOAD_DIR"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
logger -t gecoosac "unable to validate legacy upload mounts: $LEGACY_UPLOAD_DIR"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
rm -rf "$LEGACY_UPLOAD_DIR" || {
|
||||||
|
logger -t gecoosac "failed to remove legacy upload path: $LEGACY_UPLOAD_DIR"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
[ ! -e "$LEGACY_UPLOAD_DIR" ] && [ ! -L "$LEGACY_UPLOAD_DIR" ]
|
||||||
|
}
|
||||||
|
|
||||||
normalize_dir_option() {
|
normalize_dir_option() {
|
||||||
local option="$1"
|
local option="$1"
|
||||||
local validator="$3"
|
local validator="$3"
|
||||||
@@ -208,8 +278,8 @@ is_regular_file_or_absent() {
|
|||||||
[ -f "$1" ] && [ ! -L "$1" ]
|
[ -f "$1" ] && [ ! -L "$1" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
migrate_legacy_cert_paths() {
|
migrate_default_certificates() {
|
||||||
local crt_file key_file old_crt old_key new_crt new_key path
|
local crt_file key_file path
|
||||||
|
|
||||||
crt_file="$(uci -q get gecoosac.config.crt_file)"
|
crt_file="$(uci -q get gecoosac.config.crt_file)"
|
||||||
key_file="$(uci -q get gecoosac.config.key_file)"
|
key_file="$(uci -q get gecoosac.config.key_file)"
|
||||||
@@ -223,39 +293,8 @@ migrate_legacy_cert_paths() {
|
|||||||
}
|
}
|
||||||
done
|
done
|
||||||
|
|
||||||
old_crt=0
|
# Managed certificates are regenerated when HTTPS next starts.
|
||||||
old_key=0
|
rm -f "$OLD_CRT_FILE" "$OLD_KEY_FILE" "$DEFAULT_CRT_FILE" "$DEFAULT_KEY_FILE" || return 1
|
||||||
new_crt=0
|
|
||||||
new_key=0
|
|
||||||
[ -f "$OLD_CRT_FILE" ] && old_crt=1
|
|
||||||
[ -f "$OLD_KEY_FILE" ] && old_key=1
|
|
||||||
[ -f "$DEFAULT_CRT_FILE" ] && new_crt=1
|
|
||||||
[ -f "$DEFAULT_KEY_FILE" ] && new_key=1
|
|
||||||
|
|
||||||
if { [ "$old_crt" = "1" ] && [ "$new_crt" = "1" ]; } || \
|
|
||||||
{ [ "$old_key" = "1" ] && [ "$new_key" = "1" ]; }; then
|
|
||||||
logger -t gecoosac "refusing conflicting legacy and current certificate files"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if [ "$old_crt" = "1" ] && [ "$new_key" = "1" ]; then
|
|
||||||
logger -t gecoosac "refusing reverse-split certificate migration state"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if [ $((old_crt + new_crt)) -ne $((old_key + new_key)) ]; then
|
|
||||||
logger -t gecoosac "refusing incomplete certificate migration state"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$old_crt" = "1" ]; then
|
|
||||||
mv "$OLD_CRT_FILE" "$DEFAULT_CRT_FILE" || return 1
|
|
||||||
fi
|
|
||||||
if [ "$old_key" = "1" ]; then
|
|
||||||
mv "$OLD_KEY_FILE" "$DEFAULT_KEY_FILE" || return 1
|
|
||||||
fi
|
|
||||||
if [ -f "$DEFAULT_CRT_FILE" ]; then
|
|
||||||
chmod 644 "$DEFAULT_CRT_FILE" || return 1
|
|
||||||
chmod 600 "$DEFAULT_KEY_FILE" || return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$crt_file" != "$DEFAULT_CRT_FILE" ]; then
|
if [ "$crt_file" != "$DEFAULT_CRT_FILE" ]; then
|
||||||
uci -q set "gecoosac.config.crt_file=${DEFAULT_CRT_FILE}" || return 1
|
uci -q set "gecoosac.config.crt_file=${DEFAULT_CRT_FILE}" || return 1
|
||||||
@@ -270,9 +309,10 @@ migrate_legacy_cert_paths() {
|
|||||||
migrate_config() {
|
migrate_config() {
|
||||||
local compat
|
local compat
|
||||||
|
|
||||||
migrate_legacy_cert_paths || return 1
|
|
||||||
compat="$(uci -q get gecoosac.config.config_compat)"
|
compat="$(uci -q get gecoosac.config.config_compat)"
|
||||||
[ "$compat" = "$CONFIG_COMPAT" ] && return 0
|
[ "$compat" = "$CONFIG_COMPAT" ] && return 0
|
||||||
|
migrate_default_certificates || return 1
|
||||||
|
cleanup_legacy_upload_dir || return 1
|
||||||
uci -q set "gecoosac.config.config_compat=${CONFIG_COMPAT}" || return 1
|
uci -q set "gecoosac.config.config_compat=${CONFIG_COMPAT}" || return 1
|
||||||
changed=1
|
changed=1
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -5,8 +5,8 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=hysteria
|
PKG_NAME:=hysteria
|
||||||
PKG_VERSION:=2.12.0
|
PKG_VERSION:=2.12.1
|
||||||
PKG_RELEASE:=14
|
PKG_RELEASE:=15
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
PKG_SOURCE_URL:=https://codeload.github.com/apernet/hysteria/tar.gz/app/v$(PKG_VERSION)?
|
PKG_SOURCE_URL:=https://codeload.github.com/apernet/hysteria/tar.gz/app/v$(PKG_VERSION)?
|
||||||
|
|||||||
@@ -6,8 +6,11 @@
|
|||||||
"/etc/init.d/fchomo reload *": [ "exec" ],
|
"/etc/init.d/fchomo reload *": [ "exec" ],
|
||||||
"/usr/libexec/fchomo/natcheck.sh": [ "exec" ],
|
"/usr/libexec/fchomo/natcheck.sh": [ "exec" ],
|
||||||
"/var/run/fchomo/fchomo.log": [ "read" ],
|
"/var/run/fchomo/fchomo.log": [ "read" ],
|
||||||
|
"/tmp/run/fchomo/fchomo.log": [ "read" ],
|
||||||
"/var/run/fchomo/mihomo-c.log": [ "read" ],
|
"/var/run/fchomo/mihomo-c.log": [ "read" ],
|
||||||
"/var/run/fchomo/mihomo-s.log": [ "read" ]
|
"/tmp/run/fchomo/mihomo-c.log": [ "read" ],
|
||||||
|
"/var/run/fchomo/mihomo-s.log": [ "read" ],
|
||||||
|
"/tmp/run/fchomo/mihomo-s.log": [ "read" ]
|
||||||
},
|
},
|
||||||
"ubus": {
|
"ubus": {
|
||||||
"service": [ "list" ],
|
"service": [ "list" ],
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=luci-app-gecoosac
|
PKG_NAME:=luci-app-gecoosac
|
||||||
PKG_VERSION:=2.2
|
PKG_VERSION:=2.2
|
||||||
PKG_RELEASE:=17
|
PKG_RELEASE:=18
|
||||||
|
|
||||||
LUCI_TITLE:=LuCI Support for gecoosac
|
LUCI_TITLE:=LuCI Support for gecoosac
|
||||||
LUCI_DEPENDS:=+luci-base +gecoosac
|
LUCI_DEPENDS:=+luci-base +gecoosac +gecoosac-files
|
||||||
LUCI_EXTRA_DEPENDS:=gecoosac (>=2.2.20251015-r4)
|
LUCI_EXTRA_DEPENDS:=gecoosac (>=2.2.20251015)
|
||||||
LUCI_PKGARCH:=all
|
LUCI_PKGARCH:=all
|
||||||
PKG_LICENSE:=AGPL-3.0-only
|
PKG_LICENSE:=AGPL-3.0-only
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ const RPC_ERROR_MESSAGES = {
|
|||||||
'Invalid service status response': _('Invalid service status response'),
|
'Invalid service status response': _('Invalid service status response'),
|
||||||
'Expecting an absolute path': _('Expecting an absolute path'),
|
'Expecting an absolute path': _('Expecting an absolute path'),
|
||||||
'Only Gecoos upload directories can be cleared': _('Only Gecoos upload directories can be cleared'),
|
'Only Gecoos upload directories can be cleared': _('Only Gecoos upload directories can be cleared'),
|
||||||
|
'Upload directory contains a mount point': _('Upload directory contains a mount point'),
|
||||||
'Upload directory or its parent is not root-owned and private': _('Upload directory or its parent is not root-owned and private'),
|
'Upload directory or its parent is not root-owned and private': _('Upload directory or its parent is not root-owned and private'),
|
||||||
'Unable to resolve upload directory': _('Unable to resolve upload directory'),
|
'Unable to resolve upload directory': _('Unable to resolve upload directory'),
|
||||||
'Unable to read Gecoos configuration': _('Unable to read Gecoos configuration'),
|
'Unable to read Gecoos configuration': _('Unable to read Gecoos configuration'),
|
||||||
|
|||||||
@@ -139,6 +139,9 @@ msgstr "请输入绝对路径"
|
|||||||
msgid "Only Gecoos upload directories can be cleared"
|
msgid "Only Gecoos upload directories can be cleared"
|
||||||
msgstr "只能清理集客 AC 上传目录"
|
msgstr "只能清理集客 AC 上传目录"
|
||||||
|
|
||||||
|
msgid "Upload directory contains a mount point"
|
||||||
|
msgstr "上传目录包含挂载点"
|
||||||
|
|
||||||
msgid "Upload directory was not cleared"
|
msgid "Upload directory was not cleared"
|
||||||
msgstr "上传目录未清理"
|
msgstr "上传目录未清理"
|
||||||
|
|
||||||
|
|||||||
@@ -139,6 +139,9 @@ msgstr "請輸入絕對路徑"
|
|||||||
msgid "Only Gecoos upload directories can be cleared"
|
msgid "Only Gecoos upload directories can be cleared"
|
||||||
msgstr "只能清除集客 AC 上傳目錄"
|
msgstr "只能清除集客 AC 上傳目錄"
|
||||||
|
|
||||||
|
msgid "Upload directory contains a mount point"
|
||||||
|
msgstr "上傳目錄包含掛載點"
|
||||||
|
|
||||||
msgid "Upload directory was not cleared"
|
msgid "Upload directory was not cleared"
|
||||||
msgstr "上傳目錄未清除"
|
msgstr "上傳目錄未清除"
|
||||||
|
|
||||||
|
|||||||
@@ -129,6 +129,23 @@ path_in_dir() {
|
|||||||
[ "${path#"$root"/}" != "$path" ]
|
[ "${path#"$root"/}" != "$path" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
path_has_mount() {
|
||||||
|
local root line mount_path
|
||||||
|
|
||||||
|
root="$(normalize_path "$1")" || return 2
|
||||||
|
[ -r /proc/self/mountinfo ] || return 2
|
||||||
|
|
||||||
|
while IFS= read -r line; do
|
||||||
|
mount_path="$(printf '%s\n' "$line" | cut -d ' ' -f 5)" || return 2
|
||||||
|
[ -n "$mount_path" ] || return 2
|
||||||
|
mount_path="$(printf '%b\n' "$mount_path" 2>/dev/null)" || return 2
|
||||||
|
mount_path="$(normalize_path "$mount_path")" || return 2
|
||||||
|
path_in_dir "$mount_path" "$root" && return 0
|
||||||
|
done < /proc/self/mountinfo
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
is_secure_dir() {
|
is_secure_dir() {
|
||||||
local allow_sticky="$2" owner permissions metadata
|
local allow_sticky="$2" owner permissions metadata
|
||||||
|
|
||||||
@@ -339,6 +356,49 @@ restore_staged_upload() {
|
|||||||
rmdir "$stage" 2>/dev/null
|
rmdir "$stage" 2>/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clear_upload_rollback_result() {
|
||||||
|
local stage="$1" live="$2" message="$3" path="$4"
|
||||||
|
|
||||||
|
if [ -n "$stage" ] && ! restore_staged_upload "$stage" "$live"; then
|
||||||
|
logger -t gecoosac "upload cleanup retained staged data at $stage"
|
||||||
|
path="$stage"
|
||||||
|
fi
|
||||||
|
clear_upload_locked_result 0 "$message" "$path"
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_upload_error_result() {
|
||||||
|
local message="$1" path="$2"
|
||||||
|
|
||||||
|
if [ -n "$stage" ]; then
|
||||||
|
clear_upload_rollback_result "$stage" "$physical" "$message" "$path"
|
||||||
|
else
|
||||||
|
clear_upload_locked_result 0 "$message" "$path"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_clear_stage() {
|
||||||
|
local candidate="$1" mount_state
|
||||||
|
|
||||||
|
clear_stage_error=
|
||||||
|
if [ -e "$candidate/upload" ] || [ -L "$candidate/upload" ]; then
|
||||||
|
path_has_mount "$candidate/upload"
|
||||||
|
mount_state="$?"
|
||||||
|
case "$mount_state" in
|
||||||
|
0) clear_stage_error="Upload directory contains a mount point"; return 1 ;;
|
||||||
|
2) clear_stage_error="Unable to validate upload cleanup stage"; return 1 ;;
|
||||||
|
esac
|
||||||
|
rm -rf "$candidate/upload" || {
|
||||||
|
logger -t gecoosac "upload cleanup retained staged data at $candidate"
|
||||||
|
clear_stage_error="Unable to remove upload directory contents"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
rmdir "$candidate" || {
|
||||||
|
clear_stage_error="Unable to remove upload cleanup stage"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
validate_clear_protected_paths() {
|
validate_clear_protected_paths() {
|
||||||
local root="$1" live_logical="${2:-$1}" live_physical="${3:-$1}" option
|
local root="$1" live_logical="${2:-$1}" live_physical="${3:-$1}" option
|
||||||
|
|
||||||
@@ -354,7 +414,7 @@ validate_clear_protected_paths() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
clear_upload() {
|
clear_upload() {
|
||||||
local logical physical resolved parent stage candidate stages live_exists current
|
local logical physical resolved parent stage candidate stages live_exists current clear_stage_error
|
||||||
local clear_upload_dir clear_db_dir clear_piddir clear_crt_file clear_key_file
|
local clear_upload_dir clear_db_dir clear_piddir clear_crt_file clear_key_file
|
||||||
local initial_upload initial_db initial_pid initial_crt initial_key
|
local initial_upload initial_db initial_pid initial_crt initial_key
|
||||||
|
|
||||||
@@ -459,6 +519,11 @@ clear_upload() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if [ -e "$candidate/upload" ] || [ -L "$candidate/upload" ]; then
|
if [ -e "$candidate/upload" ] || [ -L "$candidate/upload" ]; then
|
||||||
|
path_has_mount "$candidate/upload"
|
||||||
|
case "$?" in
|
||||||
|
0) clear_upload_locked_result 0 "Upload directory contains a mount point" "$candidate"; return ;;
|
||||||
|
2) clear_upload_locked_result 0 "Unable to validate upload cleanup stage" "$candidate"; return ;;
|
||||||
|
esac
|
||||||
validate_clear_protected_paths "$candidate/upload" "$logical" "$physical"
|
validate_clear_protected_paths "$candidate/upload" "$logical" "$physical"
|
||||||
case "$?" in
|
case "$?" in
|
||||||
0) clear_upload_locked_result 0 "Upload cleanup stage contains a configured protected path" "$candidate"; return ;;
|
0) clear_upload_locked_result 0 "Upload cleanup stage contains a configured protected path" "$candidate"; return ;;
|
||||||
@@ -474,6 +539,13 @@ clear_upload() {
|
|||||||
clear_upload_locked_result 0 "Upload directory or its parent is not root-owned and private" "$logical"
|
clear_upload_locked_result 0 "Upload directory or its parent is not root-owned and private" "$logical"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
if [ "$live_exists" = "1" ]; then
|
||||||
|
path_has_mount "$physical"
|
||||||
|
case "$?" in
|
||||||
|
0) clear_upload_locked_result 0 "Upload directory contains a mount point" "$logical"; return ;;
|
||||||
|
2) clear_upload_locked_result 0 "Unable to validate upload cleanup stage" "$logical"; return ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
if [ "$live_exists" = "0" ] && [ "$stages" = "0" ]; then
|
if [ "$live_exists" = "0" ] && [ "$stages" = "0" ]; then
|
||||||
clear_upload_locked_result 1 "" "$logical"
|
clear_upload_locked_result 1 "" "$logical"
|
||||||
return
|
return
|
||||||
@@ -520,7 +592,7 @@ clear_upload() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
load_clear_config || {
|
load_clear_config || {
|
||||||
clear_upload_locked_result 0 "Unable to read Gecoos configuration" "$logical"
|
clear_upload_rollback_result "$stage" "$physical" "Unable to read Gecoos configuration" "$logical"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if [ "$clear_upload_dir" != "$initial_upload" ] || \
|
if [ "$clear_upload_dir" != "$initial_upload" ] || \
|
||||||
@@ -528,38 +600,42 @@ clear_upload() {
|
|||||||
[ "$clear_piddir" != "$initial_pid" ] || \
|
[ "$clear_piddir" != "$initial_pid" ] || \
|
||||||
[ "$clear_crt_file" != "$initial_crt" ] || \
|
[ "$clear_crt_file" != "$initial_crt" ] || \
|
||||||
[ "$clear_key_file" != "$initial_key" ]; then
|
[ "$clear_key_file" != "$initial_key" ]; then
|
||||||
clear_upload_locked_result 0 "Gecoos configuration changed during cleanup" "$logical"
|
clear_upload_rollback_result "$stage" "$physical" "Gecoos configuration changed during cleanup" "$logical"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
for candidate in "$parent"/.gecoosac-clear.??????; do
|
for candidate in "$parent"/.gecoosac-clear.??????; do
|
||||||
[ "$candidate" != "$parent/.gecoosac-clear.??????" ] || continue
|
[ "$candidate" != "$parent/.gecoosac-clear.??????" ] || continue
|
||||||
is_safe_clear_stage "$candidate" || {
|
is_safe_clear_stage "$candidate" || {
|
||||||
clear_upload_locked_result 0 "Unable to validate upload cleanup stage" "$candidate"
|
clear_upload_error_result "Unable to validate upload cleanup stage" "$candidate"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if [ -e "$candidate/upload" ] || [ -L "$candidate/upload" ]; then
|
if [ -e "$candidate/upload" ] || [ -L "$candidate/upload" ]; then
|
||||||
|
path_has_mount "$candidate/upload"
|
||||||
|
case "$?" in
|
||||||
|
0) clear_upload_error_result "Upload directory contains a mount point" "$candidate"; return ;;
|
||||||
|
2) clear_upload_error_result "Unable to validate upload cleanup stage" "$candidate"; return ;;
|
||||||
|
esac
|
||||||
validate_clear_protected_paths "$candidate/upload" "$logical" "$physical"
|
validate_clear_protected_paths "$candidate/upload" "$logical" "$physical"
|
||||||
case "$?" in
|
case "$?" in
|
||||||
0) clear_upload_locked_result 0 "Upload cleanup stage contains a configured protected path" "$candidate"; return ;;
|
0) clear_upload_error_result "Upload cleanup stage contains a configured protected path" "$candidate"; return ;;
|
||||||
1) ;;
|
1) ;;
|
||||||
*) clear_upload_locked_result 0 "Unable to validate configured paths" "$candidate"; return ;;
|
*) clear_upload_error_result "Unable to validate configured paths" "$candidate"; return ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
for candidate in "$parent"/.gecoosac-clear.??????; do
|
for candidate in "$parent"/.gecoosac-clear.??????; do
|
||||||
[ "$candidate" != "$parent/.gecoosac-clear.??????" ] || continue
|
[ "$candidate" != "$parent/.gecoosac-clear.??????" ] || continue
|
||||||
if [ -e "$candidate/upload" ] || [ -L "$candidate/upload" ]; then
|
[ "$candidate" = "$stage" ] && continue
|
||||||
rm -rf "$candidate/upload" || {
|
if ! remove_clear_stage "$candidate"; then
|
||||||
logger -t gecoosac "upload cleanup retained staged data at $candidate"
|
clear_upload_error_result "$clear_stage_error" "$candidate"
|
||||||
clear_upload_locked_result 0 "Unable to remove upload directory contents" "$logical"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
rmdir "$candidate" || {
|
|
||||||
clear_upload_locked_result 0 "Unable to remove upload cleanup stage" "$candidate"
|
|
||||||
return
|
return
|
||||||
}
|
fi
|
||||||
done
|
done
|
||||||
|
if [ -n "$stage" ] && ! remove_clear_stage "$stage"; then
|
||||||
|
clear_upload_error_result "$clear_stage_error" "$stage"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
stage=
|
||||||
|
|
||||||
clear_upload_locked_result 1 "" "$logical"
|
clear_upload_locked_result 1 "" "$logical"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
"/etc/natmap/ddns": [ "list" ],
|
"/etc/natmap/ddns": [ "list" ],
|
||||||
"/etc/init.d/natmap reload *": [ "exec" ],
|
"/etc/init.d/natmap reload *": [ "exec" ],
|
||||||
"/var/run/natmap/*": [ "read" ],
|
"/var/run/natmap/*": [ "read" ],
|
||||||
|
"/tmp/run/natmap/*": [ "read" ],
|
||||||
"/tmp/natmap-natBehavior": [ "read" ],
|
"/tmp/natmap-natBehavior": [ "read" ],
|
||||||
"/usr/libexec/natmap/natcheck.sh": [ "exec" ]
|
"/usr/libexec/natmap/natcheck.sh": [ "exec" ]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -6,9 +6,13 @@
|
|||||||
"/etc/init.d/packagesync": [ "exec" ],
|
"/etc/init.d/packagesync": [ "exec" ],
|
||||||
"/bin/df -hT": [ "exec" ],
|
"/bin/df -hT": [ "exec" ],
|
||||||
"/var/packagesync/releaseslist": [ "read" ],
|
"/var/packagesync/releaseslist": [ "read" ],
|
||||||
|
"/tmp/packagesync/releaseslist": [ "read" ],
|
||||||
"/var/packagesync/targetslist": [ "read" ],
|
"/var/packagesync/targetslist": [ "read" ],
|
||||||
|
"/tmp/packagesync/targetslist": [ "read" ],
|
||||||
"/var/packagesync/pkgarchslist": [ "read" ],
|
"/var/packagesync/pkgarchslist": [ "read" ],
|
||||||
"/var/run/packagesync.pid": [ "read" ]
|
"/tmp/packagesync/pkgarchslist": [ "read" ],
|
||||||
|
"/var/run/packagesync.pid": [ "read" ],
|
||||||
|
"/tmp/run/packagesync.pid": [ "read" ]
|
||||||
},
|
},
|
||||||
"ubus": {
|
"ubus": {
|
||||||
"service": [ "list" ]
|
"service": [ "list" ]
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=luci-app-passwall
|
PKG_NAME:=luci-app-passwall
|
||||||
PKG_VERSION:=26.8.1
|
PKG_VERSION:=26.8.1
|
||||||
PKG_RELEASE:=206
|
PKG_RELEASE:=207
|
||||||
PKG_PO_VERSION:=$(PKG_VERSION)
|
PKG_PO_VERSION:=$(PKG_VERSION)
|
||||||
|
|
||||||
PKG_CONFIG_DEPENDS:= \
|
PKG_CONFIG_DEPENDS:= \
|
||||||
|
|||||||
@@ -572,22 +572,22 @@ end
|
|||||||
function add_node()
|
function add_node()
|
||||||
local redirect = http.formvalue("redirect")
|
local redirect = http.formvalue("redirect")
|
||||||
|
|
||||||
local uuid = api.gen_short_uuid()
|
local uid = api.gen_random_char()
|
||||||
uci:section(appname, "nodes", uuid)
|
uci:section(appname, "nodes", uid)
|
||||||
|
|
||||||
local group = http.formvalue("group")
|
local group = http.formvalue("group")
|
||||||
if group and group ~= "default" then
|
if group and group ~= "default" then
|
||||||
uci:set(appname, uuid, "group", group)
|
uci:set(appname, uid, "group", group)
|
||||||
end
|
end
|
||||||
|
|
||||||
uci:set(appname, uuid, "type", "Socks")
|
uci:set(appname, uid, "type", "Socks")
|
||||||
|
|
||||||
if redirect == "1" then
|
if redirect == "1" then
|
||||||
api.uci_save(uci, appname)
|
api.uci_save(uci, appname)
|
||||||
http.redirect(api.url("node_config", uuid))
|
http.redirect(api.url("node_config", uid))
|
||||||
else
|
else
|
||||||
api.uci_save(uci, appname, true, true)
|
api.uci_save(uci, appname, true, true)
|
||||||
http_write_json({result = uuid})
|
http_write_json({result = uid})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -615,17 +615,17 @@ end
|
|||||||
|
|
||||||
function copy_node()
|
function copy_node()
|
||||||
local section = http.formvalue("section")
|
local section = http.formvalue("section")
|
||||||
local uuid = api.gen_short_uuid()
|
local uid = api.gen_random_char()
|
||||||
uci:section(appname, "nodes", uuid)
|
uci:section(appname, "nodes", uid)
|
||||||
for k, v in pairs(uci:get_all(appname, section)) do
|
for k, v in pairs(uci:get_all(appname, section)) do
|
||||||
if not k:match("^%.") and k ~= "group" then
|
if not k:match("^%.") and k ~= "group" then
|
||||||
if k == "remarks" then v = (v or "") .. "(1)" end
|
if k == "remarks" then v = (v or "") .. "(1)" end
|
||||||
uci:set(appname, uuid, k, v)
|
uci:set(appname, uid, k, v)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
uci:set(appname, uuid, "add_mode", 1)
|
uci:set(appname, uid, "add_mode", 1)
|
||||||
api.uci_save(uci, appname)
|
api.uci_save(uci, appname)
|
||||||
http.redirect(api.url("node_config", uuid))
|
http.redirect(api.url("node_config", uid))
|
||||||
end
|
end
|
||||||
|
|
||||||
function clear_all_nodes()
|
function clear_all_nodes()
|
||||||
@@ -1242,29 +1242,29 @@ function add_shunt_rule()
|
|||||||
local add_name = http.formvalue("add_name")
|
local add_name = http.formvalue("add_name")
|
||||||
local redirect = http.formvalue("redirect")
|
local redirect = http.formvalue("redirect")
|
||||||
|
|
||||||
local uuid = add_name
|
local uid = add_name
|
||||||
if add_name then
|
if add_name then
|
||||||
local has = uci:get(appname, uuid)
|
local has = uci:get(appname, uid)
|
||||||
if has then
|
if has then
|
||||||
http_write_json_error({ message = "This ID already exists." })
|
http_write_json_error({ message = "This ID already exists." })
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
uuid = api.gen_short_uuid()
|
uid = api.gen_random_char()
|
||||||
end
|
end
|
||||||
uci:section(appname, "shunt_rules", uuid)
|
uci:section(appname, "shunt_rules", uid)
|
||||||
|
|
||||||
local group = http.formvalue("group")
|
local group = http.formvalue("group")
|
||||||
if group and group ~= "default" then
|
if group and group ~= "default" then
|
||||||
uci:set(appname, uuid, "group", group)
|
uci:set(appname, uid, "group", group)
|
||||||
end
|
end
|
||||||
|
|
||||||
if redirect == "1" then
|
if redirect == "1" then
|
||||||
api.uci_save(uci, appname)
|
api.uci_save(uci, appname)
|
||||||
http.redirect(api.url("shunt_rules", uuid))
|
http.redirect(api.url("shunt_rules", uid))
|
||||||
else
|
else
|
||||||
api.uci_save(uci, appname)
|
api.uci_save(uci, appname)
|
||||||
http_write_json_ok({uuid = uuid, redirect_url = api.url("shunt_rules", uuid)})
|
http_write_json_ok({uid = uid, redirect_url = api.url("shunt_rules", uid)})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -23,8 +23,9 @@ s.anonymous = true
|
|||||||
s.addremove = true
|
s.addremove = true
|
||||||
s.extedit = api.url("acl_config", "%s")
|
s.extedit = api.url("acl_config", "%s")
|
||||||
function s.create(e, t)
|
function s.create(e, t)
|
||||||
t = TypedSection.create(e, t)
|
local uid = "acl_" .. api.gen_random_char(5)
|
||||||
luci.http.redirect(e.extedit:format(t))
|
TypedSection.create(e, uid)
|
||||||
|
luci.http.redirect(e.extedit:format(uid))
|
||||||
end
|
end
|
||||||
function s.remove(e, t)
|
function s.remove(e, t)
|
||||||
sys.call("rm -rf /tmp/etc/passwall_tmp/dns_" .. t .. "*")
|
sys.call("rm -rf /tmp/etc/passwall_tmp/dns_" .. t .. "*")
|
||||||
@@ -48,6 +49,15 @@ sys.net.mac_hints(function(e, t)
|
|||||||
}
|
}
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
i = s:option(DummyValue, "interface", translate("Source Interface"))
|
||||||
|
i.cfgvalue = function(t, n)
|
||||||
|
local v = Value.cfgvalue(t, n) or ''
|
||||||
|
if v == "" then
|
||||||
|
return translate("All")
|
||||||
|
end
|
||||||
|
return v
|
||||||
|
end
|
||||||
|
|
||||||
o = s:option(DummyValue, "sources", translate("Source"))
|
o = s:option(DummyValue, "sources", translate("Source"))
|
||||||
o.rawhtml = true
|
o.rawhtml = true
|
||||||
o.cfgvalue = function(t, n)
|
o.cfgvalue = function(t, n)
|
||||||
@@ -66,10 +76,13 @@ o.cfgvalue = function(t, n)
|
|||||||
return e
|
return e
|
||||||
end
|
end
|
||||||
|
|
||||||
o = s:option(DummyValue, "interface", translate("Source Interface"))
|
i = s:option(DummyValue, "mode", translate("Mode"))
|
||||||
o.cfgvalue = function(t, n)
|
i.cfgvalue = function(t, n)
|
||||||
local v = Value.cfgvalue(t, n) or '-'
|
local v = Value.cfgvalue(t, n) or '0'
|
||||||
return v
|
if v == "1" then
|
||||||
|
return translate("Proxy")
|
||||||
|
end
|
||||||
|
return translate("No Proxy")
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
|
|||||||
@@ -84,19 +84,6 @@ o = s:option(Value, "remarks", translate("Remarks"))
|
|||||||
o.default = cfgid
|
o.default = cfgid
|
||||||
o.rmempty = false
|
o.rmempty = false
|
||||||
|
|
||||||
---- Log
|
|
||||||
o = s:option(Flag, "log", translate("Log"))
|
|
||||||
o.default = 0
|
|
||||||
o.rmempty = false
|
|
||||||
|
|
||||||
o = s:option(ListValue, "loglevel", "Sing-Box/Xray " .. translate("Log Level"))
|
|
||||||
o.default = "warning"
|
|
||||||
o:value("debug")
|
|
||||||
o:value("info")
|
|
||||||
o:value("warning")
|
|
||||||
o:value("error")
|
|
||||||
o:depends("log", "1")
|
|
||||||
|
|
||||||
o = s:option(Value, "interface", translate("Source Interface"))
|
o = s:option(Value, "interface", translate("Source Interface"))
|
||||||
o:value("", translate("All"))
|
o:value("", translate("All"))
|
||||||
local iface = api.get_network_devices()
|
local iface = api.get_network_devices()
|
||||||
@@ -196,12 +183,17 @@ sources.validate = function(self, value, t)
|
|||||||
end
|
end
|
||||||
sources.write = dynamicList_write
|
sources.write = dynamicList_write
|
||||||
|
|
||||||
|
o = s:option(ListValue, "mode", translate("Mode"))
|
||||||
|
o:value("0", translate("No Proxy"))
|
||||||
|
o:value("1", translate("Proxy"))
|
||||||
|
|
||||||
---- TCP No Redir Ports
|
---- TCP No Redir Ports
|
||||||
local TCP_NO_REDIR_PORTS = m:get("@global_forwarding[0]", "tcp_no_redir_ports")
|
local TCP_NO_REDIR_PORTS = m:get("@global_forwarding[0]", "tcp_no_redir_ports")
|
||||||
o = s:option(Value, "tcp_no_redir_ports", translate("TCP No Redir Ports"))
|
o = s:option(Value, "tcp_no_redir_ports", translate("TCP No Redir Ports"))
|
||||||
o:value("", translate("Use global config") .. "(" .. TCP_NO_REDIR_PORTS .. ")")
|
o:value("", translate("Use global config") .. "(" .. TCP_NO_REDIR_PORTS .. ")")
|
||||||
o:value("disable", translate("No patterns are used"))
|
o:value("disable", translate("No patterns are used"))
|
||||||
o:value("1:65535", translate("All"))
|
o:value("1:65535", translate("All"))
|
||||||
|
o:depends("mode", "1")
|
||||||
o.validate = port_validate
|
o.validate = port_validate
|
||||||
|
|
||||||
---- UDP No Redir Ports
|
---- UDP No Redir Ports
|
||||||
@@ -213,11 +205,13 @@ o = s:option(Value, "udp_no_redir_ports", translate("UDP No Redir Ports"),
|
|||||||
o:value("", translate("Use global config") .. "(" .. UDP_NO_REDIR_PORTS .. ")")
|
o:value("", translate("Use global config") .. "(" .. UDP_NO_REDIR_PORTS .. ")")
|
||||||
o:value("disable", translate("No patterns are used"))
|
o:value("disable", translate("No patterns are used"))
|
||||||
o:value("1:65535", translate("All"))
|
o:value("1:65535", translate("All"))
|
||||||
|
o:depends("mode", "1")
|
||||||
o.validate = port_validate
|
o.validate = port_validate
|
||||||
|
|
||||||
o = s:option(DummyValue, "_hide_node_option", "")
|
o = s:option(DummyValue, "_hide_node_option", "")
|
||||||
o.template = "passwall/cbi/hidevalue"
|
o.template = "passwall/cbi/hidevalue"
|
||||||
o.value = "1"
|
o.value = "1"
|
||||||
|
o:depends("mode", "0")
|
||||||
o:depends({ tcp_no_redir_ports = "1:65535", udp_no_redir_ports = "1:65535" })
|
o:depends({ tcp_no_redir_ports = "1:65535", udp_no_redir_ports = "1:65535" })
|
||||||
if TCP_NO_REDIR_PORTS == "1:65535" and UDP_NO_REDIR_PORTS == "1:65535" then
|
if TCP_NO_REDIR_PORTS == "1:65535" and UDP_NO_REDIR_PORTS == "1:65535" then
|
||||||
o:depends({ tcp_no_redir_ports = "", udp_no_redir_ports = "" })
|
o:depends({ tcp_no_redir_ports = "", udp_no_redir_ports = "" })
|
||||||
@@ -280,6 +274,20 @@ o.value = "1"
|
|||||||
o:depends({ udp_node = "", ['!reverse'] = true })
|
o:depends({ udp_node = "", ['!reverse'] = true })
|
||||||
o:depends({ shunt_udp_node = "tcp" })
|
o:depends({ shunt_udp_node = "tcp" })
|
||||||
|
|
||||||
|
---- Log
|
||||||
|
o = s:option(Flag, "log", translate("Enable Node Log"))
|
||||||
|
o.default = 0
|
||||||
|
o.rmempty = false
|
||||||
|
o:depends({ _hide_node_option = false, use_global_config = false })
|
||||||
|
|
||||||
|
o = s:option(ListValue, "loglevel", "Sing-Box/Xray " .. translate("Log Level"))
|
||||||
|
o.default = "warn"
|
||||||
|
o:value("debug", "Debug")
|
||||||
|
o:value("info", "Info")
|
||||||
|
o:value("warn", "Warning")
|
||||||
|
o:value("error", "Error")
|
||||||
|
o:depends("log", "1")
|
||||||
|
|
||||||
---- TCP Proxy Drop Ports
|
---- TCP Proxy Drop Ports
|
||||||
local TCP_PROXY_DROP_PORTS = m:get("@global_forwarding[0]", "tcp_proxy_drop_ports")
|
local TCP_PROXY_DROP_PORTS = m:get("@global_forwarding[0]", "tcp_proxy_drop_ports")
|
||||||
o = s:option(Value, "tcp_proxy_drop_ports", translate("TCP Proxy Drop Ports"))
|
o = s:option(Value, "tcp_proxy_drop_ports", translate("TCP Proxy Drop Ports"))
|
||||||
|
|||||||
@@ -689,11 +689,11 @@ o.default = "0"
|
|||||||
o.rmempty = false
|
o.rmempty = false
|
||||||
|
|
||||||
o = s:taboption("log", ListValue, "loglevel", "Sing-Box/Xray " .. translate("Log Level"))
|
o = s:taboption("log", ListValue, "loglevel", "Sing-Box/Xray " .. translate("Log Level"))
|
||||||
o.default = "warning"
|
o.default = "warn"
|
||||||
o:value("debug")
|
o:value("debug", "Debug")
|
||||||
o:value("info")
|
o:value("info", "Info")
|
||||||
o:value("warning")
|
o:value("warn", "Warning")
|
||||||
o:value("error")
|
o:value("error", "Error")
|
||||||
|
|
||||||
o = s:taboption("log", Flag, "advanced_log_feature", translate("Advanced log feature"), translate("For professionals only."))
|
o = s:taboption("log", Flag, "advanced_log_feature", translate("Advanced log feature"), translate("For professionals only."))
|
||||||
o.default = "0"
|
o.default = "0"
|
||||||
@@ -735,10 +735,9 @@ s2.anonymous = true
|
|||||||
s2.addremove = true
|
s2.addremove = true
|
||||||
s2.extedit = api.url("socks_config", "%s")
|
s2.extedit = api.url("socks_config", "%s")
|
||||||
function s2.create(e, t)
|
function s2.create(e, t)
|
||||||
local uuid = api.gen_short_uuid(5)
|
local uid = "socks_" .. api.gen_random_char(5)
|
||||||
uuid = "socks_" .. uuid
|
TypedSection.create(e, uid)
|
||||||
TypedSection.create(e, uuid)
|
luci.http.redirect(e.extedit:format(uid))
|
||||||
luci.http.redirect(e.extedit:format(uuid))
|
|
||||||
end
|
end
|
||||||
function s2.remove(e, t)
|
function s2.remove(e, t)
|
||||||
local socks = "Socks_" .. t
|
local socks = "Socks_" .. t
|
||||||
|
|||||||
@@ -114,9 +114,8 @@ s.anonymous = true
|
|||||||
s.addremove = true
|
s.addremove = true
|
||||||
|
|
||||||
s.create = function(e, t)
|
s.create = function(e, t)
|
||||||
local uuid = api.gen_short_uuid(5)
|
local uid = "haproxy_" .. api.gen_random_char(5)
|
||||||
uuid = "haproxy_" .. uuid
|
TypedSection.create(e, uid)
|
||||||
TypedSection.create(e, uuid)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
s.remove = function(self, section)
|
s.remove = function(self, section)
|
||||||
|
|||||||
@@ -138,11 +138,11 @@ s.template = "cbi/tblsection"
|
|||||||
s.extedit = api.url("node_subscribe_config", "%s")
|
s.extedit = api.url("node_subscribe_config", "%s")
|
||||||
function s.create(e, t)
|
function s.create(e, t)
|
||||||
m.no_commit = true
|
m.no_commit = true
|
||||||
local id = TypedSection.create(e, t)
|
local uid = "sub_" .. api.gen_random_char(5)
|
||||||
uci:set(appname, id, "hysteria_up_mbps", "100")
|
TypedSection.create(e, uid)
|
||||||
uci:set(appname, id, "hysteria_down_mbps", "100")
|
m:set(uid, "hysteria_up_mbps", "100")
|
||||||
api.uci_save(uci, appname)
|
m:set(uid, "hysteria_down_mbps", "100")
|
||||||
luci.http.redirect(e.extedit:format(id))
|
luci.http.redirect(e.extedit:format(uid))
|
||||||
end
|
end
|
||||||
|
|
||||||
o = s:option(Value, "remark", translate("Remarks"))
|
o = s:option(Value, "remark", translate("Remarks"))
|
||||||
|
|||||||
@@ -222,9 +222,8 @@ if has_xray then
|
|||||||
s_xray_noise.addremove = true
|
s_xray_noise.addremove = true
|
||||||
|
|
||||||
s_xray_noise.create = function(e, t)
|
s_xray_noise.create = function(e, t)
|
||||||
local uuid = api.gen_short_uuid(5)
|
local uid = "xray_noise_" .. api.gen_random_char(5)
|
||||||
uuid = "xray_noise_" .. uuid
|
TypedSection.create(e, uid)
|
||||||
TypedSection.create(e, uuid)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
s_xray_noise.remove = function(self, section)
|
s_xray_noise.remove = function(self, section)
|
||||||
|
|||||||
@@ -513,6 +513,9 @@ o.default = "chrome"
|
|||||||
o:depends({ [_n("tls")] = true, [_n("utls")] = true })
|
o:depends({ [_n("tls")] = true, [_n("utls")] = true })
|
||||||
o:depends({ [_n("tls")] = true, [_n("reality")] = true })
|
o:depends({ [_n("tls")] = true, [_n("reality")] = true })
|
||||||
|
|
||||||
|
o = s:option(Value, _n("cipherSuites"), translate("Cipher Suites"), '<a href="https://go.dev/src/crypto/tls/cipher_suites.go#L44" target="_blank">***</a>' .. " " .. translate("Configures the list of supported cipher suites, separated by :"))
|
||||||
|
o:depends({ [_n("tls")] = true, [_n("reality")] = false })
|
||||||
|
|
||||||
o = s:option(Flag, _n("use_mldsa65Verify"), translate("ML-DSA-65"))
|
o = s:option(Flag, _n("use_mldsa65Verify"), translate("ML-DSA-65"))
|
||||||
o.default = "0"
|
o.default = "0"
|
||||||
o:depends({ [_n("tls")] = true, [_n("reality")] = true })
|
o:depends({ [_n("tls")] = true, [_n("reality")] = true })
|
||||||
|
|||||||
@@ -536,6 +536,9 @@ o.validate = function(self, value)
|
|||||||
return value
|
return value
|
||||||
end
|
end
|
||||||
|
|
||||||
|
o = s:option(Value, _n("cipherSuites"), translate("Cipher Suites"), '<a href="https://go.dev/src/crypto/tls/cipher_suites.go#L44" target="_blank">***</a>' .. " " .. translate("Configures the list of supported cipher suites, separated by :"))
|
||||||
|
o:depends({ [_n("tls")] = true })
|
||||||
|
|
||||||
o = s:option(Flag, _n("ech"), translate("ECH"))
|
o = s:option(Flag, _n("ech"), translate("ECH"))
|
||||||
o.default = "0"
|
o.default = "0"
|
||||||
o:depends({ [_n("tls")] = true, [_n("flow")] = "", [_n("reality")] = false })
|
o:depends({ [_n("tls")] = true, [_n("flow")] = "", [_n("reality")] = false })
|
||||||
|
|||||||
@@ -26,10 +26,9 @@ t.sortable = true
|
|||||||
t.template = "cbi/tblsection"
|
t.template = "cbi/tblsection"
|
||||||
t.extedit = api.url("server_user", "%s")
|
t.extedit = api.url("server_user", "%s")
|
||||||
function t.create(e, t)
|
function t.create(e, t)
|
||||||
local uuid = api.gen_uuid()
|
local uid = api.gen_random_char()
|
||||||
t = uuid
|
TypedSection.create(e, uid)
|
||||||
TypedSection.create(e, t)
|
luci.http.redirect(e.extedit:format(uid))
|
||||||
luci.http.redirect(e.extedit:format(t))
|
|
||||||
end
|
end
|
||||||
function t.remove(e, t)
|
function t.remove(e, t)
|
||||||
e.map.proceed = true
|
e.map.proceed = true
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ o:depends({ [_n("protocol")] = "socks" })
|
|||||||
|
|
||||||
o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password"))
|
o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password"))
|
||||||
for i = 1, 3 do
|
for i = 1, 3 do
|
||||||
o:value(api.gen_uuid(1))
|
o:value(api.gen_uuid())
|
||||||
end
|
end
|
||||||
o:depends({ [_n("protocol")] = "vmess" })
|
o:depends({ [_n("protocol")] = "vmess" })
|
||||||
o:depends({ [_n("protocol")] = "vless" })
|
o:depends({ [_n("protocol")] = "vless" })
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ o:depends({ [_n("protocol")] = "shadowsocks" })
|
|||||||
|
|
||||||
o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password"))
|
o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password"))
|
||||||
for i = 1, 3 do
|
for i = 1, 3 do
|
||||||
o:value(api.gen_uuid(1))
|
o:value(api.gen_uuid())
|
||||||
end
|
end
|
||||||
o:depends({ [_n("protocol")] = "vmess" })
|
o:depends({ [_n("protocol")] = "vmess" })
|
||||||
o:depends({ [_n("protocol")] = "vless" })
|
o:depends({ [_n("protocol")] = "vless" })
|
||||||
|
|||||||
@@ -642,15 +642,12 @@ function get_full_node_remarks(n)
|
|||||||
return remarks
|
return remarks
|
||||||
end
|
end
|
||||||
|
|
||||||
function gen_uuid(format)
|
function gen_uuid()
|
||||||
local uuid = sys.exec("echo -n $(cat /proc/sys/kernel/random/uuid)")
|
local uuid = sys.exec("echo -n $(cat /proc/sys/kernel/random/uuid)")
|
||||||
if format == nil then
|
|
||||||
uuid = string.gsub(uuid, "-", "")
|
|
||||||
end
|
|
||||||
return uuid
|
return uuid
|
||||||
end
|
end
|
||||||
|
|
||||||
function gen_short_uuid(length)
|
function gen_random_char(length)
|
||||||
if not length then length = 8 end
|
if not length then length = 8 end
|
||||||
return sys.exec("echo -n $(head /dev/urandom | tr -dc A-Za-z0-9 | head -c %s)" % length)
|
return sys.exec("echo -n $(head /dev/urandom | tr -dc A-Za-z0-9 | head -c %s)" % length)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ local sys = api.sys
|
|||||||
local jsonc = api.jsonc
|
local jsonc = api.jsonc
|
||||||
local appname = "passwall"
|
local appname = "passwall"
|
||||||
local fs = api.fs
|
local fs = api.fs
|
||||||
local split = api.split
|
|
||||||
local ech_domain = {}
|
local ech_domain = {}
|
||||||
|
|
||||||
local local_version = api.get_app_version("sing-box"):match("[^v]+")
|
local local_version = api.get_app_version("sing-box"):match("[^v]+")
|
||||||
@@ -88,6 +87,11 @@ local function convert_geofile()
|
|||||||
convert(GEO_VAR.IP_PATH, "geoip", GEO_VAR.IP_TAGS)
|
convert(GEO_VAR.IP_PATH, "geoip", GEO_VAR.IP_TAGS)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function get_log_level(s)
|
||||||
|
if s == "warning" then s = "warn" end
|
||||||
|
return s
|
||||||
|
end
|
||||||
|
|
||||||
function gen_outbound(flag, node, tag, proxy_table)
|
function gen_outbound(flag, node, tag, proxy_table)
|
||||||
local result = nil
|
local result = nil
|
||||||
if node then
|
if node then
|
||||||
@@ -190,7 +194,7 @@ function gen_outbound(flag, node, tag, proxy_table)
|
|||||||
if not GLOBAL.DNS_SERVER[dns_key] then
|
if not GLOBAL.DNS_SERVER[dns_key] then
|
||||||
GLOBAL.DNS_SERVER[dns_key] = {
|
GLOBAL.DNS_SERVER[dns_key] = {
|
||||||
server = {
|
server = {
|
||||||
tag = "dns-node-" .. api.gen_short_uuid(),
|
tag = "dns-node-" .. api.gen_random_char(),
|
||||||
type = dns_proto,
|
type = dns_proto,
|
||||||
server = server_address,
|
server = server_address,
|
||||||
server_port = server_port,
|
server_port = server_port,
|
||||||
@@ -232,7 +236,8 @@ function gen_outbound(flag, node, tag, proxy_table)
|
|||||||
--max_version = "1.3",
|
--max_version = "1.3",
|
||||||
fragment = fragment,
|
fragment = fragment,
|
||||||
record_fragment = record_fragment,
|
record_fragment = record_fragment,
|
||||||
certificate = (node.tls_certificate == "1" and node.tls_certificate_pem ~= "") and split(node.tls_certificate_pem, "\n") or nil,
|
certificate = (node.tls_certificate == "1" and node.tls_certificate_pem ~= "") and api.split(node.tls_certificate_pem, "\n") or nil,
|
||||||
|
cipher_suites = (node.cipherSuites and node.cipherSuites ~= "") and api.split(node.cipherSuites, ":") or nil,
|
||||||
ech = (node.ech == "1") and (function()
|
ech = (node.ech == "1") and (function()
|
||||||
local function get_ech_domain(s) --兼容xray "域名+DNS" 格式ech
|
local function get_ech_domain(s) --兼容xray "域名+DNS" 格式ech
|
||||||
local domain, dns = s:match("^([^+]+)%+(.+)$")
|
local domain, dns = s:match("^([^+]+)%+(.+)$")
|
||||||
@@ -1042,7 +1047,7 @@ function gen_config_server(node)
|
|||||||
local config = {
|
local config = {
|
||||||
log = {
|
log = {
|
||||||
disabled = (not node or node.log == "0") and true or false,
|
disabled = (not node or node.log == "0") and true or false,
|
||||||
level = node.loglevel or "info",
|
level = get_log_level(node.loglevel) or "info",
|
||||||
timestamp = true,
|
timestamp = true,
|
||||||
--output = logfile,
|
--output = logfile,
|
||||||
},
|
},
|
||||||
@@ -2169,7 +2174,7 @@ function gen_config(var)
|
|||||||
local config = {
|
local config = {
|
||||||
log = {
|
log = {
|
||||||
disabled = log == "0" and true or false,
|
disabled = log == "0" and true or false,
|
||||||
level = loglevel,
|
level = get_log_level(loglevel),
|
||||||
timestamp = true,
|
timestamp = true,
|
||||||
output = logfile,
|
output = logfile,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -31,6 +31,11 @@ local function get_domain_excluded()
|
|||||||
return hosts
|
return hosts
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function get_log_level(s)
|
||||||
|
if s == "warn" then s = "warning" end
|
||||||
|
return s
|
||||||
|
end
|
||||||
|
|
||||||
function gen_outbound(flag, node, tag, proxy_table)
|
function gen_outbound(flag, node, tag, proxy_table)
|
||||||
local result = nil
|
local result = nil
|
||||||
if node then
|
if node then
|
||||||
@@ -165,7 +170,8 @@ function gen_outbound(flag, node, tag, proxy_table)
|
|||||||
certificates = (node.tls_certificate == "1" and node.tls_certificate_pem ~= "") and {
|
certificates = (node.tls_certificate == "1" and node.tls_certificate_pem ~= "") and {
|
||||||
certificate = api.split(node.tls_certificate_pem, "\n"),
|
certificate = api.split(node.tls_certificate_pem, "\n"),
|
||||||
usage = "verify"
|
usage = "verify"
|
||||||
} or nil
|
} or nil,
|
||||||
|
cipherSuites = node.cipherSuites or nil
|
||||||
} or nil,
|
} or nil,
|
||||||
realitySettings = (node.stream_security == "reality") and {
|
realitySettings = (node.stream_security == "reality") and {
|
||||||
serverName = node.tls_serverName,
|
serverName = node.tls_serverName,
|
||||||
@@ -453,7 +459,7 @@ function gen_outbound(flag, node, tag, proxy_table)
|
|||||||
local dns_key = dns_proto .. "|" .. config_address .. "|" .. tostring(config_port)
|
local dns_key = dns_proto .. "|" .. config_address .. "|" .. tostring(config_port)
|
||||||
if not GLOBAL.DNS_SERVER[dns_key] then
|
if not GLOBAL.DNS_SERVER[dns_key] then
|
||||||
GLOBAL.DNS_SERVER[dns_key] = {
|
GLOBAL.DNS_SERVER[dns_key] = {
|
||||||
tag = "dns-node-" .. api.gen_short_uuid(),
|
tag = "dns-node-" .. api.gen_random_char(),
|
||||||
-- queryStrategy = node.domain_strategy or "UseIP",
|
-- queryStrategy = node.domain_strategy or "UseIP",
|
||||||
address = config_address,
|
address = config_address,
|
||||||
port = config_port,
|
port = config_port,
|
||||||
@@ -635,7 +641,7 @@ function gen_config_server(node)
|
|||||||
local config = {
|
local config = {
|
||||||
log = {
|
log = {
|
||||||
-- error = "/tmp/etc/passwall_server/log/" .. user[".name"] .. ".log",
|
-- error = "/tmp/etc/passwall_server/log/" .. user[".name"] .. ".log",
|
||||||
loglevel = ("1" == node.log) and node.loglevel or "none"
|
loglevel = ("1" == node.log) and get_log_level(node.loglevel) or "none"
|
||||||
},
|
},
|
||||||
-- 传入连接
|
-- 传入连接
|
||||||
inbounds = {
|
inbounds = {
|
||||||
@@ -1966,7 +1972,7 @@ function gen_config(var)
|
|||||||
end)(),
|
end)(),
|
||||||
log = {
|
log = {
|
||||||
-- error = string.format("/tmp/etc/%s/%s.log", appname, node[".name"]),
|
-- error = string.format("/tmp/etc/%s/%s.log", appname, node[".name"]),
|
||||||
loglevel = loglevel
|
loglevel = get_log_level(loglevel)
|
||||||
},
|
},
|
||||||
-- DNS
|
-- DNS
|
||||||
dns = dns,
|
dns = dns,
|
||||||
|
|||||||
@@ -1673,6 +1673,9 @@ msgstr "日志"
|
|||||||
msgid "Log"
|
msgid "Log"
|
||||||
msgstr "日志"
|
msgstr "日志"
|
||||||
|
|
||||||
|
msgid "Enable Node Log"
|
||||||
|
msgstr "启用节点日志"
|
||||||
|
|
||||||
msgid "%s Node Log"
|
msgid "%s Node Log"
|
||||||
msgstr "%s 节点日志"
|
msgstr "%s 节点日志"
|
||||||
|
|
||||||
@@ -2198,3 +2201,12 @@ msgstr "Gecko 包大小(最大)"
|
|||||||
|
|
||||||
msgid "valid time (hh:mm)"
|
msgid "valid time (hh:mm)"
|
||||||
msgstr "有效时间(hh:mm)"
|
msgstr "有效时间(hh:mm)"
|
||||||
|
|
||||||
|
msgid "Not Set"
|
||||||
|
msgstr "未设置"
|
||||||
|
|
||||||
|
msgid "Cipher Suites"
|
||||||
|
msgstr "密码套件"
|
||||||
|
|
||||||
|
msgid "Configures the list of supported cipher suites, separated by :"
|
||||||
|
msgstr "配置支持的密码套件列表,以冒号 (:) 分隔。"
|
||||||
@@ -68,6 +68,16 @@ for sid in $(uci show passwall | grep "=socks" | awk -F '.' '{print $2}' | awk -
|
|||||||
unset sid new_id
|
unset sid new_id
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
for sid in $(uci show passwall | grep "@acl_rule" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do
|
||||||
|
new_id="acl_$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 5)"
|
||||||
|
uci -q rename passwall.${sid}="${new_id}"
|
||||||
|
unset sid new_id
|
||||||
|
done
|
||||||
|
for sid in $(uci show passwall | grep "@subscribe_list" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do
|
||||||
|
new_id="sub_$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 5)"
|
||||||
|
uci -q rename passwall.${sid}="${new_id}"
|
||||||
|
unset sid new_id
|
||||||
|
done
|
||||||
|
|
||||||
uci -q commit passwall
|
uci -q commit passwall
|
||||||
|
|
||||||
|
|||||||
@@ -115,7 +115,6 @@ run_singbox() {
|
|||||||
json_add_string "logfile" "${log_file}"
|
json_add_string "logfile" "${log_file}"
|
||||||
fi
|
fi
|
||||||
[ -z "$loglevel" ] && local loglevel=$(config_t_get global loglevel "warn")
|
[ -z "$loglevel" ] && local loglevel=$(config_t_get global loglevel "warn")
|
||||||
[ "$loglevel" = "warning" ] && loglevel="warn"
|
|
||||||
json_add_string "loglevel" "$loglevel"
|
json_add_string "loglevel" "$loglevel"
|
||||||
|
|
||||||
[ -n "$flag" ] && json_add_string "flag" "$flag"
|
[ -n "$flag" ] && json_add_string "flag" "$flag"
|
||||||
@@ -1050,9 +1049,6 @@ socks_node_switch() {
|
|||||||
LOG_FILE="/dev/null"
|
LOG_FILE="/dev/null"
|
||||||
run_socks flag=$flag node=$new_node bind=$bind socks_port=$port config_file=$config_file http_port=$http_port http_config_file=$http_config_file log_file=$log_file
|
run_socks flag=$flag node=$new_node bind=$bind socks_port=$port config_file=$config_file http_port=$http_port http_config_file=$http_config_file log_file=$log_file
|
||||||
set_cache_var "${flag}" "$new_node"
|
set_cache_var "${flag}" "$new_node"
|
||||||
local ENABLED_DEFAULT_ACL=$(get_cache_var "ENABLED_DEFAULT_ACL")
|
|
||||||
local ENABLED_ACLS=$(get_cache_var "ENABLED_ACLS")
|
|
||||||
[ "$ENABLED_DEFAULT_ACL" != "1" ] && [ "$ENABLED_ACLS" != "1" ] && return
|
|
||||||
local USE_TABLES=$(get_cache_var "USE_TABLES")
|
local USE_TABLES=$(get_cache_var "USE_TABLES")
|
||||||
[ -n "$USE_TABLES" ] && source $APP_PATH/${USE_TABLES}.sh filter_direct_node_list
|
[ -n "$USE_TABLES" ] && source $APP_PATH/${USE_TABLES}.sh filter_direct_node_list
|
||||||
}
|
}
|
||||||
@@ -1147,14 +1143,13 @@ start_crontab() {
|
|||||||
# ===== subscribe =====
|
# ===== subscribe =====
|
||||||
local TMP_SUB_PATH=$TMP_PATH/sub_crontabs
|
local TMP_SUB_PATH=$TMP_PATH/sub_crontabs
|
||||||
mkdir -p "$TMP_SUB_PATH"
|
mkdir -p "$TMP_SUB_PATH"
|
||||||
local item cfgid remark sub_update_week_mode sub_update_time_mode
|
local item remark sub_update_week_mode sub_update_time_mode
|
||||||
for item in $(uci show ${CONFIG} | grep "=subscribe_list" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do
|
for item in $(uci show ${CONFIG} | grep "=subscribe_list" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do
|
||||||
sub_update_week_mode=$(config_n_get $item update_week_mode)
|
sub_update_week_mode=$(config_n_get $item update_week_mode)
|
||||||
if [ -n "$sub_update_week_mode" ]; then
|
if [ -n "$sub_update_week_mode" ]; then
|
||||||
cfgid=$(uci show ${CONFIG}.$item | head -n 1 | cut -d '.' -sf 2 | cut -d '=' -sf 1)
|
|
||||||
remark=$(config_n_get "$item" remark)
|
remark=$(config_n_get "$item" remark)
|
||||||
sub_update_time_mode=$(config_n_get $item update_time_mode)
|
sub_update_time_mode=$(config_n_get $item update_time_mode)
|
||||||
echo "$cfgid" >> "$TMP_SUB_PATH/${sub_update_week_mode}_${sub_update_time_mode}"
|
echo "$item" >> "$TMP_SUB_PATH/${sub_update_week_mode}_${sub_update_time_mode}"
|
||||||
echolog "配置定时任务:自动更新【$remark】订阅。"
|
echolog "配置定时任务:自动更新【$remark】订阅。"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -1519,8 +1514,13 @@ start_haproxy() {
|
|||||||
|
|
||||||
acl_app() {
|
acl_app() {
|
||||||
local items=$(uci show ${CONFIG} | grep "=acl_rule" | cut -d '.' -sf 2 | cut -d '=' -sf 1)
|
local items=$(uci show ${CONFIG} | grep "=acl_rule" | cut -d '.' -sf 2 | cut -d '=' -sf 1)
|
||||||
[ -n "$items" ] && {
|
if [ -z "$items" ]; then
|
||||||
local item
|
ENABLED_ACLS=0
|
||||||
|
set_cache_var ENABLED_ACLS $ENABLED_ACLS
|
||||||
|
return
|
||||||
|
else
|
||||||
|
local has_enabled
|
||||||
|
local sid
|
||||||
local socks_port redir_port dns_port dnsmasq_port chinadns_port
|
local socks_port redir_port dns_port dnsmasq_port chinadns_port
|
||||||
local msg msg2
|
local msg msg2
|
||||||
socks_port=11100
|
socks_port=11100
|
||||||
@@ -1528,13 +1528,13 @@ acl_app() {
|
|||||||
dns_port=11300
|
dns_port=11300
|
||||||
dnsmasq_port=${GLOBAL_DNSMASQ_PORT:-11400}
|
dnsmasq_port=${GLOBAL_DNSMASQ_PORT:-11400}
|
||||||
chinadns_port=11500
|
chinadns_port=11500
|
||||||
for item in $items; do
|
for sid in $items; do
|
||||||
local sid=$(uci -q show "${CONFIG}.${item}" | grep "=acl_rule" | awk -F '=' '{print $1}' | awk -F '.' '{print $2}')
|
|
||||||
[ "$(config_n_get $sid enabled)" = "1" ] || continue
|
[ "$(config_n_get $sid enabled)" = "1" ] || continue
|
||||||
eval $(uci -q show "${CONFIG}.${item}" | cut -d'.' -sf 3-)
|
has_enabled=1
|
||||||
|
eval $(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)
|
||||||
|
|
||||||
log=${log:-0}
|
log=${log:-0}
|
||||||
loglevel=${loglevel:-warning}
|
loglevel=${loglevel:-warn}
|
||||||
|
|
||||||
if [ -n "${sources}" ]; then
|
if [ -n "${sources}" ]; then
|
||||||
for s in $sources; do
|
for s in $sources; do
|
||||||
@@ -1854,7 +1854,11 @@ acl_app() {
|
|||||||
unset _china_ng_listen _chinadns_local_dns _direct_dns_mode chinadns_ng_default_tag dnsmasq_filter_proxy_ipv6 remote_fakedns force_https_soa use_fakedns
|
unset _china_ng_listen _chinadns_local_dns _direct_dns_mode chinadns_ng_default_tag dnsmasq_filter_proxy_ipv6 remote_fakedns force_https_soa use_fakedns
|
||||||
done
|
done
|
||||||
unset socks_port redir_port dns_port dnsmasq_port chinadns_port
|
unset socks_port redir_port dns_port dnsmasq_port chinadns_port
|
||||||
}
|
[ -n "${has_enabled}" ] || {
|
||||||
|
ENABLED_ACLS=0
|
||||||
|
set_cache_var ENABLED_ACLS $ENABLED_ACLS
|
||||||
|
}
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
@@ -1912,8 +1916,7 @@ start() {
|
|||||||
local cfgids item
|
local cfgids item
|
||||||
for item in $(uci show ${CONFIG} | grep "=subscribe_list" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do
|
for item in $(uci show ${CONFIG} | grep "=subscribe_list" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do
|
||||||
if [ "$(config_n_get "$item" boot_update 0)" = "1" ]; then
|
if [ "$(config_n_get "$item" boot_update 0)" = "1" ]; then
|
||||||
local cfgid=$(uci show ${CONFIG}.$item | head -n 1 | cut -d '.' -sf 2 | cut -d '=' -sf 1)
|
cfgids="${cfgids:+$cfgids,}$item"
|
||||||
cfgids="${cfgids:+$cfgids,}$cfgid"
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
[ -n "$cfgids" ] && {
|
[ -n "$cfgids" ] && {
|
||||||
@@ -2003,9 +2006,6 @@ get_config() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
ENABLED_ACLS=$(config_t_get global acl_enable 0)
|
ENABLED_ACLS=$(config_t_get global acl_enable 0)
|
||||||
[ "$ENABLED_ACLS" = 1 ] && {
|
|
||||||
[ "$(uci show ${CONFIG} | grep "@acl_rule" | grep "enabled='1'" | wc -l)" = 0 ] && ENABLED_ACLS=0
|
|
||||||
}
|
|
||||||
set_cache_var ENABLED_DEFAULT_ACL $ENABLED_DEFAULT_ACL
|
set_cache_var ENABLED_DEFAULT_ACL $ENABLED_DEFAULT_ACL
|
||||||
set_cache_var ENABLED_ACLS $ENABLED_ACLS
|
set_cache_var ENABLED_ACLS $ENABLED_ACLS
|
||||||
|
|
||||||
|
|||||||
@@ -203,6 +203,7 @@ load_acl() {
|
|||||||
for sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do
|
for sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do
|
||||||
eval "$(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)"
|
eval "$(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)"
|
||||||
|
|
||||||
|
mode=${mode:-0}
|
||||||
tcp_no_redir_ports=${tcp_no_redir_ports:-default}
|
tcp_no_redir_ports=${tcp_no_redir_ports:-default}
|
||||||
udp_no_redir_ports=${udp_no_redir_ports:-default}
|
udp_no_redir_ports=${udp_no_redir_ports:-default}
|
||||||
use_global_config=${use_global_config:-0}
|
use_global_config=${use_global_config:-0}
|
||||||
@@ -217,6 +218,10 @@ load_acl() {
|
|||||||
chn_list=${chn_list:-direct}
|
chn_list=${chn_list:-direct}
|
||||||
tcp_proxy_mode=${tcp_proxy_mode:-proxy}
|
tcp_proxy_mode=${tcp_proxy_mode:-proxy}
|
||||||
udp_proxy_mode=${udp_proxy_mode:-proxy}
|
udp_proxy_mode=${udp_proxy_mode:-proxy}
|
||||||
|
[ "$mode" = "0" ] && {
|
||||||
|
tcp_no_redir_ports="1:65535"
|
||||||
|
udp_no_redir_ports="1:65535"
|
||||||
|
}
|
||||||
[ "$tcp_no_redir_ports" = "default" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS
|
[ "$tcp_no_redir_ports" = "default" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS
|
||||||
[ "$udp_no_redir_ports" = "default" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS
|
[ "$udp_no_redir_ports" = "default" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS
|
||||||
[ "$tcp_proxy_drop_ports" = "default" ] && tcp_proxy_drop_ports=$TCP_PROXY_DROP_PORTS
|
[ "$tcp_proxy_drop_ports" = "default" ] && tcp_proxy_drop_ports=$TCP_PROXY_DROP_PORTS
|
||||||
|
|||||||
@@ -263,6 +263,7 @@ load_acl() {
|
|||||||
for sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do
|
for sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do
|
||||||
eval "$(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)"
|
eval "$(uci -q show "${CONFIG}.${sid}" | cut -d'.' -sf 3-)"
|
||||||
|
|
||||||
|
mode=${mode:-0}
|
||||||
tcp_no_redir_ports=${tcp_no_redir_ports:-default}
|
tcp_no_redir_ports=${tcp_no_redir_ports:-default}
|
||||||
udp_no_redir_ports=${udp_no_redir_ports:-default}
|
udp_no_redir_ports=${udp_no_redir_ports:-default}
|
||||||
use_global_config=${use_global_config:-0}
|
use_global_config=${use_global_config:-0}
|
||||||
@@ -277,6 +278,10 @@ load_acl() {
|
|||||||
chn_list=${chn_list:-direct}
|
chn_list=${chn_list:-direct}
|
||||||
tcp_proxy_mode=${tcp_proxy_mode:-proxy}
|
tcp_proxy_mode=${tcp_proxy_mode:-proxy}
|
||||||
udp_proxy_mode=${udp_proxy_mode:-proxy}
|
udp_proxy_mode=${udp_proxy_mode:-proxy}
|
||||||
|
[ "$mode" = "0" ] && {
|
||||||
|
tcp_no_redir_ports="1:65535"
|
||||||
|
udp_no_redir_ports="1:65535"
|
||||||
|
}
|
||||||
[ "$tcp_no_redir_ports" = "default" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS
|
[ "$tcp_no_redir_ports" = "default" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS
|
||||||
[ "$udp_no_redir_ports" = "default" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS
|
[ "$udp_no_redir_ports" = "default" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS
|
||||||
[ "$tcp_proxy_drop_ports" = "default" ] && tcp_proxy_drop_ports=$TCP_PROXY_DROP_PORTS
|
[ "$tcp_proxy_drop_ports" = "default" ] && tcp_proxy_drop_ports=$TCP_PROXY_DROP_PORTS
|
||||||
|
|||||||
@@ -533,7 +533,7 @@ local function fetch_geofile(geo_name, geo_type, url)
|
|||||||
local tmp_path = "/tmp/" .. geo_name
|
local tmp_path = "/tmp/" .. geo_name
|
||||||
local asset_path = asset_location .. geo_name
|
local asset_path = asset_location .. geo_name
|
||||||
local down_filename = url:match("^.*/([^/?#]+)")
|
local down_filename = url:match("^.*/([^/?#]+)")
|
||||||
local sha_url = url:gsub(down_filename, down_filename .. ".sha256sum")
|
local sha_url = url:gsub((down_filename:gsub("(%W)", "%%%1")), down_filename .. ".sha256sum")
|
||||||
local sha_path = tmp_path .. ".sha256sum"
|
local sha_path = tmp_path .. ".sha256sum"
|
||||||
|
|
||||||
local function verify_sha256(sha_file)
|
local function verify_sha256(sha_file)
|
||||||
|
|||||||
@@ -180,9 +180,9 @@ do
|
|||||||
local flag = "Socks节点列表[" .. i .. "]备用节点的列表"
|
local flag = "Socks节点列表[" .. i .. "]备用节点的列表"
|
||||||
local currentNodes = {}
|
local currentNodes = {}
|
||||||
local newNodes = {}
|
local newNodes = {}
|
||||||
for k, asb_node in ipairs(t.autoswitch_backup_node) do
|
for k, asb_node_id in ipairs(t.autoswitch_backup_node) do
|
||||||
if asb_node then
|
if asb_node_id then
|
||||||
local currentNode = uci:get_all(appname, asb_node) or {}
|
local currentNode = uci:get_all(appname, asb_node_id) or {}
|
||||||
if currentNode[".type"] == "nodes" then
|
if currentNode[".type"] == "nodes" then
|
||||||
currentNodes[#currentNodes + 1] = {
|
currentNodes[#currentNodes + 1] = {
|
||||||
log = true,
|
log = true,
|
||||||
@@ -1931,7 +1931,7 @@ local function update_node(manual)
|
|||||||
chain_node_type = (outbound_iface_group ~= "") and "iface" or chain_node_type
|
chain_node_type = (outbound_iface_group ~= "") and "iface" or chain_node_type
|
||||||
end
|
end
|
||||||
for _, vv in ipairs(list) do
|
for _, vv in ipairs(list) do
|
||||||
local cfgid = uci:section(appname, "nodes", api.gen_short_uuid())
|
local cfgid = uci:section(appname, "nodes", api.gen_random_char())
|
||||||
for kkk, vvv in pairs(vv) do
|
for kkk, vvv in pairs(vv) do
|
||||||
if type(vvv) == "table" and next(vvv) ~= nil then
|
if type(vvv) == "table" and next(vvv) ~= nil then
|
||||||
uci:set_list(appname, cfgid, kkk, vvv)
|
uci:set_list(appname, cfgid, kkk, vvv)
|
||||||
|
|||||||
@@ -41,10 +41,9 @@ do
|
|||||||
for item in $(uci show ${CONFIG} | grep "=subscribe_list" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do
|
for item in $(uci show ${CONFIG} | grep "=subscribe_list" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do
|
||||||
sub_update_week_mode=$(config_n_get $item update_week_mode)
|
sub_update_week_mode=$(config_n_get $item update_week_mode)
|
||||||
if [ -n "$sub_update_week_mode" ]; then
|
if [ -n "$sub_update_week_mode" ]; then
|
||||||
cfgid=$(uci show ${CONFIG}.$item | head -n 1 | cut -d '.' -sf 2 | cut -d '=' -sf 1)
|
|
||||||
remark=$(config_n_get $item remark)
|
remark=$(config_n_get $item remark)
|
||||||
sub_update_interval_mode=$(config_n_get $item update_interval_mode)
|
sub_update_interval_mode=$(config_n_get $item update_interval_mode)
|
||||||
echo "$cfgid" >> $TMP_SUB_PATH/${sub_update_week_mode}_${sub_update_interval_mode}
|
echo "$item" >> $TMP_SUB_PATH/${sub_update_week_mode}_${sub_update_interval_mode}
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=luci-app-passwall2
|
PKG_NAME:=luci-app-passwall2
|
||||||
PKG_VERSION:=26.8.7
|
PKG_VERSION:=26.8.7
|
||||||
PKG_RELEASE:=70
|
PKG_RELEASE:=71
|
||||||
PKG_PO_VERSION:=$(PKG_VERSION)
|
PKG_PO_VERSION:=$(PKG_VERSION)
|
||||||
|
|
||||||
PKG_CONFIG_DEPENDS:= \
|
PKG_CONFIG_DEPENDS:= \
|
||||||
|
|||||||
@@ -449,22 +449,22 @@ end
|
|||||||
function add_node()
|
function add_node()
|
||||||
local redirect = http.formvalue("redirect")
|
local redirect = http.formvalue("redirect")
|
||||||
|
|
||||||
local uuid = api.gen_short_uuid()
|
local uid = api.gen_random_char()
|
||||||
uci:section(appname, "nodes", uuid)
|
uci:section(appname, "nodes", uid)
|
||||||
|
|
||||||
local group = http.formvalue("group")
|
local group = http.formvalue("group")
|
||||||
if group and group ~= "default" then
|
if group and group ~= "default" then
|
||||||
uci:set(appname, uuid, "group", group)
|
uci:set(appname, uid, "group", group)
|
||||||
end
|
end
|
||||||
|
|
||||||
uci:set(appname, uuid, "type", "Xray")
|
uci:set(appname, uid, "type", "Xray")
|
||||||
|
|
||||||
if redirect == "1" then
|
if redirect == "1" then
|
||||||
api.uci_save(uci, appname)
|
api.uci_save(uci, appname)
|
||||||
http.redirect(api.url("node_config", uuid))
|
http.redirect(api.url("node_config", uid))
|
||||||
else
|
else
|
||||||
api.uci_save(uci, appname, true, true)
|
api.uci_save(uci, appname, true, true)
|
||||||
http_write_json({result = uuid})
|
http_write_json({result = uid})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -479,17 +479,17 @@ end
|
|||||||
|
|
||||||
function copy_node()
|
function copy_node()
|
||||||
local section = http.formvalue("section")
|
local section = http.formvalue("section")
|
||||||
local uuid = api.gen_short_uuid()
|
local uid = api.gen_random_char()
|
||||||
uci:section(appname, "nodes", uuid)
|
uci:section(appname, "nodes", uid)
|
||||||
for k, v in pairs(uci:get_all(appname, section)) do
|
for k, v in pairs(uci:get_all(appname, section)) do
|
||||||
if not k:match("^%.") and k ~= "group" then
|
if not k:match("^%.") and k ~= "group" then
|
||||||
if k == "remarks" then v = (v or "") .. "(1)" end
|
if k == "remarks" then v = (v or "") .. "(1)" end
|
||||||
uci:set(appname, uuid, k, v)
|
uci:set(appname, uid, k, v)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
uci:set(appname, uuid, "add_mode", 1)
|
uci:set(appname, uid, "add_mode", 1)
|
||||||
api.uci_save(uci, appname)
|
api.uci_save(uci, appname)
|
||||||
http.redirect(api.url("node_config", uuid))
|
http.redirect(api.url("node_config", uid))
|
||||||
end
|
end
|
||||||
|
|
||||||
function clear_all_nodes()
|
function clear_all_nodes()
|
||||||
@@ -1055,29 +1055,29 @@ function add_shunt_rule()
|
|||||||
local add_name = http.formvalue("add_name")
|
local add_name = http.formvalue("add_name")
|
||||||
local redirect = http.formvalue("redirect")
|
local redirect = http.formvalue("redirect")
|
||||||
|
|
||||||
local uuid = add_name
|
local uid = add_name
|
||||||
if add_name then
|
if add_name then
|
||||||
local has = uci:get(appname, uuid)
|
local has = uci:get(appname, uid)
|
||||||
if has then
|
if has then
|
||||||
http_write_json_error({ message = "This ID already exists." })
|
http_write_json_error({ message = "This ID already exists." })
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
uuid = api.gen_short_uuid()
|
uid = api.gen_random_char()
|
||||||
end
|
end
|
||||||
uci:section(appname, "shunt_rules", uuid)
|
uci:section(appname, "shunt_rules", uid)
|
||||||
|
|
||||||
local group = http.formvalue("group")
|
local group = http.formvalue("group")
|
||||||
if group and group ~= "default" then
|
if group and group ~= "default" then
|
||||||
uci:set(appname, uuid, "group", group)
|
uci:set(appname, uid, "group", group)
|
||||||
end
|
end
|
||||||
|
|
||||||
if redirect == "1" then
|
if redirect == "1" then
|
||||||
api.uci_save(uci, appname)
|
api.uci_save(uci, appname)
|
||||||
http.redirect(api.url("shunt_rules", uuid))
|
http.redirect(api.url("shunt_rules", uid))
|
||||||
else
|
else
|
||||||
api.uci_save(uci, appname)
|
api.uci_save(uci, appname)
|
||||||
http_write_json_ok({uuid = uuid, redirect_url = api.url("shunt_rules", uuid)})
|
http_write_json_ok({uid = uid, redirect_url = api.url("shunt_rules", uid)})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -23,10 +23,9 @@ s.anonymous = true
|
|||||||
s.addremove = true
|
s.addremove = true
|
||||||
s.extedit = api.url("acl_config", "%s")
|
s.extedit = api.url("acl_config", "%s")
|
||||||
function s.create(e, t)
|
function s.create(e, t)
|
||||||
local uuid = api.gen_short_uuid(5)
|
local uid = "acl_" .. api.gen_random_char(5)
|
||||||
uuid = "acl_" .. uuid
|
TypedSection.create(e, uid)
|
||||||
TypedSection.create(e, uuid)
|
luci.http.redirect(e.extedit:format(uid))
|
||||||
luci.http.redirect(e.extedit:format(uuid))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
---- Enable
|
---- Enable
|
||||||
|
|||||||
@@ -326,10 +326,9 @@ s2.anonymous = true
|
|||||||
s2.addremove = true
|
s2.addremove = true
|
||||||
s2.extedit = api.url("socks_config", "%s")
|
s2.extedit = api.url("socks_config", "%s")
|
||||||
function s2.create(e, t)
|
function s2.create(e, t)
|
||||||
local uuid = api.gen_short_uuid(5)
|
local uid = "socks_" .. api.gen_random_char(5)
|
||||||
uuid = "socks_" .. uuid
|
TypedSection.create(e, uid)
|
||||||
TypedSection.create(e, uuid)
|
luci.http.redirect(e.extedit:format(uid))
|
||||||
luci.http.redirect(e.extedit:format(uuid))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
o = s2:option(DummyValue, "status", translate("Status"))
|
o = s2:option(DummyValue, "status", translate("Status"))
|
||||||
|
|||||||
@@ -113,9 +113,8 @@ s.anonymous = true
|
|||||||
s.addremove = true
|
s.addremove = true
|
||||||
|
|
||||||
s.create = function(e, t)
|
s.create = function(e, t)
|
||||||
local uuid = api.gen_short_uuid(5)
|
local uid = "haproxy_" .. api.gen_random_char(5)
|
||||||
uuid = "haproxy_" .. uuid
|
TypedSection.create(e, uid)
|
||||||
TypedSection.create(e, uuid)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
s.remove = function(self, section)
|
s.remove = function(self, section)
|
||||||
|
|||||||
@@ -134,12 +134,11 @@ s.sortable = true
|
|||||||
s.template = "cbi/tblsection"
|
s.template = "cbi/tblsection"
|
||||||
s.extedit = api.url("node_subscribe_config", "%s")
|
s.extedit = api.url("node_subscribe_config", "%s")
|
||||||
function s.create(e, t)
|
function s.create(e, t)
|
||||||
local uuid = api.gen_short_uuid(5)
|
local uid = "sub_" .. api.gen_random_char(5)
|
||||||
uuid = "sub_" .. uuid
|
TypedSection.create(e, uid)
|
||||||
TypedSection.create(e, uuid)
|
m:set(uid, "hysteria_up_mbps", "100")
|
||||||
m:set(uuid, "hysteria_up_mbps", "100")
|
m:set(uid, "hysteria_down_mbps", "100")
|
||||||
m:set(uuid, "hysteria_down_mbps", "100")
|
luci.http.redirect(e.extedit:format(uid))
|
||||||
luci.http.redirect(e.extedit:format(uuid))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
o = s:option(Value, "remark", translate("Remarks"))
|
o = s:option(Value, "remark", translate("Remarks"))
|
||||||
|
|||||||
@@ -263,9 +263,8 @@ if has_xray then
|
|||||||
s_xray_noise.addremove = true
|
s_xray_noise.addremove = true
|
||||||
|
|
||||||
s_xray_noise.create = function(e, t)
|
s_xray_noise.create = function(e, t)
|
||||||
local uuid = api.gen_short_uuid(5)
|
local uid = "xray_noise_" .. api.gen_random_char(5)
|
||||||
uuid = "xray_noise_" .. uuid
|
TypedSection.create(e, uid)
|
||||||
TypedSection.create(e, uuid)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
s_xray_noise.remove = function(self, section)
|
s_xray_noise.remove = function(self, section)
|
||||||
|
|||||||
@@ -21,10 +21,9 @@ t.sortable = true
|
|||||||
t.template = "cbi/tblsection"
|
t.template = "cbi/tblsection"
|
||||||
t.extedit = api.url("server_user", "%s")
|
t.extedit = api.url("server_user", "%s")
|
||||||
function t.create(e, t)
|
function t.create(e, t)
|
||||||
local uuid = api.gen_uuid()
|
local uid = api.gen_random_char()
|
||||||
t = uuid
|
TypedSection.create(e, uid)
|
||||||
TypedSection.create(e, t)
|
luci.http.redirect(e.extedit:format(uid))
|
||||||
luci.http.redirect(e.extedit:format(t))
|
|
||||||
end
|
end
|
||||||
function t.remove(e, t)
|
function t.remove(e, t)
|
||||||
e.map.proceed = true
|
e.map.proceed = true
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ o:depends({ [_n("protocol")] = "socks" })
|
|||||||
|
|
||||||
o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password"))
|
o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password"))
|
||||||
for i = 1, 3 do
|
for i = 1, 3 do
|
||||||
o:value(api.gen_uuid(1))
|
o:value(api.gen_uuid())
|
||||||
end
|
end
|
||||||
o:depends({ [_n("protocol")] = "vmess" })
|
o:depends({ [_n("protocol")] = "vmess" })
|
||||||
o:depends({ [_n("protocol")] = "vless" })
|
o:depends({ [_n("protocol")] = "vless" })
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ o:depends({ [_n("protocol")] = "shadowsocks" })
|
|||||||
|
|
||||||
o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password"))
|
o = s:option(DynamicList, _n("uuid"), translate("ID") .. "/" .. translate("Password"))
|
||||||
for i = 1, 3 do
|
for i = 1, 3 do
|
||||||
o:value(api.gen_uuid(1))
|
o:value(api.gen_uuid())
|
||||||
end
|
end
|
||||||
o:depends({ [_n("protocol")] = "vmess" })
|
o:depends({ [_n("protocol")] = "vmess" })
|
||||||
o:depends({ [_n("protocol")] = "vless" })
|
o:depends({ [_n("protocol")] = "vless" })
|
||||||
|
|||||||
@@ -669,15 +669,12 @@ function get_full_node_remarks(n)
|
|||||||
return remarks
|
return remarks
|
||||||
end
|
end
|
||||||
|
|
||||||
function gen_uuid(format)
|
function gen_uuid()
|
||||||
local uuid = sys.exec("echo -n $(cat /proc/sys/kernel/random/uuid)")
|
local uuid = sys.exec("echo -n $(cat /proc/sys/kernel/random/uuid)")
|
||||||
if format == nil then
|
|
||||||
uuid = string.gsub(uuid, "-", "")
|
|
||||||
end
|
|
||||||
return uuid
|
return uuid
|
||||||
end
|
end
|
||||||
|
|
||||||
function gen_short_uuid(length)
|
function gen_random_char(length)
|
||||||
if not length then length = 8 end
|
if not length then length = 8 end
|
||||||
return sys.exec("echo -n $(head /dev/urandom | tr -dc A-Za-z0-9 | head -c %s)" % length)
|
return sys.exec("echo -n $(head /dev/urandom | tr -dc A-Za-z0-9 | head -c %s)" % length)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -56,15 +56,15 @@ display:block !important;
|
|||||||
<div class="inner">
|
<div class="inner">
|
||||||
<div class="pure-g">
|
<div class="pure-g">
|
||||||
<div class="pure-u-1-2">
|
<div class="pure-u-1-2">
|
||||||
<span class="flag"><img src="/luci-static/passwall/flags/loading.svg" class="pure-img"></span> <span
|
<span class="flag"><img src="/luci-static/passwall2/flags/loading.svg" class="pure-img"></span> <span
|
||||||
class="status-info">获取中...</span>
|
class="status-info">获取中...</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="pure-u-1-2">
|
<div class="pure-u-1-2">
|
||||||
<div class="icon-con">
|
<div class="icon-con">
|
||||||
<img src="/luci-static/passwall/img/site_icon1_01.png" class="pure-img i1">
|
<img src="/luci-static/passwall2/img/site_icon1_01.png" class="pure-img i1">
|
||||||
<img src="/luci-static/passwall/img/site_icon1_02.png" class="pure-img i2">
|
<img src="/luci-static/passwall2/img/site_icon1_02.png" class="pure-img i2">
|
||||||
<img src="/luci-static/passwall/img/site_icon1_03.png" class="pure-img i3">
|
<img src="/luci-static/passwall2/img/site_icon1_03.png" class="pure-img i3">
|
||||||
<img src="/luci-static/passwall/img/site_icon1_04.png" class="pure-img i4">
|
<img src="/luci-static/passwall2/img/site_icon1_04.png" class="pure-img i4">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -72,8 +72,8 @@ display:block !important;
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const _ASSETS = '/luci-static/passwall/';
|
const _ASSETS = '/luci-static/passwall2/';
|
||||||
const CHECK_IP_URL = '<%=url([[admin]], [[services]], [[passwall]], [[ip]])%>';
|
const CHECK_IP_URL = '<%=url([[admin]], [[services]], [[passwall2]], [[ip]])%>';
|
||||||
|
|
||||||
let wW = window.innerWidth;
|
let wW = window.innerWidth;
|
||||||
|
|
||||||
|
|||||||
@@ -2274,7 +2274,7 @@ local function update_node(manual)
|
|||||||
chain_node_type = (outbound_iface_group ~= "") and "iface" or chain_node_type
|
chain_node_type = (outbound_iface_group ~= "") and "iface" or chain_node_type
|
||||||
end
|
end
|
||||||
for _, vv in ipairs(list) do
|
for _, vv in ipairs(list) do
|
||||||
local cfgid = uci:section(appname, "nodes", api.gen_short_uuid())
|
local cfgid = uci:section(appname, "nodes", api.gen_random_char())
|
||||||
for kkk, vvv in pairs(vv) do
|
for kkk, vvv in pairs(vv) do
|
||||||
if type(vvv) == "table" and next(vvv) ~= nil then
|
if type(vvv) == "table" and next(vvv) ~= nil then
|
||||||
uci:set_list(appname, cfgid, kkk, vvv)
|
uci:set_list(appname, cfgid, kkk, vvv)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ LUCI_TITLE:=luci-app-ssr-plus
|
|||||||
LUCI_PKGARCH:=all
|
LUCI_PKGARCH:=all
|
||||||
PKG_NAME:=luci-app-ssr-plus
|
PKG_NAME:=luci-app-ssr-plus
|
||||||
PKG_VERSION:=196
|
PKG_VERSION:=196
|
||||||
PKG_RELEASE:=53
|
PKG_RELEASE:=54
|
||||||
|
|
||||||
PKG_CONFIG_DEPENDS:= \
|
PKG_CONFIG_DEPENDS:= \
|
||||||
CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \
|
CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
#cbi-passwall+.cbi-page-actions.control-group.fixed {
|
#cbi-shadowsocksr+.cbi-page-actions.control-group.fixed {
|
||||||
bottom: 3.3rem;
|
bottom: 3.3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,15 +56,15 @@ display:block !important;
|
|||||||
<div class="inner">
|
<div class="inner">
|
||||||
<div class="pure-g">
|
<div class="pure-g">
|
||||||
<div class="pure-u-1-2">
|
<div class="pure-u-1-2">
|
||||||
<span class="flag"><img src="/luci-static/passwall/flags/loading.svg" class="pure-img"></span> <span
|
<span class="flag"><img src="/luci-static/shadowsocksr/flags/loading.svg" class="pure-img"></span> <span
|
||||||
class="status-info">获取中...</span>
|
class="status-info">获取中...</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="pure-u-1-2">
|
<div class="pure-u-1-2">
|
||||||
<div class="icon-con">
|
<div class="icon-con">
|
||||||
<img src="/luci-static/passwall/img/site_icon1_01.png" class="pure-img i1">
|
<img src="/luci-static/shadowsocksr/img/site_icon1_01.png" class="pure-img i1">
|
||||||
<img src="/luci-static/passwall/img/site_icon1_02.png" class="pure-img i2">
|
<img src="/luci-static/shadowsocksr/img/site_icon1_02.png" class="pure-img i2">
|
||||||
<img src="/luci-static/passwall/img/site_icon1_03.png" class="pure-img i3">
|
<img src="/luci-static/shadowsocksr/img/site_icon1_03.png" class="pure-img i3">
|
||||||
<img src="/luci-static/passwall/img/site_icon1_04.png" class="pure-img i4">
|
<img src="/luci-static/shadowsocksr/img/site_icon1_04.png" class="pure-img i4">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -72,8 +72,8 @@ display:block !important;
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const _ASSETS = '/luci-static/passwall/';
|
const _ASSETS = '/luci-static/shadowsocksr/';
|
||||||
const CHECK_IP_URL = '<%=url([[admin]], [[services]], [[passwall]], [[ip]])%>';
|
const CHECK_IP_URL = '<%=url([[admin]], [[services]], [[shadowsocksr]], [[ip]])%>';
|
||||||
|
|
||||||
let wW = window.innerWidth;
|
let wW = window.innerWidth;
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
LUCI_NAME:=luci-app-tinyfilemanager
|
LUCI_NAME:=luci-app-tinyfilemanager
|
||||||
PKG_VERSION:=2.6
|
PKG_VERSION:=2.6
|
||||||
PKG_RELEASE:=4
|
PKG_RELEASE:=5
|
||||||
|
|
||||||
LUCI_TITLE:=LuCI Tiny File Manager
|
LUCI_TITLE:=LuCI Tiny File Manager
|
||||||
LUCI_DEPENDS:=+php8 +php8-cgi +php8-fastcgi +php8-fpm +php8-mod-session +php8-mod-ctype +php8-mod-fileinfo +php8-mod-zip +php8-mod-iconv +php8-mod-mbstring +coreutils-stat +zoneinfo-asia +bash +curl +tar +inotifywait
|
LUCI_DEPENDS:=+php8 +php8-cgi +php8-fastcgi +php8-fpm +php8-mod-session +php8-mod-ctype +php8-mod-fileinfo +php8-mod-zip +php8-mod-iconv +php8-mod-mbstring +coreutils-stat +zoneinfo-asia +bash +curl +tar +inotifywait
|
||||||
@@ -22,7 +22,7 @@ define Package/$(LUCI_NAME)/conffiles
|
|||||||
/etc/config/tinyfilemanager
|
/etc/config/tinyfilemanager
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/$(LUCI_NAME)/preinst
|
define Package/$(LUCI_NAME)/postinst
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
mkdir -p "$${IPKG_INSTROOT}/www/tinyfilemanager" 2>/dev/null
|
mkdir -p "$${IPKG_INSTROOT}/www/tinyfilemanager" 2>/dev/null
|
||||||
[ ! -d "$${IPKG_INSTROOT}/www/tinyfilemanager/rootfs" ] && ln -s / "$${IPKG_INSTROOT}/www/tinyfilemanager/rootfs"
|
[ ! -d "$${IPKG_INSTROOT}/www/tinyfilemanager/rootfs" ] && ln -s / "$${IPKG_INSTROOT}/www/tinyfilemanager/rootfs"
|
||||||
|
|||||||
@@ -6,7 +6,8 @@
|
|||||||
"/usr/libexec/tinyfilemanager-update": [ "exec" ],
|
"/usr/libexec/tinyfilemanager-update": [ "exec" ],
|
||||||
"/etc/init.d/tinyfilemanager check": [ "exec" ],
|
"/etc/init.d/tinyfilemanager check": [ "exec" ],
|
||||||
"/etc/init.d/tinyfilemanager reload": [ "exec" ],
|
"/etc/init.d/tinyfilemanager reload": [ "exec" ],
|
||||||
"/var/tinyfilemanager/releaseslist": [ "read" ]
|
"/var/tinyfilemanager/releaseslist": [ "read" ],
|
||||||
|
"/tmp/tinyfilemanager/releaseslist": [ "read" ]
|
||||||
},
|
},
|
||||||
"uci": [ "tinyfilemanager" ]
|
"uci": [ "tinyfilemanager" ]
|
||||||
},
|
},
|
||||||
|
|||||||
+2
-2
@@ -5,8 +5,8 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=nps
|
PKG_NAME:=nps
|
||||||
PKG_VERSION:=0.26.36
|
PKG_VERSION:=0.26.37
|
||||||
PKG_RELEASE:=11
|
PKG_RELEASE:=12
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
PKG_SOURCE_URL:=https://codeload.github.com/yisier/nps/tar.gz/v$(PKG_VERSION)?
|
PKG_SOURCE_URL:=https://codeload.github.com/yisier/nps/tar.gz/v$(PKG_VERSION)?
|
||||||
|
|||||||
+2
-2
@@ -5,8 +5,8 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=sing-box
|
PKG_NAME:=sing-box
|
||||||
PKG_VERSION:=1.13.16
|
PKG_VERSION:=1.13.18
|
||||||
PKG_RELEASE:=24
|
PKG_RELEASE:=25
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
PKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)?
|
PKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)?
|
||||||
|
|||||||
Reference in new issue
Block a user