├── .gitignore ├── LICENSE.txt ├── README.md ├── apache_restart.sh ├── backup.sh ├── certs.sh ├── change_php_version.sh ├── checkip.sh ├── clonesite.sh ├── create_hotlist.sh ├── create_site.sh ├── create_swapfile.sh ├── index.html ├── local_router.sh ├── mariadb_install.sh ├── mariadb_repo_setup.sh ├── mariadb_restart.sh ├── mc.menu ├── mc.menu.local ├── php_multi_install.sh ├── php_restart.sh ├── postupdate.sh ├── ri.sh ├── version ├── windows.sh └── ydcmd.py /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2018 Form.io 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of 5 | this software and associated documentation files (the "Software"), to deal in the 6 | Software without restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 8 | Software, and to permit persons to whom the Software is furnished to do so, 9 | subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 16 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 17 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 18 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 19 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RISH – Robust Internet Server Host 2 | 3 | SSH Web-server control panel 4 | 5 | ![oblozhka2](https://github.com/user-attachments/assets/fb50e880-a5fb-44ed-9ad1-8c5cd0dcef51) 6 | 7 | SSH панель конфигурации и установки web сервера 8 | 9 | Официальный сайт RISH https://rish.su 10 | 11 | Протестировано на AlmaLinux 8,9 (CentOS 8), Rocky Linux и Fedora 12 | 13 | * http/2 14 | * gzip and brotli компрессия 15 | 16 | * mpm event для apache 17 | * MariaDB 10.6, 10.11 или 11.4 18 | * Система не устанавливает никаких дополнительных сервисов и не расходует попусту ресурсов сервера 19 | * Все актуальные версии PHP начиная с 7.4 (список держится в актуальном состоянии) 20 | * Есть возможность установки Joomla 21 | * Есть возможность выбора версии PHP для каждого сайта на сервере 22 | 23 | Команда установки 24 | 25 | Предпочтительная команда установки с основного сервера: 26 | 27 | curl -L get.rish.su | sh && /root/rish/ri.sh 28 | 29 | Если у вас блокируется установка с серверов РФ – воспользуйтесь альтернативным адресом. Установка произойдет с серверов github. Альтернативная команда установки: 30 | 31 | curl -L getrish.sovmart.com | sh && /root/rish/ri.sh 32 | 33 | Внимание! Запускать скрипт надо от root! 34 | 35 | Возможно, что в минимальной установке CentOS будет отсутствовать команда curl и ее понадобится установить отдельно: 36 | 37 | yum install curl 38 | 39 | -------------------------------------------------------------------------------- /apache_restart.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | source /root/rish/windows.sh 3 | GREEN='\033[0;32m' 4 | RED='\033[0;31m' 5 | WHITE='\033[0m' 6 | clear 7 | function apache_restart() { 8 | options=("Быстрый перезапуск Apache (reload) " 9 | "Полный перезапуск Apache (restart)" 10 | "Статус Apache (status)" 11 | "Выйти") 12 | vertical_menu "center" "center" 0 30 "${options[@]}" 13 | choice=$? 14 | clear 15 | case "$choice" in 16 | 0) 17 | if apachectl configtest; then 18 | # Перезагрузка Apache, если конфигурация верна 19 | if systemctl reload httpd; then 20 | echo -e "Сервер успешно ${GREEN}перезагружен${WHITE}" 21 | else 22 | echo -e "${RED}Ошибка${WHITE} при попытке перезагрузить сервер" 23 | fi 24 | else 25 | echo -e "${RED}Ошибка${WHITE} в конфигурации Apache, сервер не был перезагружен" 26 | fi 27 | ;; 28 | 1) 29 | if apachectl configtest; then 30 | # Перезагрузка Apache, если конфигурация верна 31 | echo -e "Перезагрузка начата. Процесс может оказаться долгим - до минуты или более." 32 | if systemctl restart httpd; then 33 | echo -e "Сервер успешно ${GREEN}перезагружен${WHITE}" 34 | else 35 | echo -e "${RED}Ошибка${WHITE} при попытке перезагрузить сервер" 36 | fi 37 | else 38 | echo -e "${RED}Ошибка${WHITE} в конфигурации Apache, сервер не был перезагружен" 39 | fi 40 | ;; 41 | 2) 42 | systemctl --no-pager status httpd 43 | ;; 44 | *) 45 | echo "Никаких действий не было произведено." 46 | ;; 47 | esac 48 | vertical_menu "current" 2 0 5 "Нажмите Enter" 49 | } 50 | # Если идет прямой вызов - выполняем функцию. Если идет подключение через source - то ничего не делаем 51 | if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then 52 | apache_restart 53 | fi -------------------------------------------------------------------------------- /backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | clear 3 | MYSQLPASS="2" 4 | if [[ -x "/usr/bin/ydcmd" ]]; then 5 | ydcmd_path="/usr/bin/ydcmd" 6 | elif [[ -x "/usr/local/bin/ydcmd" ]]; then 7 | ydcmd_path="/usr/local/bin/ydcmd" 8 | else 9 | cp /root/rish/ydcmd.py /usr/local/bin/ydcmd || { echo "Ошибка: ydcmd.py не найден"; exit 1; } 10 | chmod +x /usr/local/bin/ydcmd 11 | ydcmd_path="/usr/local/bin/ydcmd" 12 | fi 13 | 14 | # Путь к конфигурационному файлу 15 | config_file="/root/rish/rish_config.sh" 16 | 17 | # Проверяем существование файла 18 | if [ ! -f "$config_file" ]; then 19 | # Создаем файл, если он не существует 20 | touch "$config_file" 21 | fi 22 | 23 | # Определяем переменные, их значения и комментарии 24 | declare -A vars 25 | vars=( 26 | ["cnf"]="#конфигурационный файл для ydcmd\ncnf=/root/.ydcmd.cfg" 27 | ["backupall"]="#\nbackupall=/root/backup_list_all" 28 | ["directory"]="#директория из которой создается бекап (где лежат сайты по каталогам - один каталог - один сайт)\ndirectory=/var/www/*/www" 29 | ["DIR_BACKUP"]="#временная папка для создания бекапа\nDIR_BACKUP=/root/backup" 30 | ["keeplast"]="#сколько последних архиваций хранить\nkeeplast=5" 31 | ["splitarchive"]="#разбивать архив на части по сколько мегабайт\nsplitarchive=500m" 32 | ["recordsize"]="#размер записей tar\nrecordsize=1m" 33 | ["checkpoint"]="#через сколько записей вызывать checkpoint\ncheckpoint=10" 34 | ["server"]="#Директория бекапа сервера в месте архивирования (куда складывать копии).\n#Если на одном диске будут бекапы разных серверов - надо изменить название для каждого\nserver=\"backup_server\"" 35 | ) 36 | 37 | # Функция для добавления переменной и комментария, если они отсутствуют 38 | add_var_if_not_exists() { 39 | local var_name="$1" 40 | local var_value="$2" 41 | if ! grep -P "^\s*${var_name}\s*=" "$config_file" > /dev/null 2>&1; then 42 | echo -e "$var_value" >> "$config_file" 43 | fi 44 | } 45 | 46 | # Проверяем каждую переменную 47 | for var in "${!vars[@]}"; do 48 | add_var_if_not_exists "$var" "${vars[$var]}" 49 | done 50 | 51 | source "$config_file" 52 | source /root/rish/windows.sh 53 | 54 | 55 | 56 | DATE=$(/bin/date '+%Y.%m.%d') 57 | 58 | GREEN='\033[0;32m' 59 | RED='\033[0;31m' 60 | LRED='\033[1;31m' 61 | WHITE='\033[0m' 62 | 63 | createlist() { 64 | echo 65 | echo "Создаем список сайтов для архивации." 66 | echo 67 | echo -n "" > $backupall 68 | let ii=0 69 | 70 | maxlen=0 71 | 72 | # Первый проход для определения максимальной длины имени сайта 73 | for file in $directory/* 74 | do 75 | if [ -d "$file" ] 76 | then 77 | r="${file##*/}" 78 | # Определяем длину имени сайта 79 | len=${#r} 80 | if (( len > maxlen )) 81 | then 82 | maxlen=$len 83 | fi 84 | fi 85 | done 86 | 87 | for file in $directory/* 88 | do 89 | if [ -d "$file" ] 90 | then 91 | r="${file##*/}" 92 | db="${r}" 93 | if [[ "$db" == "000-default" ]] 94 | then 95 | continue 96 | fi 97 | let ii=$ii+1 98 | printf "%3s. " $ii 99 | 100 | if [ -n "`mariadb -uroot -p${MYSQLPASS} -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$db'" 2>&1`" ]; 101 | then 102 | db_output="База данных $db" 103 | else 104 | db="" 105 | db_output="----" 106 | fi 107 | printf "${GREEN}%-${maxlen}s${WHITE} %-30s\n" "$r" "$db_output" 108 | currentuser=$(basename $(dirname $(dirname "$file"))) 109 | MYSQLPASS=$(cat /home/${currentuser}/.pass.txt | grep Database | awk '{ print $2}') 110 | echo "${currentuser};$r;$db;${currentuser};$MYSQLPASS" >> $backupall 111 | fi 112 | done 113 | echo 114 | } 115 | 116 | backupall() { 117 | 118 | if ! [[ -d $DIR_BACKUP ]]; then 119 | mkdir $DIR_BACKUP 120 | fi 121 | 122 | while read line; do 123 | IFS=";" 124 | set -- $line 125 | USER=$1 126 | SITE=$2 127 | DB=$3 128 | DB_USER=$4 129 | DB_PASSWD=$5 130 | EXCLUDE_LIST=${6:-} # Если 6-й колонки нет, EXCLUDE_LIST будет пустой 131 | 132 | # Обработка исключаемых папок 133 | EXCLUDE_OPTS=() 134 | if [ -n "$EXCLUDE_LIST" ]; then 135 | IFS=',' read -ra EXCLUDE_DIRS <<< "$EXCLUDE_LIST" 136 | for dir in "${EXCLUDE_DIRS[@]}"; do 137 | EXCLUDE_OPTS+=(--exclude="$dir") 138 | done 139 | fi 140 | 141 | mkdir -p $DIR_BACKUP/$server/$USER/$DATE/ 142 | echo -e -n "Архивация ${GREEN}"$SITE"${WHITE}. " 143 | cd "/var/www/${USER}/www" 144 | if [ -z "$DB" ]; then 145 | echo -n " Базы нет. " 146 | echo -e "Идет создание архива сайта" 147 | echo 148 | tar -czf - "${EXCLUDE_OPTS[@]}" $SITE \ 149 | --record-size=$recordsize --checkpoint=$checkpoint \ 150 | --checkpoint-action=exec='echo -e "\033[1A"$TAR_CHECKPOINT"mB">&2' \ 151 | | split -b $splitarchive --numeric-suffix - \ 152 | $DIR_BACKUP/"${server}/${USER}/${DATE}/${SITE}.tar.gz-part-" 153 | else 154 | mariadb-dump -u$DB_USER -p$DB_PASSWD $DB > $DB.sql 155 | sed -i '1{/999999.*sandbox/d}' $DB.sql 156 | echo -e -n " База ${GREEN}$DB${WHITE} создана. " 157 | echo -e "Идет создание архива сайта" 158 | echo 159 | tar -czf - "${EXCLUDE_OPTS[@]}" $SITE $DB.sql \ 160 | --record-size=$recordsize --checkpoint=$checkpoint \ 161 | --checkpoint-action=exec='echo -e "\033[1A"$TAR_CHECKPOINT"mB">&2' \ 162 | | split -b $splitarchive --numeric-suffix - \ 163 | $DIR_BACKUP/"${server}/${USER}/${DATE}/${SITE}.tar.gz-part-" 164 | rm ./$DB.sql 165 | fi 166 | echo -e "\033[1AАрхив сайта создан. Передаем на место хранения." 167 | $ydcmd_path --config=$cnf put --progress $DIR_BACKUP/ disk:/ 168 | rm -rf $DIR_BACKUP/* 169 | done < $backupall 170 | 171 | for userdir in /var/www/*; do 172 | user=$(basename "$userdir") 173 | if [ -d "$userdir" ] && [ "$user" != "cgi-bin" ] && [ "$user" != "html" ]; then 174 | $ydcmd_path --keep=$keeplast --type=dir clean disk:/"$server/$user" 175 | fi 176 | done 177 | } 178 | 179 | 180 | if [[ "$1" == "auto" ]] 181 | then 182 | echo "Автоматическая архивация" 183 | backupall 184 | exit 0 185 | fi 186 | 187 | basename() { 188 | # Usage: basename "path" 189 | : "${1%/}" 190 | printf '%s\n' "${_##*/}" 191 | } 192 | configcnf() { 193 | echo "Конфигурируем ydcmd" 194 | echo 195 | echo -e "${GREEN}Скопируйте указанную строку в браузер${WHITE}, выдайте разрешения и полученный код введите по запросу." 196 | echo 197 | $ydcmd_path token 198 | echo 199 | echo -e -n "${GREEN}Введите код: ${WHITE}" 200 | read -e TOKEN 201 | tt=$( $ydcmd_path token $TOKEN | awk '{print $4}' ) 202 | cd ~ 203 | echo "[ydcmd]" > $cnf 204 | echo "token = ${tt}" >> $cnf 205 | echo "verbose = yes" >> $cnf 206 | } 207 | 208 | echo "Скрипт автоматического архивирования сайтов сервера" 209 | echo 210 | 211 | 212 | if [ ! -f $cnf ] 213 | then 214 | configcnf 215 | fi 216 | 217 | if $ydcmd_path --config=$cnf info 218 | then 219 | echo 220 | echo -e "Конфигурационный файл настроен ${GREEN}корректно${WHITE}" 221 | else 222 | echo -e "${LRED}Конфигурирование не удалось${WHITE}" 223 | fi 224 | 225 | if [ ! -f $backupall ] 226 | then 227 | createlist 228 | echo 229 | echo -e "Список сайтов для архивации ${GREEN}создан${WHITE} (${backupall})" 230 | echo 231 | echo "Для запуска процесса архивации запустите скрипт повторно" 232 | echo 233 | echo "Предварительная настройка завершена" 234 | vertical_menu "current" 2 0 5 "Нажмите Enter" 235 | exit 0 236 | else 237 | echo -e "Список сайтов для архивации ${GREEN}найден${WHITE} (${backupall})" 238 | fi 239 | minute=$(shuf -i 0-59 -n 1) 240 | minute=$(printf "%2d" $minute) 241 | echo 242 | echo "┌────────────────────────────────────────────────────────────────┐" 243 | echo "│ Для вызова скрипта в режиме CRON нужно добавить параметр auto. │" 244 | echo "│ Настроить архивацию можно по команде crontab -e │" 245 | echo "│ $minute 4 * * * /root/rish/backup.sh auto >/dev/null 2>&1 │" 246 | echo "└────────────────────────────────────────────────────────────────┘" 247 | echo 248 | echo 249 | while true 250 | do 251 | IFS=$' \t\n' 252 | echo "Выберите действие:" 253 | vertical_menu "current" 2 0 5 "default=3" "Архивация всех сайтов сервера" "Обновить файл-список всех архивируемых сайтов" "Обновить привязку аккаунта яндекс-диска" "Выйти" 254 | choice=$? 255 | case "${choice}" in 256 | 0) 257 | backupall 258 | ;; 259 | 1) 260 | createlist 261 | ;; 262 | 2) 263 | if [ -f $cnf ] 264 | then 265 | rm $cnf 266 | fi 267 | configcnf 268 | echo 269 | if $ydcmd_path --config=$cnf info 270 | then 271 | echo 272 | echo -e "Конфигурационный файл настроен ${GREEN}корректно${WHITE}" 273 | else 274 | echo -e "${LRED}Конфигурирование не удалось${WHITE}" 275 | fi 276 | ;; 277 | *) 278 | break 279 | ;; 280 | esac 281 | done 282 | 283 | -------------------------------------------------------------------------------- /certs.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | source /root/rish/windows.sh 3 | GREEN='\033[0;32m' 4 | RED='\033[0;31m' 5 | WHITE='\033[0m' 6 | certs() { 7 | clear 8 | site_name=$1 9 | echo -e "Сертификат для сайта ${GREEN}${site_name}${WHITE}" 10 | echo 11 | if [[ -f "/etc/httpd/conf.d/$site_name.conf" ]]; then 12 | mapfile -t aliases < <(grep "ServerAlias" "/etc/httpd/conf.d/$site_name.conf" | sed 's/^[ \t]*ServerAlias[ \t]*//') 13 | echo "Список алиасов:" 14 | for alias in "${aliases[@]}"; do 15 | echo -e "${alias%"${site_name}"}"${GREEN}${site_name}${WHITE} 16 | done 17 | echo 18 | vertical_menu "current" 2 0 5 "Получить для www.${site_name} и ${site_name}" \ 19 | "Получить только для ${site_name}" \ 20 | "Получить для всех алиасов и ${site_name}" \ 21 | "Получить самоподписанный для www.${site_name} и ${site_name}" \ 22 | "Отозвать сертификат для ${site_name}" 23 | 24 | choice=$? 25 | case "$choice" in 26 | 0) 27 | certbot --apache -d ${site_name} -d www.${site_name} 28 | ;; 29 | 1) 30 | certbot --apache -d ${site_name} 31 | ;; 32 | 2) 33 | domain_args="-d $site_name" 34 | for alias in "${aliases[@]}"; do 35 | domain_args="$domain_args -d $alias" 36 | done 37 | certbot --apache $domain_args 38 | ;; 39 | 3) 40 | cd /etc/httpd/conf.d 41 | 42 | rm -f ${site_name}-ssl* 43 | ttssl="${site_name}-ssl.conf" 44 | localsitename="${site_name}" 45 | { 46 | echo "[req]" 47 | echo "distinguished_name = req_distinguished_name" 48 | echo "x509_extensions = v3_req" 49 | echo "prompt = no" 50 | echo "[req_distinguished_name]" 51 | echo "CN = ${localsitename}" 52 | echo "[v3_req]" 53 | echo "keyUsage = critical, digitalSignature, keyAgreement" 54 | echo "extendedKeyUsage = serverAuth" 55 | echo "subjectAltName = @alt_names" 56 | echo "[alt_names]" 57 | echo "DNS.1 = www.${localsitename}" 58 | echo "DNS.2 = ${localsitename}" 59 | } >rish_temp_file_for_creating_selfsigned_cert.txt 60 | openssl req -x509 -nodes \ 61 | -newkey rsa:2048 \ 62 | -keyout /etc/pki/tls/private/${localsitename}.key \ 63 | -out /etc/pki/tls/certs/${localsitename}.crt \ 64 | -sha256 \ 65 | -days 3650 \ 66 | -subj "/CN=${localsitename}" \ 67 | -config rish_temp_file_for_creating_selfsigned_cert.txt 68 | rm -f rish_temp_file_for_creating_selfsigned_cert.txt 69 | cp ${site_name}.conf $ttssl 70 | sed -i 's///g' "$ttssl" 71 | sed -i "/<\/VirtualHost>/i ServerSignature Off\nSSLCertificateFile /etc/pki/tls/certs/${site_name}.crt\nSSLCertificateKeyFile /etc/pki/tls/private/${site_name}.key" "$ttssl" 72 | if apachectl configtest; then 73 | systemctl reload httpd 74 | echo "Сервер перезагружен." 75 | else 76 | echo -e "Сервер не был перезагружен. ${RED}Ошибка${WHITE} в конфигурации апача." 77 | fi 78 | echo "Сертификат установлен" 79 | echo 80 | ;; 81 | 4) 82 | echo -e "Отзыв сертификата ${GREEN}${site_name}${WHITE}" 83 | # Путь к сертификату 84 | cert_path="/etc/letsencrypt/live/${site_name}/cert.pem" 85 | # Проверка существования сертификата 86 | if [ ! -f "$cert_path" ]; then 87 | echo "Сертификат не найден: $cert_path" 88 | return 89 | fi 90 | # Отзыв сертификата 91 | if ! certbot revoke --cert-path "$cert_path"; then 92 | echo "Не удалось отозвать сертификат" 93 | return 94 | fi 95 | # Путь к файлу конфигурации SSL для Apache 96 | ssl_conf="/etc/httpd/conf.d/${site_name}-le-ssl.conf" 97 | # Удаление файла конфигурации SSL, если он существует 98 | if [ -f "$ssl_conf" ]; then 99 | rm "$ssl_conf" &>/dev/null 100 | echo "Файл SSL конфигурации удален: $ssl_conf" 101 | else 102 | echo "Файл SSL конфигурации не найден: $ssl_conf" 103 | fi 104 | # Проверка конфигурации Apache 105 | if apachectl configtest; then 106 | # Перезагрузка Apache, если конфигурация верна 107 | if systemctl reload httpd; then 108 | echo "Сервер успешно перезагружен" 109 | else 110 | echo "Ошибка при попытке перезагрузить сервер" 111 | fi 112 | else 113 | echo "Ошибка в конфигурации Apache, сервер не был перезагружен" 114 | fi 115 | ;; 116 | *) ;; 117 | esac 118 | else 119 | echo -e "${RED}$site_name${WHITE} это не сайт (не vhost)" 120 | fi 121 | } 122 | # Если идет прямой вызов - выполняем функцию. Если идет подключение через source - то ничего не делаем 123 | if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then 124 | certs "$1" 125 | vertical_menu "current" 2 0 5 "Нажмите Enter" 126 | fi -------------------------------------------------------------------------------- /change_php_version.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | source /root/rish/windows.sh 3 | GREEN='\033[0;32m' 4 | RED='\033[0;31m' 5 | WHITE='\033[0m' 6 | CURSORUP='\033[1A' 7 | ERASEUNTILLENDOFLINE='\033[K' 8 | function change_php_version() { 9 | clear 10 | local path="$2" 11 | site_name="$1" # Имя сайта 12 | if [[ -f "/etc/httpd/conf.d/$site_name.conf" ]]; then 13 | 14 | php_version=$(grep -oP 'SetHandler "proxy:unix:/var/opt/remi/\Kphp[0-9]+' "/etc/httpd/conf.d/$site_name.conf") 15 | echo -e "Сайт ${GREEN}${site_name}${WHITE} использует ${GREEN}${php_version}${WHITE}" 16 | username=$(echo "$path" | cut -d'/' -f4) 17 | mapfile -t installed_versions < <(rpm -qa | grep php | grep -oP 'php[0-9]{2}' | sort -r | uniq) 18 | echo 19 | echo -e "Выберите нужную версию ${GREEN}PHP${WHITE} из доступных." 20 | echo 21 | vertical_menu "current" 1 0 10 "${installed_versions[@]}" 22 | local ret=$? 23 | if ((ret == 255)); then 24 | echo -e "Никаких изменений в конфигурации ${RED}не производилось${WHITE}!" 25 | vertical_menu "current" 2 0 5 "Нажмите Enter" 26 | return 27 | fi 28 | local selected_php=${installed_versions[${ret}]} 29 | if [[ ! -f "/etc/opt/remi/${selected_php}/php-fpm.d/${username}.conf" ]]; then 30 | # Если пул для этой версии PHP еще не был создан, то создаем 31 | echo 32 | echo -e "Выберите режим работы PHP для пользователя ${GREEN}${username}${WHITE}:" 33 | vertical_menu "current" 2 0 5 "ondemand - оптимально расходует память" "dynamic - более оперативно реагирует на запросы" 34 | echo -e ${CURSORUP}${ERASEUNTILLENDOFLINE} 35 | ret=$? 36 | if ((ret == 0)); then 37 | php_mode="ondemand" 38 | else 39 | php_mode="dynamic" 40 | fi 41 | { 42 | echo "[${username}]" 43 | echo "listen = /var/opt/remi/${selected_php}/run/php-fpm/${username}.sock" 44 | echo "user = ${username}" 45 | echo "group = ${username}" 46 | echo "listen.owner = ${username}" 47 | echo "listen.group = ${username}" 48 | echo "" 49 | echo "listen.allowed_clients = 127.0.0.1" 50 | echo "pm = ${php_mode}" 51 | echo "pm.max_children = 20" 52 | echo "pm.start_servers = 3" 53 | echo "pm.min_spare_servers = 3" 54 | echo "pm.max_spare_servers = 5" 55 | echo "pm.process_idle_timeout = 10s" 56 | echo ";slowlog = /var/www/${username}/slow.log" 57 | echo ";request_slowlog_timeout = 15s" 58 | echo "php_value[session.save_handler] = files" 59 | echo "php_value[session.save_path] = /var/www/${username}/session" 60 | echo "php_value[soap.wsdl_cache_dir] = /var/www/${username}/wsdlcache" 61 | } >"/etc/opt/remi/${selected_php}/php-fpm.d/${username}.conf" 62 | 63 | if [[ -f "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf" ]]; then 64 | mv "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf" "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf.old" 65 | fi 66 | 67 | echo -e "Перезапускаем ${GREEN}${selected_php}-php-fpm${WHITE} для активации версии ${GREEN}${selected_php}${WHITE}?" 68 | if vertical_menu "current" 2 0 5 "Да" "Нет"; then 69 | if /opt/remi/${selected_php}/root/usr/sbin/php-fpm -t; then 70 | if systemctl restart "${selected_php}-php-fpm"; then 71 | echo -e "Версия ${GREEN}${selected_php}${WHITE} корректно перезапущена." 72 | echo 73 | else 74 | echo 75 | echo -e "Ошибка при перезапуске ${RED}${selected_php}-php-fpm${WHITE}. Проверьте журналы для диагностики." 76 | echo 77 | fi 78 | else 79 | echo 80 | echo -e "Версия ${RED}${selected_php}${WHITE} имеет проблемы в конфигурационных файлах." 81 | echo -e "Сервис ${RED}не был перезапущен${WHITE} и продолжает работать." 82 | echo 83 | systemctl status "${selected_php}-php-fpm" 84 | fi 85 | else 86 | echo -e "${RED}${selected_php}-php-fpm${WHITE} перезапущен не был. Не забудьте потом перезапустить его самостоятельно." 87 | fi 88 | 89 | fi 90 | cp "/etc/httpd/conf.d/${site_name}.conf" "/etc/httpd/conf.d/${site_name}.conf.old" 91 | # Меняем путь к сокету 92 | sed -i -r "s|/var/opt/remi/php[0-9][0-9]/run/php-fpm/|/var/opt/remi/${selected_php}/run/php-fpm/|g" "/etc/httpd/conf.d/${site_name}.conf" 93 | if [[ -f "/etc/httpd/conf.d/${site_name}-ssl.conf" ]]; then 94 | sed -i -r "s|/var/opt/remi/php[0-9][0-9]/run/php-fpm/|/var/opt/remi/${selected_php}/run/php-fpm/|g" "/etc/httpd/conf.d/${site_name}-ssl.conf" 95 | fi 96 | if [[ -f "/etc/httpd/conf.d/${site_name}-le-ssl.conf" ]]; then 97 | sed -i -r "s|/var/opt/remi/php[0-9][0-9]/run/php-fpm/|/var/opt/remi/${selected_php}/run/php-fpm/|g" "/etc/httpd/conf.d/${site_name}-le-ssl.conf" 98 | fi 99 | if cmp -s "/etc/httpd/conf.d/${site_name}.conf" "/etc/httpd/conf.d/${site_name}.conf.old"; then 100 | echo -e "Замен в файле ${RED}не произведено${WHITE}." 101 | rm "/etc/httpd/conf.d/${site_name}.conf.old" 102 | else 103 | echo -e "Версия PHP в файле /etc/httpd/conf.d/${site_name}.conf изменена на ${GREEN}${selected_php}${WHITE}." 104 | rm "/etc/httpd/conf.d/${site_name}.conf.old" 105 | fi 106 | if [[ -f "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf" ]]; then 107 | mv "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf" "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf.old" 108 | fi 109 | echo -e "Перезапускаем apache для активации сайта ${LRED}${site_name}${WHITE}?" 110 | if vertical_menu "current" 2 0 5 "Да" "Нет"; then 111 | if apachectl configtest; then 112 | systemctl reload httpd 113 | echo "Сервер apache перезагружен" 114 | else 115 | echo "Сервер не был перезагружен" 116 | fi 117 | else 118 | echo "Сервер apache перезапущен не был. Не забудьте потом перезапустить его самостоятельно." 119 | fi 120 | else 121 | echo -e "Сайт(vhost) ${RED}${site_name}${WHITE} не существует." 122 | echo -e "Вначале создайте сайт (vhost)." 123 | echo -e "Никаких изменений не произведено." 124 | fi 125 | vertical_menu "current" 2 0 5 "Нажмите Enter" 126 | } 127 | # Если идет прямой вызов - выполняем функцию. Если идет подключение через source - то ничего не делаем 128 | if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then 129 | change_php_version "$1" "$2" 130 | fi -------------------------------------------------------------------------------- /checkip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | clear 3 | GREEN='\033[0;32m' 4 | LGREEN='\033[1;32m' 5 | LWHITE='\033[1;37m' 6 | RED='\033[0;31m' 7 | YELLOW='\033[0;33m' 8 | WHITE='\033[0m' 9 | 10 | function check_certificate() { 11 | local DOMAIN=$1 12 | local PORT=443 # Установка стандартного порта 443 13 | local CERT_INFO 14 | CERT_INFO=$(echo | openssl s_client -servername "${DOMAIN}" -connect "${DOMAIN}:${PORT}" 2>/dev/null | openssl x509 -noout -text 2>/dev/null) 15 | 16 | if [ -n "$CERT_INFO" ]; then 17 | local COMMON_NAMES 18 | COMMON_NAMES=$(echo "$CERT_INFO" | grep -o "DNS:[^ ,]*" | sed 's/DNS://g') 19 | local DOMAIN_FOUND=false 20 | 21 | for CN in $COMMON_NAMES; do 22 | if [ "$CN" = "$DOMAIN" ]; then 23 | DOMAIN_FOUND=true 24 | break 25 | fi 26 | done 27 | 28 | if $DOMAIN_FOUND; then 29 | echo -e -n "${GREEN}https://${WHITE}" 30 | else 31 | echo -e -n "${RED}https://${WHITE}" 32 | fi 33 | else 34 | echo -n " http://" 35 | fi 36 | } 37 | function check_certificate_expiration() { 38 | local DOMAIN=$1 39 | local PORT=443 40 | local CERT 41 | CERT=$(echo | openssl s_client -servername "${DOMAIN}" -connect "${DOMAIN}:${PORT}" 2>/dev/null | openssl x509 -noout -enddate) 42 | 43 | if [ -n "$CERT" ]; then 44 | local END_DATE 45 | END_DATE=$(echo "$CERT" | cut -d'=' -f2) 46 | local FORMATTED_END_DATE 47 | FORMATTED_END_DATE=$(date -d "${END_DATE}" +"%d %B %Y") 48 | local END_DATE_TS 49 | END_DATE_TS=$(date -d "${END_DATE}" +%s) 50 | local CURRENT_DATE_TS 51 | CURRENT_DATE_TS=$(date +%s) 52 | 53 | local DAYS_LEFT=$(((END_DATE_TS - CURRENT_DATE_TS) / 86400)) 54 | printf "SSL %4s дней," "${DAYS_LEFT}" 55 | else 56 | echo -e -n " -" 57 | fi 58 | } 59 | unicode_printf() { 60 | local field_width="$1" 61 | local unicode_string="$2" 62 | local string_length 63 | local formatted_string 64 | # Вычисляем количество символов в строке 65 | string_length=$(echo -n "$unicode_string" | awk '{print length}') 66 | # Вычисляем количество пробелов для заполнения 67 | local padding=$((field_width - string_length)) 68 | # Если строка короче заданной ширины поля, добавляем пробелы 69 | for ((i=1; i<=padding; i++)); do 70 | formatted_string+=" " 71 | done 72 | # Добавляем пробелы справа от строки 73 | unicode_string+="$formatted_string" 74 | # Выводим отформатированную строку 75 | echo -n "$unicode_string" 76 | } 77 | 78 | get_php_version() { 79 | local DOMAIN=$1 80 | local CONF_FILE="/etc/httpd/conf.d/${DOMAIN}.conf" 81 | 82 | if [ -f "$CONF_FILE" ]; then 83 | local PHP_VERSION 84 | PHP_VERSION=$(grep -oP 'SetHandler\s+"proxy:unix:/var/opt/remi/php\K[0-9]+' "$CONF_FILE") 85 | if [ -n "$PHP_VERSION" ]; then 86 | echo "php ${PHP_VERSION}" 87 | else 88 | echo "-" 89 | fi 90 | else 91 | echo "-" 92 | fi 93 | } 94 | 95 | CheckIP() { 96 | clear 97 | echo "Что значат цвета IP:" 98 | echo -e "${RED}Красный цвет${WHITE} – сайт недоступен (проблемы с доменом)" 99 | echo -e "${GREEN}Зеленый цвет${WHITE} – все ок, сайт доступен по IP адресу этого сервера" 100 | echo -e "Белый цвет – сайт доступен по другому IP адресу" 101 | echo 102 | 103 | local myip="("$(ip route get 1 | grep -Eo 'src [0-9\.]{1,20}' | awk '{print $NF;exit}')")" 104 | echo -e "Адрес этого сервера: ${GREEN}${myip}${WHITE}" 105 | 106 | echo "───────────────────────────────────────────" 107 | for file in /var/www/*; do 108 | if [ -d "$file" ]; then 109 | local SiteUser="${file##*/}" 110 | if [[ ${SiteUser} == "cgi-bin" ]]; then 111 | continue 112 | fi 113 | if [[ ${SiteUser} == "html" ]]; then 114 | continue 115 | fi 116 | echo -e "${YELLOW}${SiteUser}${WHITE}:" 117 | for PathToSiteName in ${file}/www/*; do 118 | if [ -d "$PathToSiteName" ]; then 119 | local SiteName="${PathToSiteName##*/}" 120 | local CONF_FILE="/etc/httpd/conf.d/${SiteName}.conf" 121 | 122 | if [ -f "$CONF_FILE" ]; then 123 | if curl -I http://"$SiteName" &>/dev/null; then 124 | local ip 125 | ip=$(ping -c 1 $SiteName | grep PING | awk '{ print $3 }') 126 | if [[ "$myip" == "$ip" ]]; then 127 | printf " ${GREEN}%-19s${WHITE}" "$ip" 128 | else 129 | printf " %-19s" "$ip" 130 | fi 131 | check_certificate "$SiteName" 132 | if [[ "$SiteName" =~ (xn\-\-) ]] 133 | then 134 | unicode_domain=$(idn2 -d "$SiteName") 135 | else 136 | unicode_domain=$SiteName 137 | fi 138 | echo -e -n " ${LGREEN}" 139 | unicode_printf 32 "$unicode_domain" 140 | echo -e -n " ${WHITE}" 141 | check_certificate_expiration "$SiteName" 142 | else 143 | printf " %-27s" " " 144 | if [[ "$SiteName" =~ (xn\-\-) ]] 145 | then 146 | unicode_domain=$(idn2 -d "$SiteName") 147 | else 148 | unicode_domain=$SiteName 149 | fi 150 | echo -e -n " ${RED}" 151 | unicode_printf 32 "$unicode_domain" 152 | echo -e -n " ${WHITE}" 153 | printf " " 154 | fi 155 | if [ -f "${PathToSiteName}"/administrator/manifests/files/joomla.xml ]; then 156 | JoomlaVersion=$(cat "${PathToSiteName}"/administrator/manifests/files/joomla.xml | grep ".*" | sed -rn 's/.*>([0-9.]+)<.*/\1/p') 157 | printf " Joomla %8s" "${JoomlaVersion}" 158 | else 159 | printf " %8s" "-" 160 | fi 161 | PHP_VERSION=$(get_php_version "$SiteName") 162 | printf ", ${PHP_VERSION}" 163 | FOLDER_SIZE_MB=$(du -sm "${PathToSiteName}" | awk '{print $1}' | sed ':a;s/\([^0-9.][0-9]\+\|^[0-9]\+\)\([0-9]\{3\}\)/\1\ \2/g;ta') 164 | printf " ${LWHITE}%9s ${WHITE}Mb" "${FOLDER_SIZE_MB} " 165 | echo 166 | else 167 | printf " %-19s" " " 168 | input_variable="папка ${RED}${SiteName}${WHITE} не сайт" 169 | 170 | # Убираем управляющие символы для подсчета длины строки 171 | plain_text=$(echo -e "$input_variable" | sed -r 's/\x1B\[[0-9;]*[a-zA-Z]//g') 172 | 173 | # Вычисляем длину строки без учета управляющих символов 174 | plain_length=${#plain_text} 175 | 176 | # Вычисляем количество пробелов для дополнения до 50 символов 177 | padding_length=$((50 - plain_length)) 178 | 179 | # Формируем строку с пробелами 180 | padding=$(printf " %-${padding_length}s" "") 181 | 182 | # Выводим строку с цветом и дополнением пробелами 183 | echo -e -n "${input_variable}${padding}" 184 | printf " %4s " " " 185 | printf " %8s" "-" 186 | FOLDER_SIZE_MB=$(du -sm "${PathToSiteName}" | awk '{print $1}' | sed ':a;s/\([^0-9.][0-9]\+\|^[0-9]\+\)\([0-9]\{3\}\)/\1\ \2/g;ta') 187 | printf " ${LWHITE}%9s ${WHITE}Mb" "${FOLDER_SIZE_MB} " 188 | echo 189 | fi 190 | fi 191 | done 192 | fi 193 | done 194 | echo "───────────────────────────────────────────" 195 | local FREE_SPACE 196 | FREE_SPACE=$(df -Pm / | awk 'NR==2 {print $4}' | sed ':a;s/\([^0-9.][0-9]\+\|^[0-9]\+\)\([0-9]\{3\}\)/\1\ \2/g;ta') 197 | local ALL_SITES_SIZE_MB 198 | ALL_SITES_SIZE_MB=$(du -sm "/var/www" | awk '{print $1}' | sed ':a;s/\([^0-9.][0-9]\+\|^[0-9]\+\)\([0-9]\{3\}\)/\1\ \2/g;ta') 199 | echo -e "На сервере свободно: ${GREEN}${FREE_SPACE}${WHITE} Mb. Сайты занимают ${GREEN}${ALL_SITES_SIZE_MB}${WHITE} Mb." 200 | vertical_menu "current" 2 0 5 "Нажмите Enter" 201 | } -------------------------------------------------------------------------------- /clonesite.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | LGREEN='\033[1;32m' 3 | AddServer() { 4 | clear 5 | local regex="^[a-zA-Z0-9]+([-\.][a-zA-Z0-9]+)*(\.[a-zA-Z]{2,})?$|^[a-zA-Z0-9]+$" 6 | server_name= 7 | while true; do 8 | # Запрос IP-адреса у пользователя 9 | read -e -p "Введите IP-адрес нового сервера или нажмите Enter для выхода: " ip_address 10 | 11 | # Проверка на пустой ввод - выход из скрипта 12 | if [[ -z "$ip_address" ]]; then 13 | echo -e -n ${WHITE}${CURSORUP}${ERASEUNTILLENDOFLINE} 14 | return 15 | fi 16 | 17 | # Проверка IP-адреса на доступность с помощью пинга 18 | if ping -c 1 -W 2 "$ip_address" &>/dev/null; then 19 | echo -e "IP-адрес ${GREEN}$ip_address${WHITE} доступен." 20 | break 21 | else 22 | echo -e "IP-адрес ${RED}$ip_address${WHITE} недоступен. Попробуйте ввести другой адрес." 23 | fi 24 | done 25 | echo "Теперь нужно выбрать имя сервера." 26 | echo "Имя сервера имеет смысл только для вас и содержит латинские символы и цифры." 27 | echo "Имя можно выбрать по своему усмотрению." 28 | echo 29 | echo -e -n "${WHITE}Введите имя сервера (Enter для выхода):${GREEN}" 30 | read -e -p " " server_name 31 | while true; do 32 | if [[ -z "$server_name" ]]; then 33 | echo -e -n ${WHITE}${CURSORUP}${ERASEUNTILLENDOFLINE} 34 | return 1 35 | fi 36 | # Проверяем корректность начального имени сайта 37 | if [[ "$server_name" =~ $regex ]]; then 38 | echo -e "${WHITE}Имя сервера ${GREEN}$server_name${WHITE} введено корректно." 39 | if grep -q "$server_name" /root/.ssh/config; then 40 | echo -e "Этот сервер уже существует в списке, выберите другой." 41 | echo -e -n "Введите корректное имя сервера:${GREEN}" 42 | read -e -p " " server_name 43 | continue # Пропускаем текущую итерацию цикла 44 | fi 45 | break 46 | else 47 | echo -e "${WHITE}Имя сервера ${RED}$server_name${WHITE} некорректное. " 48 | echo -e -n "Введите корректное имя (Enter для выхода):${GREEN}" 49 | read -e -p " " server_name 50 | fi 51 | done 52 | comment=${server_name} 53 | echo -e -n "${WHITE}Укажите комментарий для ключа:${GREEN}" 54 | read -e -p " " -i "$comment" comment 55 | echo -e ${WHITE} 56 | ssh-keygen -t ed25519 -C "$comment" -f ~/.ssh/${server_name}-key -N '' 57 | { 58 | echo 59 | echo "Host ${server_name}" 60 | echo " Hostname ${ip_address}" 61 | echo " User root" 62 | echo " Compression yes" 63 | echo " IdentityFile ~/.ssh/${server_name}-key" 64 | } >>~/.ssh/config 65 | echo "Пожалуйста, скопируйте следующую команду и вставьте её в терминал удалённого сервера после подключения:" 66 | echo -e "${LGREEN}echo '$(cat ~/.ssh/${server_name}-key.pub)' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys${WHITE}" 67 | echo "После этого можете продолжить работу." 68 | echo 69 | 70 | # Сортируем файл config по алфавиту 71 | # Путь к файлу конфигурации SSH 72 | config_file="$HOME/.ssh/config" 73 | temp_file="$HOME/.ssh/temp_config" 74 | sorted_file="$HOME/.ssh/config.sorted" 75 | 76 | # Создаем резервную копию файла конфигурации 77 | cp "$config_file" "${config_file}.bak" 78 | 79 | # Создаем временный файл, преобразуем все многострочные записи в однострочные 80 | awk 'BEGIN { 81 | first = 1; # Флаг для отслеживания первой записи 82 | } 83 | { 84 | if ($1 == "Host") { 85 | if (!first) { 86 | printf "\n\n"; # Добавляем два перевода строки только если это не первая запись 87 | } 88 | first = 0; # Сбрасываем флаг первой записи после первой обработки 89 | printf "%s", $0; # Печатаем заголовок Host без начального перевода строки 90 | } else { 91 | # Удаляем начальные пробелы и табуляции, заменяем внутренние пробелы на один пробел 92 | gsub(/^[ \t]+|[ \t]+$/, "", $0); 93 | gsub(/[ \t]+/, " ", $0); 94 | printf "@%s", $0; # Добавляем разделитель @ 95 | } 96 | } END {print "";}' "$config_file" >"$temp_file" 97 | 98 | # Удаление всех двойных переводов строк (пустых строк), которые могли появиться 99 | sed '/^$/d' "$temp_file" >"$sorted_file" 100 | 101 | # Сортировка строк 102 | sort "$sorted_file" -o "$sorted_file" 103 | 104 | # Преобразование обратно в многострочный формат 105 | awk 'BEGIN {FS="@"} { 106 | for (i = 1; i <= NF; i++) { 107 | if (i == 1) { 108 | print $i; # Печать заголовка Host 109 | } else if (length($i) > 0) { 110 | print " " $i; # Добавление отступа и печать строки 111 | } 112 | } 113 | print ""; # Добавляем пустую строку после каждого блока для разделения 114 | }' "$sorted_file" >"$config_file" 115 | 116 | # Очистка временных файлов 117 | rm -f "$temp_file" "$sorted_file" 118 | 119 | } 120 | CloneSite() { 121 | 122 | # Суффикс для доменов на локальном сервере 123 | declare suffix="test" 124 | local count 125 | local onlydatabase=$1 126 | 127 | clear 128 | if [[ $onlydatabase ]]; then 129 | echo "Клонируем только базу данных." 130 | fi 131 | 132 | source /root/rish/rish_config.sh 133 | 134 | if [[ -z "$MYSQLPASS" ]]; then 135 | echo -e "Переменная ${RED}\$MYSQLPASS${WHITE} не установлена." 136 | return 137 | fi 138 | 139 | serverip=$(ip route get 1 | grep -Eo 'src [0-9\.]{1,16}' | awk '{print $NF;exit}') 140 | if ${LocalServer}; then 141 | echo "──────────────────────────────────────────────────────────────────" 142 | echo -e "При клонировании домен первого уровня будет заменен на ${GREEN}.${suffix}${WHITE}" 143 | echo "Суффикс можно поменять в настройках скрипта" 144 | echo "──────────────────────────────────────────────────────────────────" 145 | else 146 | echo "────────────────────────────────────────────────────────" 147 | echo -e "Адрес вашего сервера: ${GREEN}${serverip}${WHITE}" 148 | echo "Клонирование будет осуществляться в нормальном режиме" 149 | echo "────────────────────────────────────────────────────────" 150 | fi 151 | 152 | if [[ ! -e ~/.ssh/config ]]; then 153 | touch ~/.ssh/config 154 | fi 155 | 156 | while true; do 157 | mapfile -t servers < <(<~/.ssh/config grep "Host " | awk '{print $2}' | sort) 158 | count=${#servers[@]} 159 | servers+=("Добавить сервер") 160 | echo "Выберите сервер для подключения:" 161 | vertical_menu "current" 2 0 30 "${servers[@]}" 162 | choice=$? 163 | if ((choice == 255)); then 164 | echo -e ${CURSORUP}"Отказ от клонирования."${ERASEUNTILLENDOFLINE} 165 | return 166 | fi 167 | if ((choice < count)); then 168 | break 169 | fi 170 | AddServer 171 | done 172 | 173 | local choosenserver=${servers[${choice}]} 174 | 175 | ssh -q -o BatchMode=yes -o StrictHostKeyChecking=no -o ConnectTimeout=5 ${choosenserver} 'exit 0' 176 | if (($? == 255)); then 177 | echo -e "Подключиться к серверу ${LRED}${choosenserver}${WHITE} невозможно." 178 | return 179 | fi 180 | 181 | echo -e "Список сайтов удаленного сервера ${GREEN}${choosenserver}${WHITE}:" 182 | printf "\n" 183 | 184 | #local sites=( $( ssh $choosenserver ls -l $directory | grep 'drwx'| awk '{print $9}' ) ) 185 | mapfile -t sites < <(ssh $choosenserver 'ls -l /var/www/*/www/ 2>/dev/null' | grep drwx | grep -v 000-default | awk '{print $9" ("$3")"}' | sort) 186 | 187 | vertical_menu "current" 2 20 30 "${sites[@]}" 188 | choice=$? 189 | if ((choice == 255)); then 190 | return 191 | fi 192 | 193 | sitename=${sites[$choice]} 194 | local remoteuser 195 | remoteuser=$(echo "${sitename}" | cut -d "(" -f2 | cut -d ")" -f1) 196 | 197 | local remotesitename 198 | remotesitename="${sitename%% *}" 199 | 200 | if [[ "${remotesitename##*.}" == "${remotesitename##*/}" ]]; then 201 | echo "Неверный выбор. Сайт должен быть как минимум доменом второго уровня." 202 | echo -e "Был выбран ${RED}${remotesitename}${WHITE}" 203 | return 204 | else 205 | if $LocalServer; then 206 | localsitename=${remotesitename%${remotesitename##*.}}$suffix 207 | else 208 | localsitename=$remotesitename 209 | fi 210 | fi 211 | 212 | echo -e "Перенос сайта ${GREEN}${remotesitename}${WHITE} пользователя ${GREEN}${remoteuser}${WHITE} с сервера ${GREEN}${choosenserver}${WHITE} " 213 | 214 | if [ -z "$sitename" ]; then 215 | return 216 | fi 217 | 218 | local siteusers 219 | echo 220 | echo "Выберите пользователя на текущем сервере, куда надо копировать сайт" 221 | mapfile -t siteusers < <(ls -l /var/www 2>/dev/null | grep drwx | grep -v cgi-bin | grep -v html | awk '{print $9}' | sort) 222 | 223 | vertical_menu "current" 2 20 30 "${siteusers[@]}" 224 | choice=$? 225 | if ((choice == 255)); then 226 | return 227 | fi 228 | local localuser=${siteusers[$choice]} 229 | 230 | echo -e -n "${WHITE}Подтвердите имя сайта для клонирования:${GREEN}" 231 | read -e -p " " -i "$localsitename" site_name 232 | localsitename=$site_name 233 | 234 | echo -e ${CURSORUP}${CURSORUP}${CURSORUP}${ERASEUNTILLENDOFLINE}${WHITE}"В сайт ${GREEN}$localsitename${WHITE} пользователя ${GREEN}${localuser}${WHITE} на сервер ${GREEN}$serverip${WHITE}${ERASEUNTILLENDOFLINE}" 235 | echo -e " "${ERASEUNTILLENDOFLINE} 236 | echo -e " "${ERASEUNTILLENDOFLINE} 237 | local pathtosite 238 | 239 | pathtosite="/var/www/${remoteuser}/www/${remotesitename}" 240 | 241 | ssh ${choosenserver} "test -e "${pathtosite} 242 | 243 | if [ $? -ne 0 ]; then 244 | echo "такого сайта ${remotesitename} нет на удаленном сервере!" 245 | return 246 | fi 247 | 248 | rr=$(ssh $choosenserver 'grep DocumentRoot /etc/httpd/conf.d/'${remotesitename}'.conf' | sed 's|.*/||') 249 | 250 | if [[ "${remotesitename}" == "${rr}" ]]; then 251 | documentroot="" 252 | echo -e "DocumentRoot равен папке сайта"${ERASEUNTILLENDOFLINE} 253 | else 254 | documentroot="/"$rr 255 | echo -e "DocumentRoot будет установлен: "${documentroot}${ERASEUNTILLENDOFLINE} 256 | fi 257 | 258 | ext=${remotesitename##*.} 259 | 260 | ee='mariadb -uroot -p${MYSQLPASS} -qfsBe' 261 | ee=$ee' "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='"'${remotesitename}'\" " 262 | ee=$ee'2>&1' 263 | ee=$(ssh $choosenserver $ee) 264 | if [ -n "$ee" ]; then 265 | echo -e "идет создание архива базы данных ${GREEN}${remotesitename}${WHITE}" 266 | ssh $choosenserver 'mariadb-dump -u root -p$'{MYSQLPASS} $remotesitename >$remotesitename.sql 267 | sed -i '1{/999999.*sandbox/d}' ${remotesitename}.sql 268 | echo -e "Архив базы данных ${GREEN}${remotesitename}${WHITE} скачан" 269 | if mariadb -u root -p${MYSQLPASS} -e "CREATE DATABASE IF NOT EXISTS \`${localsitename}\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"; then 270 | echo -e "База mysql с именем ${GREEN}${localsitename}${WHITE} создана" 271 | mariadb -uroot -p${MYSQLPASS} -e "GRANT ALL PRIVILEGES ON \`${localsitename}\`.* TO '${localuser}'@'localhost';" 272 | mariadb -uroot -p${MYSQLPASS} -e "FLUSH PRIVILEGES;" 273 | echo -e "Права на базу выданы пользователю ${GREEN}${localuser}${WHITE}" 274 | else 275 | echo -e ${RED}"Произошла ошибка"${WHITE} 276 | fi 277 | if mariadb --help | grep -q -- "--sandbox"; then 278 | SANDBOX_OPTION="--sandbox" 279 | else 280 | SANDBOX_OPTION="" 281 | fi 282 | mariadb -u root -p$MYSQLPASS $SANDBOX_OPTION $localsitename <$remotesitename".sql" 283 | rm $remotesitename".sql" 284 | echo -e "База данных ${GREEN}$localsitename${WHITE} перенесена" 285 | else 286 | echo "базы данных у сайта нет" 287 | fi 288 | 289 | if [[ $onlydatabase ]]; then 290 | return 291 | fi 292 | 293 | namearch=$remotesitename."tar.gz" 294 | 295 | echo 296 | temp1="cd ${pathtosite}; rm -f ../$namearch" 297 | temp2="cd ${pathtosite}; tar czf ../$namearch ." 298 | echo -e "Идет создание архива сайта ${GREEN}$remotesitename${WHITE} пользователя ${GREEN}${remoteuser}${WHITE}" 299 | ssh $choosenserver "$temp1" 300 | ssh $choosenserver "$temp2" 301 | 302 | local pathtolocalsite="/var/www/${localuser}/www/${localsitename}" 303 | local pathtolocaluser="/var/www/${localuser}/www" 304 | cd ${pathtolocaluser} || return 305 | rm -rf $namearch 306 | 307 | echo "Идет скачивание архива сайта" 308 | scp $choosenserver:${pathtosite}/../$namearch ${pathtolocaluser} 309 | ssh $choosenserver rm ${pathtosite}/../$namearch 310 | 311 | if [[ -d "${pathtolocalsite}" ]]; then 312 | rm -rf "${pathtolocalsite}" 313 | echo -e "Старое содержимое локального сайта ${GREEN}${localsitename}${WHITE} удалено " 314 | mkdir -p "$localsitename" 315 | echo -e "Создан новый сайт ${GREEN}${localsitename}${WHITE} пользователя ${GREEN}${localuser}${WHITE} " 316 | else 317 | echo -e "Создан новый сайт ${GREEN}${localsitename}${WHITE} пользователя ${GREEN}${localuser}${WHITE} " 318 | mkdir -p "$localsitename" 319 | fi 320 | echo -e "Началось разархивирование сайта на локальном компьютере ${GREEN}${localsitename}${WHITE}." 321 | tar xzf $namearch -C ${pathtolocaluser}/$localsitename 322 | rm $namearch 323 | 324 | chown -R ${localuser}:${localuser} $localsitename 325 | echo -e "Архив сайта развернут в каталоге ${GREEN}${localuser}/${localsitename}${WHITE}" 326 | 327 | mapfile -t installed_versions < <(rpm -qa | grep php | grep -oP 'php[0-9]{2}' | sort -r | uniq) 328 | echo 329 | echo -e "Выберите нужную версию ${GREEN}PHP${WHITE} из доступных." 330 | echo 331 | vertical_menu "current" 1 0 10 "${installed_versions[@]}" 332 | local ret=$? 333 | local selected_php 334 | if ((ret == 255)); then 335 | selected_php=${installed_versions[0]} 336 | else 337 | selected_php=${installed_versions[${ret}]} 338 | fi 339 | 340 | echo -e "${CURSORUP}Выбрана версия ${GREEN}${selected_php}${WHITE}" 341 | 342 | if [[ ! -f "/etc/opt/remi/${selected_php}/php-fpm.d/${localuser}.conf" ]]; then 343 | # Если пул для этой версии PHP еще не был создан, то создаем 344 | echo 345 | echo -e "Выберите режим работы PHP для пользователя ${GREEN}${localuser}${WHITE}:" 346 | vertical_menu "current" 2 0 5 "ondemand - оптимально расходует память" "dynamic - более оперативно реагирует на запросы" 347 | ret=$? 348 | local php_mode 349 | if ((ret == 0)); then 350 | php_mode="ondemand" 351 | else 352 | php_mode="dynamic" 353 | fi 354 | { 355 | echo "[${localuser}]" 356 | echo "listen = /var/opt/remi/${selected_php}/run/php-fpm/${localuser}.sock" 357 | echo "user = ${localuser}" 358 | echo "group = ${localuser}" 359 | echo "listen.owner = ${localuser}" 360 | echo "listen.group = ${localuser}" 361 | echo "" 362 | echo "listen.allowed_clients = 127.0.0.1" 363 | echo "pm = ${php_mode}" 364 | echo "pm.max_children = 20" 365 | echo "pm.start_servers = 3" 366 | echo "pm.min_spare_servers = 3" 367 | echo "pm.max_spare_servers = 5" 368 | echo "pm.process_idle_timeout = 10s" 369 | echo ";slowlog = /var/www/${localuser}/slow.log" 370 | echo ";request_slowlog_timeout = 15s" 371 | echo "php_value[session.save_handler] = files" 372 | echo "php_value[session.save_path] = /var/www/${localuser}/session" 373 | echo "php_value[soap.wsdl_cache_dir] = /var/www/${localuser}/wsdlcache" 374 | } >"/etc/opt/remi/${selected_php}/php-fpm.d/${localuser}.conf" 375 | 376 | if [[ -f "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf" ]]; then 377 | mv "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf" "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf.old" 378 | fi 379 | 380 | echo -e "Перезапускаем ${GREEN}${selected_php}-php-fpm${WHITE} для активации версии ${GREEN}${selected_php}${WHITE}?" 381 | 382 | if /opt/remi/${selected_php}/root/usr/sbin/php-fpm -t; then 383 | if systemctl restart "${selected_php}-php-fpm"; then 384 | echo -e "Версия ${GREEN}${selected_php}${WHITE} корректно перезапущена." 385 | echo 386 | else 387 | echo 388 | echo -e "Ошибка при перезапуске ${RED}${selected_php}-php-fpm${WHITE}. Проверьте журналы для диагностики." 389 | echo 390 | fi 391 | else 392 | echo 393 | echo -e "Версия ${RED}${selected_php}${WHITE} имеет проблемы в конфигурационных файлах." 394 | echo -e "Сервис ${RED}не был перезапущен${WHITE} и продолжает работать." 395 | echo 396 | systemctl status "${selected_php}-php-fpm" 397 | fi 398 | 399 | fi 400 | 401 | cd /etc/httpd/conf.d 402 | rm -f ${localsitename}* 403 | 404 | { 405 | echo "" 406 | echo "ServerAdmin webmaster@localhost" 407 | echo "ServerName ${localsitename}" 408 | echo "ServerAlias www.${localsitename}" 409 | echo "DocumentRoot /var/www/${localuser}/www/${localsitename}${documentroot}" 410 | echo "" 411 | echo "" 412 | echo " SetHandler \"proxy:unix:/var/opt/remi/${selected_php}/run/php-fpm/${localuser}.sock|fcgi://localhost\"" 413 | echo "" 414 | echo "" 415 | echo "DirectoryIndex index.php index.html" 416 | echo "" 417 | echo "" 418 | echo " Options -Indexes +FollowSymLinks" 419 | echo " AllowOverride All" 420 | echo " Require all granted" 421 | echo "" 422 | echo "" 423 | echo "ServerSignature Off" 424 | echo "ErrorLog /var/www/${localuser}/logs/${localsitename}-error-log" 425 | echo "LogLevel warn" 426 | echo "CustomLog /var/www/${localuser}/logs/${localsitename}-access-log combined" 427 | echo "" 428 | 429 | } >>$localsitename".conf" 430 | 431 | ttssl=$localsitename"-ssl.conf" 432 | if $LocalServer; then 433 | #SSLCertificateFile /etc/pki/tls/certs/localhost.crt 434 | #SSLCertificateKeyFile /etc/pki/tls/private/localhost.key 435 | echo 436 | echo -e "Нужно ли установить самоподписанный ${GREEN}SSL${WHITE} сертификат на сайт?" 437 | if vertical_menu "current" 2 0 5 "Да" "Нет"; then 438 | { 439 | echo "[req]" 440 | echo "distinguished_name = req_distinguished_name" 441 | echo "x509_extensions = v3_req" 442 | echo "prompt = no" 443 | echo "[req_distinguished_name]" 444 | echo "CN = ${localsitename}" 445 | echo "[v3_req]" 446 | echo "keyUsage = critical, digitalSignature, keyAgreement" 447 | echo "extendedKeyUsage = serverAuth" 448 | echo "subjectAltName = @alt_names" 449 | echo "[alt_names]" 450 | echo "DNS.1 = www.${localsitename}" 451 | echo "DNS.2 = ${localsitename}" 452 | } >rish_temp_file_for_creating_selfsigned_cert.txt 453 | openssl req -x509 -nodes \ 454 | -newkey rsa:2048 \ 455 | -keyout /etc/pki/tls/private/${localsitename}.key \ 456 | -out /etc/pki/tls/certs/${localsitename}.crt \ 457 | -sha256 \ 458 | -days 3650 \ 459 | -subj "/CN=${localsitename}" \ 460 | -config rish_temp_file_for_creating_selfsigned_cert.txt 461 | rm -f rish_temp_file_for_creating_selfsigned_cert.txt 462 | 463 | cp $localsitename".conf" $ttssl 464 | sed -i 's///g' "$ttssl" 465 | sed -i "/<\/VirtualHost>/i ServerSignature Off\nSSLCertificateFile /etc/pki/tls/certs/${localsitename}.crt\nSSLCertificateKeyFile /etc/pki/tls/private/${localsitename}.key" "$ttssl" 466 | 467 | echo "Сертификат установлен" 468 | echo 469 | else 470 | echo 471 | echo "Сертификат не был установлен" 472 | fi 473 | fi 474 | 475 | if [ -f "${pathtolocalsite}/configuration.php" ]; then 476 | echo 477 | DATABASEPASS=$(cat /home/${localuser}/.pass.txt | grep Database | awk '{ print $2}') 478 | echo -e "Сайт распознан как созданный на основе ${GREEN}Joomla${WHITE}" 479 | sed -i "s/\$password.*$/\$password = '${DATABASEPASS}';/" "${pathtolocalsite}/configuration.php" 480 | echo "Новый пароль внесен в configuration.php" 481 | sed -i "s/\$db .*$/\$db = '${localsitename}';/" "${pathtolocalsite}/configuration.php" 482 | echo -e "имя базы данных ${GREEN}${localsitename}${WHITE} установлено в configuration.php" 483 | sed -i "s/\$user.*$/\$user = '${localuser}';/" "${pathtolocalsite}/configuration.php" 484 | echo -e "Имя пользователя базы данных установлено ${GREEN}${localuser}${WHITE}" 485 | sed -i "s|\$log_path .*$|\$log_path = '${pathtolocalsite}/administrator/logs';|" "${pathtolocalsite}/configuration.php" 486 | echo "Путь к папке logs скорректирован" 487 | sed -i "s|\$tmp_path .*$|\$tmp_path = '${pathtolocalsite}/tmp';|" "${pathtolocalsite}/configuration.php" 488 | echo "Путь к папке tmp скорректирован" 489 | echo 490 | fi 491 | 492 | echo "Перезагрузка сервера" 493 | if apachectl configtest; then 494 | systemctl reload httpd 495 | echo "Сервер перезагружен" 496 | else 497 | echo "Сервер не был перезагружен" 498 | fi 499 | vertical_menu "current" 2 0 5 "Нажмите Enter" 500 | } 501 | -------------------------------------------------------------------------------- /create_hotlist.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | function create_hotlist() { 3 | cat >~/.config/mc/hotlist <>~/.config/mc/hotlist 16 | echo 'ENTRY "Путь к php.ini '${installed}' /etc/opt/remi/'${installed}'" URL "/etc/opt/remi/'${installed}'"' >>~/.config/mc/hotlist 17 | done 18 | echo "ENDGROUP" >>~/.config/mc/hotlist 19 | mapfile -t users < <(find "/var/www" -mindepth 1 -maxdepth 1 -type d -exec basename {} \; | grep -vE "^(cgi-bin|html)$" | sort) 20 | for user in "${users[@]}"; do 21 | echo 'ENTRY "Путь к сайтам '${user}' /var/www/'${user}'/www" URL "/var/www/'${user}'/www"' >>~/.config/mc/hotlist 22 | done 23 | } 24 | -------------------------------------------------------------------------------- /create_site.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | source /root/rish/windows.sh 3 | GREEN='\033[0;32m' 4 | RED='\033[0;31m' 5 | WHITE='\033[0m' 6 | CURSORUP='\033[1A' 7 | ERASEUNTILLENDOFLINE='\033[K' 8 | 9 | function check_site() { 10 | site_name="$1" # Имя сайта 11 | local directory_path="$2" 12 | local full_path="$directory_path/$site_name" 13 | local choice 14 | local regex="^([a-zA-Z0-9]+([-\.][a-zA-Z0-9]+)*(\.[a-zA-Z]{2,})?|xn--[a-zA-Z0-9\-]+([-\.][a-zA-Z0-9\-]+)*(\.xn--[a-zA-Z0-9\-]+|[a-zA-Z]{2,})?|^[a-zA-Z0-9]+)$" 15 | local punycode_domain 16 | # Есть ли кириллица в имени сайта? 17 | if echo "$site_name" | awk 'BEGIN{found=0} /[А-Яа-яЁё]/ {found=1} END{exit !found}'; then 18 | echo -e "Имя сайта ${GREEN}${site_name}${WHITE} содержит кириллические символы." 19 | punycode_domain=$(idn2 --quiet "$site_name" 2>/dev/null ) 20 | if [ -d "$directory_path/$punycode_domain" ]; then 21 | echo -e "Переименование ${RED}${site_name}${WHITE} --> ${RED}${punycode_domain}${WHITE} невозможно." 22 | echo -e "Каталог с именем ${GREEN}${punycode_domain}${WHITE} уже существует." 23 | echo -e "" 24 | else 25 | # Переименовываем каталог 26 | mv "$full_path" "$directory_path/$punycode_domain" 27 | echo -e "Каталог переименован. ${GREEN}${site_name}${WHITE} --> ${GREEN}${punycode_domain}${WHITE}." 28 | site_name=$punycode_domain 29 | full_path="$directory_path/$site_name" 30 | fi 31 | fi 32 | 33 | # Проверяем, существует ли папка и корректно ли ее имя 34 | if [[ -d "$full_path" && "$site_name" =~ $regex ]]; then 35 | # Проверяем, а не создан ли уже такой сайт? 36 | if [[ ! -f "/etc/httpd/conf.d/$site_name.conf" ]]; then 37 | # Проверяем нет ли верхнего регистра в названии папки 38 | if [[ "$site_name" =~ [[:upper:]] ]]; then 39 | # Приводим имя к нижнему регистру 40 | lower_name="${site_name,,}" 41 | echo ${lower_name} 42 | # Проверяем, не существует ли уже каталог с именем в нижнем регистре 43 | if [ -d "$directory_path/$lower_name" ]; then 44 | echo -e "Переименование ${GREEN}${site_name}${WHITE} --> ${GREEN}${lower_name}${WHITE} невозможно." 45 | echo -e "Каталог с именем ${GREEN}${lower_name}${WHITE} уже существует." 46 | echo -e "" 47 | site_name="" 48 | else 49 | # Переименовываем каталог 50 | mv "$full_path" "$directory_path/$lower_name" 51 | echo -e "Каталог переименован. ${GREEN}${site_name}${WHITE} --> ${GREEN}${lower_name}${WHITE}." 52 | site_name=$lower_name 53 | fi 54 | fi 55 | if [[ -n "$site_name" ]]; then 56 | # Проверяем, а не punycode ли? 57 | if [[ "$site_name" =~ (xn\-\-) ]] 58 | then 59 | echo -e -n "Имя домена ${GREEN}$site_name${WHITE} " 60 | echo -e -n " (${GREEN}"$(idn2 -d "$site_name")"${WHITE}) корректное" 61 | echo 62 | echo -e -n "Будет создан сайт (vhost) с именем ${GREEN}$site_name${WHITE} " 63 | echo -e -n " (${GREEN}"$(idn2 -d "$site_name")"${WHITE})" 64 | echo 65 | else 66 | echo -e "Имя домена ${GREEN}$site_name${WHITE} корректное." 67 | echo -e "Будет создан сайт (vhost) с именем ${GREEN}$site_name${WHITE}." 68 | fi 69 | vertical_menu "current" 2 0 5 "Да" "Нет" "Задать свое имя сайта" 70 | choice=$? 71 | echo -e ${CURSORUP}${ERASEUNTILLENDOFLINE} 72 | case "$choice" in 73 | 0) 74 | return 0 # Выход из функции, если все в порядке 75 | ;; 76 | 1) 77 | return 1 78 | ;; 79 | 255) 80 | return 2 81 | ;; 82 | *) 83 | site_name="" 84 | ;; 85 | esac 86 | fi 87 | else 88 | echo -e "Конфигурационный файл для сайта ${RED}$site_name${WHITE} уже существует." 89 | fi 90 | site_name="" 91 | else 92 | # Если имя некорректное - пускай сам вводит что ему нужно 93 | site_name="" 94 | fi 95 | echo -e "${WHITE}Введите свое имя сайта (Enter для выхода):${GREEN}" 96 | read -e -p "" site_name 97 | site_name="${site_name,,}" 98 | while true; do 99 | if [[ -z "$site_name" ]]; then 100 | echo -e "${WHITE}" 101 | return 1 102 | fi 103 | # Проверяем, а не кириллицу ли ввели? 104 | if echo "$site_name" | awk 'BEGIN{found=0} /[А-Яа-яЁё]/ {found=1} END{exit !found}'; then 105 | echo -e "${WHITE}Имя сайта ${GREEN}${site_name}${WHITE} содержит кириллические символы." 106 | echo -e "Будет преобразование в стандарт punycode." 107 | site_name=$(idn2 --quiet "$site_name" 2>/dev/null ) 108 | fi 109 | # Проверяем корректность начального имени сайта 110 | if [[ "$site_name" =~ $regex ]]; then 111 | echo -e -n "${WHITE}Имя сайта ${GREEN}$site_name${WHITE} введено корректно." 112 | # Проверяем, а не punycode ли? 113 | if [[ "$site_name" =~ (xn\-\-) ]] 114 | then 115 | echo -e -n " (${GREEN}"$(idn2 -d "$site_name")"${WHITE})" 116 | echo 117 | else 118 | echo 119 | fi 120 | 121 | if [[ -f "/etc/httpd/conf.d/$site_name.conf" ]]; then 122 | echo -e "Конфигурационный файл для сайта ${RED}$site_name${WHITE} уже существует." 123 | echo -e "Введите другое имя (Enter для выхода):${GREEN}" 124 | read -e -p "" site_name 125 | continue # Пропускаем текущую итерацию цикла 126 | fi 127 | break 128 | else 129 | echo -e "${WHITE}Имя сайта ${RED}$site_name${WHITE} некорректное. " 130 | echo -e "Введите корректное имя (Enter для выхода):${GREEN}" 131 | read -e -p "" site_name 132 | fi 133 | done 134 | 135 | echo 136 | } 137 | function create_site() { 138 | clear 139 | local path="$2" 140 | local php_mode 141 | username=$(echo "$path" | cut -d'/' -f4) 142 | echo -e "Создание сайта (vhost) для пользователя ${GREEN}${username}${WHITE}" 143 | if check_site "$1" "$2"; then 144 | echo -e -n "Создаем сайт (vhost) ${GREEN}${site_name}" 145 | if [[ "$site_name" =~ (xn\-\-) ]] 146 | then 147 | echo -e -n " ("$(idn2 -d "$site_name")")" 148 | fi 149 | echo -e ${WHITE} 150 | mapfile -t installed_versions < <(rpm -qa | grep php | grep -oP 'php[0-9]{2}' | sort -r | uniq) 151 | echo 152 | echo -e "Выберите нужную версию ${GREEN}PHP${WHITE} из доступных." 153 | echo 154 | vertical_menu "current" 1 0 10 "${installed_versions[@]}" 155 | local ret=$? 156 | if ((ret == 255)); then 157 | echo -e "Сайт (vhost) ${site_name} ${RED}не был создан${WHITE}" 158 | vertical_menu "current" 2 0 5 "Нажмите Enter" 159 | return 160 | fi 161 | local selected_php=${installed_versions[${ret}]} 162 | echo -e "${CURSORUP}Выбрана версия ${GREEN}${selected_php}${WHITE}" 163 | echo -e -n "Введите имя папки для DocumentRoot (${GREEN}Enter${WHITE}, если все стандартно):${GREEN}" 164 | read -e -p " " DocumentRoot 165 | echo 166 | echo -e "${WHITE}Владельцем всех папок и файлов в папке ${GREEN}${path}/${site_name}/${DocumentRoot}${WHITE}" 167 | if [[ -z "$DocumentRoot" ]]; then 168 | mkdir -p "$path/$site_name" 169 | else 170 | DocumentRoot="/"${DocumentRoot} 171 | mkdir -p "$path/$site_name/$DocumentRoot" 172 | fi 173 | chown -R ${username}:${username} "$path/$site_name" 174 | 175 | echo -e "Установлен пользователь ${GREEN}${username}${WHITE}" 176 | echo 177 | 178 | { 179 | echo "" 180 | echo "ServerAdmin webmaster@localhost" 181 | echo "ServerName ${site_name}" 182 | echo "ServerAlias www.${site_name}" 183 | echo "DocumentRoot /var/www/${username}/www/${site_name}${DocumentRoot}" 184 | echo "" 185 | echo "" 186 | echo " SetHandler \"proxy:unix:/var/opt/remi/${selected_php}/run/php-fpm/${username}.sock|fcgi://localhost\"" 187 | echo "" 188 | echo "" 189 | echo "DirectoryIndex index.php index.html" 190 | echo "" 191 | echo "" 192 | echo " Options -Indexes +FollowSymLinks" 193 | echo " AllowOverride All" 194 | echo " Require all granted" 195 | echo "" 196 | echo "" 197 | echo "ServerSignature Off" 198 | echo "ErrorLog /var/www/${username}/logs/${site_name}-error-log" 199 | echo "LogLevel warn" 200 | echo "CustomLog /var/www/${username}/logs/${site_name}-access-log combined" 201 | echo "" 202 | } >"/etc/httpd/conf.d/${site_name}.conf" 203 | 204 | if [[ ! -f "/etc/opt/remi/${selected_php}/php-fpm.d/${username}.conf" ]]; then 205 | # Если пул для этой версии PHP еще не был создан, то создаем 206 | echo 207 | echo -e "Выберите режим работы PHP для пользователя ${GREEN}${username}${WHITE}:" 208 | vertical_menu "current" 2 0 5 "ondemand - оптимально расходует память" "dynamic - более оперативно реагирует на запросы" 209 | ret=$? 210 | if ((ret == 0)); then 211 | php_mode="ondemand" 212 | else 213 | php_mode="dynamic" 214 | fi 215 | if [ ! -d "/var/www/${username}/tmp" ]; then 216 | echo "Папка /var/www/${username}/tmp не существует, создаём..." 217 | mkdir -p "/var/www/${username}/tmp" 218 | fi 219 | { 220 | echo "[${username}]" 221 | echo "listen = /var/opt/remi/${selected_php}/run/php-fpm/${username}.sock" 222 | echo "user = ${username}" 223 | echo "group = ${username}" 224 | echo "listen.owner = ${username}" 225 | echo "listen.group = ${username}" 226 | echo "" 227 | echo "listen.allowed_clients = 127.0.0.1" 228 | echo "pm = ${php_mode}" 229 | echo "pm.max_children = 20" 230 | echo "pm.start_servers = 3" 231 | echo "pm.min_spare_servers = 3" 232 | echo "pm.max_spare_servers = 5" 233 | echo "pm.process_idle_timeout = 10s" 234 | echo ";slowlog = /var/www/${username}/slow.log" 235 | echo ";request_slowlog_timeout = 15s" 236 | echo "php_value[session.save_handler] = files" 237 | echo "php_value[session.save_path] = /var/www/${username}/session" 238 | echo "php_value[soap.wsdl_cache_dir] = /var/www/${username}/wsdlcache" 239 | echo "php_value[upload_tmp_dir] = /var/www/${username}/tmp" 240 | } >"/etc/opt/remi/${selected_php}/php-fpm.d/${username}.conf" 241 | 242 | if [[ -f "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf" ]]; then 243 | mv "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf" "/etc/opt/remi/${selected_php}/php-fpm.d/www.conf.old" 244 | fi 245 | 246 | echo -e "Перезапускаем ${GREEN}${selected_php}-php-fpm${WHITE} для активации версии ${GREEN}${selected_php}${WHITE}?" 247 | if vertical_menu "current" 2 0 5 "Да" "Нет"; then 248 | if /opt/remi/${selected_php}/root/usr/sbin/php-fpm -t; then 249 | if systemctl restart "${selected_php}-php-fpm"; then 250 | echo -e "Версия ${GREEN}${selected_php}${WHITE} корректно перезапущена." 251 | echo 252 | else 253 | echo 254 | echo -e "Ошибка при перезапуске ${RED}${selected_php}-php-fpm${WHITE}. Проверьте журналы для диагностики." 255 | echo 256 | fi 257 | else 258 | echo 259 | echo -e "Версия ${RED}${selected_php}${WHITE} имеет проблемы в конфигурационных файлах." 260 | echo -e "Сервис ${RED}не был перезапущен${WHITE} и продолжает работать." 261 | echo 262 | systemctl status "${selected_php}-php-fpm" 263 | fi 264 | else 265 | echo -e "${RED}${selected_php}-php-fpm${WHITE} перезапущен не был. Не забудьте потом перезапустить его самостоятельно." 266 | fi 267 | fi 268 | echo -e -n "Перезапускаем apache для активации сайта ${GREEN}${site_name}${WHITE}? " 269 | # Проверяем, а не punycode ли? 270 | if [[ "$site_name" =~ (xn\-\-) ]] 271 | then 272 | echo -e -n " (${GREEN}"$(idn2 -d "$site_name")"${WHITE})" 273 | echo 274 | else 275 | echo 276 | fi 277 | if vertical_menu "current" 2 0 5 "Да" "Нет"; then 278 | if apachectl configtest; then 279 | systemctl reload httpd 280 | echo "Сервер apache перезагружен" 281 | else 282 | echo "Сервер не был перезагружен" 283 | fi 284 | else 285 | echo "Сервер apache перезапущен не был. Не забудьте потом перезапустить его самостоятельно." 286 | fi 287 | 288 | else 289 | echo "Сайт (vhost) не был создан" 290 | fi 291 | 292 | vertical_menu "current" 2 0 5 "Нажмите Enter" 293 | } 294 | # Если идет прямой вызов - выполняем функцию. Если идет подключение через source - то ничего не делаем 295 | if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then 296 | create_site "$1" "$2" 297 | fi -------------------------------------------------------------------------------- /create_swapfile.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | function create_swapfile() { 4 | echo 5 | # Проверяем, есть ли активный swap 6 | if swapon --show | grep -q '^[^ ]'; then 7 | echo "Swap уже активен:" 8 | swapon --show 9 | echo "Подключение swap не требуется." 10 | else 11 | echo "Swap файл не найден." 12 | local TOTAL_MEM 13 | TOTAL_MEM=$(free -m | awk '/^Mem:/{print $2}') 14 | local SWAP_FILE="/swapfile" 15 | local SWAP_SIZE 16 | 17 | local def="" 18 | echo -e "Размер памяти сервера: ${GREEN}${TOTAL_MEM}${WHITE} Mb" 19 | if [ "$TOTAL_MEM" -lt 1024 ]; then 20 | echo "Для вас обязательно требуется включение swap файла. " 21 | def="default=1" 22 | elif [ "$TOTAL_MEM" -lt 4096 ]; then 23 | echo "При размере памяти менее 4Гб желательно включение swap файла. " 24 | echo "Однако это не обязательно – сервер будет работать и все зависит от нагрузки." 25 | echo "Swap файл можно будет включить позже, если понадобится." 26 | def="default=1" 27 | fi 28 | vertical_menu "current" 2 0 5 "Не создавать swap файл" "Создать swap файл размером 1 Gb" "Создать swap файл размером 2 Gb" ${def} 29 | choice=$? 30 | case "$choice" in 31 | 0) 32 | echo "Swap файл не был создан." 33 | return 34 | ;; 35 | 1) 36 | SWAP_SIZE="1G" 37 | ;; 38 | 2) 39 | SWAP_SIZE="2G" 40 | ;; 41 | esac 42 | 43 | echo "Создание swap файла размером $SWAP_SIZE" 44 | 45 | # Создаем файл для swap 46 | fallocate -l $SWAP_SIZE $SWAP_FILE 47 | 48 | # Проверка на успех создания файла 49 | if [ $? -ne 0 ]; then 50 | echo "Ошибка: не удалось создать swap файл." 51 | exit 1 52 | fi 53 | 54 | # Назначаем правильные права доступа 55 | chmod 600 $SWAP_FILE 56 | 57 | # Создаем swap пространство 58 | mkswap $SWAP_FILE 59 | 60 | # Активируем swap 61 | swapon $SWAP_FILE 62 | 63 | # Проверяем статус swap 64 | if sudo swapon --show | grep -q "$SWAP_FILE"; then 65 | echo -e "Swap файл успешно ${GREEN}активирован${WHITE}." 66 | else 67 | echo -e "${RED}Ошибка${WHITE}: не удалось активировать swap файл." 68 | exit 1 69 | fi 70 | # Добавляем в /etc/fstab для автоматической активации при загрузке 71 | if ! grep -q "$SWAP_FILE" /etc/fstab; then 72 | echo "$SWAP_FILE none swap sw 0 0" | tee -a /etc/fstab > /dev/null 73 | echo -e "Swap добавлен в ${GREEN}/etc/fstab${WHITE}." 74 | else 75 | echo "Swap уже присутствует в /etc/fstab." 76 | fi 77 | 78 | # Устанавливаем значение vm.swappiness, если swap активен 79 | local SWAPPINESS_VALUE=10 # Здесь можно указать нужное значение 80 | echo "Настройка vm.swappiness в $SWAPPINESS_VALUE" 81 | 82 | # Устанавливаем значение на лету 83 | sysctl vm.swappiness=$SWAPPINESS_VALUE 84 | 85 | # Для постоянного изменения добавляем его в /etc/sysctl.conf, если его там нет 86 | if ! grep -q "vm.swappiness" /etc/sysctl.conf; then 87 | echo "vm.swappiness=$SWAPPINESS_VALUE" | tee -a /etc/sysctl.conf 88 | echo "vm.swappiness добавлен в /etc/sysctl.conf" 89 | else 90 | # Если параметр уже существует, заменим его на новое значение 91 | sed -i "s/^vm.swappiness=.*/vm.swappiness=$SWAPPINESS_VALUE/" /etc/sysctl.conf 92 | echo "vm.swappiness обновлен в /etc/sysctl.conf" 93 | fi 94 | 95 | fi 96 | echo 97 | } -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | RISH Test Page for the Apache HTTP Server 6 | 7 | 79 | 80 | 81 | 82 |

RISH Test Page

83 | 84 |
85 |
86 |

This page is used to test the proper operation of the Apache HTTP server after it has been installed. If you can read this page, it means that the web server installed at this site is working properly, but has not yet been configured.

87 |
88 |
89 | 90 |
91 |
92 |

If you are a member of the general public:

93 | 94 |

The fact that you are seeing this page indicates that the website you just visited is either experiencing problems, or is undergoing routine maintenance.

95 | 96 |

If you would like to let the administrators of this website know that you've seen this page instead of the page you expected, you should send them e-mail. In general, mail sent to the name "webmaster" and directed to the website's domain should reach the appropriate person.

97 | 98 |

For example, if you experienced problems while visiting www.example.com, you should send e-mail to "webmaster@example.com".

99 | 100 |

Fedora is a distribution of Linux, a popular computer operating system. It is commonly used by hosting companies because it is free, and includes free web server software. Many times, they do not set up their web server correctly, and it displays this "test page" instead of the expected website.

101 | 102 |

Accordingly, please keep these facts in mind:

103 |
    104 |
  • Neither the Fedora Project or Red Hat has any affiliation with any website or content hosted from this server (unless otherwise explicitly stated).
  • 105 |
  • Neither the Fedora Project or Red Hat has "hacked" this webserver, this test page is an included component of Apache's httpd webserver software.
  • 106 |
107 | 108 |

For more information about RISH, please visit the RISH Project website.

109 |
110 |
111 | 112 |
113 |

If you are the website administrator:

114 | 115 |

You may now add content to the directory /var/www/html/. Note that until you do so, people visiting your website will see this page, and not your content. To prevent this page from ever being used, follow the instructions in the file /etc/httpd/conf.d/welcome.conf.

116 | 117 |
118 |

You are free to use the images below on Apache and Fedora powered HTTP servers. Thanks for using Apache and Fedora!

119 | 120 |

[ Powered by Apache ] [ Powered by Fedora ]

121 |
122 |
123 |
124 |
125 | 126 | -------------------------------------------------------------------------------- /local_router.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | clear 3 | # Путь к конфигурационному файлу 4 | CONFIG_FILE="/root/rish/rish_config.sh" 5 | 6 | # Подключение файла windows.sh 7 | source /root/rish/windows.sh 8 | 9 | # Проверяем, существует ли конфигурационный файл 10 | if [ ! -f "$CONFIG_FILE" ]; then 11 | touch "$CONFIG_FILE" 12 | fi 13 | 14 | GREEN='\033[0;32m' 15 | RED='\033[0;31m' 16 | WHITE='\033[0m' 17 | # Подключаем конфигурационный файл 18 | source "$CONFIG_FILE" 19 | 20 | # Функция для запроса логина и пароля у пользователя и вычисления MD5_HASH 21 | request_credentials() { 22 | echo "Введите логин для роутера (или нажмите Enter для выхода):" 23 | read -r -e ROUTER_LOGIN 24 | # Проверяем, введен ли логин 25 | if [ -z "$ROUTER_LOGIN" ]; then 26 | echo "Логин не введен. Выход из скрипта." 27 | exit 1 28 | fi 29 | echo "Введите пароль для роутера:" 30 | read -r -e ROUTER_PASSWORD 31 | echo 32 | # Вычисление MD5_HASH 33 | MD5_HASH=$(echo -n "$ROUTER_LOGIN:$REALM:$ROUTER_PASSWORD" | openssl md5 | awk '{print $2}') 34 | sed -i '/^MD5_HASH=/d' "$CONFIG_FILE" 35 | sed -i '/^ROUTER_LOGIN=/d' "$CONFIG_FILE" 36 | # Сохраняем логин и MD5_HASH в конфигурационный файл 37 | echo "ROUTER_LOGIN=\"$ROUTER_LOGIN\"" >> "$CONFIG_FILE" 38 | echo "MD5_HASH=\"$MD5_HASH\"" >> "$CONFIG_FILE" 39 | } 40 | 41 | # Функция для проверки доступности IP-адреса роутера 42 | check_router_ip() { 43 | if ping -c 1 -W 5 "$1" &> /dev/null; then 44 | return 0 45 | else 46 | return 1 47 | fi 48 | } 49 | # Проверяем, задан ли ROUTER_IP в конфигурационном файле 50 | if [ -z "$ROUTER_IP" ]; then 51 | # Определяем IP адрес роутера автоматически 52 | DEFAULT_ROUTER_IP=$(ip route | grep default | awk '{print $3}') 53 | # Если автоматическое определение не удалось, используем 192.168.1.1 54 | if [ -z "$DEFAULT_ROUTER_IP" ]; then 55 | echo "Не удалось определить адрес роутера. Используем адрес 192.168.1.1" 56 | DEFAULT_ROUTER_IP="192.168.1.1" 57 | fi 58 | # Предлагаем пользователю принять IP адрес или изменить его, используя read -e -i 59 | echo "Введите IP адрес роутера (нажмите Enter для значения по умолчанию):" 60 | read -r -e -i "$DEFAULT_ROUTER_IP" ROUTER_IP 61 | # Перед добавлением новой записи удаляем старые из конфигурационного файла 62 | sed -i '/^ROUTER_IP=/d' "$CONFIG_FILE" 63 | # Сохраняем ROUTER_IP в конфигурационный файл 64 | echo "ROUTER_IP=\"$ROUTER_IP\"" >> "$CONFIG_FILE" 65 | fi 66 | # Проверяем доступность существующего ROUTER_IP 67 | if ! check_router_ip "$ROUTER_IP"; then 68 | echo -e "${RED}Роутер недоступен ${WHITE} по адресу ${RED}$ROUTER_IP${WHITE}." 69 | echo "Попробуйте ввести другой IP адрес роутера." 70 | echo 71 | # Определяем IP адрес роутера автоматически 72 | DEFAULT_ROUTER_IP=$(ip route | grep default | awk '{print $3}') 73 | # Если автоматическое определение не удалось, используем 192.168.1.1 74 | if [ -z "$DEFAULT_ROUTER_IP" ]; then 75 | DEFAULT_ROUTER_IP="192.168.1.1" 76 | fi 77 | # Предлагаем пользователю ввести новый IP адрес 78 | echo "Введите новый IP адрес роутера (нажмите Enter для значения по умолчанию):" 79 | read -r -e -i "$DEFAULT_ROUTER_IP" ROUTER_IP 80 | # Перед добавлением новой записи удаляем старые из конфигурационного файла 81 | sed -i '/^ROUTER_IP=/d' "$CONFIG_FILE" 82 | # Сохраняем новый ROUTER_IP в конфигурационный файл 83 | echo "ROUTER_IP=\"$ROUTER_IP\"" >> "$CONFIG_FILE" 84 | # Проверяем доступность нового IP адреса 85 | if ! check_router_ip "$ROUTER_IP"; then 86 | echo 87 | echo -e "${RED}Роутер недоступен ${WHITE} по адресу ${RED}$ROUTER_IP${WHITE}. Проверьте подключение и повторите попытку." 88 | echo 89 | vertical_menu "current" 2 0 5 "Нажмите Enter" 90 | exit 1 91 | fi 92 | fi 93 | 94 | echo "IP адрес роутера: $ROUTER_IP" 95 | 96 | # Директория для хранения временных файлов 97 | WORK_DIR="/root/rish" 98 | COOKIE_JAR="$WORK_DIR/cookies.txt" 99 | HEADER_FILE="$WORK_DIR/headers.txt" 100 | RESPONSE_FILE="$WORK_DIR/response.txt" 101 | DELETE_RESPONSE_FILE="$WORK_DIR/delete_response.txt" 102 | 103 | # Проверяем, существует ли директория WORK_DIR, если нет - создаем 104 | if [ ! -d "$WORK_DIR" ]; then 105 | mkdir -p "$WORK_DIR" 106 | fi 107 | 108 | 109 | # Функция для аутентификации 110 | authenticate() { 111 | # Проверяем, задан ли ROUTER_LOGIN и MD5_HASH 112 | if [ -z "$ROUTER_LOGIN" ] || [ -z "$MD5_HASH" ]; then 113 | echo "Логин или MD5_HASH не найдены. Запрашиваю у пользователя..." 114 | request_credentials 115 | fi 116 | 117 | # Отправка GET-запроса на /auth и сохранение заголовков 118 | curl -s -D "$HEADER_FILE" -o /dev/null -c "$COOKIE_JAR" "http://$ROUTER_IP/auth" 119 | 120 | # Проверяем код ответа 121 | HTTP_CODE=$(awk '/HTTP\/1\.[01] [0-9]{3}/ {print $2}' "$HEADER_FILE" | tail -1) 122 | 123 | if [ "$HTTP_CODE" -eq 200 ]; then 124 | return 0 125 | else 126 | 127 | # Извлечение заголовков 128 | TOKEN=$(awk -F': ' '/X-NDM-Challenge:/ {print $2}' "$HEADER_FILE" | tr -d '\r') 129 | REALM=$(awk -F': ' '/X-NDM-Realm:/ {print $2}' "$HEADER_FILE" | tr -d '\r') 130 | 131 | # Если REALM пустой, устанавливаем значение по умолчанию 132 | if [ -z "$REALM" ]; then 133 | REALM="Keenetic" 134 | echo "Realm не предоставлен, используем значение по умолчанию: $REALM" 135 | fi 136 | 137 | 138 | # Вычисление SHA256 хеша: sha256(token + md5_hash) 139 | PASSWORD_HASH=$(echo -n "$TOKEN$MD5_HASH" | openssl sha256 | awk '{print $2}') 140 | # Подготовка данных для авторизации 141 | AUTH_DATA=$(printf '{"login":"%s","password":"%s"}' "$ROUTER_LOGIN" "$PASSWORD_HASH") 142 | 143 | # Отправка POST-запроса на /auth 144 | response=$(curl -s -o /dev/null -w "%{http_code}" -b "$COOKIE_JAR" -c "$COOKIE_JAR" \ 145 | -X POST "http://$ROUTER_IP/auth" \ 146 | -H "Content-Type: application/json" \ 147 | -d "$AUTH_DATA") 148 | 149 | if [ "$response" -eq 200 ]; then 150 | return 0 151 | else 152 | echo "Ошибка авторизации. Код ответа: $response" 153 | echo "Пожалуйста, введите корректный логин и пароль." 154 | # Удаляем неверный MD5_HASH и ROUTER_LOGIN из конфигурационного файла 155 | sed -i '/^MD5_HASH=/d' "$CONFIG_FILE" 156 | sed -i '/^ROUTER_LOGIN=/d' "$CONFIG_FILE" 157 | # Запрашиваем данные заново 158 | request_credentials 159 | # Повторяем аутентификацию 160 | authenticate 161 | fi 162 | fi 163 | } 164 | 165 | add_domain() { 166 | local domain="$1" 167 | local ip_address="$2" 168 | 169 | # URL для добавления записи 170 | ADD_URL="http://$ROUTER_IP/rci/ip/host/" 171 | 172 | # Данные для добавления 173 | ADD_DATA=$(printf '{"domain":"%s","address":"%s"}' "$domain" "$ip_address") 174 | 175 | # Отправка POST-запроса для добавления домена 176 | RESPONSE_CODE=$(curl --connect-timeout 10 -m 10 -s -o "$RESPONSE_FILE" -w "%{http_code}" -b "$COOKIE_JAR" \ 177 | -X POST "$ADD_URL" \ 178 | -H "Content-Type: application/json" \ 179 | -d "$ADD_DATA") 180 | 181 | # Проверка кода ответа 182 | if [ "$RESPONSE_CODE" -eq 401 ]; then 183 | echo "Сессия истекла, повторная авторизация..." 184 | authenticate 185 | # Повторяем запрос после успешной авторизации 186 | RESPONSE_CODE=$(curl --connect-timeout 10 -m 10 -s -o "$RESPONSE_FILE" -w "%{http_code}" -b "$COOKIE_JAR" \ 187 | -X POST "$ADD_URL" \ 188 | -H "Content-Type: application/json" \ 189 | -d "$ADD_DATA") 190 | fi 191 | 192 | if [ "$RESPONSE_CODE" -eq 200 ]; then 193 | echo -e "Домен ${GREEN}$domain${WHITE} успешно добавлен с IP ${GREEN}$ip_address${WHITE}." 194 | else 195 | echo -e "Ошибка при добавлении домена. Код ответа: ${RED}$RESPONSE_CODE${WHITE}" 196 | cat "$RESPONSE_FILE" 197 | fi 198 | 199 | # Очистка временного файла 200 | rm -f "$RESPONSE_FILE" 201 | } 202 | 203 | # Функция для отправки команды на удаление записи с обработкой повторной авторизации 204 | delete_domain() { 205 | # URL для удаления записи 206 | DELETE_URL="http://$ROUTER_IP/rci/ip/host/?domain=$selected_domain" 207 | 208 | # Отправка DELETE-запроса и получение HTTP-кода 209 | RESPONSE_CODE=$(curl -s -o "$DELETE_RESPONSE_FILE" -w "%{http_code}" -b "$COOKIE_JAR" \ 210 | -X DELETE "$DELETE_URL") 211 | 212 | # Проверка кода ответа 213 | if [ "$RESPONSE_CODE" -eq 401 ]; then 214 | echo "Сессия истекла, повторная авторизация..." 215 | authenticate 216 | # Повторяем запрос после успешной авторизации 217 | RESPONSE_CODE=$(curl -s -o "$DELETE_RESPONSE_FILE" -w "%{http_code}" -b "$COOKIE_JAR" \ 218 | -X DELETE "$DELETE_URL") 219 | fi 220 | 221 | if [ "$RESPONSE_CODE" -eq 200 ]; then 222 | echo -e "Запись ${GREEN}$selected_domain${WHITE} успешно удалена." 223 | else 224 | echo "Ошибка при удалении записи. Код ответа: ${RED}$RESPONSE_CODE${WHITE}" 225 | cat "$DELETE_RESPONSE_FILE" 226 | fi 227 | 228 | # Очистка временного файла 229 | rm -f "$DELETE_RESPONSE_FILE" 230 | } 231 | 232 | while true 233 | do 234 | # Выполняем аутентификацию 235 | authenticate 236 | # Отправка команды роутеру и получение HTTP-кода 237 | RESPONSE_CODE=$(curl -s -o "$RESPONSE_FILE" -w "%{http_code}" -b "$COOKIE_JAR" "http://$ROUTER_IP/rci/show/running-config") 238 | 239 | # Проверка кода ответа. Если 401, то повторная авторизация 240 | if [ "$RESPONSE_CODE" -eq 401 ]; then 241 | echo "Сессия истекла, повторная авторизация..." 242 | authenticate 243 | # Повторяем запрос после успешной авторизации 244 | RESPONSE_CODE=$(curl -s -o "$RESPONSE_FILE" -w "%{http_code}" -b "$COOKIE_JAR" "http://$ROUTER_IP/rci/show/running-config") 245 | fi 246 | 247 | # Чтение ответа из файла 248 | RESPONSE_CONTENT=$(<"$RESPONSE_FILE") 249 | 250 | # Очистка временного файла 251 | rm -f "$RESPONSE_FILE" 252 | 253 | # Шаг 3: Извлечение строк с 'ip host' и создание массива 254 | 255 | # Извлекаем поле 'message' из JSON-ответа 256 | messages=$(echo "$RESPONSE_CONTENT" | sed -n '/"message": \[/,/^\s*\]/p' | sed '1d;$d' | sed 's/^[ \t]*"//;s/",\?$//') 257 | 258 | # Используем mapfile для чтения строк в массив 259 | mapfile -t array < <(echo "$messages" | grep "^ip host" | tr -d '\r') 260 | # Вывод меню для выбора 261 | echo 262 | echo "Выберите нужную запись для удаления или добавьте новый домен." 263 | echo "Нажмите Esc для выхода" 264 | echo 265 | # Проверка на пустой массив 266 | if [ ${#array[@]} -eq 0 ]; then 267 | sorted_array=("Добавить домен") 268 | else 269 | # Определение максимальной длины доменного имени 270 | max_length=0 271 | unset domains_ips 272 | declare -A domains_ips 273 | for line in "${array[@]}"; do 274 | # Извлекаем домен и IP 275 | read -r _ _ domain ip <<< "$line" 276 | domains_ips["$domain"]="$ip" 277 | # Определяем длину доменного имени 278 | domain_length=${#domain} 279 | if (( domain_length > max_length )); then 280 | max_length=$domain_length 281 | fi 282 | done 283 | 284 | # Формирование массива для меню с учетом выравнивания 285 | formatted_array=() 286 | for domain in "${!domains_ips[@]}"; do 287 | ip=${domains_ips["$domain"]} 288 | formatted_line=$(printf "%-${max_length}s %s" "$domain" "$ip") 289 | formatted_array+=("$formatted_line") 290 | done 291 | 292 | # Сортировка массива 293 | sorted_array=() 294 | mapfile -t sorted_array < <(printf '%s\n' "${formatted_array[@]}" | sort) 295 | sorted_array=("Добавить домен" "${sorted_array[@]}") 296 | fi 297 | 298 | # Используем функцию vertical_menu из windows.sh 299 | vertical_menu "current" 2 30 30 "${sorted_array[@]}" 300 | choice=$? 301 | if (( choice > 254 )); then 302 | exit 303 | fi 304 | 305 | if (( choice == 0 )); then 306 | # Добавляем новый домен 307 | 308 | # Сканируем директорию /etc/httpd/conf.d для получения списка доступных доменов 309 | conf_dir="/etc/httpd/conf.d" 310 | domain_files=() 311 | 312 | # Проходим по всем файлам в директории 313 | for file in "$conf_dir"/*.conf; do 314 | filename=$(basename "$file") 315 | 316 | # Пропускаем файлы, которые нужно исключить 317 | if [[ "$filename" == "userdir.conf" || "$filename" == "welcome.conf" || "$filename" == "ssl.conf" || \ 318 | "$filename" == "README" || "$filename" == "000-default.conf" || "$filename" == "000-default-ssl.conf" ]]; then 319 | continue 320 | fi 321 | if [[ "$filename" == php*php.conf ]]; then 322 | continue 323 | fi 324 | if [[ "$filename" == *-ssl.conf ]]; then 325 | continue 326 | fi 327 | 328 | if [[ "$filename" == autoindex.conf ]]; then 329 | continue 330 | fi 331 | # Извлекаем доменное имя из названия файла 332 | domain="${filename%.conf}" 333 | domain_files+=("$domain") 334 | done 335 | 336 | # Проверяем, есть ли доступные домены для добавления 337 | if [ ${#domain_files[@]} -eq 0 ]; then 338 | echo -e "${RED}Внимание!${WHITE}. Не найдено ни одного хоста для добавления." 339 | echo "Вам следует создать хотя бы один сайт, чтобы домен работал." 340 | echo 341 | fi 342 | 343 | # Сортируем список доменов 344 | sorted_domains=($(printf '%s\n' "${domain_files[@]}" | sort)) 345 | # Добавляем опцию для ввода своего домена 346 | sorted_domains=("Ввести свой домен" "${sorted_domains[@]}") 347 | 348 | # Вывод меню для выбора домена для добавления 349 | echo "Выберите домен для добавления или введите свой." 350 | echo "Нажмите Esc для выхода." 351 | 352 | vertical_menu "current" 2 30 30 "${sorted_domains[@]}" 353 | choice=$? 354 | if (( choice > 254 )); then 355 | exit 356 | fi 357 | 358 | # Получаем выбранный домен 359 | selected_domain="${sorted_domains[$choice]}" 360 | 361 | # Если пользователь выбрал "Ввести свой домен", запрашиваем доменное имя 362 | if (( choice == 0 )); then 363 | echo "Введите доменное имя, которое хотите добавить (Enter чтобы выйти):" 364 | read -e selected_domain 365 | # Убираем лишние пробелы 366 | selected_domain=$(echo "$selected_domain" | xargs) 367 | # Проверяем, что домен не пустой 368 | if [ -z "$selected_domain" ]; then 369 | echo "Домен не введен. Выход из скрипта." 370 | vertical_menu "current" 2 0 5 "Нажмите Enter" 371 | exit 1 372 | fi 373 | fi 374 | 375 | # Получаем IP адрес сервера 376 | ip_address=$(hostname -I | awk '{print $1}') 377 | 378 | # Подтверждение добавления 379 | echo 380 | echo -e "Домен: ${GREEN}${selected_domain}${WHITE} будет добавлен с IP ${GREEN}$ip_address${WHITE}" 381 | echo 382 | vertical_menu "current" 2 0 5 "Добавить ${selected_domain}" "Добавить ${selected_domain} и www.${selected_domain}" "Ничего не добавлять" 383 | choice=$? 384 | case "$choice" in 385 | 0) 386 | add_domain "$selected_domain" "$ip_address" 387 | ;; 388 | 1) 389 | add_domain "$selected_domain" "$ip_address" 390 | add_domain "www.$selected_domain" "$ip_address" 391 | ;; 392 | *) 393 | ;; 394 | esac 395 | else 396 | # Обработка выбора пользователя 397 | selected_entry=${sorted_array[$choice]} 398 | selected_domain=$(echo "$selected_entry" | awk '{print $1}') 399 | 400 | echo 401 | echo -e "Домен: ${GREEN}${selected_domain}${WHITE} будет ${RED}удален${WHITE}" 402 | echo 403 | if vertical_menu "current" 2 0 5 "Да" "Нет" 404 | then 405 | delete_domain 406 | fi 407 | fi 408 | 409 | # Очистка 410 | rm -f "$COOKIE_JAR" "$HEADER_FILE" 411 | echo 412 | done -------------------------------------------------------------------------------- /mariadb_install.sh: -------------------------------------------------------------------------------- 1 | # shellcheck disable=SC3000-SC4000 2 | mariadb_install() { 3 | 4 | Install "MariaDB-server MariaDB-client" 5 | systemctl start mariadb 6 | systemctl enable mariadb 7 | 8 | Up 9 | echo -e "Производим настройку безопасности ${GREEN}mysql_secure_installation${WHITE}" 10 | Down 11 | sed -i '/character-set-server=utf8/d' /etc/my.cnf.d/server.cnf 12 | sed -i "s/^\[mysqld\]/\[mysqld\]\ncharacter-set-server=utf8/" /etc/my.cnf.d/server.cnf 13 | 14 | mariadb-secure-installation <&2 177 | } 178 | 179 | error(){ 180 | msg error "$@" 181 | exit 1 182 | } 183 | 184 | cap() 185 | { 186 | printf '%s' "$1" | head -c 1 | tr [:lower:] [:upper:] 187 | printf '%s' "$1" | tail -c '+2' 188 | } 189 | 190 | verify_server_os_combo() { 191 | local failed=0 192 | local not_available="MariaDB Server ${mariadb_server_version_real} is not available for $(cap ${os_type}) $(cap ${os_version})" 193 | case $mariadb_server_version_real in 194 | *10.1[0-1]*) ;; # need to handle 10.10+ 195 | *10.[0-4]*) case ${os_version} in jammy|bullseye|noble) failed=1 ;; esac ;; 196 | *10.5*) case ${os_version} in jammy|noble) failed=1 ;; esac ;; 197 | esac 198 | if (( $failed )) 199 | then 200 | # This verify_server_os_combo function only runs if MariaDB is not being 201 | # skipped. If Maxscale is being skipped then we return an error, otherwise 202 | # we just return a warning and skip configuring the Server repo. 203 | if ((skip_maxscale)) 204 | then 205 | error "${not_available}" 206 | else 207 | msg warning "${not_available}, skipping..." 208 | skip_server=1 209 | fi 210 | fi 211 | } 212 | 213 | verify_mariadb_server_version() { 214 | # version regex 215 | if (($skip_eol_check)); then 216 | rx='^(mariadb-){0,1}(10\.[0-9]|10\.1[0-1]|10\.[0-9]\.[1-9]{0,1}[0-9]{1}|10\.1[0-1]\.[1-9]{1}[0-9]{0,1}|11\.[0-5]|11\.[0-5]\.[1-9]{1}[0-9]{0,1})$' 217 | else 218 | rx='^(mariadb-){0,1}(10\.[4569]|10\.1[0-1]|10\.[4569]\.[1-9]{0,1}[0-9]{1}|10\.1[0-1]\.[1-9]{1}[0-9]{0,1}|11\.[0-5]|11\.[0-5]\.[1-9]{1}[0-9]{0,1})$' 219 | fi 220 | if [[ $@ =~ $rx ]] ; then 221 | case $os_type in 222 | ubuntu|debian) 223 | verify_url="${url_mariadb_repo}/${mariadb_server_version_real}/repo/${os_type}/dists/${os_version}/Release" 224 | ;; 225 | rhel) 226 | verify_url="${url_mariadb_repo}/${mariadb_server_version_real}/yum/rhel/${os_version}/${arch}/repodata/repomd.xml" 227 | ;; 228 | sles) 229 | verify_url="${url_mariadb_repo}/${mariadb_server_version_real}/yum/sles/${os_version}/x86_64/repodata/repomd.xml" 230 | ;; 231 | esac 232 | error_log=$(mktemp) 233 | http_status_code=$(curl -LsS --stderr ${error_log} -o /dev/null -I -w "%{http_code}" ${verify_url}) 234 | return_code="$?" 235 | error_output=$(cat ${error_log}) 236 | rm -f ${error_log} 237 | 238 | case ${http_status_code} in 239 | 200) 240 | msg info "MariaDB Server version ${mariadb_server_version_real} is valid" 241 | ;; 242 | 403|404) 243 | get_version_info_server 244 | error "MariaDB Server version ${mariadb_server_version_real} is not working. 245 | # Please verify that the version is correct. 246 | # Not all releases of MariaDB are available on all distributions. 247 | #${version_info}" 248 | ;; 249 | *) 250 | error_message="Problem encountered while trying to verify the MariaDB Server version:" 251 | if [[ "${return_code}" -gt "0" ]]; then 252 | get_version_info_server 253 | error "${error_message} 254 | $error_output ${version_info}" 255 | else 256 | get_version_info_server 257 | error "${error_message} 258 | Unexpected HTTP response code '${http_status_code}' ${version_info}" 259 | fi 260 | ;; 261 | esac 262 | else 263 | get_version_info_server 264 | error "MariaDB Server version ${mariadb_server_version_real} is not valid. ${version_info}" 265 | fi 266 | } 267 | 268 | get_version_info_server() { 269 | if [[ "${version_info}" = "" ]]; then 270 | latest_versions_server=$(curl -s https://dlm.mariadb.com/rest/releases/mariadb_server/) 271 | 272 | version_info=" 273 | # The latest MariaDB Server versions are: 274 | # ${latest_versions_server} 275 | # 276 | # More information on MariaDB releases is available at: 277 | # https://mariadb.com/kb/en/release-notes/" 278 | fi 279 | } 280 | 281 | version(){ 282 | printf "mariadb_repo_setup %s\n" "$version" 283 | } 284 | 285 | while :; do 286 | case $1 in 287 | --version) 288 | version 289 | exit 0 290 | ;; 291 | --mariadb-server-version) 292 | if [[ -n $2 ]] && [[ $2 != --* ]]; then 293 | mariadb_server_version=$2 294 | shift 295 | else 296 | error "The $1 option requires an argument" 297 | fi 298 | ;; 299 | --mariadb-server-version=?*) 300 | mariadb_server_version=${1#*=} 301 | ;; 302 | --mariadb-server-version=) 303 | error "The $1 option requires an argument" 304 | ;; 305 | --mariadb-maxscale-version) 306 | if [[ -n $2 ]] && [[ $2 != --* ]]; then 307 | mariadb_maxscale_version=$2 308 | shift 309 | else 310 | error "The $1 option requires an argument" 311 | fi 312 | ;; 313 | --mariadb-maxscale-version=?*) 314 | mariadb_maxscale_version=${1#*=} 315 | ;; 316 | --mariadb-maxscale-version=) 317 | error "The $1 option requires an argument" 318 | ;; 319 | 320 | --write-to-stdout) 321 | write_to_stdout=1 322 | ;; 323 | 324 | --skip-key-import) 325 | skip_key_import=1 326 | ;; 327 | --skip-maxscale) 328 | skip_maxscale=1 329 | ;; 330 | --skip-server) 331 | skip_server=1 332 | ;; 333 | --skip-tools) 334 | skip_tools=1 335 | ;; 336 | --skip-verify) 337 | skip_verify=1 338 | ;; 339 | --skip-check-installed) 340 | skip_check_installed=1 341 | ;; 342 | --skip-eol-check) 343 | skip_eol_check=1 344 | ;; 345 | --skip-os-eol-check) 346 | skip_os_eol_check=1 347 | ;; 348 | 349 | --os-type) 350 | if [[ -n $2 ]] && [[ $2 != --* ]]; then 351 | os_type=$2 352 | shift 353 | else 354 | error "The $1 option requires an argument" 355 | fi 356 | ;; 357 | --os-type=?*) 358 | os_type=${1#*=} 359 | ;; 360 | --os-type=) 361 | error "The $1 option requires an argument" 362 | ;; 363 | --arch) 364 | if [[ -n $2 ]] && [[ $2 != --* ]]; then 365 | os_type=$2 366 | shift 367 | else 368 | error "The $1 option requires an argument" 369 | fi 370 | ;; 371 | --arch=?*) 372 | arch=${1#*=} 373 | # normalize arch names 374 | case $arch in 375 | amd64|x86_64) 376 | arch='x86_64' 377 | ;; 378 | aarch64|arm64) 379 | arch='aarch64' 380 | ;; 381 | *) 382 | error "You set arch=$arch but valid architectures are: x86_64 (amd64) and aarch64 (arm64)" 383 | ;; 384 | esac 385 | ;; 386 | --arch=) 387 | error "The $1 option requires an argument" 388 | ;; 389 | --os-version) 390 | if [[ -n $2 ]] && [[ $2 != --* ]]; then 391 | os_version=$2 392 | shift 393 | else 394 | error "The $1 option requires an argument" 395 | fi 396 | ;; 397 | --os-version=?*) 398 | os_version=${1#*=} 399 | ;; 400 | --os-version=) 401 | error "The $1 option requires an argument" 402 | ;; 403 | --help) 404 | version 405 | printf "%s" "$usage" 406 | exit 407 | ;; 408 | -?*) 409 | msg warning "Unknown option (ignored): $1\n" 410 | ;; 411 | *) 412 | break 413 | esac 414 | shift 415 | done 416 | 417 | # We accept setting os-type to centos or rocky, but we normalize it to 'rhel' 418 | case ${os_type} in 419 | centos|rocky*) os_type='rhel' ;; 420 | esac 421 | 422 | open_outfile(){ 423 | unset outfile 424 | if (( write_to_stdout )) 425 | then 426 | exec 4>&1 427 | else 428 | case $1 in 429 | ubuntu|debian) outfile=/etc/apt/sources.list.d/mariadb.list ;; 430 | rhel) outfile=/etc/yum.repos.d/mariadb.repo ;; 431 | sles) outfile=/etc/zypp/repos.d/mariadb.repo ;; 432 | *) error "Sorry, your OS is not supported." "$supported" 433 | esac 434 | if [[ -e $outfile ]] 435 | then 436 | local suffix=0 437 | while [[ -e $outfile.old_$((++suffix)) ]]; do :; done 438 | msg warning "Found existing file at $outfile. Moving to $outfile.old_$suffix" 439 | if ! mv "$outfile" "$outfile.old_$suffix" 440 | then 441 | error "Could not move existing '$outfile'. Aborting"\ 442 | "Use the --write-to-stdout option to see its effect without becoming root" 443 | fi 444 | fi 445 | if ! exec 4>"$outfile" 446 | then 447 | error "Could not open file $outfile for writing. Aborting"\ 448 | "Use the --write-to-stdout option to see its effect without becoming root" 449 | fi 450 | fi 451 | } 452 | 453 | identify_os(){ 454 | if [[ ! $arch ]] 455 | then 456 | arch=$(uname -m) 457 | fi 458 | # Check for macOS 459 | if [[ $(uname -s) == Darwin ]] 460 | then 461 | printf '%s\n' \ 462 | 'To install MariaDB Server from a repository on macOS, please use Homebrew:' \ 463 | ' https://mariadb.com/kb/en/mariadb/installing-mariadb-on-macos-using-homebrew/' \ 464 | 'Or use the native PKG installer:' \ 465 | ' https://mariadb.com/kb/en/mariadb/installing-mariadb-server-pkg-packages-on-macos/' 466 | exit 467 | # Check for RHEL/CentOS, Fedora, etc. 468 | elif command -v rpm >/dev/null && [[ -e /etc/redhat-release ]] 469 | then 470 | os_type=rhel 471 | el_version=$(rpm -qa '(oraclelinux|sl|redhat|centos|fedora|rocky|alma)*release(|-server)' --queryformat '%{VERSION}') 472 | case $el_version in 473 | 5*) os_version=5 ; ((skip_os_eol_check)) || error "RHEL/CentOS 5 is no longer supported" "$supported" ;; 474 | 6*) os_version=6 ; ((skip_os_eol_check)) || error "RHEL/CentOS 6 is no longer supported" "$supported" ;; 475 | 7*) os_version=7 ;; 476 | 8*) os_version=8 ; extra_options="module_hotfixes = 1" ;; 477 | 9*) os_version=9 ; extra_options="module_hotfixes = 1" ;; 478 | *) error "Detected RHEL or compatible but version ($el_version) is not supported." "$supported" "$otherplatforms" ;; 479 | esac 480 | elif [[ -e /etc/os-release ]] 481 | then 482 | . /etc/os-release 483 | # Is it Debian? 484 | case $ID in 485 | debian) 486 | os_type=debian 487 | debian_version=$(< /etc/debian_version) 488 | case $debian_version in 489 | 9*) os_version=stretch ; ((skip_os_eol_check)) || error "Debian 9 'stretch' has reached End of Life and is no longer supported" "$supported" ;; 490 | 10*) os_version=buster ;; 491 | 11*) os_version=bullseye ;; 492 | 12*) os_version=bookworm ;; 493 | *) error "Detected Debian but version ($debian_version) is not supported." "$supported" "$otherplatforms" ;; 494 | esac 495 | ;; 496 | ubuntu) 497 | os_type=ubuntu 498 | . /etc/lsb-release 499 | os_version=$DISTRIB_CODENAME 500 | case $os_version in 501 | precise ) ((skip_os_eol_check)) || error 'Ubuntu 12.04 LTS has reached End of Life and is no longer supported.' ;; 502 | trusty ) ((skip_os_eol_check)) || error 'Ubuntu 14.04 LTS has reached End of Life and is no longer supported.' ;; 503 | xenial ) ((skip_os_eol_check)) || error 'Ubuntu 16.04 LTS has reached End of Life and is no longer supported.' ;; 504 | bionic ) extra_options=" lang=none target-=CNF" ; ((skip_os_eol_check)) || error 'Ubuntu 18.04 LTS has reached End of Life and is no longer supported.' ;; 505 | focal|jammy|noble ) ;; 506 | *) error "Detected Ubuntu but version ($os_version) is not supported." "Only Ubuntu LTS releases are supported." "$otherplatforms" ;; 507 | esac 508 | if [[ $arch == aarch64 ]] 509 | then 510 | case $os_version in 511 | xenial ) ;; 512 | bionic ) extra_options=" lang=none target-=CNF" ;; 513 | focal|jammy|noble ) ;; 514 | *) error "Only 18.04/bionic, 20.04/focal, 22.04/jammy, & 24.04/noble are supported for ARM64. Detected version: '$os_version'" ;; 515 | esac 516 | fi 517 | ;; 518 | sles) 519 | os_type=sles 520 | os_version=${VERSION_ID%%.*} 521 | case $os_version in 522 | 12|15) ;; 523 | *) error "Detected SLES but version ($os_version) is not supported." "$otherplatforms" ;; 524 | esac 525 | ;; 526 | esac 527 | fi 528 | if ! [[ $os_type ]] || ! [[ $os_version ]] 529 | then 530 | error "Could not identify OS type or version." "$supported" 531 | fi 532 | } 533 | 534 | check_installed() { 535 | local not_installed 536 | local number_not_installed 537 | local install_message 538 | local need_to_install 539 | not_installed="" 540 | need_to_install=false 541 | for package in "$@" ; do 542 | case ${os_type} in 543 | debian|ubuntu) 544 | if { dpkg -l "${package}" | grep ii; } &>/dev/null ; then 545 | need_to_install=false 546 | else 547 | need_to_install=true 548 | fi 549 | ;; 550 | rhel) 551 | if { yum list installed "${package}" ; } &>/dev/null ; then 552 | need_to_install=false 553 | else 554 | need_to_install=true 555 | fi 556 | ;; 557 | sles) 558 | if { rpm -q "${package}" ; } &>/dev/null ; then 559 | need_to_install=false 560 | else 561 | need_to_install=true 562 | fi 563 | ;; 564 | esac 565 | if ${need_to_install} ; then 566 | if [ "${not_installed}" = "" ] ; then 567 | # number of not installed packages is 1 568 | not_installed="${package}" 569 | number_not_installed=1 570 | else 571 | # number of not installed packages is >1 572 | not_installed="${not_installed} ${package}" 573 | number_not_installed=2 574 | fi 575 | fi 576 | done 577 | if [ "${not_installed}" != "" ] ; then 578 | # One or more packages are not installed 579 | case ${number_not_installed} in 580 | 1) install_message="The following package is needed by the script, but not installed:" ;; 581 | 2) install_message="The following packages are needed by the script, but not installed:" ;; 582 | esac 583 | 584 | error "${install_message} 585 | ${not_installed} 586 | Please install and rerun the script. 587 | To disable this check add the \`--skip-check-installed\` flag" 588 | fi 589 | } 590 | 591 | remove_mdbe_repo(){ 592 | case $os_type in 593 | debian|ubuntu) 594 | # First, remove the MariaDB Enterprise Repository config package, if it's installed 595 | if dpkg -l mariadb-enterprise-repository &>/dev/null 596 | then 597 | msg info 'Removing mariadb-enterprise-repository package...' 598 | dpkg -P mariadb-enterprise-repository 599 | fi 600 | ;; 601 | rhel|sles) 602 | # First, remove the MariaDB Enterprise Repository config package, if it's installed 603 | if rpm -qs mariadb-enterprise-repository &>/dev/null 604 | then 605 | msg info 'Removing mariadb-enterprise-repository package...' 606 | rpm -e mariadb-enterprise-repository 607 | fi 608 | ;; 609 | esac 610 | } 611 | 612 | clean_package_cache(){ 613 | msg info 'Cleaning package cache...' 614 | case $1 in 615 | yum) 616 | yum clean all 617 | ;; 618 | dnf) 619 | dnf clean all 620 | ;; 621 | zypper) 622 | zypper clean --all 623 | ;; 624 | esac 625 | } 626 | 627 | # The directory structure of the MariaDB Server repo is such that the directories for each 628 | # version have "mariadb-" prepended to the version number (i.e. mariadb-10.1 instead of 10.1) 629 | # for 10.6 this has changed to just the version number 630 | if [[ $mariadb_server_version = mariadb-* ]] 631 | then 632 | mariadb_server_version_num=${mariadb_server_version#*-} 633 | else 634 | mariadb_server_version_num=$mariadb_server_version 635 | mariadb_server_version=mariadb-$mariadb_server_version 636 | fi 637 | 638 | mariadb_server_version_real=$mariadb_server_version_num 639 | 640 | # If we're writing the repository info to stdout, let's not try to import the signing keys. 641 | ((write_to_stdout)) && skip_key_import=1 642 | 643 | if [[ ! $arch ]] 644 | then 645 | arch=$(uname -m) 646 | case $arch in 647 | amd64|x86_64) 648 | arch='x86_64' 649 | ;; 650 | aarch64|arm64) 651 | arch='aarch64' 652 | ;; 653 | esac 654 | fi 655 | 656 | case $arch in 657 | x86_64) ;; 658 | aarch64) skip_tools=1;; 659 | *) error "The MariaDB Repository only supports x86_64 and aarch64 (detected $arch)." "$supported" "$otherplatforms" ;; 660 | esac 661 | 662 | if [[ $os_type ]] && [[ $os_version ]] 663 | then 664 | # Both were given on the command line, so we'll just try using those. 665 | msg info "Skipping OS detection and using OS type '$os_type' and version '$os_version' as given on the command line" 666 | # We're skipping OS detection, so set extra_options to the correct value 667 | # for RHEL 668 | case $os_version in 669 | 7*|8*|9*) 670 | if [ $os_type = 'rhel' ] ; then 671 | case $os_version in 672 | 7*) os_version=7 ;; 673 | 8*) os_version=8 ; extra_options="module_hotfixes = 1" ;; 674 | 9*) os_version=9 ; extra_options="module_hotfixes = 1" ;; 675 | esac 676 | elif [ $os_type = 'debian' ] ; then 677 | case $os_version in 678 | 7) os_version='wheezy' ; ((skip_os_eol_check)) || msg warning "Debian 7 'wheezy' has reached End of Life and is no longer supported." "$supported" ;; 679 | 8) os_version='jessie' ; ((skip_os_eol_check)) || msg warning "Debian 8 'jessie' has reached End of Life and is no longer supported." "$supported" ;; 680 | 9) os_version='stretch' ; ((skip_os_eol_check)) || msg warning "Debian 9 'stretch' has reached End of Life and is no longer supported" "$supported" ;; 681 | esac 682 | else 683 | error "--os-version='$os_version' is only valid if --os-type='rhel', you gave '$os_type'" "$supported" 684 | fi 685 | ;; 686 | 10|11) 687 | if [ $os_type = 'debian' ] ; then 688 | case $os_version in 689 | 10) os_version='buster' ;; 690 | 11) os_version='bullseye' ;; 691 | esac 692 | else 693 | error "--os-version='$os_version' is only valid if --os-type='debian', you gave '$os_type'" "$supported" 694 | fi 695 | ;; 696 | 12*) 697 | if [ $os_type = 'sles' ] ; then 698 | case $os_version in 699 | 12*) os_version=12 ;; 700 | esac 701 | elif [ $os_type = 'debian' ] ; then 702 | case $os_version in 703 | 12*) os_version='bookworm' ;; 704 | esac 705 | else 706 | error "--os-version='$os_version' is only valid if --os-type='sles' or 'debian', you gave '$os_type'" "$supported" 707 | fi 708 | ;; 709 | 15*) 710 | if [ $os_type = 'sles' ] ; then 711 | case $os_version in 712 | 15*) os_version=15 ;; 713 | esac 714 | else 715 | error "--os-version='$os_version' is only valid if --os-type='sles', you gave '$os_type'" "$supported" 716 | fi 717 | ;; 718 | xenial|bionic|focal|jammy|noble) 719 | if [ $os_type != 'ubuntu' ] ; then 720 | error "--os-version='$os_version' is only valid if --os-type='ubuntu', you gave '$os_type'" "$supported" 721 | fi 722 | ;; 723 | stretch|buster|bullseye|bookworm) 724 | if [ $os_type != 'debian' ] ; then 725 | error "--os-version='$os_version' is only valid if --os-type='debian', you gave '$os_type'" "$supported" 726 | fi 727 | ;; 728 | *) error "--os-type='$os_type' with --os-version='$os_version' is an invalid combination" "$supported" ;; 729 | esac 730 | elif [[ $os_type ]] || [[ $os_version ]] 731 | then 732 | error 'If you give either --os-type or --os-version, you must give both.' 733 | else 734 | identify_os 735 | fi 736 | 737 | # Handle various aarch64 repositories 738 | if [[ "$arch" = 'aarch64' ]] ; then 739 | case $os_version in 740 | 7) 741 | ((skip_maxscale)) || msg info "Skipping MariaDB MaxScale as RHEL 7 does not have aarch64 packages available." 742 | ((skip_maxscale)) || skip_maxscale=1 743 | ;; 744 | 12) 745 | if [ $os_type = 'sles' ] ; then 746 | error "There are no aarch64 packages available for MariaDB Server or MariaDB MaxScale for SLES 12." 747 | fi 748 | ;; 749 | 15) 750 | ((skip_server)) || msg warning "Skipping MariaDB Server as there are no aarch64 packages available." 751 | ((skip_server)) || skip_server=1 752 | ;; 753 | esac 754 | fi 755 | 756 | if (($skip_check_installed)) 757 | then 758 | msg info "Skipping check for script prerequisites." 759 | else 760 | msg info "Checking for script prerequisites." 761 | case $os_version in 762 | stretch) check_installed curl ca-certificates apt-transport-https ;; 763 | *) check_installed curl ca-certificates ;; 764 | esac 765 | fi 766 | 767 | # To support old versions for testing purposes which are not on dlm.mariadb.com 768 | case ${mariadb_server_version} in 769 | *10.1[0-9]*) ;; # everything >= 10.10 is on the new dlm for sure 770 | *10.0*) ;& # 10.0 releases are on the old download server only 771 | *10.1*) ;& # same for 10.1 772 | *10.2*) ;& # same for 10.2 773 | *10.3.[0-2]*|*10.3.[0-9]) ;& # 10.3: old server has <= .32, dlm has >= .29, we switch at .30 774 | *10.4.[0-1]*|*10.4.[0-9]) ;& # 10.4: dlm has >= 10.4.20 775 | *10.5.[0-9]) # 10.5: dlm has >= 10.5.10 776 | url_base="downloads.mariadb.com" 777 | url_mariadb_repo="https://${url_base}/MariaDB" 778 | mariadb_server_version_real=$mariadb_server_version 779 | ;; 780 | esac 781 | 782 | rhel_repo_server=" 783 | [mariadb-main] 784 | name = MariaDB Server 785 | baseurl = ${url_mariadb_repo}/%s/yum/rhel/%s/%s 786 | gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Server-GPG-KEY 787 | gpgcheck = 1 788 | enabled = 1 789 | %s" 790 | rhel_repo_maxscale=' 791 | [mariadb-maxscale] 792 | # To use the latest stable release of MaxScale, use "latest" as the version 793 | # To use the latest beta (or stable if no current beta) release of MaxScale, use "beta" as the version 794 | name = MariaDB MaxScale 795 | baseurl = https://dlm.mariadb.com/repo/maxscale/%s/yum/rhel/%s/%s 796 | gpgkey = file:///etc/pki/rpm-gpg/MariaDB-MaxScale-GPG-KEY 797 | gpgcheck = 1 798 | enabled = 1' 799 | rhel_repo_tools=' 800 | [mariadb-tools] 801 | name = MariaDB Tools 802 | baseurl = https://downloads.mariadb.com/Tools/rhel/%s/x86_64 803 | gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Enterprise-GPG-KEY 804 | gpgcheck = 1 805 | enabled = 1' 806 | 807 | deb_repo_server=" 808 | # MariaDB Server 809 | # To use a different major version of the server, or to pin to a specific minor version, change URI below. 810 | deb [arch=amd64,arm64] ${url_mariadb_repo}/%s/repo/%s %s main" 811 | deb_repo_server_debug="deb [arch=amd64,arm64${extra_options}] ${url_mariadb_repo}/%s/repo/%s %s main/debug" 812 | deb_repo_maxscale=' 813 | # MariaDB MaxScale 814 | # To use the latest stable release of MaxScale, use "latest" as the version 815 | # To use the latest beta (or stable if no current beta) release of MaxScale, use "beta" as the version 816 | deb [arch=amd64,arm64] https://dlm.mariadb.com/repo/maxscale/%s/%s %s main' 817 | deb_repo_tools=' 818 | # MariaDB Tools 819 | deb [arch=amd64] http://downloads.mariadb.com/Tools/%s %s main' 820 | 821 | sles_repo_server=" 822 | [mariadb-server] 823 | name = MariaDB Server 824 | baseurl = ${url_mariadb_repo}/%s/yum/sles/%s/x86_64 825 | gpgkey = file:///etc/pki/trust/MariaDB-Server-GPG-KEY 826 | gpgcheck = 1 827 | type=rpm-md 828 | enabled = 1 829 | autorefresh=1 830 | priority=10" 831 | sles_repo_maxscale=' 832 | [mariadb-maxscale] 833 | # To use the latest stable release of MaxScale, use "latest" as the version 834 | # To use the latest beta (or stable if no current beta) release of MaxScale, use "beta" as the version 835 | name = MariaDB MaxScale 836 | baseurl = https://dlm.mariadb.com/repo/maxscale/%s/yum/sles/%s/%s 837 | gpgkey = file:///etc/pki/trust/MariaDB-MaxScale-GPG-KEY 838 | enabled = 1 839 | autorefresh=1 840 | gpgcheck = 1 841 | type=rpm-md 842 | priority=10' 843 | sles_repo_tools=' 844 | [mariadb-tools] 845 | name = MariaDB Tools 846 | baseurl = https://downloads.mariadb.com/Tools/sles/%s/x86_64 847 | gpgkey = file:///etc/pki/trust/MariaDB-Enterprise-GPG-KEY 848 | enabled = 1 849 | autorefresh=1 850 | gpgcheck = 1 851 | type=rpm-md 852 | priority=10' 853 | 854 | open_outfile "$os_type" 855 | 856 | # If we're not writing to stdout, try to remove the mariadb-enterprise-repository package 857 | ((write_to_stdout)) || remove_mdbe_repo 858 | 859 | 860 | # Before we get into creating the configuration file, check the combination of 861 | # MariaDB version and OS 862 | ((skip_server)) || verify_server_os_combo 863 | 864 | case $os_type in 865 | ubuntu|debian) 866 | # should be a valid version, so verify it is so 867 | ((skip_server)) || ((skip_verify)) || verify_mariadb_server_version $mariadb_server_version_real 868 | # If we are not writing to stdout, create an apt preferences file to give our 869 | # packages the highest possible priority 870 | if ((write_to_stdout)) 871 | then 872 | msg info 'If run without --write-to-stdout, this script will create /etc/apt/preferences.d/mariadb-enterprise.pref to give packages from MariaDB repositories highest priority, in order to avoid conflicts with packages from OS and other repositories.' 873 | else 874 | printf '%s\n' \ 875 | 'Package: *' \ 876 | "Pin: origin ${url_base}" \ 877 | 'Pin-Priority: 1000' \ 878 | > /etc/apt/preferences.d/mariadb-enterprise.pref 879 | fi 880 | { 881 | ((skip_server)) || printf "$deb_repo_server\n\n" "$mariadb_server_version_real" "$os_type" "$os_version" 882 | case $os_type in 883 | ubuntu) 884 | ((skip_server)) || printf "$deb_repo_server_debug\n\n" "$mariadb_server_version_real" "$os_type" "$os_version" 885 | ;; 886 | esac 887 | ((skip_maxscale)) || printf "$deb_repo_maxscale\n\n" "$mariadb_maxscale_version" "apt" "$os_version" 888 | ((skip_tools)) || printf "$deb_repo_tools\n" "$os_type" "$os_version" 889 | } >&4 890 | ((write_to_stdout)) || msg info "Repository file successfully written to $outfile" 891 | if ! ((skip_key_import)) 892 | then 893 | msg info 'Adding trusted package signing keys...' 894 | if curl -LsSO https://supplychain.mariadb.com/mariadb-keyring-2019.gpg 895 | then 896 | if curl -LsS https://supplychain.mariadb.com/mariadb-keyring-2019.gpg.sha256 | sha256sum -c --quiet 897 | then 898 | msg info 'Running apt-get update...' 899 | if mv mariadb-keyring-2019.gpg /etc/apt/trusted.gpg.d/ && 900 | chmod 644 /etc/apt/trusted.gpg.d/mariadb-keyring-2019.gpg && 901 | apt-get -qq update 902 | then 903 | msg info 'Done adding trusted package signing keys' 904 | else 905 | msg error 'Failed to add trusted package signing keys' 906 | fi 907 | else 908 | msg error 'Failed to verify trusted package signing keys keyring file' 909 | fi 910 | else 911 | msg error 'Failed to download trusted package signing keys keyring file' 912 | fi 913 | elif ((write_to_stdout)) 914 | then 915 | msg info 'If run without --skip-key-import/--write-to-stdout, this script will import package signing keys used by MariaDB' 916 | fi 917 | ;; 918 | rhel) 919 | ((skip_server)) || ((skip_verify)) || verify_mariadb_server_version $mariadb_server_version_real 920 | { 921 | ((skip_server)) || printf "$rhel_repo_server\n\n" "$mariadb_server_version_real" "$os_version" "$arch" "$extra_options" 922 | ((skip_maxscale)) || printf "$rhel_repo_maxscale\n\n" "$mariadb_maxscale_version" "$os_version" "$arch" 923 | ((skip_tools)) || printf "$rhel_repo_tools\n" "$os_version" 924 | } >&4 925 | ((write_to_stdout)) || msg info "Repository file successfully written to $outfile" 926 | if ! ((skip_key_import)) 927 | then 928 | msg info 'Adding trusted package signing keys...' 929 | if rpm --import "${key_urls[@]}" 930 | then 931 | pushd /etc/pki/rpm-gpg/ 932 | for key in ${key_urls[@]} ; do curl -LsSO ${key};done 933 | popd 934 | msg info 'Successfully added trusted package signing keys' 935 | else 936 | msg error 'Failed to add trusted package signing keys' 937 | fi 938 | fi 939 | ((write_to_stdout)) || clean_package_cache yum 940 | ;; 941 | sles) 942 | ((skip_server)) || ((skip_verify)) || verify_mariadb_server_version $mariadb_server_version_real 943 | { 944 | ((skip_server)) || printf "$sles_repo_server\n\n" "$mariadb_server_version_real" "$os_version" 945 | ((skip_maxscale)) || printf "$sles_repo_maxscale\n\n" "$mariadb_maxscale_version" "$os_version" "$arch" 946 | ((skip_tools)) || printf "$sles_repo_tools\n" "$os_version" 947 | } >&4 948 | ((write_to_stdout)) || msg info "Repository file successfully written to $outfile" 949 | if ! ((skip_key_import)) 950 | then 951 | if [[ $os_version = 11 ]] 952 | then 953 | # RPM in SLES 11 doesn't support HTTPS, so munge the URLs to use standard HTTP 954 | rpm --import "${key_urls[@]/#https/http}" 955 | else 956 | msg info 'Adding trusted package signing keys...' 957 | if rpm --import "${key_urls[@]}" 958 | then 959 | pushd /etc/pki/trust/ 960 | for key in ${key_urls[@]} ; do curl -LsSO ${key};done 961 | popd 962 | msg info 'Successfully added trusted package signing keys' 963 | else 964 | msg error 'Failed to add trusted package signing keys' 965 | fi 966 | fi 967 | fi 968 | ((write_to_stdout)) || clean_package_cache zypper 969 | ;; 970 | *) 971 | error "Sorry, your OS is not supported." "$supported" 972 | ;; 973 | esac 974 | -------------------------------------------------------------------------------- /mariadb_restart.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | source /root/rish/windows.sh 3 | GREEN='\033[0;32m' 4 | RED='\033[0;31m' 5 | WHITE='\033[0m' 6 | clear 7 | function mariadb_restart() { 8 | options=("Перезапуск MariaDB" 9 | "Статус MariaDB" 10 | "Выйти") 11 | vertical_menu "center" "center" 0 30 "${options[@]}" 12 | choice=$? 13 | clear 14 | case "$choice" in 15 | 0) 16 | echo "Перезапуск MariaDB..." 17 | systemctl restart mariadb 18 | sleep 2 19 | if systemctl is-active --quiet mariadb; then 20 | echo -e "MariaDB перезапущена ${GREEN}успешно${WHITE}." 21 | else 22 | echo -e "Перезапуск ${RED}неудачен${WHITE}... Проверьте статус MariaDB." 23 | systemctl status mariadb 24 | fi 25 | ;; 26 | 1) 27 | systemctl --no-pager status mariadb 28 | ;; 29 | *) 30 | echo "Никаких действий не было произведено." 31 | ;; 32 | esac 33 | vertical_menu "current" 2 0 5 "Нажмите Enter" 34 | } 35 | # Если идет прямой вызов - выполняем функцию. Если идет подключение через source - то ничего не делаем 36 | if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then 37 | mariadb_restart 38 | fi -------------------------------------------------------------------------------- /mc.menu: -------------------------------------------------------------------------------- 1 | shell_patterns=0 2 | 3 | + d /var/www/ & t d 4 | 1 Архив сайта 5 | GREEN='\033[0;32m' 6 | LGREEN='\033[1;32m' 7 | RED='\033[0;31m' 8 | WHITE='\033[0m' 9 | MYSQLPASS=2 10 | source /root/rish/windows.sh 11 | clear 12 | echo -e "Создаем архив сайта ${GREEN}%f${WHITE}" 13 | if [[ -n "$(mariadb -uroot -p${MYSQLPASS} -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='%f'" 2>&1)" ]] 14 | then 15 | echo "Идет создание архива базы данных" 16 | mariadb-dump -u root -p$MYSQLPASS %f > %f.sql 17 | sed -i '1{/999999.*sandbox/d}' %f.sql 18 | echo -e "Архив базы ${GREEN}%f.sql${WHITE} создан" 19 | else 20 | echo -e "Базы данных у сайта ${RED}нет${WHITE}" 21 | fi 22 | echo "Ждите пока идет создание архива сайта..." 23 | tar -czf %f".tar.gz" %f && \ 24 | echo -e "${GREEN}"%f".tar.gz${WHITE} создан." 25 | vertical_menu "current" 2 0 5 "Нажмите Enter" 26 | 27 | + d /var/www/ & t d 28 | 4 Архив базы данных сайта 29 | MYSQLPASS="2" 30 | GREEN='\033[0;32m' 31 | RED='\033[0;31m' 32 | WHITE='\033[0m' 33 | source /root/rish/windows.sh 34 | clear 35 | if [[ -n "$(mariadb -uroot -p${MYSQLPASS} -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='%f'" 2>&1)" ]] 36 | then 37 | echo "Идет создание архива базы данных" 38 | mariadb-dump -u root -p$MYSQLPASS %f > %f.sql 39 | sed -i '1{/999999.*sandbox/d}' %f.sql 40 | echo -e "Архив базы ${GREEN}%f.sql${WHITE} создан" 41 | else 42 | echo -e "Базы данных у сайта ${RED}нет${WHITE}" 43 | fi 44 | vertical_menu "current" 2 0 5 "Нажмите Enter" 45 | 46 | + d /var/www/ & t d 47 | 2 Создать сайт 48 | bash /root/rish/create_site.sh "%f" "%d" 49 | 50 | + d /var/www/ & t d 51 | 7 Сменить версию PHP для сайта 52 | bash /root/rish/change_php_version.sh "%f" "%d" 53 | 54 | =+ f \.zip$ 55 | 7 Рaзaрхивирoвaть zip-фaйл 56 | GREEN='\033[0;32m' 57 | RED='\033[0;31m' 58 | WHITE='\033[0m' 59 | echo -e "Архив ${GREEN}%f${WHITE} будет извлечён в текущую директорию: ${GREEN}$(pwd)${WHITE}" 60 | source /root/rish/windows.sh 61 | if vertical_menu "current" 2 0 5 "Да" "Нет" 62 | then 63 | unzip %f 64 | echo 65 | fi 66 | vertical_menu "current" 2 0 5 "Нажмите Enter" 67 | 68 | =+ f \.sql$ 69 | 3 Сoздaть бaзy пo имeни фaйлa .sql 70 | GREEN='\033[0;32m' 71 | RED='\033[0;31m' 72 | LRED='\033[1;31m' 73 | WHITE='\033[0m' 74 | if [[ ! -z "`mariadb -uroot -p${MYSQLPASS} -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='%b'" 2>&1`" ]] 75 | then 76 | echo -e "База с именем ${GREEN}%b${WHITE} ${RED}уже существует${WHITE}" 77 | exit 78 | fi 79 | r=%d 80 | r=${r#/var/www/} 81 | r=${r%/www*} 82 | if [[ ${r} == "html" ]] 83 | then 84 | if mariadb-admin -u root -p$MYSQLPASS create %b 85 | then 86 | echo -e "База mysql с именем ${GREEN}%b${WHITE} создана" 87 | else 88 | echo -e ${RED}"Произошла ошибка"${WHITE} 89 | fi 90 | else 91 | if mariadb -u root -p${MYSQLPASS} -e "CREATE DATABASE \`%b\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 92 | then 93 | echo -e "База mysql с именем ${GREEN}%b${WHITE} создана" 94 | mariadb -uroot -p${MYSQLPASS} -e "GRANT ALL PRIVILEGES ON \`%b\`.* TO '${r}'@'localhost';" 95 | mariadb -uroot -p${MYSQLPASS} -e "FLUSH PRIVILEGES;" 96 | echo -e "Права на базу выданы пользователю ${GREEN}${r}${WHITE}" 97 | else 98 | echo -e ${RED}"Произошла ошибка"${WHITE} 99 | fi 100 | fi 101 | 102 | + d /var/www/ & t d 103 | 3 Сoздaть бaзy MySQL пo имени папки 104 | GREEN='\033[0;32m' 105 | RED='\033[0;31m' 106 | LRED='\033[1;31m' 107 | WHITE='\033[0m' 108 | MYSQLPASS="2" 109 | source /root/rish/windows.sh 110 | clear 111 | if [[ ! -z "`mariadb -uroot -p${MYSQLPASS} -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='%f'" 2>&1`" ]] 112 | then 113 | echo -e "База с именем ${GREEN}%f${WHITE} ${RED}уже существует${WHITE}" 114 | vertical_menu "current" 2 0 5 "Нажмите Enter" 115 | exit 116 | fi 117 | r=%d 118 | r=${r#/var/www/} 119 | r=${r%/www*} 120 | echo -e "Будет создана база MySQL с именем ${GREEN}%f${WHITE}." 121 | echo -e "Права будут выданы пользователю ${GREEN}${r}${WHITE}" 122 | if vertical_menu "current" 2 0 5 "Да" "Нет" 123 | then 124 | if mariadb -u root -p${MYSQLPASS} -e "CREATE DATABASE \`%f\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 125 | then 126 | echo -e "База mysql с именем ${GREEN}%f${WHITE} создана" 127 | mariadb -uroot -p${MYSQLPASS} -e "GRANT ALL PRIVILEGES ON \`%f\`.* TO '${r}'@'localhost';" 128 | mariadb -uroot -p${MYSQLPASS} -e "FLUSH PRIVILEGES;" 129 | echo -e "Права на базу выданы пользователю ${GREEN}${r}${WHITE}" 130 | else 131 | echo -e ${RED}"Произошла ошибка"${WHITE} 132 | fi 133 | else 134 | echo -e "База не была создана." 135 | fi 136 | vertical_menu "current" 2 0 5 "Нажмите Enter" 137 | 138 | =+ f \.sql$ 139 | 5 Импopт бaзы дaнных из фaйлa .sql 140 | source /root/rish/windows.sh 141 | GREEN='\033[0;32m' 142 | RED='\033[0;31m' 143 | LRED='\033[1;31m' 144 | WHITE='\033[0m' 145 | r=%d 146 | r=${r#/var/www/} 147 | r=${r%/www*} 148 | MYSQLPASS="2" 149 | clear 150 | echo -e "Будет произведен импорт базы данных ${GREEN}%b${WHITE} из файла ${GREEN}%f${WHITE}" 151 | if vertical_menu "current" 2 0 5 "Да" "Нет" 152 | then 153 | if [[ -z "`mariadb -uroot -p${MYSQLPASS} -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='%b'" 2>&1`" ]] 154 | then 155 | echo -e "Базы данных с именем ${GREEN}%b${WHITE} не существует. Создать?" 156 | if vertical_menu "current" 2 0 5 "Да" "Нет" 157 | then 158 | if mariadb -u root -p${MYSQLPASS} -e "CREATE DATABASE \`%b\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 159 | then 160 | echo -e "База mysql с именем ${GREEN}%b${WHITE} создана" 161 | mariadb -uroot -p${MYSQLPASS} -e "GRANT ALL PRIVILEGES ON \`%b\`.* TO '${r}'@'localhost';" 162 | mariadb -uroot -p${MYSQLPASS} -e "FLUSH PRIVILEGES;" 163 | echo -e "Права на базу выданы пользователю ${GREEN}${r}${WHITE}" 164 | else 165 | echo -e ${RED}"Произошла ошибка"${WHITE} 166 | fi 167 | else 168 | echo -e "База не была создана. Импорт прерван." 169 | vertical_menu "current" 2 0 5 "Нажмите Enter" 170 | exit 171 | fi 172 | fi 173 | echo -e "Идет импорт базы данных из файла ${GREEN}"%d"/"%f${WHITE} 174 | # Проверка наличия опции --sandbox 175 | if mariadb --help | grep -q -- "--sandbox"; then 176 | SANDBOX_OPTION="--sandbox" 177 | else 178 | SANDBOX_OPTION="" 179 | fi 180 | if mariadb -u root -p$MYSQLPASS $SANDBOX_OPTION %b < %d"/"%f 181 | then 182 | echo -e "База данных ${GREEN}%b${WHITE} успешно импортирована" 183 | else 184 | echo "Произошла ошибка импорта" 185 | fi 186 | else 187 | echo -e "База не была создана. Импорт прерван." 188 | fi 189 | vertical_menu "current" 2 0 5 "Нажмите Enter" 190 | 191 | + d /var/www/ & t d 192 | 8 Удалить сайт 193 | GREEN='\033[0;32m' 194 | RED='\033[0;31m' 195 | LRED='\033[1;31m' 196 | WHITE='\033[0m' 197 | MYSQLPASS="2" 198 | clear 199 | source /root/rish/windows.sh 200 | if ! [ -d "%d/%f" ] 201 | then 202 | echo "Это не является папкой сайта. Удаление прервано." 203 | exit 204 | fi 205 | echo -e "Вы действительно хотите удалить сайт ${LRED}%f${WHITE}?" 206 | vertical_menu "current" 2 0 5 "Нет" "Да" 207 | choice=$? 208 | if [[ "$choice" == "255" ]] 209 | then 210 | exit 211 | fi 212 | if [[ "$choice" == "0" ]] 213 | then 214 | exit 215 | fi 216 | echo "Проверяем наличие сертификата у сайта" 217 | if command -v certbot >/dev/null 2>&1 218 | then 219 | if certbot certificates --cert-name %f | grep %f &>/dev/null 220 | then 221 | echo "У сайта есть SSL сертификат" 222 | echo "Производим отзыв сертификата" 223 | certbot revoke --cert-path /etc/letsencrypt/live/%f/cert.pem 224 | else 225 | echo "У сайта нет SSL сертификата" 226 | fi 227 | fi 228 | rm /etc/httpd/conf.d/%f* &>/dev/null 229 | if [[ $? -eq 0 ]] 230 | then 231 | echo -e "Файлы виртуальных хостов ${GREEN}/etc/httpd/conf.d/%f${WHITE} удалены." 232 | else 233 | echo -e "Файлы виртуального хоста ${RED}удалить не удалось${WHITE}." 234 | fi 235 | if apachectl configtest 236 | then 237 | systemctl reload httpd 238 | echo "Сервер перезагружен." 239 | else 240 | echo -e "Сервер не был перезагружен. ${RED}Ошибка${WHITE} в конфигурации апача." 241 | echo -e "Удаление сайта ${RED}прервано${WHITE}" 242 | exit 243 | fi 244 | rm -R %d/%f 245 | if [[ $? -eq 0 ]] 246 | then 247 | echo -e "Папка сайта ${GREEN}%f${WHITE} удалена" 248 | else 249 | echo -e "В процессе удаления папки сайта ${RED}%f${WHITE} возникли проблемы" 250 | fi 251 | r=%d 252 | r=${r#/var/www/} 253 | r=${r%/www*} 254 | rm /var/www/${r}/logs/%f* &>/dev/null 255 | if [[ $? -eq 0 ]] 256 | then 257 | echo -e "Логи сайта ${GREEN}удалены${WHITE}." 258 | else 259 | echo -e "Логи сайта ${RED}удалены не были${WHITE}." 260 | fi 261 | if [[ ! -z "`mariadb -uroot -p${MYSQLPASS} -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='%f'" 2>&1`" ]] 262 | then 263 | echo "У сайта есть база данных" 264 | if mariadb-admin -f -u root -p${MYSQLPASS} drop %f 265 | then 266 | echo -e "База данных ${GREEN}%f${WHITE} удалена" 267 | else 268 | echo -e "При удалении базы данных ${RED}%f${WHITE} произошли ${RED}ошибки${WHITE}" 269 | fi 270 | fi 271 | rm /etc/pki/tls/private/%f* &>/dev/null 272 | if [[ $? -eq 0 ]] 273 | then 274 | echo "Удалены локальные ssl сертификаты сайта" 275 | fi 276 | rm /etc/pki/tls/certs/%f* &>/dev/null 277 | if [[ $? -eq 0 ]] 278 | then 279 | echo "Удалены локальные ssl сертификаты сайта" 280 | fi 281 | echo "Убедитесь что для сайта не установлены задания cron (удалить можно командой crontab -e):" 282 | crontab -l 283 | echo "Нажмите Enter" 284 | vertical_menu "current" 2 0 5 "Да" 285 | 286 | + d /var/www/ & t d 287 | k Удалить базу данных 288 | GREEN='\033[0;32m' 289 | RED='\033[0;31m' 290 | LRED='\033[1;31m' 291 | WHITE='\033[0m' 292 | MYSQLPASS="2" 293 | clear 294 | source /root/rish/windows.sh 295 | if [[ ! -z "`mariadb -uroot -p${MYSQLPASS} -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='%f'" 2>&1`" ]] 296 | then 297 | echo -e "Вы хотите удалить базу данных ${LRED}%f${WHITE}?" 298 | if vertical_menu "current" 2 0 5 "Нет" "Да" 299 | then 300 | echo "База данных не была удалена" 301 | vertical_menu "current" 2 0 5 "Нажмите Enter" 302 | exit 0 303 | fi 304 | if mariadb-admin -f -u root -p${MYSQLPASS} drop %f 305 | then 306 | echo -e "База данных ${GREEN}%f${WHITE} удалена" 307 | else 308 | echo -e "При удалении базы данных ${RED}%f${WHITE} произошли ${RED}ошибки${WHITE}" 309 | fi 310 | else 311 | echo -e "У сайта ${RED}%f${WHITE} нет базы данных" 312 | fi 313 | vertical_menu "current" 2 0 5 "Нажмите Enter" 314 | 315 | + d /var/www/ & t d 316 | 6 Пoлyчить/Oтoзвaть/Пpoдлить SSL cert. 317 | bash /root/rish/certs.sh %f 318 | 319 | r Перезaпуск и стaтус серверa apache 320 | bash /root/rish/apache_restart.sh 321 | 322 | f Статус и перезапуск php-fpm 323 | bash /root/rish/php_restart.sh 324 | 325 | M Статус и перезапуск MariaDB 326 | bash /root/rish/mariadb_restart.sh 327 | 328 | i IP адрес сервера 329 | clear 330 | ipaddress=$( ip route get 1 | grep -Eo 'src [0-9\.]{1,20}' | awk '{print $NF;exit}' ) 331 | echo $ipaddress 332 | echo "Нажмите Enter" 333 | sed -i "s/^i IP адрес сервера.*$/i IP адрес сервера ${ipaddress}/" /etc/mc/mc.menu 334 | read 335 | 336 | + d /var/www/ & t d 337 | j Скачать Joomla в папку 338 | clear 339 | GREEN='\033[0;32m' 340 | RED='\033[0;31m' 341 | WHITE='\033[0m' 342 | LRED='\033[1;31m' 343 | MYSQLPASS="2" 344 | source /root/rish/windows.sh 345 | directory=%d 346 | echo "Доступные версии Joomla для скачивания:" 347 | downloads=( $( curl -s https://api.github.com/repos/joomla/joomla-cms/releases | grep browser_download.*Stable-Full.*tar.gz | grep -Eo 'https?://[^ ]+Stable-Full_Package.tar.gz' )) 348 | for i in "${downloads[@]}"; do 349 | echo ${i} 350 | done 351 | echo 352 | echo "Выберите версию Joomla для скачивания:" 353 | joomlas=( $( curl -s https://api.github.com/repos/joomla/joomla-cms/releases | grep browser_download.*Stable-Full.*tar.gz | grep -Eo 'https?://[^ ]+Stable-Full_Package.tar.gz' | awk -F"/" '{print $NF}' )) 354 | vertical_menu "current" 2 0 30 "${joomlas[@]}" 355 | choice=$? 356 | if (( choice == 255 )) 357 | then 358 | echo "Выход. Каталог не тронут. Никаких действий произведено не было." 359 | exit 360 | fi 361 | joomla_version=$( echo ${joomlas[${choice}]} | sed 's@^[^0-9]*\([0-9]\+\).*@\1@' ) 362 | cd ${directory} 363 | if [[ ${joomla_version} == "3" ]] 364 | then 365 | echo -e "Установка Joomla version ${GREEN}3${WHITE}" 366 | else 367 | echo -e "Установка Joomla version ${GREEN}${joomla_version}${WHITE}" 368 | fi 369 | if [ -n "$(ls -A ${directory}/%f)" ]; then 370 | echo -e "Удалить содержимое папки ${GREEN}%f${WHITE}?" 371 | vertical_menu "current" 2 0 5 "Да" "Нет" 372 | cr=$? 373 | if (( ${cr}==0 )) 374 | then 375 | rm -rf %f 376 | mkdir %f 377 | fi 378 | fi 379 | wget "${downloads[${choice}]}" 380 | tar xvzf *Stable-Full_Package.tar.gz -C ${directory}/%f > /dev/null 381 | rm ${directory}/*Stable-Full_Package.tar.gz 382 | r=%d 383 | r=${r#/var/www/} 384 | r=${r%/www*} 385 | if [[ ${r} == "html" ]] 386 | then 387 | r="apache" 388 | fi 389 | chown -R ${r}:${r} %d"/"%f 390 | mv ${directory}/%f/htaccess.txt ${directory}/%f/.htaccess 391 | if [[ ${r} == "apache" ]] 392 | then 393 | echo "Неверно выбран каталог для сайта" 394 | exit 395 | else 396 | if [[ ${joomla_version} == "3" ]] 397 | then 398 | echo -e "Установка Joomla version ${GREEN}3${WHITE}" 399 | if cat /home/${r}/.pass.txt | grep -q "defaultsiteaccount" 400 | then 401 | echo "Будет использована учетная запись" 402 | email=$( cat /home/${r}/.pass.txt | grep "siteaccount" | awk '{ print $2}' ) 403 | pass=$( cat /home/${r}/.pass.txt | grep "siteaccount" | awk '{ print $3}' ) 404 | echo -e "Логин/почта: "${GREEN}${email} ${WHITE}"Пароль: "${LRED}${pass}${WHITE} 405 | sed -i "s/name=\"admin_email\".*/name=\"admin_email\" default=\"${email}\"/" ${directory}/%f/installation/model/forms/site.xml 406 | sed -i "s/name=\"admin_user\".*/name=\"admin_user\" default=\"${email}\"/" ${directory}/%f/installation/model/forms/site.xml 407 | sed -i "s/name=\"admin_password\".*/name=\"admin_password\" default=\"${pass}\"/" ${directory}/%f/installation/model/forms/site.xml 408 | sed -i "s/name=\"admin_password2\".*/name=\"admin_password2\" default=\"${pass}\"/" ${directory}/%f/installation/model/forms/site.xml 409 | fi 410 | dbpass=$( cat /home/${r}/.pass.txt | grep "Database" | awk '{ print $2}' ) 411 | sed -i "s/name=\"site_name\".*/name=\"site_name\" default=\"%f\"/" ${directory}/%f/installation/model/forms/site.xml 412 | sed -i "s/name=\"db_user\".*/name=\"db_user\" default=\"${r}\"/" ${directory}/%f/installation/model/forms/database.xml 413 | sed -i "s/name=\"db_pass\".*/name=\"db_pass\" default=\"${dbpass}\"/" ${directory}/%f/installation/model/forms/database.xml 414 | sed -i "s/name=\"db_name\".*/name=\"db_name\" default=\"%f\"/" ${directory}/%f/installation/model/forms/database.xml 415 | else 416 | echo -e "Установка Joomla version ${GREEN}${joomla_version}${WHITE}" 417 | if cat /home/${r}/.pass.txt | grep -q "defaultsiteaccount" 418 | then 419 | echo "Будет использована учетная запись" 420 | email=$( cat /home/${r}/.pass.txt | grep "siteaccount" | awk '{ print $2}' ) 421 | pass=$( cat /home/${r}/.pass.txt | grep "siteaccount" | awk '{ print $3}' ) 422 | echo -e "Логин/почта: "${GREEN}${email} ${WHITE}"Пароль: "${LRED}${pass}${WHITE} 423 | sed -i "s/name=\"admin_email\".*/name=\"admin_email\" default=\"${email}\"/" ${directory}/%f/installation/forms/setup.xml 424 | sed -i "s/name=\"admin_user\".*/name=\"admin_user\" default=\"${email}\"/" ${directory}/%f/installation/forms/setup.xml 425 | sed -i "s/name=\"admin_username\".*/name=\"admin_username\" default=\"${email}\"/" ${directory}/%f/installation/forms/setup.xml 426 | sed -i "s/name=\"admin_password\".*/name=\"admin_password\" default=\"${pass}\"/" ${directory}/%f/installation/forms/setup.xml 427 | fi 428 | dbpass=$( cat /home/${r}/.pass.txt | grep "Database" | awk '{ print $2}' ) 429 | sed -i "s/name=\"site_name\".*/name=\"site_name\" default=\"%f\"/" ${directory}/%f/installation/forms/setup.xml 430 | sed -i "s/name=\"db_user\".*/name=\"db_user\" default=\"${r}\"/" ${directory}/%f/installation/forms/setup.xml 431 | sed -i "s/name=\"db_pass\".*/name=\"db_pass\" default=\"${dbpass}\"/" ${directory}/%f/installation/forms/setup.xml 432 | sed -i "s/joomla_db/%f/" ${directory}/%f/installation/forms/setup.xml 433 | fi 434 | if [[ -z "$(mariadb -uroot -p${MYSQLPASS} -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='%f'" 2>&1)" ]] 435 | then 436 | echo -e "Базы данных с именем ${GREEN}%f${WHITE} не существует. Создать?" 437 | vertical_menu "current" 2 0 5 "Да" "Нет" 438 | cr=$? 439 | if (( ${cr}==0 )) 440 | then 441 | if mariadb -u root -p${MYSQLPASS} -e "CREATE DATABASE \`%f\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 442 | then 443 | echo -e "База mysql с именем ${GREEN}%f${WHITE} создана" 444 | mariadb -uroot -p${MYSQLPASS} -e "GRANT ALL PRIVILEGES ON \`%f\`.* TO '${r}'@'localhost';" 445 | mariadb -uroot -p${MYSQLPASS} -e "FLUSH PRIVILEGES;" 446 | echo -e "Права на базу выданы пользователю ${GREEN}${r}${WHITE}" 447 | else 448 | echo -e ${RED}"Произошла ошибка"${WHITE} 449 | fi 450 | else 451 | echo "База данных не была создана." 452 | fi 453 | else 454 | echo -e "База данных с именем ${GREEN}%f${WHITE} уже существует. Хотите очистить ее?" 455 | vertical_menu "current" 2 0 5 "Да" "Нет" 456 | cr=$? 457 | if (( ${cr}==0 )) 458 | then 459 | if mariadb-admin -f -u root -p${MYSQLPASS} drop %f 460 | then 461 | echo -e "База данных ${GREEN}%f${WHITE} удалена" 462 | else 463 | echo -e "При удалении базы данных ${RED}%f${WHITE} произошли ${RED}ошибки${WHITE}" 464 | fi 465 | if mariadb -u root -p${MYSQLPASS} -e "CREATE DATABASE \`%f\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 466 | then 467 | echo -e "База mysql с именем ${GREEN}%f${WHITE} создана" 468 | mariadb -uroot -p${MYSQLPASS} -e "GRANT ALL PRIVILEGES ON \`%f\`.* TO '${r}'@'localhost';" 469 | mariadb -uroot -p${MYSQLPASS} -e "FLUSH PRIVILEGES;" 470 | echo -e "Права на базу выданы пользователю ${GREEN}${r}${WHITE}" 471 | else 472 | echo -e ${RED}"Произошла ошибка"${WHITE} 473 | fi 474 | fi 475 | fi 476 | fi 477 | echo 478 | ip=$( echo "$SSH_CLIENT" | awk '{ print $1}' ) 479 | echo -e "Сейчас сайт ${GREEN}заблокирован${WHITE} для всех IP адресов кроме вашего: ${GREEN}"${ip}${WHITE} 480 | echo "Теперь перейдите в браузер и выполните необходимые шаги для установки сайта." 481 | echo "Все поля уже были предварительно заполнены для корректной установки." 482 | echo "После того как вы выполните установку сайта - вернитесь к окну терминала и нажмите Enter для снятия блокировки по IP." 483 | echo 484 | echo "Для снятия блокировки по IP " 485 | sed -i '1s/^/Allow from '${ip}'\n/' ${directory}/%f/.htaccess 486 | sed -i '1s/^/Deny from all\n/' ${directory}/%f/.htaccess 487 | sed -i '1s/^/Order deny,allow\n/' ${directory}/%f/.htaccess 488 | vertical_menu "current" 2 0 5 "Нажмите Enter" 489 | sed -i '/Order deny,allow*/d' ${directory}/%f/.htaccess 490 | sed -i '/Deny from all*/d' ${directory}/%f/.htaccess 491 | sed -i '/Allow from*/d' ${directory}/%f/.htaccess 492 | 493 | + d /var/www/ & t d 494 | p Настроить Joomla в папке 495 | source /root/rish/windows.sh 496 | GREEN='\033[0;32m' 497 | RED='\033[0;31m' 498 | LRED='\033[1;31m' 499 | WHITE='\033[0m' 500 | r=%d 501 | r=${r#/var/www/} 502 | r=${r%/www*} 503 | if [[ ${r} == "html" ]] 504 | then 505 | r="root" 506 | else 507 | MYSQLPASS=`cat /home/${r}/.pass.txt | grep Database | awk '{ print $2}'` 508 | fi 509 | if [[ -f "%d/%f/configuration.php" ]] 510 | then 511 | echo 512 | echo -e "Сайт распознан как созданный на основе ${GREEN}Joomla${WHITE}." 513 | echo -e "Вы хотите внести изменения в файл ${GREEN}configuration.php${WHITE}, чтобы сайт работал корректно?" 514 | if vertical_menu "current" 2 0 5 "Да" "Нет" 515 | then 516 | sed -i "s/\$password.*$/\$password = '${MYSQLPASS}';/" %d/%f/configuration.php 517 | echo "Новый пароль внесен в configuration.php" 518 | sed -i "s/\$user.*$/\$user = '${r}';/" %d/%f/configuration.php 519 | echo -e "Имя пользователя базы данных установлено ${GREEN}${r}${WHITE}" 520 | sed -i "s/\$db .*$/\$db = '%f';/" %d/%f/configuration.php 521 | echo -e "имя базы данных ${GREEN}%f${WHITE} установлено в configuration.php" 522 | sed -i "s&\$log_path .*$&\$log_path = '%d\/%f\/administrator\/logs';&" %d/%f/configuration.php 523 | echo -e "Путь к папке logs скорректирован ${GREEN}%d/%f/administrator/logs${WHITE}" 524 | sed -i "s&\$tmp_path .*$&\$tmp_path = '%d\/%f\/tmp';&" %d/%f/configuration.php 525 | echo -e "Путь к папке tmp скорректирован ${GREEN}%d/%f/tmp${WHITE}" 526 | sed -i "s&\$host .*$&\$host = 'localhost';&" %d/%f/configuration.php 527 | echo -e "Хост базы данных установлен в ${GREEN}localhost${WHITE}" 528 | echo 529 | else 530 | echo "Никаких изменений в файл ${GREEN}configuration.php${WHITE} не вносилось." 531 | fi 532 | else 533 | echo 534 | echo -e "Сайт не имеет файла configuration.php" 535 | echo 536 | fi 537 | vertical_menu "current" 2 0 5 "Нажмите Enter" 538 | 539 | + d /var/www/ & t d 540 | 9 Нacтpoить пpaвa дocтyпa кaтaлoгa 541 | GREEN='\033[0;32m' 542 | RED='\033[0;31m' 543 | LRED='\033[1;31m' 544 | WHITE='\033[0m' 545 | source /root/rish/windows.sh 546 | echo -e "Установить всем папкам права - ${GREEN}755${WHITE}, а файлам - ${GREEN}644${WHITE}?" 547 | if vertical_menu "current" 2 0 5 "Да" "Нет" 548 | then 549 | find %d"/"%f -type d -print0 | xargs -0 chmod 755 550 | if ! find %d"/"%f -type f -exec false {} + 551 | then 552 | find %d"/"%f -type f -print0 | xargs -0 chmod 644 553 | fi 554 | echo -e "Все папки получили права - ${GREEN}755${WHITE}, все файлы - ${GREEN}644${WHITE}" 555 | fi 556 | r=%d 557 | r=${r#/var/www/} 558 | r=${r%/www*} 559 | if [[ ${r} == "html" ]] 560 | then 561 | r="apache" 562 | fi 563 | echo -e "Установить владельцем всех папок и файлов в папке ${GREEN}%d/%f${WHITE}" 564 | echo -e "Пользователя ${GREEN}$r${WHITE}" 565 | if vertical_menu "current" 2 0 5 "Да" "Нет" 566 | then 567 | chown -R ${r}:${r} %d"/"%f 568 | echo -e "Владельцем всех файлов установлен ${GREEN}${r}${WHITE}" 569 | fi 570 | vertical_menu "current" 2 0 5 "Нажмите Enter" 571 | 572 | + d /var/www/ & t d 573 | s Установка/обновление phpmyadmin 574 | GREEN='\033[0;32m' 575 | RED='\033[0;31m' 576 | LRED='\033[1;31m' 577 | WHITE='\033[0m' 578 | source /root/rish/windows.sh 579 | silent() 580 | { 581 | if [[ "$DEBUG" -eq 1 ]] ; then 582 | "$@" 583 | else 584 | "$@" &>/dev/null 585 | fi 586 | } 587 | clear 588 | echo -e -n "${WHITE}В какую папку на сайте ставить phpmyadmin?:${GREEN}" 589 | read -e -p " " -i "pppma" NAME 590 | echo -e "${WHITE}" 591 | if [[ -z ${NAME} ]] 592 | then 593 | PMA_PATH="%d/%f" 594 | else 595 | PMA_PATH="%d/%f/${NAME}" 596 | fi 597 | PMA_VERSION="latest" 598 | PMA_LANGUAGE="all-languages" 599 | PMA_CURRENT_VERSION= 600 | PMA_TEMP_DIR="'./tmp/'" 601 | PMA_ISSET=0 602 | FORCE_INSTALL=0 603 | LATEST=0 604 | DEBUG=0 605 | PMA_LATEST_VERSION_INFO_URL="https://www.phpmyadmin.net/home_page/version.php" 606 | if [ "$PMA_VERSION" = "latest" ]; then 607 | LATEST=1 608 | PMA_VERSION=$(wget -q -O /tmp/pma_lastest.html $PMA_LATEST_VERSION_INFO_URL && sed -ne '1p' /tmp/pma_lastest.html); 609 | fi 610 | PMA_DOWNLOAD_URL="https://files.phpmyadmin.net/phpMyAdmin/${PMA_VERSION}/phpMyAdmin-${PMA_VERSION}-${PMA_LANGUAGE}.tar.gz" 611 | BLOWFISH_SECRET=$(tr -dc 'A-Za-z0-9' < /dev/urandom | dd bs=1 count=32 2>/dev/null) 612 | echo -n "Установленная версия: " 613 | if [ -d "$PMA_PATH" -a -f "${PMA_PATH}/README" ]; then 614 | PMA_ISSET=1 615 | PMA_CURRENT_VERSION=$(sed -n 's/^Version \(.*\)$/\1/p' ${PMA_PATH}/README) 616 | if ! [ -z "$PMA_CURRENT_VERSION" ]; then 617 | echo "$PMA_CURRENT_VERSION" 618 | else 619 | echo "unknown version" 620 | fi 621 | else 622 | echo "not installed" 623 | fi 624 | echo -n -e "Версия, доступная к установке: ${GREEN}" 625 | if [ $LATEST -eq 1 ]; then 626 | echo "${PMA_VERSION} (latest)" 627 | else 628 | echo "$PMA_VERSION" 629 | fi 630 | echo -e "${WHITE}" 631 | echo -e "Ставим phpmyadmin по адресу ${GREEN}%f/${NAME}${WHITE}?" 632 | if ! vertical_menu "current" 2 0 5 "Да" "Нет" 633 | then 634 | echo "Установка прервана" 635 | vertical_menu "current" 2 0 5 "Нажмите Enter" 636 | exit 1 637 | fi 638 | PMA_PARENT_PATH="$(echo "$PMA_PATH" | sed 's/\/[^/]*$//' | sed 's/\/$//')" 639 | PMA_DIRNAME="$(echo "$PMA_PATH" | sed 's/.*\///')" 640 | cd $PMA_PARENT_PATH 641 | if [ $PMA_ISSET -eq 1 ]; then 642 | echo "Создаем архив... " 643 | CUR_TIME=$(date +%%Y-%%m-%%d-%%H-%%M-%%S) 644 | silent tar -zcf "${CUR_TIME}".tar.gz "$PMA_DIRNAME" 645 | if [ -f "${CUR_TIME}.tar.gz" ]; then 646 | rm -rf "$PMA_PATH" 647 | echo -n "Создан файл" 648 | echo " (${CUR_TIME}.tar.gz)" 649 | else 650 | echo "Not created" 651 | echo 652 | exit 1 653 | fi 654 | fi 655 | # Download new version 656 | cd "$PMA_PARENT_PATH" 657 | echo -n "Загружаем новую версию... " 658 | silent wget -c "$PMA_DOWNLOAD_URL" 659 | if [ -f "${PMA_PARENT_PATH}/phpMyAdmin-${PMA_VERSION}-${PMA_LANGUAGE}.tar.gz" ]; then 660 | echo "Done" 661 | else 662 | echo "Unable to download!" 663 | echo 664 | exit 1 665 | fi 666 | # Install 667 | echo -n "Устанавливаем... " 668 | silent tar xzf phpMyAdmin-"$PMA_VERSION"-"$PMA_LANGUAGE".tar.gz 669 | silent mv phpMyAdmin-"$PMA_VERSION"-"$PMA_LANGUAGE" "$PMA_DIRNAME" 670 | silent rm phpMyAdmin-"$PMA_VERSION"-"$PMA_LANGUAGE".tar.gz* 671 | if [ -d "$PMA_PATH" ]; then 672 | echo "Done" 673 | else 674 | echo "Can't install!" 675 | echo 676 | exit 1 677 | fi 678 | rm -rf "$PMA_PATH"/setup 679 | echo -n "Настраиваем... " 680 | mkdir "$PMA_PATH"/tmp 681 | cp "$PMA_PATH"/config.sample.inc.php "$PMA_PATH"/config.inc.php 682 | sed -i "s|\$cfg\['blowfish_secret'\].*;|\$cfg['blowfish_secret'] = '${BLOWFISH_SECRET}';|" \ 683 | "$PMA_PATH"/config.inc.php 684 | r=%d 685 | r=${r#/var/www/} 686 | r=${r%/www*} 687 | chown -R ${r}:${r} "$PMA_PATH" 688 | echo "Done" 689 | echo "Установка завершена" 690 | vertical_menu "current" 2 0 5 "Нажмите Enter" 691 | 692 | R Управление Сервером 693 | r=$( pwd ) 694 | cd /root/rish 695 | ./ri.sh 696 | cd ${r} 697 | 698 | O Обновление RISH 699 | GREEN='\033[0;32m' 700 | RED='\033[0;31m' 701 | LRED='\033[1;31m' 702 | WHITE='\033[0m' 703 | source /root/rish/windows.sh 704 | cd /root 705 | clear 706 | rm -f rish2.tar.gz > /dev/null 707 | config_file="/root/rish/rish_config.sh" 708 | source $config_file 709 | version_gt() { 710 | test "$(printf '%%s\n' "$@" | sort -V | head -n 1)" != "$1" 711 | } 712 | Update(){ 713 | # Извлекаем файл версии из архива 714 | if tar -xzf "rish2.tar.gz" --strip-components=1 "rish/version" 715 | then 716 | # Если файл версии не существует в папке rish, то устанавливаем версию 0.0.0 717 | if [ ! -f "/root/rish/version" ]; then 718 | echo "Ваша версия RISH не известна." 719 | folder_version="0.0.0" 720 | else 721 | folder_version=$(cat "/root/rish/version") 722 | echo -e "Ваша версия RISH ${folder_version}" 723 | fi 724 | archive_version=$(cat "/root/version") 725 | rm -f "/root/version" > /dev/null 726 | def="" 727 | if version_gt "${archive_version}" "${folder_version}"; then 728 | echo -e "Доступна более новая версия RISH для обновления – ${GREEN}${archive_version}${WHITE}" 729 | echo "Рекомендуем обновиться до этой версии." 730 | echo 731 | else 732 | echo "Ваша версия RISH актуальна - обновление не требуется." 733 | echo "Но если нужно - вы можете переустановить RISH." 734 | echo 735 | def="default=1" 736 | fi 737 | echo -e "Установить версию ${GREEN}${archive_version}${WHITE}?" 738 | if vertical_menu "current" 2 0 5 "Да" "Нет" ${def} 739 | then 740 | #обновляем версию RISH 741 | if tar -tzf rish2.tar.gz > /dev/null 2>&1 742 | then 743 | tar --no-same-owner -xvf rish2.tar.gz 744 | rm rish2.tar.gz 745 | cd /root/rish 746 | rm /etc/mc/mc.menu 747 | cp mc.menu /etc/mc/mc.menu 748 | if ${LocalServer}; then 749 | cat mc.menu.local >> /etc/mc/mc.menu 750 | fi 751 | chmod u+x ri.sh 752 | chmod u+x clonesite.sh 753 | chmod u+x backup.sh 754 | echo 755 | bash postupdate.sh 756 | else 757 | echo "Скачанный архив поврежден" 758 | vertical_menu "current" 2 0 5 "Нажмите Enter" 759 | exit 1 760 | fi 761 | else 762 | echo "RISH не был обновлен" 763 | fi 764 | else 765 | echo "Внутри архива отсутствует файл версии. Что-то пошло не так." 766 | echo "Обновление невозможно." 767 | echo 768 | vertical_menu "current" 2 0 5 "Нажмите Enter" 769 | exit 1 770 | fi 771 | } 772 | echo "Проверяем обновление..." 773 | if wget --timeout=15 --tries=1 https://rish.su/rish2.tar.gz > /dev/null 2>&1 774 | then 775 | Update 776 | else 777 | if wget https://api.github.com/repos/Delo-Design/rish/releases/latest -O - | awk -F \" -v RS="," '/browser_download_url/ {print $(NF-1)}' | xargs wget > /dev/null 2>&1 778 | then 779 | Update 780 | else 781 | echo "Не удалось скачать архив" 782 | vertical_menu "current" 2 0 5 "Нажмите Enter" 783 | exit 1 784 | fi 785 | fi 786 | rm -f rish2.tar.gz > /dev/null 787 | vertical_menu "current" 2 0 5 "Нажмите Enter" 788 | 789 | Z Статистика сайтов сервера 790 | source /root/rish/checkip.sh 791 | source /root/rish/windows.sh 792 | CheckIP 793 | -------------------------------------------------------------------------------- /mc.menu.local: -------------------------------------------------------------------------------- 1 | h Домены Keenetic 2 | bash /root/rish/local_router.sh -------------------------------------------------------------------------------- /php_multi_install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | function php_multi_install() { 4 | local options 5 | while true; do 6 | mapfile -t available_versions < <(dnf repository-packages remi-safe list | grep php | grep -oP 'php[0-9]{2}' | sort -r | uniq) 7 | mapfile -t installed_versions < <(rpm -qa | grep php | grep -oP 'php[0-9]{2}' | sort -r | uniq) 8 | options=() 9 | for available in "${available_versions[@]}"; do 10 | local skip= 11 | for installed in "${installed_versions[@]}"; do 12 | if [[ $available == $installed ]]; then 13 | skip=1 14 | break 15 | fi 16 | done 17 | [[ ! $skip ]] && options+=("$available") 18 | done 19 | 20 | if [ ${#options[@]} -eq 0 ]; then 21 | echo "Все доступные версии PHP уже установлены." 22 | return 23 | fi 24 | 25 | echo 26 | echo -e "Вы сможете доустановить невыбранные версии ${GREEN}PHP${WHITE} позднее, после установки RISH." 27 | echo -e "Установка ${GREEN}PHP${WHITE} происходит по очереди, одна версия за другой." 28 | echo -e "Выбирайте только реально необходимые, не ставьте все подряд." 29 | echo 30 | echo -e "Выберите нужную версию ${GREEN}PHP${WHITE} из доступных." 31 | local current_y=$(get_cursor_row) 32 | echo 33 | local size=$(stty size) 34 | local lines=${size% *} 35 | ((skip_lines=0)) 36 | ((need_to_skeep=${#installed_versions[@]})) 37 | if (((current_y + need_to_skeep + 1) > lines)); then 38 | ((skip_lines=${current_y} + need_to_skeep - ${lines} + 2)) 39 | echo -en ${ESC}"[${skip_lines}S" 40 | ((current_y = ${current_y} - ${skip_lines})) 41 | fi 42 | if (( ${#installed_versions[@]} > 0 )); then 43 | cursor_to $(($current_y+2)) 23 44 | echo -en "───────────>" 45 | cursor_to $(($current_y)) 35 46 | echo -en "Установлено:" 47 | refresh_window ${current_y}+1 35 ${#installed_versions[@]} 10 0 "${installed_versions[@]}" 48 | fi 49 | 50 | 51 | # Добавляем опцию для завершения процесса 52 | options+=("Завершить выбор") 53 | cursor_to $(($current_y)) 0 54 | echo "Доступно:" 55 | vertical_menu "current" 1 0 10 "${options[@]}" 56 | local ret=$? 57 | cursor_to $(($current_y)) 0 58 | echo -en ${ESC}"[0J" 59 | if (( ret == 255 )) || (( ret == ${#options[@]}-1 )); then 60 | return 0 61 | fi 62 | local selected_version=${options[${ret}]} 63 | 64 | echo "Установка выбранной версии PHP ($selected_version) и дополнительных расширений..." 65 | sudo dnf install -y "$selected_version" \ 66 | "${selected_version}-php-fpm" \ 67 | "${selected_version}-php-opcache" \ 68 | "${selected_version}-php-cli" \ 69 | "${selected_version}-php-gd" \ 70 | "${selected_version}-php-mbstring" \ 71 | "${selected_version}-php-mysqlnd" \ 72 | "${selected_version}-php-xml" \ 73 | "${selected_version}-php-soap" \ 74 | "${selected_version}-php-zip" \ 75 | "${selected_version}-php-intl" \ 76 | "${selected_version}-php-json" \ 77 | "${selected_version}-php-gmp" 78 | 79 | Up 80 | echo -e "${GREEN}${selected_version}${WHITE} успешно установлен." 81 | Down 82 | PHPINI="/etc/opt/remi/${selected_version}/php.ini" 83 | sed -i "s/memory_limit = .*/memory_limit = 256M/" $PHPINI 84 | sed -i "s/upload_max_filesize = .*/upload_max_filesize = 32M/" $PHPINI 85 | sed -i "s/post_max_size = .*/post_max_size = 32M/" $PHPINI 86 | sed -i "s/max_execution_time = .*/max_execution_time = 60/" $PHPINI 87 | sed -i "/^;\?max_input_vars[[:space:]]*=/c\max_input_vars = 20000" $PHPINI 88 | sed -i "s/output_buffering .*/output_buffering = Off/" $PHPINI 89 | 90 | echo -e "Установлены лимиты для ${GREEN}${selected_version}${WHITE}:" 91 | echo -e "memory_limit = ${GREEN}256M${WHITE}" 92 | echo -e "upload_max_filesize = ${GREEN}32M${WHITE}" 93 | echo -e "post_max_size = ${GREEN}32M${WHITE}" 94 | echo -e "max_execution_time = ${GREEN}60${WHITE}" 95 | echo -e "max_input_vars = ${GREEN}20000${WHITE}" 96 | 97 | echo 98 | echo -e "Ставим ${GREEN}imagick${WHITE}?" 99 | if vertical_menu "current" 2 0 5 "Да" "Нет" 100 | then 101 | Install "${selected_version}-php-pecl-imagick" 102 | #yum install php-pecl-imagick 103 | fi 104 | if ${LocalServer}; then 105 | echo -e ${CURSORUP}"Ставим ${GREEN}Xdebug${WHITE}?${ERASEUNTILLENDOFLINE}" 106 | if vertical_menu "current" 2 0 5 "Да" "Нет"; then 107 | Install "${selected_version}-php-xdebug" 108 | if [[ -e "/etc/opt/remi/${selected_version}/php.d/15-xdebug.ini" ]]; then 109 | { 110 | echo "xdebug.idekey = \"PHPSTORM\"" 111 | echo "xdebug.mode = debug" 112 | echo "xdebug.client_port = 9003" 113 | echo "xdebug.discover_client_host=1" 114 | } >>"/etc/opt/remi/${selected_version}/php.d/15-xdebug.ini" 115 | else 116 | echo -e "Файл ${RED}/etc/opt/remi/${selected_version}/php.d/15-xdebug.ini${WHITE} не существует!" 117 | echo -e "Возможны ошибки при установке xdebug." 118 | echo -e "Продолжить установку?" 119 | if vertical_menu "current" 2 0 5 "Да" "Нет"; then 120 | echo "Продолжаем..." 121 | else 122 | RemoveRim 123 | echo "Установка завершена с ошибкой" 124 | exit 1 125 | fi 126 | fi 127 | fi 128 | fi 129 | 130 | systemctl enable ${selected_version}-php-fpm 131 | echo 132 | systemctl start ${selected_version}-php-fpm 133 | echo 134 | 135 | done 136 | } 137 | 138 | 139 | -------------------------------------------------------------------------------- /php_restart.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | source /root/rish/windows.sh 3 | GREEN='\033[0;32m' 4 | RED='\033[0;31m' 5 | WHITE='\033[0m' 6 | php_restart() { 7 | clear 8 | # Получаем список установленных версий PHP с помощью rpm и записываем в массив 9 | local versions 10 | mapfile -t versions < <(rpm -qa | grep php | grep -oP 'php[0-9]{2}' | sort -r | uniq) 11 | local version 12 | local menu_items=() 13 | local choice 14 | local length 15 | 16 | # Добавление пункта для перезапуска всех версий в начало списка 17 | menu_items=("Перезапустить все установленные php-fpm") 18 | 19 | # Добавляем префикс и суффикс к каждой версии для создания пунктов меню 20 | for version in "${versions[@]}"; do 21 | menu_items+=("Перезапустить $version-php-fpm") 22 | done 23 | 24 | # Добавляем проверку статуса 25 | for version in "${versions[@]}"; do 26 | menu_items+=("Проверить статус $version-php-fpm") 27 | done 28 | 29 | # Вывод всех пунктов меню для проверки 30 | vertical_menu "center" "center" 0 10 "${menu_items[@]}" 31 | choice=$? 32 | if ((choice == 255)); then 33 | return 34 | fi 35 | clear 36 | if ((choice == 0)); then 37 | # Перезапуск всех версий 38 | for version in "${versions[@]}"; do 39 | if /opt/remi/${version}/root/usr/sbin/php-fpm -t; then 40 | if systemctl restart "${version}-php-fpm"; then 41 | echo -e "Версия ${GREEN}${version}${WHITE} корректно перезапущена." 42 | echo 43 | else 44 | echo 45 | echo -e "Ошибка при перезапуске ${RED}${version}-php-fpm${WHITE}. Проверьте журналы для диагностики." 46 | echo 47 | fi 48 | 49 | else 50 | echo 51 | echo -e "Версия ${RED}${version}${WHITE} имеет проблемы в конфигурационных файлах." 52 | echo -e "Сервис ${RED}не был перезапущен${WHITE} и продолжает работать." 53 | echo 54 | systemctl status "${version}-php-fpm" 55 | fi 56 | done 57 | vertical_menu "current" 2 0 5 "Нажмите Enter" 58 | return 59 | fi 60 | length=${#versions[@]} 61 | if ((choice < length + 1)); then 62 | # Пункты меню для перезапуска 63 | version=${versions[${choice} - 1]} 64 | if /opt/remi/${version}/root/usr/sbin/php-fpm -t; then 65 | if systemctl restart "${version}-php-fpm"; then 66 | echo -e "Версия ${GREEN}${version}${WHITE} корректно перезапущена." 67 | echo 68 | else 69 | echo 70 | echo -e "Ошибка при перезапуске ${RED}${version}-php-fpm${WHITE}. Проверьте журналы для диагностики." 71 | echo 72 | fi 73 | 74 | else 75 | echo 76 | echo -e "Версия ${RED}${version}${WHITE} имеет проблемы в конфигурационных файлах." 77 | echo -e "Сервис ${RED}не был перезапущен${WHITE} и продолжает работать." 78 | echo 79 | systemctl status "${version}-php-fpm" 80 | fi 81 | else 82 | version=${versions[${choice} - $length - 1]} 83 | systemctl status "${version}-php-fpm" 84 | 85 | fi 86 | vertical_menu "current" 2 0 5 "Нажмите Enter" 87 | } 88 | 89 | # Если идет прямой вызов - выполняем функцию. Если идет подключение через source - то ничего не делаем 90 | if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then 91 | php_restart 92 | fi -------------------------------------------------------------------------------- /postupdate.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | GREEN='\033[0;32m' 4 | RED='\033[0;31m' 5 | WHITE='\033[0m' 6 | version_gt() { 7 | test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1" 8 | } 9 | #Вспомогательное внутри сценария 10 | LOG_FILE="/root/rish/logfile_rish_install.log" 11 | # Путь к конфигурационному файлу 12 | config_file="/root/rish/rish_config.sh" 13 | # Проверка на существование файла лога 14 | if [ ! -f "$LOG_FILE" ]; then 15 | echo "Отсутствует лог файл установки RISH. Установка была выполнена неверно." 16 | echo "Обновление невозможно." 17 | exit 1 18 | fi 19 | # Функция для проверки, был ли шаг выполнен 20 | check_step() { 21 | local step=$1 22 | grep -Fxq "$step" "$LOG_FILE" 23 | } 24 | # Функция для записи выполненного шага 25 | mark_step_completed() { 26 | local step=$1 27 | echo "$step" >>"$LOG_FILE" 28 | } 29 | source $config_file 30 | # Функция для сравнения версий (%%s нужен для макроподстановки mc.menu) 31 | 32 | Install() { 33 | if ! rpm -q $@ >/dev/null 2>&1; then 34 | echo -e "Ставим ${GREEN}$@${WHITE}" 35 | if yum -y install $@; then 36 | echo -e "${GREEN}$@${WHITE} установлен" 37 | else 38 | echo -e "Установить ${RED}$@${WHITE} не удалось, очищаем кэш и пытаемся снова" 39 | # Очистка кэша yum и повторная попытка установки 40 | yum clean all 41 | yum makecache 42 | if yum -y install $@; then 43 | echo -e "${GREEN}$@${WHITE} установлен после очистки кэша" 44 | else 45 | echo -e "Установить ${RED}$@${WHITE} не удалось даже после очистки кэша" 46 | exit 1 47 | fi 48 | fi 49 | echo 50 | else 51 | echo -e "${GREEN}$@${WHITE} уже установлен" 52 | fi 53 | } 54 | 55 | STEP="Установка dnf-utils" 56 | if ! check_step "$STEP"; then 57 | Install dnf-utils 58 | mark_step_completed "$STEP" 59 | fi 60 | 61 | STEP="Добавление папки tmp всем пользователям" 62 | if ! check_step "$STEP"; then 63 | for dir in /var/www/*; do 64 | # Проверяем, что это директория и она не является cgi-bin или html 65 | if [ -d "$dir" ] && [[ $(basename "$dir") != "cgi-bin" && $(basename "$dir") != "html" ]]; then 66 | # Проверяем, существует ли папка tmp 67 | if [ ! -d "$dir/tmp" ]; then 68 | # Если папки нет, создаем её и выводим сообщение 69 | mkdir "$dir/tmp" 70 | echo -e ${GREEN}$(basename "$dir")${WHITE}": папка tmp создана в $dir" 71 | chown $(basename "$dir"):$(basename "$dir") "$dir/tmp" 72 | fi 73 | fi 74 | done 75 | echo 76 | # Проходим по каждой версии PHP в /etc/opt/remi/ 77 | for php_version_dir in /etc/opt/remi/*; do 78 | # Проверяем, что это директория 79 | if [ -d "$php_version_dir" ]; then 80 | # Ищем все конфиги php-fpm.d/ для каждого пользователя, кроме www.conf 81 | for conf_file in "$php_version_dir/php-fpm.d"/*.conf; do 82 | # Пропускаем файл www.conf 83 | if [[ $(basename "$conf_file") == "www.conf" ]]; then 84 | continue 85 | fi 86 | 87 | # Извлекаем имя пользователя из имени файла 88 | username=$(basename "$conf_file" .conf) 89 | 90 | # Проверяем, существует ли параметр php_value[upload_tmp_dir] 91 | if ! grep -q "php_value\[upload_tmp_dir\]" "$conf_file"; then 92 | # Проверка последнего символа с помощью od 93 | last_char=$(tail -c 1 "$conf_file" | od -An -t u1) 94 | # ASCII код для перевода строки (\n) — это 10 95 | if [ "$last_char" -ne 10 ]; then 96 | echo "Добавляем перевод строки в конец '$conf_file'" 97 | echo "" >> "$conf_file" 98 | fi 99 | # Если параметра нет, добавляем его в конец файла 100 | echo "php_value[upload_tmp_dir] = /var/www/$username/tmp" >> "$conf_file" 101 | echo -e "${GREEN}${username} ($(basename $php_version_dir))${WHITE}: Добавлен параметр php_value[upload_tmp_dir] в $conf_file" 102 | else 103 | echo -e "${username} ($(basename $php_version_dir)): Параметр php_value[upload_tmp_dir] уже существует в $conf_file" 104 | fi 105 | done 106 | fi 107 | done 108 | echo 109 | mapfile -t versions < <(rpm -qa | grep php | grep -oP 'php[0-9]{2}' | sort -r | uniq) 110 | 111 | # Перезапуск всех версий 112 | for version in "${versions[@]}"; do 113 | if /opt/remi/${version}/root/usr/sbin/php-fpm -t; then 114 | if systemctl restart "${version}-php-fpm"; then 115 | echo -e "Версия ${GREEN}${version}${WHITE} корректно перезапущена." 116 | echo 117 | else 118 | echo 119 | echo -e "Ошибка при перезапуске ${RED}${version}-php-fpm${WHITE}. Проверьте журналы для диагностики." 120 | echo 121 | fi 122 | 123 | else 124 | echo 125 | echo -e "Версия ${RED}${version}${WHITE} имеет проблемы в конфигурационных файлах." 126 | echo -e "Сервис ${RED}не был перезапущен${WHITE} и продолжает работать." 127 | echo 128 | systemctl status "${version}-php-fpm" 129 | fi 130 | done 131 | mark_step_completed "$STEP" 132 | fi 133 | 134 | # Удаление файла autoindex для httpd 135 | # файл autoindex может появиться при обновлении httpd 136 | if [ -f /etc/httpd/conf.d/autoindex.conf ]; then 137 | echo "Файл /etc/httpd/conf.d/autoindex.conf найден. Удаляем его." 138 | echo "Рекомендуем перезапустить сервер Apache после завершения обновления RISH." 139 | rm -f /etc/httpd/conf.d/autoindex.conf 140 | fi 141 | -------------------------------------------------------------------------------- /version: -------------------------------------------------------------------------------- 1 | 2.1.7 -------------------------------------------------------------------------------- /windows.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | #set -euo pipefail 3 | #IFS=$'\n\t' 4 | 5 | # little helpers for terminal print control and key input 6 | ESC=$( printf "\033") 7 | cursor_blink_on() { printf "$ESC[?25h"; } 8 | cursor_blink_off() { printf "$ESC[?25l"; } 9 | cursor_to() { printf "$ESC[$1;${2:-1}H"; } 10 | print_option() { printf "$1 "; } 11 | print_selected_on() { printf "$ESC[7m"; } 12 | print_selected_off() { printf "$ESC[27m"; } 13 | get_cursor_row() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${ROW#*[}; } 14 | get_cursor_column() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${COL}; } 15 | repl() { printf '%.0s'"$1" $(seq 1 "$2"); } 16 | key_input() { 17 | local key="" 18 | local extra="" 19 | local escKey=`echo -en "\033"` 20 | local upKey=`echo -en "\033[A"` 21 | local downKey=`echo -en "\033[B"` 22 | 23 | read -s -n1 key 2> /dev/null >&2 24 | while read -s -n1 -t .0001 extra 2> /dev/null >&2 ; do 25 | key="$key$extra" 26 | done 27 | 28 | if [[ $key = $upKey ]]; then 29 | echo "up" 30 | elif [[ $key = $downKey ]]; then 31 | echo "down" 32 | elif [[ $key = $escKey ]]; then 33 | echo "esc" 34 | elif [[ $key = "" ]]; then 35 | echo "enter" 36 | fi 37 | } 38 | 39 | 40 | function refresh_window { 41 | # формат вызова 42 | # refresh_window y x height width shift "@" 43 | 44 | local MaxWindowWidth 45 | local left_x 46 | local top_y 47 | local ReturnKey="" 48 | local temp 49 | local -a ms 50 | local -a menu_items 51 | local height 52 | local i=0 53 | local shift_y 54 | ms=( "$@" ) 55 | left_x=${ms[1]} 56 | top_y=${ms[0]} 57 | MaxWindowWidth=${ms[3]} 58 | menu_items=( "${ms[@]:5}" ) 59 | height=${ms[2]} 60 | shift_y=${ms[4]} 61 | 62 | cursor_to $(($top_y )) $(($left_x)) 63 | printf "┌" 64 | repl "─" $(( $MaxWindowWidth + 3 )) 65 | printf "┐" 66 | 67 | for ((i=0;i<${height};i++)) 68 | do 69 | cursor_to $(($top_y + ${i} + 1)) $(($left_x)) 70 | print_option "│ ${menu_items[${i}+${shift_y}]}" 71 | repl " " $(( ${MaxWindowWidth}-${#menu_items[${i}+${shift_y}]} )) 72 | printf "│" 73 | done 74 | 75 | cursor_to $(($top_y + ${i} +1 )) $(($left_x)) 76 | printf "└" 77 | repl "─" $(( $MaxWindowWidth + 3 )) 78 | printf "┘" 79 | } 80 | 81 | function vertical_menu { 82 | # формат вызова 83 | # vertical_menu y x height width "@" 84 | # если x = center - то центрирование по горизонтали 85 | # если y = center - то центрирование по вертикали 86 | # = current - выводим меню в текущей строке 87 | # если height = 0 - не устанавливать высоты (она будет посчитана автоматически) 88 | # = число - установить высоту окна равную числу. Пункты меню будут скролироваться 89 | # width = число. Если строка будет больше этого числа - то ширина будет расширена до него 90 | # если среди пунктов меню встречается слово default со знаком =, то это значит установка пункта меню по умолчанию 91 | # этот пункт меню будет выбранным при выводе меню 92 | # vertical_menu y x height width "default=2" "First Item" "Second Item" "Third Item" 93 | local MaxWindowWidth 94 | local left_x 95 | local top_y 96 | local ReturnKey="" 97 | local -a ms 98 | local -a menu_items 99 | local size 100 | local lines 101 | local columns 102 | local current_y 103 | local skip_lines=0 104 | local height 105 | local shift_y=0 106 | size=$(stty size) 107 | lines=${size% *} 108 | columns=${size#* } 109 | 110 | # Обработка и удаление аргумента default, если он присутствует 111 | local default_selected_index=0 112 | local new_menu_items=() 113 | for arg in "$@"; do 114 | if [[ $arg == default=* ]]; then 115 | default_selected_index=${arg#default=} 116 | else 117 | new_menu_items+=("$arg") 118 | fi 119 | done 120 | 121 | ms=("${new_menu_items[@]:0:4}") 122 | menu_items=("${new_menu_items[@]:4}") 123 | left_x=${ms[1]} 124 | top_y=${ms[0]} 125 | MaxWindowWidth=${ms[3]} 126 | current_y=$(get_cursor_row) 127 | 128 | if ((${ms[2]} == 0)); then 129 | height=${#menu_items[@]} 130 | else 131 | # если требуемая высота больше чем количество пунктов меню, уменьшаем ее 132 | if ((${ms[2]} > ${#menu_items[@]})); then 133 | height=${#menu_items[@]} 134 | else 135 | height=${ms[2]} 136 | fi 137 | fi 138 | 139 | #find the width of the window 140 | for el in "${menu_items[@]}"; do 141 | if ((${MaxWindowWidth} < ${#el})); then 142 | MaxWindowWidth=${#el} 143 | fi 144 | done 145 | ((MaxWindowWidth = ${MaxWindowWidth} + 2)) 146 | 147 | if [[ ${ms[1]} == "center" ]]; then 148 | ((left_x = (${columns} - ${MaxWindowWidth} - 6) / 2)) 149 | fi 150 | if [[ ${ms[0]} == "center" ]]; then 151 | ((top_y = (${lines} - ${height} - 2) / 2)) 152 | fi 153 | 154 | if [[ ${ms[0]} == "current" ]]; then 155 | # если меню не поместится - надо сдвинуть экран 156 | ((skip_lines = 0)) 157 | if (((${current_y} + ${height}+1) > ${lines})); then 158 | ((skip_lines = ${current_y} + ${height} - ${lines} + 2)) 159 | echo -en ${ESC}"[${skip_lines}S" 160 | fi 161 | ((top_y = ${current_y} - ${skip_lines})) 162 | ((current_y = top_y)) 163 | fi 164 | refresh_window ${top_y} ${left_x} ${height} ${MaxWindowWidth} ${shift_y} "${menu_items[@]}" 165 | 166 | # ensure cursor and input echoing back on upon a ctrl+c during read -s 167 | trap "cursor_blink_on; stty echo; printf '\n'; exit" 2 168 | cursor_blink_off 169 | 170 | local selected=${default_selected_index} 171 | local previous_selected=${default_selected_index} 172 | while true; do 173 | # print options by overwriting the last lines 174 | 175 | cursor_to $(($top_y + $previous_selected + 1)) $(($left_x)) 176 | print_option "│ ${menu_items[$previous_selected + ${shift_y}]}" 177 | repl " " $(($MaxWindowWidth - ${#menu_items[$previous_selected + ${shift_y}]})) 178 | printf "│" 179 | 180 | cursor_to $(($top_y + $selected + 1)) $(($left_x)) 181 | printf "│ " 182 | print_selected_on 183 | printf " ${menu_items[${selected} + ${shift_y}]}" 184 | repl " " $(($MaxWindowWidth - ${#menu_items[$selected + ${shift_y}]})) 185 | print_selected_off 186 | printf " │" 187 | 188 | # user key control 189 | ReturnKey=$(key_input) 190 | case ${ReturnKey} in 191 | enter) break ;; 192 | esc) 193 | selected=255 194 | break 195 | ;; 196 | up) 197 | previous_selected=${selected} 198 | ((selected--)) 199 | if [[ ${selected} -lt 0 ]]; then 200 | if ((${shift_y} > 0)); then 201 | ((shift_y--)) 202 | refresh_window ${top_y} ${left_x} ${height} ${MaxWindowWidth} ${shift_y} "${menu_items[@]}" 203 | fi 204 | selected=0 205 | fi 206 | ;; 207 | down) 208 | previous_selected=${selected} 209 | ((selected++)) 210 | if [[ ${selected} -ge ${height} ]]; then 211 | if (((${shift_y} + ${selected}) < ${#menu_items[@]})); then 212 | ((shift_y++)) 213 | refresh_window ${top_y} ${left_x} ${height} ${MaxWindowWidth} ${shift_y} "${menu_items[@]}" 214 | fi 215 | selected=${previous_selected} 216 | fi 217 | ;; 218 | esac 219 | done 220 | 221 | printf "\n" 222 | cursor_blink_on 223 | cursor_to ${current_y} 1 224 | if [[ ${ms[0]} == "current" ]]; then 225 | # очистить выведенное меню 226 | echo -en ${ESC}"[0J" 227 | fi 228 | ((selected += ${shift_y})) 229 | return ${selected} 230 | } 231 | 232 | 233 | function fn_bui_setup_get_env() 234 | { 235 | # save the home dir 236 | local _script_name=${BASH_SOURCE[0]} 237 | local _script_dir=${_script_name%/*} 238 | 239 | if [[ "$_script_name" == "$_script_dir" ]] 240 | then 241 | # _script name has no path 242 | _script_dir="." 243 | fi 244 | 245 | # convert to absolute path 246 | _script_dir=$(cd $_script_dir; pwd -P) 247 | 248 | export BUI_HOME=$_script_dir 249 | } 250 | 251 | --------------------------------------------------------------------------------