最終更新 3 weeks ago

Аналог a2enable/a2disable для nginx - управляет файлами виртуальных хостов.

KarelWintersky revised this gist 1 month ago. Go to revision

1 file changed, 108 insertions, 25 deletions

vhostmanage.sh

@@ -1,9 +1,11 @@
1 1 #!/bin/bash
2 + VERSION='1.1'
2 3
3 4 ### Конфигурация ###
4 5 SEARCH_EXTENSION="*" # Можно изменить на "*" для поиска всех файлов
5 6 SITES_AVAILABLE="/etc/nginx/sites-available"
6 7 SITES_ENABLED="/etc/nginx/sites-enabled"
8 + SITES_ORDER_DISABLED_FIRST=1 # 1 - выключенные первыми, 0 - включенные первыми
7 9
8 10 ### Стили вывода ###
9 11 GREEN='\033[0;32m'
@@ -11,11 +13,30 @@ RED='\033[0;31m'
11 13 YELLOW='\033[1;33m'
12 14 NC='\033[0m' # No Color
13 15
16 + ### Справка ###
17 + show_help() {
18 + echo ""
19 + echo -e "${YELLOW}VHostManage version $VERSION${NC}"
20 + echo -e "(c) Karel Wintersky + Claude Sonnet, 2025-2026"
21 + echo ""
22 + echo -e "${YELLOW}Использование:${NC}"
23 + echo " vhostmanage - Информация о версии и список всех сайтов"
24 + echo " vhostmanage list - Список всех сайтов"
25 + echo " vhostmanage list enabled - Список только включенных сайтов"
26 + echo " vhostmanage list disabled - Список только выключенных сайтов"
27 + echo " vhostmanage enable <site> [link_name] - Включить сайт"
28 + echo " vhostmanage disable <site> - Выключить сайт"
29 + echo " vhostmanage help - Показать эту справку"
30 + echo -e "\n${YELLOW}Настройки:${NC}"
31 + echo " Измените SEARCH_EXTENSION в скрипте"
32 + echo " Доступные значения: conf (по умолчанию) или * (все файлы)"
33 + }
34 +
14 35 ### Проверка прав ###
15 36 check_root() {
16 37 if [ "$(id -u)" -ne 0 ]; then
17 - echo -e "${RED}Ошибка: требуется root (используйте sudo)${NC}" >&2
18 - exit 1
38 + echo -e "${RED}ВАЖНО: для выполнения команд enable/disable требуется root (используйте sudo)${NC}" >&2
39 + # exit 1
19 40 fi
20 41 }
21 42
@@ -59,11 +80,62 @@ get_enabled_name() {
59 80
60 81 ### Вывод списка ###
61 82 list_sites() {
62 - echo -e "${YELLOW}Доступные сайты (расширение: $SEARCH_EXTENSION):${NC}"
63 - echo "===================================="
83 + local filter="$1" # all, enabled, disabled
64 84
65 - find_configs | while read -r rel_path; do
85 + if [ "$filter" != "enabled" ] && [ "$filter" != "disabled" ]; then
86 + filter="all"
87 + fi
88 +
89 + # Собираем сайты в массивы
90 + local enabled_sites=()
91 + local disabled_sites=()
92 +
93 + while IFS= read -r rel_path; do
66 94 if is_enabled "$rel_path"; then
95 + enabled_sites+=("$rel_path")
96 + else
97 + disabled_sites+=("$rel_path")
98 + fi
99 + done < <(find_configs)
100 +
101 + # Сортируем массивы
102 + IFS=$'\n' enabled_sites=($(sort <<<"${enabled_sites[*]}"))
103 + IFS=$'\n' disabled_sites=($(sort <<<"${disabled_sites[*]}"))
104 + unset IFS
105 +
106 + # Выводим в зависимости от фильтра и порядка
107 + if [ "$filter" = "all" ]; then
108 + if [ "$SITES_ORDER_DISABLED_FIRST" -eq 1 ]; then
109 + # Сначала выключенные
110 + for rel_path in "${disabled_sites[@]}"; do
111 + echo -e "${RED}[disabled]${NC} $rel_path"
112 + done
113 + for rel_path in "${enabled_sites[@]}"; do
114 + local enabled_name=$(get_enabled_name "$rel_path")
115 + local base_name=$(basename "$rel_path")
116 + if [ "$enabled_name" != "$base_name" ]; then
117 + echo -e "${GREEN}[enabled]${NC} $rel_path (как $enabled_name)"
118 + else
119 + echo -e "${GREEN}[enabled]${NC} $rel_path"
120 + fi
121 + done
122 + else
123 + # Сначала включенные
124 + for rel_path in "${enabled_sites[@]}"; do
125 + local enabled_name=$(get_enabled_name "$rel_path")
126 + local base_name=$(basename "$rel_path")
127 + if [ "$enabled_name" != "$base_name" ]; then
128 + echo -e "${GREEN}[enabled]${NC} $rel_path (как $enabled_name)"
129 + else
130 + echo -e "${GREEN}[enabled]${NC} $rel_path"
131 + fi
132 + done
133 + for rel_path in "${disabled_sites[@]}"; do
134 + echo -e "${RED}[disabled]${NC} $rel_path"
135 + done
136 + fi
137 + elif [ "$filter" = "enabled" ]; then
138 + for rel_path in "${enabled_sites[@]}"; do
67 139 local enabled_name=$(get_enabled_name "$rel_path")
68 140 local base_name=$(basename "$rel_path")
69 141 if [ "$enabled_name" != "$base_name" ]; then
@@ -71,10 +143,12 @@ list_sites() {
71 143 else
72 144 echo -e "${GREEN}[enabled]${NC} $rel_path"
73 145 fi
74 - else
146 + done
147 + elif [ "$filter" = "disabled" ]; then
148 + for rel_path in "${disabled_sites[@]}"; do
75 149 echo -e "${RED}[disabled]${NC} $rel_path"
76 - fi
77 - done
150 + done
151 + fi
78 152 }
79 153
80 154 ### Включение сайта ###
@@ -99,20 +173,20 @@ enable_site() {
99 173 return
100 174 fi
101 175
102 - if ln -s "$available_path" "$enabled_path"; then
176 + if sudo ln -s "$available_path" "$enabled_path"; then
103 177 if [ "$link_name" != "$(basename "$site_path")" ]; then
104 178 echo -e "${GREEN}Включен: $site_path (как $link_name)${NC}"
105 179 else
106 180 echo -e "${GREEN}Включен: $site_path${NC}"
107 181 fi
108 182
109 - if ! nginx -t; then
183 + if ! sudo nginx -t; then
110 184 echo -e "${RED}Ошибка конфигурации!${NC}" >&2
111 185 rm "$enabled_path"
112 186 exit 1
113 187 fi
114 188
115 - systemctl reload nginx
189 + sudo systemctl reload nginx
116 190 echo "NGINX перезагружен"
117 191 else
118 192 echo -e "${RED}Ошибка создания симлинка${NC}" >&2
@@ -131,19 +205,19 @@ disable_site() {
131 205 return
132 206 fi
133 207
134 - if rm "$enabled_path"; then
208 + if sudo rm "$enabled_path"; then
135 209 if [ "$enabled_name" != "$(basename "$site_path")" ]; then
136 210 echo -e "${GREEN}Выключен: $enabled_name (ссылался на $site_path)${NC}"
137 211 else
138 212 echo -e "${GREEN}Выключен: $site_path${NC}"
139 213 fi
140 214
141 - if ! nginx -t; then
215 + if ! sudo nginx -t; then
142 216 echo -e "${RED}Ошибка конфигурации!${NC}" >&2
143 217 exit 1
144 218 fi
145 219
146 - systemctl reload nginx
220 + sudo systemctl reload nginx
147 221 echo "NGINX перезагружен"
148 222 else
149 223 echo -e "${RED}Ошибка удаления симлинка${NC}" >&2
@@ -151,22 +225,23 @@ disable_site() {
151 225 fi
152 226 }
153 227
154 - ### Основной код ###
155 - show_help() {
156 - echo -e "${YELLOW}Использование:${NC}"
157 - echo " nghost list - Список сайтов"
158 - echo " nghost enable <site> [link_name] - Включить сайт"
159 - echo " nghost disable <site> - Выключить сайт"
160 - echo -e "\n${YELLOW}Настройки:${NC}"
161 - echo " Измените SEARCH_EXTENSION в скрипте"
162 - echo " Доступные значения: conf (по умолчанию) или * (все файлы)"
228 + ### Вывод информации о версии и списка ###
229 + show_about() {
230 + echo ""
231 + echo -e "${YELLOW}VHostManage version $VERSION${NC}"
232 + echo ""
233 + list_sites "all"
234 + echo ""
235 + echo -e "Use ${YELLOW}vhostmanage help${NC} for help"
163 236 }
164 237
165 - check_root
238 +
239 + ### Основной код ###
240 + # check_root
166 241
167 242 case "$1" in
168 243 list)
169 - list_sites
244 + list_sites "$2"
170 245 ;;
171 246 enable)
172 247 if [ -z "$2" ]; then
@@ -184,7 +259,15 @@ case "$1" in
184 259 fi
185 260 disable_site "$2"
186 261 ;;
262 + help)
263 + show_help
264 + ;;
265 + "")
266 + show_about
267 + ;;
187 268 *)
269 + echo -e "${RED}Неизвестная команда: $1${NC}" >&2
270 + echo ""
188 271 show_help
189 272 exit 1
190 273 ;;

