Dernière activité 12 hours ago

Утилита для управления виртуальными хостами NGINX в системах с организацией конфигурации через sites-available/sites-enabled.

KarelWintersky a révisé ce gist 12 hours ago. Aller à la révision

1 file changed, 2 deletions

vhostmanage.md renommé en vhostmanage.sh

@@ -1,4 +1,3 @@
1 - ```bash
2 1 #!/bin/bash
3 2 VERSION='1.1'
4 3
@@ -274,4 +273,3 @@ case "$1" in
274 273 ;;
275 274 esac
276 275
277 - ```

KarelWintersky a révisé ce gist 1 day ago. Aller à la révision

1 file changed, 277 insertions

vhostmanage.md(fichier créé)

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