#!/usr/bin/env bash ENABLED=yes [[ ${ENABLED} == "yes" ]] || exit 0 DEBUGMODE=no SOURCE=/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0 SOURCE=/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0 SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null SOURCE=${SYSCONF}/server; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null debug_mode "$0" "$@" PATH_UBPILE="/opt/ubpile" UBPILE_CONF_JSON="${PATH_UBPILE}/conf/config.json" UBPILE_CONF_JSON_TEMPLATE="${PATH_UBPILE}/sample_conf/config.json" PATH_HAPROXY_UBPILE_CONF="/etc/haproxy/haproxy-ubpile.cfg" ## Использовать приложение UBPile ## UBPILE=primary|worker|disable|clean ## primary # Выступать в роли главного сервера управляющего всеми 'Worker' ## worker # Исполнитель заданий приходящих от сервера 'Primary' ## disable # Отключить ## clean # Очистить БД и вернуть настройки по умолчанию. После процедуры очистки установится UBPILE=disable ## UBPILE[secret_key|base_app_url|...]= ## secretkey # При настройке нескольких серверов все ваши серверы должны иметь один и тот же секретный ключ. Любая случайно сгенерированная строка подойдет ## base_app_url # Полный URL-адрес, включая http порт, если он нестандартный. Это используется в электронных письмах для создания URL-адресов с самостоятельными ссылками ## email_from # Адрес электронной почты, который будет использоваться в качестве адреса "От" при отправке уведомлений ## smtp_hostname # Имя хоста вашего SMTP-сервера для отправки почты. Так-же это может быть `127.0.0.1` или `localhost` ## debug_level # Уровень детализации в журналах отладки. Он варьируется от 1 (очень тихо) до 10 (очень громко). Значение по умолчанию — 4 ## job_memory_max # Максимальное ограничение памяти по умолчанию для каждого задания, по умолчанию: 1073741824 (1Гб) ## ## server_comm_use_hostnames # Разрешить серверам подключаться друг к другу по именам хостов, полезно с меняющимися IP адресами. Значения: *false, true ## web_direct_connect # Разрешить веб-интерфейсу прямое подключение к главному серверу, полезно при использовании нескольких резервных серверов ## # или балансировщик нагрузки или обратного прокси. Значения: *false, true ## web_socket_use_hostnames # Разрешить веб-интерфейсу подключаться к внутренним серверам, используя их имена хостов, а не IP-адреса. Значения: *false, true ## # Это свойство вступает в силу только в том случае, если web_direct_connect=true ## WebServer.http_port # Номер порта http веб-сервера для пользовательского интерфейса. По умолчанию: 9012 ## WebServer.https # Включить HTTPS, чтобы пользовательский интерфейс был зашифрован SSL. Значения: *false, true ## WebServer.https_port # Номер порта https веб-сервера для пользовательского интерфейса. По умолчанию: 9013 ## ... # Могут использоваться любые переменные конфигурационного файла config.json ## UBPILE[secret_key]="4a6ed27e0434490028ff63b11f12fb7c" ## UBPILE[base_app_url]="http://localhost:80" ## UBPILE[web_direct_connect]="true" exec_01_ubpile(){ clean_db(){ [[ ${PATH_UBPILE}/data ]] && rm -rdf ${PATH_UBPILE}/data } [[ -d ${PATH_UBPILE} ]] || return 0 [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift [[ -n ${COMMAND} ]] || COMMAND="set=" local PARAM="$@" if [[ -n ${PARAM} ]]; then local UBPILE= declare -A UBPILE [[ ${PARAM%%=*} =~ [!\$%\&()*+,/\;\<\=\>?\^\{|\}~] ]] || eval "${PARAM%%=*}=\${PARAM#*=}" fi if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#UBPILE[@]} != 0 ]]; then local STRING_ARG_CONF= if [[ -f ${UBPILE_CONF_JSON} ]]; then for NAME_ARG_CONF in "${!UBPILE[@]}"; do [[ ${NAME_ARG_CONF} != 0 ]] && STRING_ARG_CONF+=".${NAME_ARG_CONF}=${UBPILE[${NAME_ARG_CONF}]}|" done [[ -n ${STRING_ARG_CONF} ]] && echo -E "$(jq "${STRING_ARG_CONF%|*}" ${UBPILE_CONF_JSON})" > ${UBPILE_CONF_JSON} fi # Удалить ключ из системной конфигурации [[ -n ${UBPILE[secret_key]} ]] && sed "/UBPILE\[secret_key\]=/d" -i ${SYSCONF}/server if [[ ${UBPILE[0]} == "clean" ]]; then ubconfig set [server] UBPILE=disable clean_db elif [[ ${UBPILE[0]} == "primary" ]]; then chmod o-rwx ${PATH_UBPILE} systemctl --quiet is-active ubpile.service &>/dev/null || ${PATH_UBPILE}/bin/control.sh setup systemctl --quiet enable ubpile.service &>/dev/null systemctl --quiet restart ubpile.service &>/dev/null message_motd "enable" elif [[ ${UBPILE[0]} == "worker" ]]; then chmod o-rwx ${PATH_UBPILE} clean_db systemctl --quiet enable ubpile.service &>/dev/null systemctl --quiet restart ubpile.service &>/dev/null message_motd "enable" elif [[ ${UBPILE[0]} == "disable" ]]; then systemctl --quiet stop ubpile.service haproxy-ubpile.service &>/dev/null systemctl --quiet disable ubpile.service haproxy-ubpile.service &>/dev/null message_motd "disable" fi elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then if [[ ${PARAM%%=*} =~ ^.*'['(.*)']' ]]; then NAME_VAR=${BASH_REMATCH[1]} TEMPLATE_VALUE="$(jq '.${NAME_VAR}' UBPILE_CONF_JSON_TEMPLATE)" echo -E "$(jq ".${NAME_VAR}=${TEMPLATE_VALUE}" ${UBPILE_CONF_JSON})" > ${UBPILE_CONF_JSON} fi fi } ## Использовать для UBPile преднастроенный обратный прокси, разместив приложение на указанном порту ## UBPILE_REVERSE_PROXY=enable|disable| ## enable # Только включить автозапуск и запустить сервис haproxy-ubpile.service ## disable # Выключить и отключить автозапуск сервис haproxy-ubpile.service ## # Настроить http порт, включить автозапуск и запустить сервис haproxy-ubpile.service ## # Если требуется настройка SSL, то необходимо полученный сертификат вручную прописать в файле конфигурации /etc/haproxy/haproxy-ubpile.cfg ## UBPILE_REVERSE_PROXY_PORT=80 exec_02_reverse_proxy_port(){ [[ -d ${PATH_UBPILE} ]] || return 0 local STRING_ARG_CONF= if [[ ${UBPILE_REVERSE_PROXY_PORT} == @(disable|no) ]]; then systemctl --quiet stop haproxy-ubpile.service &>/dev/null systemctl --quiet disable haproxy-ubpile.service &>/dev/null message_motd elif [[ ${UBPILE_REVERSE_PROXY_PORT} == @(enable|yes) ]]; then [[ -n ${UBPILE[web_direct_connect]} ]] || ubconfig set [server] UBPILE[web_direct_connect]="true" systemctl --quiet enable haproxy-ubpile.service &>/dev/null systemctl --quiet start haproxy-ubpile.service &>/dev/null message_motd "enable" "$(sed -En '/^\s*frontend http/,/^\s*backend/{s/^\s*bind.*:([[:digit:]]*).*/\1/p}' ${PATH_HAPROXY_UBPILE_CONF})" elif [[ ${UBPILE_REVERSE_PROXY_PORT} =~ ^[[:digit:]]*$ ]]; then # Пропишем порт в конфиге haproxy sed -E "/^\s*frontend http/,/^\s*backend/s/^\s*bind.*/ bind \*:${UBPILE_REVERSE_PROXY_PORT}/g" -i ${PATH_HAPROXY_UBPILE_CONF} # Если параметры не заданы в конфиге, то зададим #[[ -n ${UBPILE[web_direct_connect]} ]] || STRING_ARG_CONF+=".web_direct_connect=true | " #[[ -n ${UBPILE[base_app_url]} ]] || STRING_ARG_CONF+=".base_app_url=http://localhost:${UBPILE_REVERSE_PROXY_PORT} | " #[[ -n ${STRING_ARG_CONF} ]] && echo -E "$(jq "${STRING_ARG_CONF%|*}" ${UBPILE_CONF_JSON})" > ${UBPILE_CONF_JSON} [[ -n ${UBPILE[web_direct_connect]} ]] || ubconfig set [server] UBPILE[web_direct_connect]="true" [[ -n ${UBPILE[base_app_url]} ]] || ubconfig set [server] UBPILE[base_app_url]="http://localhost:${UBPILE_REVERSE_PROXY_PORT}" #systemctl --quiet is-active ubpile.service &>/dev/null && systemctl --quiet restart ubpile.service &>/dev/null systemctl --quiet enable haproxy-ubpile.service &>/dev/null systemctl --quiet start haproxy-ubpile.service &>/dev/null message_motd "enable" "${UBPILE_REVERSE_PROXY_PORT}" fi } message_motd(){ [[ -d ${PATH_UBPILE} ]] || return 0 local UBPILE_MSG_STATUS=$1 local UBPILE_PORT=$2 local UBPILE_RUN="/run/ubpile" PC_HOSTNAME="$(hostname -f)" PC_IP="$(ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p')" install -dm0755 ${UBPILE_RUN} [[ -z ${UBPILE_PORT} || ${UBPILE_PORT} == "-" ]] && [[ -f ${UBPILE_CONF_JSON} ]] && UBPILE_PORT=$(jq '.WebServer.http_port' ${UBPILE_CONF_JSON}) echo "Веб-консоль UBPile: http://${PC_HOSTNAME}:${UBPILE_PORT:-3012}/ или http://${PC_IP:-127.0.0.1}:${UBPILE_PORT:-3012}/" > ${UBPILE_RUN}/active echo "Запустить веб-консоль UBPile: systemctl enable --now ubpile.service" > ${UBPILE_RUN}/inactive [[ ${UBPILE_MSG_STATUS} == "enable" ]] && ln -snf active.motd ${UBPILE_RUN}/motd || ln -snf inactive.motd ${UBPILE_RUN}/motd } ################ ##### MAIN ##### ################ # Если файл подключен как ресурс с функциями, то выйти return 0 2>/dev/null && return 0 if [[ -z $@ ]]; then while read -ru3 FUNCTION; do $"${FUNCTION##* }" done 3< <(declare -F | grep "declare -f exec_") else while [[ $# -gt 0 ]]; do declare -f ${1} &>/dev/null && FUNCTION+="; ${1}" && shift || { FUNCTION+=" '${1}'" && shift; } done eval ${FUNCTION#*; } fi