KarelWintersky revised this gist 1 year ago. Go to revision

No changes

KarelWintersky revised this gist 1 year ago. Go to revision

1 file changed, 192 insertions

vhostmanage.sh(file created)

@@ -0,0 +1,192 @@
1 + #!/bin/bash
2 +
3 + ### Конфигурация ###
4 + SEARCH_EXTENSION="*" # Можно изменить на "*" для поиска всех файлов
5 + SITES_AVAILABLE="/etc/nginx/sites-available"
6 + SITES_ENABLED="/etc/nginx/sites-enabled"
7 +
8 + ### Стили вывода ###
9 + GREEN='\033[0;32m'
10 + RED='\033[0;31m'
11 + YELLOW='\033[1;33m'
12 + NC='\033[0m' # No Color
13 +
14 + ### Проверка прав ###
15 + check_root() {
16 + if [ "$(id -u)" -ne 0 ]; then
17 + echo -e "${RED}Ошибка: требуется root (используйте sudo)${NC}" >&2
18 + exit 1
19 + fi
20 + }
21 +
22 + ### Получить реальный путь из симлинка ###
23 + get_available_path() {
24 + local enabled_link="$1"
25 + readlink -f "$enabled_link" | sed "s|^$SITES_AVAILABLE/||"
26 + }
27 +
28 + ### Поиск конфигов ###
29 + find_configs() {
30 + local search_pattern="*.$SEARCH_EXTENSION"
31 + [ "$SEARCH_EXTENSION" = "*" ] && search_pattern="*"
32 +
33 + find "$SITES_AVAILABLE" -type f -name "$search_pattern" | while read -r file; do
34 + echo "${file#$SITES_AVAILABLE/}"
35 + done
36 + }
37 +
38 + ### Проверка включен ли сайт ###
39 + is_enabled() {
40 + local site_path="$1"
41 + find "$SITES_ENABLED" -type l | while read -r link; do
42 + if [ "$(get_available_path "$link")" = "$site_path" ]; then
43 + echo "1"
44 + return
45 + fi
46 + done | grep -q "1"
47 + }
48 +
49 + ### Получить имя симлинка для сайта ###
50 + get_enabled_name() {
51 + local site_path="$1"
52 + find "$SITES_ENABLED" -type l | while read -r link; do
53 + if [ "$(get_available_path "$link")" = "$site_path" ]; then
54 + basename "$link"
55 + return
56 + fi
57 + done
58 + }
59 +
60 + ### Вывод списка ###
61 + list_sites() {
62 + echo -e "${YELLOW}Доступные сайты (расширение: $SEARCH_EXTENSION):${NC}"
63 + echo "===================================="
64 +
65 + find_configs | while read -r rel_path; do
66 + if is_enabled "$rel_path"; then
67 + local enabled_name=$(get_enabled_name "$rel_path")
68 + local base_name=$(basename "$rel_path")
69 + if [ "$enabled_name" != "$base_name" ]; then
70 + echo -e "${GREEN}[enabled]${NC} $rel_path (как $enabled_name)"
71 + else
72 + echo -e "${GREEN}[enabled]${NC} $rel_path"
73 + fi
74 + else
75 + echo -e "${RED}[disabled]${NC} $rel_path"
76 + fi
77 + done
78 + }
79 +
80 + ### Включение сайта ###
81 + enable_site() {
82 + local site_path="$1"
83 + local link_name="${2:-$(basename "$site_path")}"
84 + local available_path="$SITES_AVAILABLE/$site_path"
85 + local enabled_path="$SITES_ENABLED/$link_name"
86 +
87 + if [ ! -f "$available_path" ]; then
88 + echo -e "${RED}Ошибка: файл $available_path не существует${NC}" >&2
89 + exit 1
90 + fi
91 +
92 + if is_enabled "$site_path"; then
93 + local current_name=$(get_enabled_name "$site_path")
94 + if [ "$current_name" != "$(basename "$site_path")" ]; then
95 + echo -e "${YELLOW}Предупреждение: сайт уже включен как $current_name${NC}" >&2
96 + else
97 + echo -e "${YELLOW}Предупреждение: сайт уже включен${NC}" >&2
98 + fi
99 + return
100 + fi
101 +
102 + if ln -s "$available_path" "$enabled_path"; then
103 + if [ "$link_name" != "$(basename "$site_path")" ]; then
104 + echo -e "${GREEN}Включен: $site_path (как $link_name)${NC}"
105 + else
106 + echo -e "${GREEN}Включен: $site_path${NC}"
107 + fi
108 +
109 + if ! nginx -t; then
110 + echo -e "${RED}Ошибка конфигурации!${NC}" >&2
111 + rm "$enabled_path"
112 + exit 1
113 + fi
114 +
115 + systemctl reload nginx
116 + echo "NGINX перезагружен"
117 + else
118 + echo -e "${RED}Ошибка создания симлинка${NC}" >&2
119 + exit 1
120 + fi
121 + }
122 +
123 + ### Выключение сайта ###
124 + disable_site() {
125 + local site_path="$1"
126 + local enabled_name=$(get_enabled_name "$site_path")
127 + local enabled_path="$SITES_ENABLED/$enabled_name"
128 +
129 + if [ -z "$enabled_name" ]; then
130 + echo -e "${YELLOW}Предупреждение: сайт не включен${NC}" >&2
131 + return
132 + fi
133 +
134 + if rm "$enabled_path"; then
135 + if [ "$enabled_name" != "$(basename "$site_path")" ]; then
136 + echo -e "${GREEN}Выключен: $enabled_name (ссылался на $site_path)${NC}"
137 + else
138 + echo -e "${GREEN}Выключен: $site_path${NC}"
139 + fi
140 +
141 + if ! nginx -t; then
142 + echo -e "${RED}Ошибка конфигурации!${NC}" >&2
143 + exit 1
144 + fi
145 +
146 + systemctl reload nginx
147 + echo "NGINX перезагружен"
148 + else
149 + echo -e "${RED}Ошибка удаления симлинка${NC}" >&2
150 + exit 1
151 + fi
152 + }
153 +
154 + ### Основной код ###
155 + show_help() {
156 + echo -e "${YELLOW}Использование:${NC}"
157 + echo " nghost list - Список сайтов"
158 + echo " nghost enable <site> [link_name] - Включить сайт"
159 + echo " nghost disable <site> - Выключить сайт"
160 + echo -e "\n${YELLOW}Настройки:${NC}"
161 + echo " Измените SEARCH_EXTENSION в скрипте"
162 + echo " Доступные значения: conf (по умолчанию) или * (все файлы)"
163 + }
164 +
165 + check_root
166 +
167 + case "$1" in
168 + list)
169 + list_sites
170 + ;;
171 + enable)
172 + if [ -z "$2" ]; then
173 + echo -e "${RED}Укажите имя сайта${NC}" >&2
174 + show_help
175 + exit 1
176 + fi
177 + enable_site "$2" "$3"
178 + ;;
179 + disable)
180 + if [ -z "$2" ]; then
181 + echo -e "${RED}Укажите имя сайта${NC}" >&2
182 + show_help
183 + exit 1
184 + fi
185 + disable_site "$2"
186 + ;;
187 + *)
188 + show_help
189 + exit 1
190 + ;;
191 + esac
192 +
Newer Older