diff --git a/extras/apm-launcher b/extras/apm-launcher new file mode 100755 index 00000000..d7aafd61 --- /dev/null +++ b/extras/apm-launcher @@ -0,0 +1,102 @@ +#!/bin/bash + +# ===== 日志函数(简化版)===== +log.info() { echo "INFO: $*"; } +log.warn() { echo "WARN: $*"; } +log.error() { echo "ERROR: $*"; } +log.debug() { :; } # APM 场景下可禁用 debug 日志 + +# ===== APM 专用桌面文件扫描(单文件)===== +function scan_apm_desktop_log() { + unset desktop_file_path + local pkg_name="$1" + local desktop_dir="/var/lib/apm/apm/files/ace-env/var/lib/apm/${pkg_name}/entries/applications" + + [ -d "$desktop_dir" ] || return 1 + + while IFS= read -r -d '' path; do + [ -f "$path" ] || continue + if ! grep -q 'NoDisplay=true' "$path" 2>/dev/null; then + log.info "Found valid APM desktop file: $path" + export desktop_file_path="$path" + return 0 + fi + done < <(find "$desktop_dir" -name "*.desktop" -type f -print0 2>/dev/null) + + return 1 +} + +# ===== APM 专用桌面文件扫描(多文件列表)===== +function scan_apm_desktop_list() { + local pkg_name="$1" + local desktop_dir="/var/lib/apm/apm/files/ace-env/var/lib/apm/${pkg_name}/entries/applications" + local result="" + + [ -d "$desktop_dir" ] || { echo ""; return; } + + while IFS= read -r -d '' path; do + [ -f "$path" ] || continue + if ! grep -q 'NoDisplay=true' "$path" 2>/dev/null; then + result+="${path}," + fi + done < <(find "$desktop_dir" -name "*.desktop" -type f -print0 2>/dev/null) + + echo "${result%,}" +} + +# ===== 启动应用 ===== +function launch_app() { + local desktop_path="${1#file://}" + local exec_cmd + + # 提取并清理 Exec 行(移除字段代码如 %f %u 等) + exec_cmd=$(grep -m1 '^Exec=' "$desktop_path" | cut -d= -f2- | sed 's/%[fFuUdDnNickvm]*//g; s/^[[:space:]]*//; s/[[:space:]]*$//') + [ -z "$exec_cmd" ] && return 1 + + log.info "Launching: $exec_cmd" + ${SHELL:-bash} -c "$exec_cmd" & +} + +# 导出函数供 ACE 环境调用 +export -f launch_app scan_apm_desktop_log scan_apm_desktop_list log.info log.error + +# ===== 主逻辑 ===== +[ $# -lt 2 ] && { + log.error "Usage: $0 {check|list|launch|start} " + exit 1 +} + +action="$1" +pkg_name="$2" + +case "$action" in + check) + if scan_apm_desktop_log "$pkg_name"; then + exit 0 + else + exit 1 + fi + ;; + + list) + if result=$(scan_apm_desktop_list "$pkg_name"); [ -n "$result" ]; then + echo "$result" + exit 0 + else + exit 1 + fi + ;; + + launch|start) + if scan_apm_desktop_log "$pkg_name" && launch_app "$desktop_file_path"; then + exit 0 + else + exit 1 + fi + ;; + + *) + log.error "Invalid command: $action (supported: check|list|launch|start)" + exit 2 + ;; +esac