-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy patheasyenv.sh
More file actions
129 lines (116 loc) · 3.02 KB
/
Copy patheasyenv.sh
File metadata and controls
129 lines (116 loc) · 3.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env bash
set -euo pipefail
# EasyEnv CLI — 从 catalog.yml 解析模块并 docker compose up/down
# Windows: Git Bash / WSL
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CATALOG="${ROOT}/catalog.yml"
usage() {
cat <<'EOF'
用法: ./easyenv.sh <list|up|down|path> [module_id]
list 列出 catalog.yml 中全部模块
up <id> 在模块目录执行 docker compose up -d
down <id> 在模块目录执行 docker compose down
path <id> 打印模块相对路径
示例:
./easyenv.sh list
./easyenv.sh up mysql
./easyenv.sh down redis
EOF
}
# 解析: 在匹配 id 的块内取 path 字段(扁平 - id: 块)
module_field() {
local id="$1"
local field="$2"
awk -v id="$id" -v field="$field" '
$0 ~ /^- id:[[:space:]]*/ {
cur = $0
sub(/^- id:[[:space:]]*/, "", cur)
gsub(/[[:space:]]+$/, "", cur)
inblock = (cur == id)
next
}
inblock && $0 ~ ("^[[:space:]]*" field ":[[:space:]]*") {
line = $0
sub("^[[:space:]]*" field ":[[:space:]]*", "", line)
gsub(/^["'\'']|["'\'']$/, "", line)
print line
exit
}
' "$CATALOG"
}
cmd_list() {
printf "%-14s %-12s %-40s %s\n" "ID" "CATEGORY" "PATH" "STATUS"
printf "%-14s %-12s %-40s %s\n" "--------------" "------------" "----------------------------------------" "------"
local id category path status
while IFS= read -r id; do
[[ -z "$id" ]] && continue
category="$(module_field "$id" category)"
path="$(module_field "$id" path)"
status="$(module_field "$id" status)"
printf "%-14s %-12s %-40s %s\n" "$id" "$category" "$path" "$status"
done < <(awk '/^- id:[[:space:]]*/ { sub(/^- id:[[:space:]]*/,""); gsub(/[[:space:]]+$/,""); print }' "$CATALOG")
}
require_compose_module() {
local id="$1"
local path
path="$(module_field "$id" path)"
if [[ -z "$path" ]]; then
echo "未知模块: $id(请先 ./easyenv.sh list)" >&2
exit 1
fi
local abs="${ROOT}/${path}"
if [[ ! -f "${abs}/docker-compose.yml" ]]; then
echo "模块 ${id} 无 docker-compose.yml: ${path}" >&2
echo "(runtime 类请进入目录执行 install.sh)" >&2
exit 1
fi
echo "$abs"
}
cmd_up() {
local abs
abs="$(require_compose_module "$1")"
(cd "$abs" && docker compose up -d)
}
cmd_down() {
local abs
abs="$(require_compose_module "$1")"
(cd "$abs" && docker compose down)
}
cmd_path() {
local path
path="$(module_field "$1" path)"
if [[ -z "$path" ]]; then
echo "未知模块: $1" >&2
exit 1
fi
echo "$path"
}
main() {
if [[ ! -f "$CATALOG" ]]; then
echo "缺少 catalog.yml: $CATALOG" >&2
exit 1
fi
local op="${1:-}"
case "$op" in
list) cmd_list ;;
up)
[[ $# -ge 2 ]] || { usage; exit 1; }
cmd_up "$2"
;;
down)
[[ $# -ge 2 ]] || { usage; exit 1; }
cmd_down "$2"
;;
path)
[[ $# -ge 2 ]] || { usage; exit 1; }
cmd_path "$2"
;;
-h|--help|help|"") usage ;;
*)
echo "未知命令: $op" >&2
usage
exit 1
;;
esac
}
main "$@"