From 40c06db5ecef4e7f424651f7b27ec6cf287114cb Mon Sep 17 00:00:00 2001 From: Christian Tosta Date: Wed, 11 Jun 2025 14:48:19 -0300 Subject: [PATCH] Corrigido rebase incorreto --- .gitignore | 3 + builtin/cli.bash | 146 ++++-- sig-installer-dev | 1276 +++++++++++++++++++-------------------------- 3 files changed, 658 insertions(+), 767 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e24e24d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*\.old +snippets/ +tools/ diff --git a/builtin/cli.bash b/builtin/cli.bash index c18aca2..31d390d 100644 --- a/builtin/cli.bash +++ b/builtin/cli.bash @@ -21,20 +21,15 @@ export U_ITEM="\u21e2" export U_TICK="\u2713" export U_FAIL="\u2715" -export COLS="$(( $(tput cols) - 1 ))" +#export COLS="$(( $(tput cols) - 1 ))" export EL=$(tput el) -: "cli.clear" -function cli.clear { - clear -} - # Get the cursor current position and returns CURSOR_X, CURSOR_Y : "cli.get_cursor" cli.get_cursor() { local _xy - echo -ne $"\E[6n" + echo -ne $"\e[6n" read -rsdR _xy _xy="${_xy#*[}" export CURSOR_X=${_xy/*;} @@ -44,21 +39,45 @@ cli.get_cursor() { # Puts the cursor at x:y (defaults to 0:0) : "cli.set_cursor " cli.set_cursor() { - printf "\E[%sH" "${2:0};${1:0}" + printf "\e[%sH" "${2:0};${1:0}" } -# Just prints N blank lines -: "cli.jump " -cli.jump() { - for i in $(seq 1 ${1:-1}); do - printf "%s${EL}\n" +# Puts cursor N lines up +: "cli.lineup []" +cli.lineup() { + printf "\e[%sA${EL}\e[0F" "${1:-1}" +} + +# Puts cursor N lines down +: "cli.linedown []" +cli.linedown() { + printf "\e[%sB${EL}\e[0F" "${1:-1}" +} + +# Clears the screen below cursor position +: "cli.clear" +cli.clear() { + cli.writeln + cli.lineup + cli.get_cursor + local _lines=$((( $(tput lines) - ${CURSOR_Y} - 1 ))) + for i in $(seq 1 ${_lines}); do + cli.writeln done + cli.set_cursor 0 ${CURSOR_Y} +} + +# Just prints a blank line +: "cli.writeln" +cli.writeln() { + cli.linedown + printf "\n" } # Just like printf : "cli.print [] [ ...]" cli.print() { - printf $"${1}" ${@:2} + printf "${1:-}" ${@:2} } # Folds text at 'size' column @@ -69,8 +88,9 @@ cli.fold() { : "cli.status [] " cli.status() { - local fmt=${2//\\n} - cli.jump + local fmt="${2:-}" + fmt="${fmt//\\n}" + cli.writeln case "${1:-info}" in debug) printf "\e[0F${S_DEBUG}${fmt:-%s}${@:3}${EL}\n" ;; crit*) printf "\e[0F${S_CRIT}${fmt:-%s}${@:3}${EL}\n" ;; @@ -130,7 +150,7 @@ cli.items() { printf "${U_ITEM} ${1:-%s}" "${@:2}" } -: "cli.items " +: "cli.item " cli.item() { cli.items "%s\n" "${@}" | head -1 } @@ -139,45 +159,106 @@ cli.item() { cli.title() { cli.items "%s" "$(cli.emphasis blue "%s" "${@^^}")" cli.line + cli.writeln } -: "cli.subtitle " +: "cli.subtitle [noline]" cli.subtitle() { printf "%0.s\u2508%s" cli.bold " ${@^^} " cli.get_cursor - for i in $(seq 0 $((( ${COLS} - ${CURSOR_X} )))); do + for i in $(seq 0 $((( $(tput cols) - ${CURSOR_X} )))); do printf "%0.s\u2508" done - cli.jump + cli.writeln } -: "cli.prompt []" +: "cli.prompt [] []" cli.prompt() { - read -p "$(cli.print ${1:-})" k - echo ${k} + local k= + _get_var() { : "${@:$#}"; echo "${_//-*/}"; } + _get_opts() { echo "${@//${_var}/}"; } + case ${#@} in + 1) + _prompt="$(cli.print "${1:-}")" + _var=k + _opts= + ;; + *) + _prompt="$(cli.print "${1:-}")" + _var=$(_get_var ${@:2}) + _opts=$(_get_opts ${@:2}) + ;; + esac + read -p "$(cli.print "${1:-}")" ${_opts} ${_var:-k} + ! [[ -z "${k}" ]] && echo "${k}" || : } # Draws a horizontal line : "cli.line [nobreak]" cli.line() { - [[ -z "${1:-}" ]] && cli.jump - for i in $(seq 1 ${COLS}); do + [[ -z "${1:-}" ]] && cli.writeln + for i in $(seq 1 $(tput cols)); do printf "%0.s\u2504" done - [[ -z "${1:-}" ]] && cli.jump + [[ -z "${1:-}" ]] && cli.writeln } # Draws a thin horizontal divisor line : "cli.boldline" cli.boldline() { - for i in $(seq 1 ${COLS}); do + for i in $(seq 1 $(tput cols)); do printf "%0.s\u2581" done + cli.writeln +} + +cli.subprocess.output() { + while readarray -t -n ${1:-10} buffer && ((${#buffer[@]})); do + cli.set_cursor 0 ${CURSOR_Y} + local _max_len=$(( $(tput cols) - 18 )) + for line in "${buffer[@]}"; do + ! [[ -z "${line}" ]] \ + && cli.color purple " %s" "${line:0:${_max_len}}${EL}" \ + && cli.writeln + done + done + cli.set_cursor 0 ${CURSOR_Y} + for _i in {1..${1}}; do + cli.writeln + done + cli.set_cursor 0 ${CURSOR_Y} +} + +cli.subprocess.success() { + cli.set_cursor 0 ${CURSOR_Y} + printf " ${S_SUCCESS}%s\n" "${@:1:1}${EL}" + for p in ${@:2}; do + cli.tab 2; cli.print "$( + cli.color green "$(cli.item ${p}${EL})" + )\n" + done } +cli.subprocess.failure() { + cli.set_cursor 0 ${CURSOR_Y} + printf " ${S_ERROR}%s\n" "${@:1:1}${EL}" + if [[ -f "${2:-}" ]]; then + tail -${4:-50} ${@:2:1} 2>/dev/null | while read line; do + cli.tab 2; cli.print "$( + cli.color red "${3:-Log}: ${line}${EL}" + )\n" + done + else + cli.lineup + cli.clear + fi +} + + : "cli.section <subtitle> <content>" cli.section() { + cli.set_cursor 0 0 __section.header() { __section.title() { printf $"${@:1:1}" \ @@ -186,13 +267,15 @@ cli.section() { } __section.title.underline() { cli.boldline + cli.writeln } __section.title "${@}" __section.title.underline } __section.content() { - cli.jump 2 - cli.fold ${COLS} "${@}" + cli.linedown + cli.fold $(tput cols) "${@}" + cli.writeln } __section.footer() { __section.footer.line() { @@ -200,9 +283,10 @@ cli.section() { } __section.footer.line } + cli.clear __section.header "${@:1:3}" - __section.content "${@:4}" - __section.footer + ! [[ -z "${@:4}" ]] && __section.content "${@:4}" + ! [[ -z "${@:4}" ]] && __section.footer } cli.self_compress() { diff --git a/sig-installer-dev b/sig-installer-dev index f0bd857..f662482 100755 --- a/sig-installer-dev +++ b/sig-installer-dev @@ -6,8 +6,12 @@ version=2506.90 : ${LANG:=C.UTF-8} +rm -rf /tmp/${self}.* +CACHEDIR=$(mktemp -d /tmp/${self}.cache.XXXXX) +PRIVKEY_PASSPHRASE= + # Read the configuration from all config files found -CONFPATH="/etc/${self}:/usr/local/etc/${self}:.config:./config:." +CONFPATH="/etc/${self}:/usr/local/etc/${self}:./config:." for _p in ${CONFPATH//:/\ }; do test -f ${_p}/${self}.conf && \ . ${_p}/${self}.conf @@ -16,41 +20,51 @@ done function cli { # Compressed built-in CLI cli.__init__() { local blob="\ - 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 \ - 0MMmahd1/gelgdo3VRQAAA== \ + H4sIAAAAAAACA6VY6XPaSBb/7r+iV8ET5FoBwnHiCEM5cXDWu6xJ4bhmUraHEtDYKguJ1RHbwfrf9 \ + 70+pJYQ18wXRB/v7F+/o+nz3A8icj783O99aWu39MacaXtUzl72L7tstgGzcvosP53ODrqcw+Fx66 \ + j1UV353LvuZktmU137Ouh2L7PF3Fp/8Onyq0LZbByryz+6vV7/d2W5mdPn2/XgW0+hPlJsuBp+6X6 \ + +/trWKgu5MbmNm+8/muRmQkfx/V1lwc1PiJYRnQ0uviMN91eCxGB1SjkOnMgZ2245cXcw6A+4RJWI \ + BoEflFP8/mlwyQm4J1KaJzvwHG+FkheX5/2CkngAKbHjTf1yysv+94uzLpeYI/F8sIuWE11dn511r \ + 64KEtmxpvRhPB7TMMwxkByuhxffu/+FY4qbJm1q2TTo8h82/cE8VKbPP130xPQRcHkjz7vfQx2qVV \ + KpRvM4ImPfDXViEJPoekre7bXFMnV1ICZfaUSiB0rGcRD6AX4C6kVk7odwlL5HbG9CAhrFgReSs+v \ + BVX8w/OOf8t+PPYtoY9ep3dNoyDloe/lxVSeLPUJcH2BBhs8vezCg4wefGB4lFcTme0+DuYDaE2IE \ + 4WTAdhH8RZfC583BTYJbpKFCizZbrB+0kqW1H2KtdZDsJWjltzgKVTPtiDxbL6Q6oVM7dnHNJw2ro \ + Ut7wlR/cvLcIScvHW5XWLRrHjheNCVox374L42Axk2rkbQqCxM+miJdsLskruPRkMRzKQvH8ZzcnH \ + jxbESDIVvv3HGBfLFM2KfKottLMAadM7GmZZjrBE78J08VieM1QnG5TOznNWLPXGoH3M/hOKDUIyP \ + q+k9SE4kpqcUYt3OJ7K8Qh+MnCCTU9cSIO0EMMmhlsGLaA7Az8LMZRD/cRYGJRNwFHeimoI5DHA+2 \ + h/R/MA14YSSJ3gJPwY6iHhPfo0IDBRwNlT93wr/jMOIuC4lNRq7tPTJtpNWCJbdbDBTLpe9Vv3uaw \ + tp1HqlYkizZCM6Szw7BuJkdde7IiR3cmx1YgG+zQ2q1mjhgtlEIzeSww0w0MOnUagprzn13AidKny \ + O8M29D5xd9i5ElnqXHOIUt5ARX4KLgTnFXcH5Jxn7IUIMCNPJKGK0RPoFMk0mU9y+yozgEruzbWWG \ + bvJRsUy7QTGdRm11Fg0UOMYRPvX5767G5AszskAoPYHoA5RyPKc6Soa7egcZ5ZSHSZ8J4WsZ+mKBN \ + hwm/HJ5GWi2OIRBwUEKNeXQjMUuMJcQsj26kxhRZJhpz6kZi9EEZMabWjcSYLMuIeXbdSI65soxc5 \ + NmN9FvoLTB4mAgiGtpjBX2Abwz87NPZ5V4xip2BmEEvg11AJ7pyMXnFpFrOi1BxWw8TafzIjWmekN \ + UxW1DeY8DOk/IaZgtaP7C9+4JcUbFtQf1CXcgSeWpe2m5DPY+DuVuQLQraLagP8oRsz0ayAlzobP5 \ + gh04oEPM6gqC2E2wkg7+BHJS5ET1peZrZdy7ty1+INUDahckaTO3CZi28dmG0Fmm7MFoLup3cDOf2 \ + mgPh9tQFGI5YHs7S4ijLvzmUsn1pIua1m2AR2SORyTkLGAsOUF0hzJpYa/+D3NwQ4xeSh/X6TcP4e \ + Acq3d2R336DfU2lctmHHUiEsogqCNLuLCy7Iqx+gAX+za4IIyjUo5UFb50SwnTL4nozKcrKFSY4oT \ + iG6wIOwRzCXQKVyQPrR0zVOU7k0hwjNrPESfq2mvc63KfM63/+mWi6ppR8hYJEqYTikSoYW1HcL9w \ + iVwue2W/UQmgQjxrHIFCw5sdOuHCilVXThaoYitvqcjuZFrx/JFhMZ/XysnAtXzcvGzcP/Nk8Iif8 \ + O5SH78+xTYB2BP7/tINOWrXirlyQfGxjp4hG/OT9A7E4BCpvEq3FG01sIut146COM4ncDzIYntI9p \ + /U6bAQ2SbqRxdfK4s1pIgOrqbMP8ODKtMUx8wpcJnF2smwXsGs/ygGKbLNBmnx251apSnNFna7n2I \ + tl/J9bzwKGbLXnZIU07IWQHq8VyrGMx8Ktf0yvu3Qezry+Eos3DV8C+wmbnwc/cH75XgQHpXZA+B9 \ + xPAJFHpWWU5xsKoYXRFxQvlpfbt8UjK5B5DsFkRvF5EyJHkCaYs/E+elgA6jahTcMx1n4Vaz6iyof \ + m6svkQgAgB18W6r5MTIU4p4eHIgZeNJ2ENgvxIiI4fE4aTYSMoqnUxqgxdUqAJwPb07vEj3f/65sd \ + XGDaL5n9vPQpV677OnpmOgcf1PhK/QA+DwTqKXychDDvfxUbsUikefDq3OegSGgERFTkcJqWIBZoV \ + DCOwNtmUMGpNS127T33IohO8WFWathz5r8veeCwhGKZ0IlpaxRRkKFELU7ytKYZVqmcIFQfc7wx6J \ + CTm1M+80WUYNBVfgsczir5WTMYDm1sphz/iJC6bdeCtZl26a248YB/Su28YZ3lWXOlMFmSmS1DKhp \ + 4SMUP+AI5BKjsnhnGUeNhJsP5KTZqU/oz7oXuy6k++y+MJgqoNzgINVFUHajEoeW0fPvE4sIGKeaK \ + k5KEULdkKYHkT50Ca74KoZn56A/s7fJMXuZLRRPUCBgJQBfWRR0sCHxIupF6eslo1x1BA3MjUOxqY \ + YFEA3SB5xsQS04lJBVSU9GvXGVavbYu/QgL88irXD1VZRKvc9bfkkgtidlOtZiDyxQYrD0qwzNypQ \ + aEkqZyWJ5rZw9TpytC/+n8gsvfHyCPYLlIqciK69cnvvU96PSI+ILtRLTU7OT1SRCjorAIizkNTxk \ + Wipx+9R6lybTJTekG7ah4QqlgYS60+EYiqRAiY92xI/TDh/gCnPo3P9y5sQYf4TsI6dgnb5/R4ynD \ + x/SuWfok0IJ3bfcP/shuYXW+i3I/D8m/SqsFxwAAA== \ " envfile=$(mktemp /tmp/sig-installer.env.XXXXXX) echo $blob | base64 -di | gunzip -dc > ${envfile} test -r ${envfile} && source ${envfile} rm -f ${envfile} } + #source $(dirname $0)/builtin/cli.bash cli.__init__ cli.clear } @@ -94,9 +108,8 @@ function self.check_os { ubuntu) cli.color orange "%s" "${_os_name}"; cli.print "${_os_version}" ;; debian) cli.color purple "%s" "${_os_name}"; cli.print "${_os_version}" ;; fedora) cli.color blue "%s" "${_os_name}"; cli.print "${_os_version}" ;; - *) (printf "%s %s\n" "${_os_name}" "${_os_version}") ;; + *) (printf "%s %s" "${_os_name}" "${_os_version}") ;; esac - return 0 } function self.check_essential { @@ -189,9 +202,8 @@ function parsers.yaml { out=${res} && echo ${out} else err=$(: "${res//*\<module\>}"; echo "${_//:\ /: \[}]") - ${ui}.status error "%s ${U_SUBITEM} %s " "${1##*\/} ${err}" $"NotFound" + ${ui}.status error "%s ${U_ITEM} %s " "${1##*\/} ${err}" $"NotFound" fi - } # == Configuração do Sistema====================================================================== # @@ -291,99 +303,44 @@ function system.setup_openssh { # == Instalação de Pacotes e Aplicativos ======================================================== # -function system.install_pkgs_old { - import /etc/os-release - local _os_id=${ID} - case ${_os_id} in - ubuntu|debian) - ${ui}.status info $"Instalando os pacotes ..." \ - && sudo apt-get -qq update \ - && ${ui}.color gold \ - && ( \ - sudo apt-get -q -y install --no-install-suggests "${@}" 2>&1 \ - | while read line; do \ - ${ui}.status tab "${line}"; \ - done \ - ) \ - && ${ui}.color none \ - && ${ui}.status info $"Pacotes instalados com sucesso!" \ - || ${ui}.status info $"Erro ao instalar os pacotes!" - ;; - *) - ${ui}.status warn $"Não implementado." - check_os - ;; - esac - return 0 -} - function system.install_pkgs { - __buffer_output() { - while mapfile -t -n ${1:-10} buffer && ((${#buffer[@]})); do - cli.set_cursor 1 ${CURSOR_Y} - printf "${C_PURPLE}" - for line in "${buffer[@]}"; do - ! [[ -z "${line}" ]] && printf " %s\n" "${line}${EL}" - done; - done - } - - __apt_success() { - cli.set_cursor 1 ${CURSOR_Y} - printf "${S_SUCCESS}%s\n" \ - "${@:1:1}:${EL}" - for p in ${@:2}; do - cli.tab 2; cli.item "${p}${EL}" - done - } - - __apt_failure() { - cli.set_cursor 1 ${CURSOR_Y} - printf "${S_ERROR}%s\n" \ - "${@:1:1}:${EL}" - if [[ -f "${2:-}" ]]; then - tail -${4:-50} ${@:2:1} 2>/dev/null | while read line; do - cli.tab 2; printf "${C_RED}${3:-Log}: %s\n" "${line}${EL}" - done - else - cli.set_cursor 1 ${CURSOR_Y} - cli.jump - fi - printf "\\E[0G${C_NONE}" - } - - local _log=$(mktemp /tmp/${self}.install.XXXXX) + local _log=$(mktemp /tmp/${self}.apt-install.XXXXX) case "${DISTRO}" in debian|ubuntu) - printf "%0.s\n" + ${ui}.status info "%s" $"Aguarde. Instalando pacotes ..." + ${ui}.get_cursor export DEBIAN_FRONTEND=noninteractive - cli.status info "%s\n" $"Instalando os pacotes. Por favor aguarde ..." - cli.get_cursor - apt-get -q update | tee ${_log} | \ - __buffer_output 5 && \ - apt-get -qy install ${@} 2>&1 | tee ${_log} | \ - __buffer_output 10 \ - && __apt_success $"Pacotes instalados com sucesso" ${@} \ - || __apt_failure $"A instalação de pacotes falhou" ${_log} APT 50 - printf "${C_NONE}%0.s\n" + apt-get \ + -o Dpkg::Progress-Fancy=0 \ + -o=Dpkg::Use-Pty=0 \ + -q update \ + | tee -a ${_log} \ + | ${ui}.subprocess.output 10 && \ + apt-get \ + -o Dpkg::Progress-Fancy=0 \ + -o=Dpkg::Use-Pty=0 \ + -qqy install ${@} 2>&1 \ + | tee -a ${_log} \ + | ${ui}.subprocess.output 10 \ + && ${ui}.subprocess.success $"Pacotes instalados com sucesso" ${@} \ + || ${ui}.subprocess.failure $"A instalação de pacotes falhou" ${_log} APT 50 + ${ui}.writeln ;; fedora) - cli.jump - cli.status info "%s\n" $"Instalando os pacotes. Por favor aguarde ..." - cli.get_cursor + ${ui}.status info "%s\n" $"Aguarde. Instalando pacotes ..." + ${ui}.get_cursor dnf -y install --refresh ${@} 2>&1 | tee ${_log} | \ - __buffer_output 10 \ - && __apt_success $"Pacotes instalados com sucesso" ${@} \ - || __apt_failure $"A instalação de pacotes falhou" ${_log} DNF 50 - printf "${C_NONE}%0.s\n" + ${ui}.subprocess.output 10 \ + && ${ui}.subprocess.success $"Pacotes instalados com sucesso" ${@} \ + || ${ui}.subprocess.failure $"A instalação de pacotes falhou" ${_log} DNF 50 + ${ui}.writeln ;; *) - cli.jump - cli.status crit "%s" $"${DISTRO^}: Sistema operacional não suportado!" - cli.jump + ${ui}.status crit "%s" $"${DISTRO^}: Sistema operacional não suportado!" + ${ui}.writeln ;; esac - cli.get_cursor + ${ui}.get_cursor } function system.remove_pkgs { @@ -411,58 +368,54 @@ function system.remove_pkgs { return 0 } -function system.install_postgres { - local _pg_version=${1:-17} - local _citus_version=${2} +# == Plugins: funções a serem separadas do instalador ============================================ # - local POSTRES_PACKAGES=" - libjemalloc2 \ - postgresql-${_pg_version} \ - " +function plugin.postgres { + local \ + _pg_version=${1:-17} \ + _pg_citus_version=${2:-} \ + _pg_shared_preload= \ + _pg_packages \ + _pg_cluster \ + _pg_hba_file \ + _pg_port - ${ui}.subtitle "PostgreSQL" + _pg_packages=" + libjemalloc2 \ + postgresql-${_pg_version} \ + " + _pg_check_repo() { + product.setup_repos ${1:-pgdg} + } - ${ui}.status info $"Habilitando repositório: PostgreSQL-PGDG ..." - if [[ ! -f "/etc/apt/sources.list.d/pgdg.list" ]]; then - sudo install -d /usr/share/postgresql-common/pgdg \ - && sudo curl -kso /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \ - --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc \ - && sudo sh -c " \ - echo 'deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \ - https://apt.postgresql.org/pub/repos/apt ${VERSION_CODENAME}-pgdg main' \ - > /etc/apt/sources.list.d/pgdg.list" - fi - ${ui}.color gold - ${ui}.status tab "The repository is set up! You can now install packages." - ${ui}.color none - - local _pg_shared_preload= - if [[ ! -z "${_citus_version}" ]]; then - ${ui}.status info $"Habilitando repositório: PostgreSQL-Citus ..." - if [[ ! -f "/etc/apt/sources.list.d/citusdata_community.list" ]]; then - ${ui}.color gold - sudo curl -ks https://install.citusdata.com/community/deb.sh | bash 2>&1 \ - | while read line; do \ - ${ui}.status tab "${line}"; \ - done - ${ui}.color none - else - ${ui}.color gold - ${ui}.status tab "The repository is set up! You can now install packages." - ${ui}.color none - fi - POSTRES_PACKAGES+=" postgresql-${_pg_version}-citus-${_citus_version/*-}" + #_pg_check_repo pgdg + if ! [[ -z "${_pg_citus_version}" ]]; then + #_pg_check_repo citus + _pg_packages+=" postgresql-${_pg_version}-citus-${_pg_citus_version/*-}" _pg_shared_preload+="citus" fi - system.install_pkgs ${POSTRES_PACKAGES} + system.install_pkgs ${_pg_packages} + ${ui}.lineup + ${ui}.writeln + ${ui}.writeln - pg_conftool ${_pg_version} main set listen_addresses '*' - pg_conftool ${_pg_version} main set log_timezone 'America/Sao_Paulo' - pg_conftool ${_pg_version} main set shared_preload_libraries ${_pg_shared_preload} + _pg_cluster=$(pg_lsclusters | awk '/^17/ {print $2}') + ${ui}.status info $"Configurando cluster PostgresSQL %s" "[${_pg_version}-${_pg_cluster}]" - local _pg_hba_file="/etc/postgresql/${_pg_version}/main/pg_hba.conf" - sudo cat <<-EOF | sed 's/^\s*\(.*\)/\1/g' > ${_pg_hba_file} + pg_conftool ${_pg_version} ${_pg_cluster} set listen_addresses '*' + pg_conftool ${_pg_version} ${_pg_cluster} set log_timezone 'America/Sao_Paulo' + pg_conftool ${_pg_version} ${_pg_cluster} set shared_preload_libraries ${_pg_shared_preload} + + _pg_port=$(pg_conftool \ + ${_pg_version} ${_pg_cluster} show port \ + | grep -iPo '[0-9]*') + + _pg_hba_file=$(pg_conftool \ + ${_pg_version} ${_pg_cluster} show hba_file \ + | grep -iPo ".*[\'\"]\K[\S]*.conf") + + cat <<-EOF | sed 's/^\s*\(.*\)/\1/g' > ${_pg_hba_file} # Local Administrative User local all postgres peer # "local" is for Unix domain socket connections only @@ -480,101 +433,166 @@ function system.install_postgres { #host replication all ::1/128 scram-sha-256 EOF - ${ui}.status info $"Reiniciando o cluster [%s/%s] ... " ${_pg_version} "main" - pg_ctlcluster ${_pg_version} main restart - ${ui}.color gold - pg_lsclusters ${_pg_version} main | while read line; do \ - case "$line" in \ - *online*) ${ui}.color green ;; \ - *down*) ${ui}.color red ;; \ - esac; \ - ${ui}.status tab "${line}"; \ - done - ${ui}.color none + ${ui}.status info $"Cluster configurado. Configuração (JSON): %s" + ( + pg_conftool ${_pg_version} ${_pg_cluster} show all \ + | jq -nR '{ "postgresql.conf": [ inputs ] }'; \ + sed -e '/^#/d;s/\ \+/\ /g' "${_pg_hba_file}" \ + | jq -nR '{ "pg_hba.conf": [ inputs ] }'; + ) | jq -s '.' + ${ui}.writeln + + ${ui}.status info $"Reiniciando o cluster " \ + "$(${ui}.print "[%s/%s] ..." "${_pg_version}" "${_pg_cluster}")" + ${ui}.writeln + echo + pg_ctlcluster ${_pg_version} ${_pg_cluster} restart + pg_lsclusters ${_pg_version} ${_pg_cluster} \ + | awk '/(on|off)line/ { print $1"/"$2,"["$4"]:"}' \ + | while read line; do + case "${line}" in + *"online"*) + ${ui}.tab 2 + ${ui}.status success "$(${ui}.color green "${line}")" + ${ui}.item "$(${ui}.color green "$(ss -nlt | grep ${_pg_port})")" + ;; + *"down"*) + ${ui}.tab 2 + ${ui}.status failure "$(${ui}.color red "${line}")" + ;; + esac + done } -function system.install_pyenv { - local _pyenv_root=${@:1:1} - local _py_version=${@:2:1} +function plugin.pyenv { + local \ + _pyenv_root=${@:1:1} \ + _py_version=${@:2:1} \ + __pyenv __python \ + _log _py_test \ + _profile_script - PYENV_PACKAGES=" \ - gcc \ - libc6-dev \ - libreadline-dev \ - libssl-dev \ - libbz2-dev \ - zlib1g-dev \ - libsqlite3-dev \ - make \ - " - - ${ui}.subtitle "PyEnv (Python Environment)" export PYENV_ROOT="${_pyenv_root:-/usr/local/share/pyenv}" - useradd -M -d ${PYENV_ROOT} -s /bin/bash -r -U pyenv >/dev/null 2>&1 || : - - [[ -d "${PYENV_ROOT}" ]] && \ - ${ui}.status info $"PyEnv já está configurado!\n" && \ - return 0 - system.install_pkgs ${PYENV_PACKAGES} - #rm -rf ${PYENV_ROOT} - ${ui}.status info $"Instalando PyENV [%s] ..." ${PYENV_ROOT} - ${ui}.color gold - curl -ks https://pyenv.run | bash 2>&1 \ - | while read line; do \ - case "${line}" in \ - Cloning*) ${ui}.status tab "${line}";; \ - esac; \ - done - ${ui}.color none - - ${ui}.status info $"Executando PyEnv Doctor [%s] ..." ${PYENV_ROOT} - ${ui}.color gold __pyenv=${PYENV_ROOT}/bin/pyenv - ${__pyenv} doctor 2>&1 \ - | while read line; do \ - case "${line}" in \ - Congratulations*) ${ui}.color green && ${ui}.status tab "${line}";; \ - warning*|WARNING*) ${ui}.color orange && ${ui}.status tab "${line}";; \ - *error:*) ${ui}.color red && ${ui}.status tab "${line}";; \ - *) ${ui}.status tab "${line}";; \ - esac \ - done || exit ${?} - ${ui}.color none + __python=${PYENV_ROOT}/versions/${_py_version}/bin/python - ${ui}.status info $"Instalando Python [%s] ..." ${_py_version} - ${ui}.color gold - ${__pyenv} install ${_py_version} \ - | while read line; do \ - case "${line}" in \ - warning*|WARNING*) ${ui}.color orange && ${ui}.status tab "${line}";; \ - error*|ERROR*) ${ui}.color red && ${ui}.status tab "${line}";; \ - *) ${ui}.status tab "${line}";; \ - esac \ - done || exit ${?} - ${ui}.color none - chgrp -R pyenv ${PYENV_ROOT} - chmod -R g+rw ${PYENV_ROOT} - system.remove_pkgs ${PYENV_PACKAGES} - echo + _pyenv.install() { + _log=$(mktemp /tmp/${self}.pyenv-install.XXXXX) + curl -ks https://pyenv.run | bash 2>&1 \ + | grep Cloning \ + | tee -a ${_log} \ + | ${ui}.subprocess.output 5 \ + && (${ui}.subprocess.success $"PyEnv foi instalado com sucesso!" \ + "${__pyenv}\u0020${U_ITEM}\u0020$(${__pyenv} -v | sed 's/pyenv\s*//')" \ + ) \ + || ${ui}.subprocess.failure $"Erro ao instalar PyEnv" ${_log} PYENV 50 + ${ui}.clear + ${ui}.writeln + } - cat <<-EOF | sed 's/^\s*\(.*\)/\1/g' > /etc/profile.d/pyenv.sh - export PYENV_ROOT="${PYENV_ROOT}" - [[ -d \$PYENV_ROOT/bin ]] && export PATH="\$PYENV_ROOT/bin:\$PATH" - eval "\$(pyenv init - bash)" - eval "\$(pyenv virtualenv-init -)" -EOF + _pyenv.update() { + _log=$(mktemp /tmp/${self}.pyenv-update.XXXXX) + ${__pyenv} update 2>&1 \ + | tee -a ${_log} \ + | grep -v '*' \ + | ${ui}.subprocess.output 5 \ + && (${ui}.subprocess.success $"PyEnv foi atualizado com sucesso!" \ + "${__pyenv}\u0020${U_ITEM}\u0020$(${__pyenv} -v | sed 's/pyenv\s*//')" \ + ) \ + || ${ui}.subprocess.failure $"Erro ao atualizar PyEnv" ${_log} PYENV 50 + ${ui}.clear + ${ui}.writeln + } + + _pyenv.doctor() { + _log=${1:-$(mktemp /tmp/${self}.pyenv-doctor.XXXXX)} + ${__pyenv} doctor 2>&1 \ + | tee -a ${_log} \ + | ${ui}.subprocess.output 1 \ + && ${ui}.subprocess.success "$(tail -1 ${_log})" \ + || ${ui}.subprocess.failure "Falha" ${_log} PYENV 50 + } + + _pyenv.build() { + _log=${1:-$(mktemp /tmp/${self}.pyenv-python-build.XXXXX)} + env PYTHON_CONFIGURE_OPTS="--enable-shared" \ + ${__pyenv} install -fv ${_py_version} 2>&1 \ + | tee -a ${_log} \ + | ${ui}.subprocess.output 10 \ + && ${ui}.subprocess.success "$(${ui}.color green "$(tail -1 ${_log})")" \ + || ${ui}.subprocess.failure "Falha ao compilar Python" ${_log} PYENV 50 + } + + _pyenv.set_permissions() { + chgrp -R pyenv ${PYENV_ROOT} + chmod -R g+rw ${PYENV_ROOT} + } + + _pyenv.set_environment() { + # Map pyenv python2 to system + ln -snf \ + ${_pyenv_root}/versions/${_py_version}/bin/{pip,python}2* \ + /usr/local/bin/ || : + + readarray -t _profile_script < <(echo \ + "case \"\$(groups)\" in\n\ + \t*\"pyenv\"*)\n\ + \t\texport PYENV_ROOT=\"${PYENV_ROOT}\"\n\ + \t\t[[ -d \"\${PYENV_ROOT}/bin\" ]] \ + && export PATH=\"\${PYENV_ROOT}/bin:\${PATH}\"\n\ + \t\teval \"\$(pyenv init - bash)\"\n\ + \t\t#eval \"\$(pyenv virtualenv-init -)\"\n\ + \t;;\n\ + \resac" + ) + echo -e ${_profile_script[@]} \ + | sed 's/\s*\r//g;s/\t/ /g' > /etc/profile.d/pyenv.sh + } + + if [[ -x "${__pyenv}" ]]; then + ${ui}.status info $"PyEnv já está instalado. Atualizando ..." + ${ui}.get_cursor + _pyenv.update + else + ${ui}.status info "$(${ui}.print $"Instalando PyEnv [%s] ..." ${PYENV_ROOT})" + ${ui}.get_cursor + useradd -M -d ${PYENV_ROOT} -s /bin/bash -r -U pyenv >/dev/null 2>&1 || : + _pyenv.install + fi + ${ui}.writeln + + _py_test="$(${__python} -V 2>&1 || :)" + if [[ "${_py_test}" =~ "No such file or directory" ]]; then + _log=$(mktemp /tmp/${self}.pyenv-python-build.XXXXX) + rm -rf /tmp/python-*.log # Remove previous PyEnv logs + ${ui}.status info "$(${ui}.print $"Verificando dependências ..." ${PYENV_ROOT})" + ${ui}.get_cursor && _pyenv.doctor ${_log} + ${ui}.status info "$(${ui}.print $"Compilando Python [%s] ..." ${_py_version})" + ${ui}.get_cursor && _pyenv.build ${_log} + rm -rf /tmp/python-*.log # Remove current (duplicated) PyEnv logs + else + ${ui}.status info $"Python já está instalado:" + ${ui}.color green " $(${ui}.item "${__python}")" + ${ui}.writeln + fi + ${ui}.clear + ${ui}.writeln + + _pyenv.set_permissions + _pyenv.set_environment + ${ui}.writeln } # == Installer =================================================================================== # function installer.configure { - local \ - _passphrase=$(${ui}.prompt $"Frase secreta para acesso aos downloads: ") + local _passphrase + ${ui}.prompt $"Frase secreta para acesso aos downloads: " _passphrase PRIVKEY_PASSPHRASE="${_passphrase}" ! [[ "X" == "${PRIVKEY_PASSPHRASE}X" ]] && \ - ${ui}.status info $"Frase secreta armazenada com sucesso." ${_passphrase} + ${ui}.status info $"Frase secreta armazenada com sucesso." } function installer.download { @@ -606,7 +624,7 @@ function installer.download { rm -f ${_token} } -function installer.download_metadata { +function installer.get_metadata { local \ _metadata_uri="installer/config/sig-installer" \ _metadata_name="${1:-products}" @@ -617,7 +635,7 @@ function installer.download_metadata { silent } -function installer.load_products { +function installer.get_products { local \ _product_metadata="${metadata_cache}/products.yml" \ _version_metadata="${metadata_cache}/versions.yml" \ @@ -642,32 +660,23 @@ function installer.product.menu { _products _prod_variant _prod_name _prod_color \ _prod_version _id _prod - cli.set_cursor 0 0 cli.section "%s [VERSÃO: %s] - CONFIGURAÇÃO DE PRODUTOS${EL}\n" \ ${self^^} \ ${version} \ "$( - ${ui}.status info $"Atualizando metadados de produtos... " - installer.download_metadata products - installer.download_metadata versions - installer.download_metadata repos - _products="$(installer.load_products)" + ${ui}.status info "%s" $"Atualizando metadados de produtos... " + installer.get_metadata products + installer.get_metadata versions + installer.get_metadata repos )" - #PRIVKEY_PASSPHRASE=Sig%$ºluc03s - while [[ -z "${PRIVKEY_PASSPHRASE}" ]]; do - installer.configure - done + ${ui}.lineup 2 + ${ui}.status info "%s" $"Carregando lista de produtos... " + _products="$(installer.get_products)" + ${ui}.writeln - exit 1 - ${ui}.status info $"Atualizando metadados de produtos... " - installer.download_metadata products - installer.download_metadata versions - installer.download_metadata repos - _products="$(installer.load_products)" - - #${ui}.title $"Produtos:"; ${ui}.title $"Instalar/Atualizar Produtos:" + ${ui}.subtitle $"Produtos:" _id=1 declare -A products @@ -678,28 +687,35 @@ function installer.product.menu { _prod_color=$(parsers.yaml "${_product_metadata}" "products.${_prod}.color") _prod_version=$(parsers.yaml "${_version_metadata}" "products.${_prod}-${_prod_variant}") - ${ui}.status tab "$( \ - ${ui}.color blue)${_id}.$(${ui}.color none) $( \ - ${ui}.print \ - "%s (%s) [%s: %s]" \ - "${F_BOLD}Sig${NO_FMT}$(${ui}.color ${_prod_color})${_prod_name#Sig*}${NO_FMT}" \ - ${_prod_variant^} \ - $"VERSÃO" $(${ui}.color orange)${_prod_version#*/}$(${ui}.color none) \ - )" + ${ui}.tab +# ${ui}.print "$( \ +# ${ui}.color blue)${_id}.$(${ui}.color none) $( \ +# ${ui}.print \ +# "%s (%s) [%s: %s]" \ +# "${F_BOLD}Sig${F_NONE}$(${ui}.color ${_prod_color})${_prod_name#Sig*}${F_NONE}" \ +# ${_prod_variant^} \ +# $"VERSÃO" $(${ui}.color orange)${_prod_version#*/}$(${ui}.color none) \ +# )" + ${ui}.print "[%s] %s%s (%s) [%s: %s]\n" \ + "$(${ui}.color blue ${_id})" \ + "Sig" \ + "${_prod_name#Sig*}" \ + "${_prod_variant}" \ + "VERSÃO ${_prod_version#*/}" let _id=_id+1 done; echo ${ui}.subtitle $"Configurações:" - ${ui}.status tab "$( \ - ${ui}.color blue)C.$(${ui}.color none) $( \ - ${ui}.print $"Configuração do Instalador" \ - )" + ${ui}.tab + printf "[%s] %s\n" \ + "$(${ui}.color blue c)" \ + $"Configuração do Instalador" - ${ui}.status tab "$( \ - ${ui}.color blue)Q.$(${ui}.color none) $( \ - ${ui}.print $"Limpar downloads e Sair" \ - )" + ${ui}.tab + printf "[%s] %s\n" \ + "$(${ui}.color blue q)" \ + $"Limpar downloads e Sair" ${ui}.line ${ui}.prompt $"Selecione a opção: " id @@ -716,159 +732,6 @@ function installer.product.menu { # == Products ==================================================================================== # -function product.get_requires { - import /etc/os-release - local _os_id=${ID} - - _get_product_requires() { - local \ - _prod_metadata="${CACHEDIR}/products.yml" \ - _version_metadata="${CACHEDIR}/versions.yml" \ - _prod_name _prod_variant _prod_color _prod_paths \ - _prod_requires _prod_buildreq _prod_config _prod_version \ - _rq _br _pkg _repo - - ! [[ "X" == "${PRODUCT:-${1}}X" ]] || return 1 - - _prod_requires=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.requires") - _prod_buildreq=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.buildrequires") - - # Not used here: - #_prod_name=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.name") - #_prod_variant=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.variant") - #_prod_color=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.color") - #_prod_paths=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.paths") - #_prod_config=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.config") - #_prod_version=$(parsers.yaml ${_version_metadata} "products.${PRODUCT}-${_prod_variant}") - - for _rq in ${_prod_requires}; do - [[ "${_rq}" =~ "${_os_id}" ]] && : "${_rq#*/}"; REQUIRES+="${_%~*} " - done - - for _br in ${_prod_buildreq}; do - [[ "${_br}" =~ "${_os_id}" ]] && : "${_br#*/}"; BUILD_REQUIRES+="${_%~*} " - done - - for _pkg in ${_prod_requires} ${_prod_buildreq}; do - : "${_pkg%"${_pkg##*\/}"}"; _repo=${_%\/*} - case ${_repo} in - ""|default) continue ;; - local) echo "${_pkg}" >> ${CACHEDIR}/${PRODUCT}.local.build ;; - sig) DOWNLOADS+="${_pkg} " ;; - *) ! [[ "${REPOS}" =~ "${_repo}" ]] && REPOS+="${_repo} " - esac - done - } - - _get_product_repos_requires() { - local \ - repo_metadata="${CACHEDIR}/repos.yml" \ - _repo _repo_summary _repo_type _repo_dists \ - _repo_requires _repo_buildreq _repo_script \ - _rq _br - - for _repo in ${REPOS}; do - _repo_requires=$(parsers.yaml ${repo_metadata} "repos.${_repo}.requires") - _repo_buildreq=$(parsers.yaml ${repo_metadata} "repos.${_repo}.buildrequires") - - # Not used here: - #_repo_summary=$(parsers.yaml ${repo_metadata} "repos.${_repo}.summary") - #_repo_type=$(parsers.yaml ${repo_metadata} "repos.${_repo}.type") - #_repo_dists=$(parsers.yaml ${repo_metadata} "repos.${_repo}.dists") - #_repo_script=$(parsers.yaml ${repo_metadata} "repos.${_repo}.run") - done - - for _rq in ${_repo_requires:-}; do - [[ "${_rq}" =~ "${_os_id}" ]] && : "${_rq#*/}"; REQUIRES+="${_%~*} " - done - - for _br in ${_repo_buildreq:-}; do - [[ "${_br}" =~ "${_os_id}" ]] && : "${_br#*/}"; BUILD_REQUIRES+="${_%~*} " - done - } - - _get_product_requires - _get_product_repos_requires - - #DEBUG=1 - #${ui}.status info "%s: %s\n" $"Requires" "${REQUIRES}" - #${ui}.status info "%s: %s\n" $"BuildRequires" "${BUILD_REQUIRES}" - #${ui}.status info "%s: %s\n" $"Repos" "${REPOS}" - #[[ ${DEBUG:-0} -gt 0 ]] && sleep 10 - #return 0 -} - -function product.setup_repos { - local \ - _repo _repo_name _repo_summary \ - _repo_script - - _product.repo.get_property() { - local \ - __repo_metadata="${CACHEDIR}/repos.yml" \ - __repo="${1:-}" \ - __repo_property="${2:-}" - - echo "$(parsers.yaml ${__repo_metadata} "repos.${__repo}.${__repo_property}")" - } - - for _repo in ${REPOS}; do - _repo_name=${_repo} - _repo_summary="$(_product.repo.get_property ${_repo} summary)" - _repo_type=$(_product.repo.get_property ${_repo} type) - - ${ui}.status info $"Configurando Repositório [%s]" ${_repo_name} - ${ui}.status tab $"Sumário: ${_repo_summary}\n" - case ${_repo_type} in - local) true ;; - run) - _repo_script=$(_product.repo.get_property ${_repo} run) - ;; - deb) echo "Não implementado" ;; - rpm-md) echo "Não Implementado" ;; - *) true ;; - esac - eval $(echo "${_repo_script}") - done -} - -function product.get_property { - local \ - _prod_variant \ - _prod_verpath - - _get_property() { - metadata_cache="${CACHEDIR}" - - local \ - _product_metadata="${metadata_cache}/products.yml" \ - _version_metadata="${metadata_cache}/versions.yml" \ - _key=${PRODUCT}${1:-} - - echo $(parsers.yaml "${_product_metadata}" \ - "products.${_key}") - } - - _prod_variant=$(_get_property .variant) - - # Treat if product has variants: - # true: verpath field comes from yaml key <product>-<variant> - # false: verpath field comes from yaml key <product> - ! [[ "${PRODUCT}" == "${_prod_variant}" ]] \ - && _prod_verpath=$(_get_property -${_prod_variant}) \ - || _prod_verpath=$(_get_property) - - case "${1:-}" in - name) echo "$(_get_property .name)" ;; - version) echo "$(basename ${_prod_verpath})" ;; - variant) echo "$(_get_property .variant)" ;; - dowload_uri) continue ;; - cache_file) continue ;; - *) true ;; - esac - -} - function product.download { metadata_cache="${CACHEDIR}" @@ -944,318 +807,268 @@ function product.download { --quiet done - exit 1 - chmod g+rx,o+rx ${CACHEDIR} ${ui}.status info $"Download concluído." #${ui}.prompt $"Pressione uma tecla para continuar ... " } -function product.install { - ${ui}.clear - ${ui}.init $"%s [VERSÃO: %s] - INSTALAÇÃO DO PRODUTO\n" ${self^^} ${version} - ${ui}.title "$(product.get_property name)" +function product.get_property { + local \ + _prod_variant \ + _prod_verpath - mkdir -p /srv/sig + _get_property() { + metadata_cache="${CACHEDIR}" + + local \ + _product_metadata="${metadata_cache}/products.yml" \ + _version_metadata="${metadata_cache}/versions.yml" \ + _key=${PRODUCT}${1:-} + + echo $(parsers.yaml "${_product_metadata}" \ + "products.${_key}") + } + + _prod_variant=$(_get_property .variant) + + # Treat if product has variants: + # true: verpath field comes from yaml key <product>-<variant> + # false: verpath field comes from yaml key <product> + ! [[ "${PRODUCT}" == "${_prod_variant}" ]] \ + && _prod_verpath=$(_get_property -${_prod_variant}) \ + || _prod_verpath=$(_get_property) + + case "${1:-}" in + name) echo "$(_get_property .name)" ;; + version) echo "$(basename ${_prod_verpath})" ;; + variant) echo "$(_get_property .variant)" ;; + *) echo "$(_get_property ."${1:-}")" || : ;; + esac + +} + +function product.get_requires { + import /etc/os-release + local _os_id=${ID} + + _get_product_requires() { + local \ + _prod_metadata="${CACHEDIR}/products.yml" \ + _version_metadata="${CACHEDIR}/versions.yml" \ + _prod_name _prod_variant _prod_color _prod_paths \ + _prod_requires _prod_buildreq _prod_config _prod_version \ + _rq _br _pkg _repo + + ! [[ "X" == "${PRODUCT:-${1:-}}X" ]] || return 1 + + _prod_requires=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.requires") + _prod_buildreq=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.buildrequires") + + # Not used here: + #_prod_name=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.name") + #_prod_variant=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.variant") + #_prod_color=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.color") + #_prod_paths=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.paths") + #_prod_config=$(parsers.yaml ${_prod_metadata} "products.${PRODUCT}.config") + #_prod_version=$(parsers.yaml ${_version_metadata} "products.${PRODUCT}-${_prod_variant}") + + for _rq in ${_prod_requires}; do + [[ "${_rq}" =~ "${_os_id}" ]] && : "${_rq#*/}"; REQUIRES+="${_%~*} " + done + + for _br in ${_prod_buildreq}; do + [[ "${_br}" =~ "${_os_id}" ]] && : "${_br#*/}"; BUILD_REQUIRES+="${_%~*} " + done + + for _pkg in ${_prod_requires} ${_prod_buildreq}; do + : "${_pkg%"${_pkg#*\/}"}"; _repo=${_%\/*} + case ${_repo} in + ""|default) continue ;; + local) echo "${_pkg}" >> ${CACHEDIR}/${PRODUCT}.local.build ;; + sig) DOWNLOADS+="${_pkg} " ;; + *) ! [[ "${REPOS}" =~ "${_repo}" ]] && REPOS+="${_repo} " + esac + done + } + + _get_product_repos_requires() { + local \ + repo_metadata="${CACHEDIR}/repos.yml" \ + _repo _repo_summary _repo_type _repo_dists \ + _repo_requires _repo_buildreq _repo_script \ + _rq _br + + for _repo in ${REPOS}; do + _repo_requires=$(parsers.yaml ${repo_metadata} "repos.${_repo}.requires") + _repo_buildreq=$(parsers.yaml ${repo_metadata} "repos.${_repo}.buildrequires") + + # Not used here: + #_repo_summary=$(parsers.yaml ${repo_metadata} "repos.${_repo}.summary") + #_repo_type=$(parsers.yaml ${repo_metadata} "repos.${_repo}.type") + #_repo_dists=$(parsers.yaml ${repo_metadata} "repos.${_repo}.dists") + #_repo_script=$(parsers.yaml ${repo_metadata} "repos.${_repo}.run") + done + + for _rq in ${_repo_requires:-}; do + [[ "${_rq}" =~ "${_os_id}" ]] && : "${_rq#*/}"; REQUIRES+="${_%~*} " + done + + for _br in ${_repo_buildreq:-}; do + [[ "${_br}" =~ "${_os_id}" ]] && : "${_br#*/}"; BUILD_REQUIRES+="${_%~*} " + done + } + + _get_product_requires + _get_product_repos_requires + + #DEBUG=1 + #${ui}.status info "%s: %s\n" $"Requires" "${REQUIRES}" + #${ui}.status info "%s: %s\n" $"BuildRequires" "${BUILD_REQUIRES}" + #${ui}.status info "%s: %s\n" $"Repos" "${REPOS}" + #[[ ${DEBUG:-0} -gt 0 ]] && sleep 10 + #return 0 +} + +function product.install { + metadata_cache="${CACHEDIR}" + + cli.section "%s [VERSÃO: %s] - INSTALAÇÃO DO PRODUTOS${EL}\n" \ + ${self^^} \ + ${version} || : + + ${ui}.title $"Produto: " "$(product.get_property name)" + + #system.setlocale pt_BR.UTF-8 + #product.download + + _paths="$(product.get_property paths)" + _keys="$(echo "${_paths//\'/\"}" | jq 'keys_unsorted[]')" + + ${ui}.status info $"Criando diretórios e links ... " + for _k in ${_keys[*]}; do + _dir=$(echo "${_paths//\'/\"}" | jq ".${_k}") + mkdir -p ${_dir} \ + && (${ui}.tab; ${ui}.item "${_dir//\"/}") + done ln -snf /srv/sig /sig + ${ui}.writeln + + # -- Configurando repositórios + product.setup_repos ${REPOS} # -- Instalando pacotes necessários system.install_pkgs ${BUILD_REQUIRES} - - - - _pdpy=$(parsers.yaml ${CACHEDIR}/products.yml "products.${PRODUCT}.python") - _name=$(parsers.yaml ${CACHEDIR}/products.yml "products.${PRODUCT}.name") - _libs=$(parsers.yaml ${CACHEDIR}/products.yml "products.${PRODUCT}.download") - _pdpv=$(parsers.yaml ${CACHEDIR}/versions.yml "products.python${_pdpy/.*}.${PRODUCT}") - - useradd -m -d /srv/sig/${PRODUCT} -s /bin/bash -G pyenv -r -U ${PRODUCT} 2>/dev/null || : - cat /etc/skel/.bashrc > /srv/sig/${PRODUCT}/.bashrc - echo -e "\n# Load Python ${_pdpy}\npyenv local ${_pdpy} >/dev/null 2>&1" >> /srv/sig/${PRODUCT}/.bashrc - echo ${_pdpy} > /srv/sig/${PRODUCT}/.python-version - - ${ui}.status info $"Instalando produto [%s] ..." "${_name}" - ${ui}.color gold - runuser -l ${PRODUCT} -- python -m pip install --upgrade --user pip - runuser -l ${PRODUCT} -- python -m pip install --upgrade --user setuptools - for _lib in ${_libs}; do - _lbpv=$(parsers.yaml ${CACHEDIR}/versions.yml libs.python${_pdpy/.*}.${_lib}) - runuser -l ${PRODUCT} -- python -m pip install --user \ - "${CACHEDIR}/${PRODUCT}/${_lib}-${_lbpv#*/}.tar.gz" - if [[ "${_lib}" == "kiwi" ]]; then - _f=/srv/sig/${PRODUCT}/.local/lib/python2.7/site-packages/kiwi/__installed__.py - find $(dirname ${_f})/ -name *.pyc -delete - download "installer/config/${PRODUCT}/__installed__.py" "${_f}" \ - && chown -R ${PRODUCT}:${PRODUCT} "${_f}" \ - && chmod 644 ${_f} \ - && touch ${_f} - fi + # -- Compilando requisitos não empacotados + _builds=$(grep "^local/" ${metadata_cache}/${PRODUCT}.local.build) + for _build in ${_builds}; do + _build=${_build#*/} + _type=${_build%:*} + _args=${_build#*:} + case "${_type}" in + plugin) + _callback="plugin.${_args%@*}" + _k_args=${_args#*@} + ;; + esac + ${ui}.subtitle $"Executando plugin: "${_args%@*} + ${_callback} ${_k_args//;/\ } done - case "${PRODUCT}" in - sigerp) - _date=$(date +%Y%m%d%H%M%S) - _pdpy=$(parsers.yaml ${CACHEDIR}/products.yml "products.${PRODUCT}.python") + ## -- SIG ----------------------------- # + # Pyenv +# useradd -m -d /srv/sig/${PRODUCT} -s /bin/bash -G pyenv -r -U ${PRODUCT} 2>/dev/null || : +# cat /etc/skel/.bashrc > /srv/sig/${PRODUCT}/.bashrc +# echo -e "\n# Load Python ${_pdpy}\npyenv local ${_pdpy} >/dev/null 2>&1" >> /srv/sig/${PRODUCT}/.bashrc +# echo ${_pdpy} > /srv/sig/${PRODUCT}/.python-version +# +# # Pip modules +# ${ui}.status info $"Instalando produto [%s] ..." "${_name}" +# ${ui}.color gold +# runuser -l ${PRODUCT} -- python -m pip install --upgrade --user pip +# runuser -l ${PRODUCT} -- python -m pip install --upgrade --user setuptools +# for _lib in ${_libs}; do +# _lbpv=$(parsers.yaml ${CACHEDIR}/versions.yml libs.python${_pdpy/.*}.${_lib}) +# runuser -l ${PRODUCT} -- python -m pip install --user \ +# "${CACHEDIR}/${PRODUCT}/${_lib}-${_lbpv#*/}.tar.gz" +# if [[ "${_lib}" == "kiwi" ]]; then +# _f=/srv/sig/${PRODUCT}/.local/lib/python2.7/site-packages/kiwi/__installed__.py +# find $(dirname ${_f})/ -name *.pyc -delete +# download "installer/config/${PRODUCT}/__installed__.py" "${_f}" \ +# && chown -R ${PRODUCT}:${PRODUCT} "${_f}" \ +# && chmod 644 ${_f} \ +# && touch ${_f} +# fi +# done - # Addons SigERP - [[ -d "/srv/sig/${PRODUCT}/addons" ]] && \ - mv \ - /srv/sig/${PRODUCT}/addons \ - /srv/sig/${PRODUCT}/addons.${_date}.bak - mkdir -p /srv/sig/${PRODUCT}/{addons,config,logs,data-dir} /run/${PRODUCT} - tar -C /srv/sig/${PRODUCT}/addons/ \ - -xzf ${CACHEDIR}/${PRODUCT}/${PRODUCT}-${_pdpv#*/}.tar.gz - download "installer/config/${PRODUCT}/requirements.txt" \ - "/srv/sig/${PRODUCT}/addons/requirements.txt" - [[ -f "/srv/sig/${PRODUCT}/addons/requirements.txt" ]] && \ - runuser -l ${PRODUCT} -- \ - python -m pip install -r /srv/sig/${PRODUCT}/addons/requirements.txt --user - chown -R ${PRODUCT}: /srv/sig/${PRODUCT}/ /run/${PRODUCT} + #system.remove_pkgs ${BUILD_REQUIRES} - # Runner and systemd units - download "installer/config/${PRODUCT}/sigerp-runner-pyenv-${_pdpy}.sh" \ - "/srv/sig/${PRODUCT}/sigerp-runner" \ - && chmod +x "/srv/sig/${PRODUCT}/sigerp-runner" \ - && ln -snf \ - "/srv/sig/${PRODUCT}/sigerp-runner" \ - "/usr/local/bin/sigerp-runner" - download "installer/config/${PRODUCT}/sigerp.service" \ - "/srv/sig/${PRODUCT}/sigerp.service" \ - && ln -snf \ - "/srv/sig/${PRODUCT}/sigerp.service" \ - "/etc/systemd/system/sigerp.service" \ - && ln -snf \ - "sigerp.service" \ - "/etc/systemd/system/openerp.service" - download "installer/config/${PRODUCT}/sigerp@.service" \ - "/srv/sig/${PRODUCT}/sigerp@.service" \ - && ln -snf \ - "/srv/sig/${PRODUCT}/sigerp@.service" \ - "/etc/systemd/system/sigerp@.service" \ - && ln -snf \ - "sigerp.service@" \ - "/etc/systemd/system/openerp@.service" - - # Config file - download "installer/config/${PRODUCT}/sigerp-${_pdpy}.conf" \ - "/srv/sig/${PRODUCT}/config/sigerp.conf" - - # Artwork SigERP - download "installer/config/${PRODUCT}/artwork-sigerp.zip" \ - "${CACHEDIR}/${PRODUCT}/artwork-sigerp.zip" \ - && unzip -o -d \ - "/srv/sig/${PRODUCT}/.local/lib/python${_pdpy%.*}/site-packages/" \ - -x "${CACHEDIR}/${PRODUCT}/artwork-sigerp.zip" - - # Runtime dependencies - SIGERP_PACKAGES="\ - atop \ - libmysqlclient21 \ - net-tools \ - rclone \ - tmate \ - vim-nox \ - " - system.install_pkgs ${SIGERP_PACKAGES} - - # Create/Alter PostgreSQL user - local _dbuser="openerp" - local _password=$(openssl rand -base64 32 | sed 's/\//|/g') - ${ui}.status info $"Criando/Atualizando usuário do banco de dados [%s]" ${PRODUCT} - sudo -iu postgres \ - psql -c \ - "CREATE USER ${_dbuser} WITH \ - PASSWORD '${_password}' \ - CREATEDB;" \ - || \ - sudo -iu postgres \ - psql -c \ - "ALTER USER ${_dbuser} WITH \ - PASSWORD '${_password}' \ - CREATEDB;" - - if [[ 0${?} -eq 0 ]]; then - sed -i "s/.*db_password.*/db_password = ${_password}/g" \ - "/srv/sig/${PRODUCT}/config/sigerp.conf" - ${ui}.status warn $"Senha de acesso ao banco de dados: %s" ${_password} - sleep 5 - fi - - systemctl daemon-reload - systemctl enable --now sigerp.service || : - ;; - sigpdv) - _date=$(date +%Y%m%d%H%M%S) - - # -- Faz o backup da pasta anterior do SigPDV - [[ -d "/srv/sig/${PRODUCT}/sigpdv" ]] && \ - mv \ - /srv/sig/${PRODUCT}/sigpdv \ - /srv/sig/${PRODUCT}/sigpdv.${_date}.bak - - - # -- Cria a árvore de diretórios do SigPDV - mkdir -p /srv/sig/${PRODUCT}/sigpdv - mkdir -p /usr/local/sigext - mkdir -p /recebe - - # -- Instala pacotes necessários para rodar o programa - SIGPV_PACKAGES=" - atop \ - libmysqlclient21 \ - mousepad \ - net-tools \ - qt5dxcb-plugin \ - system-config-printer \ - terminator \ - rclone \ - tmate \ - vim-nox \ - " - system.install_pkgs ${SIGPV_PACKAGES} - - # -- Download e instalação dos addons e aplicação de correções - tar -C /srv/sig/${PRODUCT}/ \ - -xzf ${CACHEDIR}/${PRODUCT}/${PRODUCT}-${_pdpv#*/}.tar.gz - ln -snf \ - /srv/sig/${PRODUCT}/sigpdv \ - /srv/sig/sigpdv/.local/lib/python2.7/site-packages/ - ln -snf \ - /srv/sig/${PRODUCT}/sigpdv \ - /usr/local/ - # Correção para erro "Dois frentes em execução" - download "installer/config/${PRODUCT}/${PRODUCT}-single-instance-fix.patch" \ - "${CACHEDIR}/sigpdv/${PRODUCT}-single-instance-fix.patch" - patch -d /srv/sig/${PRODUCT}/sigpdv \ - -p0 < "${CACHEDIR}/sigpdv/${PRODUCT}-single-instance-fix.patch" - - # -- Instalação dos módulos python de dependências - download "installer/config/${PRODUCT}/requirements.txt" \ - "/srv/sig/${PRODUCT}/sigpdv/requirements.txt" - [[ -f "/srv/sig/${PRODUCT}/sigpdv/requirements.txt" ]] && \ - runuser -l ${PRODUCT} -- \ - python -m pip install -qq -r /srv/sig/${PRODUCT}/sigpdv/requirements.txt --user \ - && rm -f /srv/sig/${PRODUCT}/sigpdv/requirements.txt - - # -- Lançadores dos programas - download "installer/config/${PRODUCT}/${PRODUCT}-wrapper.sh" \ - "/srv/sig/${PRODUCT}/${PRODUCT}-wrapper.sh" \ - && chmod +x "/srv/sig/${PRODUCT}/${PRODUCT}-wrapper.sh" \ - && ln -snf "/srv/sig/${PRODUCT}/${PRODUCT}-wrapper.sh" /usr/local/bin/start-comanda \ - && ln -snf "/srv/sig/${PRODUCT}/${PRODUCT}-wrapper.sh" /usr/local/bin/start-consulta-cda \ - && ln -snf "/srv/sig/${PRODUCT}/${PRODUCT}-wrapper.sh" /usr/local/bin/start-pdvconfig \ - && ln -snf "/srv/sig/${PRODUCT}/${PRODUCT}-wrapper.sh" /usr/local/bin/start-sigpdv \ - && ln -snf "/srv/sig/${PRODUCT}/${PRODUCT}-wrapper.sh" /usr/local/bin/start-sigpve - ln -snf \ - /srv/sig/${PRODUCT}/${PRODUCT}/debian/icons/* \ - /usr/share/pixmaps/ - mkdir /usr/local/share/applications/ \ - && ln -snf \ - /srv/sig/${PRODUCT}/${PRODUCT}/debian/desktop-files/* \ - /usr/local/share/applications/ \ - && sed -i 's|/usr/bin|/usr/local/bin|g' /usr/local/share/applications/*.desktop \ - && update-desktop-database || : - - # -- Configuração padrão inicial - download "installer/config/${PRODUCT}/pdvconfig.cfg" \ - "/usr/local/sigext/pdvconfig.cfg" - download "installer/config/${PRODUCT}/CliSiTef.ini" \ - "/usr/local/sigext/CliSiTef.ini" - for amb in homologacao producao lib_ssl_antiga; do - ln -snf \ - "/usr/local/sigext/CliSiTef.ini" \ - /srv/sig/${PRODUCT}/${PRODUCT}/sigtef/lib_x86_64/${amb}/ - done - - # -- Configurações de segurança e dos usuários - local _app_user=${PRODUCT} - local _app_group=${_app_user} - # Acesso do usuário do desktop - local _desktop_user=$(getent passwd | sed '/x:1000/!d;s/:.*//g') - usermod -aG ${_app_group},pyenv ${_desktop_user} - # Configuração do sudo - download "installer/config/${PRODUCT}/${PRODUCT}.sudo" \ - "/etc/sudoers.d/${PRODUCT}" \ - && chown root:root "/etc/sudoers.d/${PRODUCT}" \ - && chmod 600 "/etc/sudoers.d/${PRODUCT}" - # Permissões de usuários e grupos - for dir in /srv/sig/${PRODUCT} /usr/local/sigext /recebe; do - chown -R ${_app_user}:${_app_group} ${dir} - chmod -R g+rw,o-rwx ${dir} - done - - # -- Configuração do banco de dados PostgreSQL - local _db_name=${PRODUCT} - local _db_user=${_db_name} - local _db_pass=$(openssl rand -base64 32 | sed 's/\//|/g') - ${ui}.status info $"Configurando o banco de dados [%s]" ${_db_name}} - sudo -iu postgres \ - psql -c \ - "CREATE USER ${_db_user} WITH \ - PASSWORD '${_db_pass}' \ - CREATEDB;" \ - || \ - sudo -iu postgres \ - psql -c \ - "ALTER USER ${_db_user} WITH \ - PASSWORD '${_db_pass}' \ - CREATEDB;" - if [[ 0${?} -eq 0 ]]; then - sed -i "s/.*db_pdv_pass.*/db_pdv_pass = ${_db_pass}/g" \ - "/usr/local/sigext/pdvconfig.cfg" - sudo -i -u postgres createdb -O ${_db_user} ${_db_name} >/dev/null 2>&1 || : - ${ui}.status warn $"Senha de acesso ao banco de dados: %s" ${_db_pass} - sleep 5 - fi - ;; - - sigvpn) - import /etc/os-release - - ${ui}.status info $"Configurando repositório OpenVPN ..." - local _name=suporte-sig - local _suite=${VERSION_CODENAME} - rm -f /etc/apt/trusted.gpg.d/openvpn*.gpg - curl -fsSL https://swupdate.openvpn.net/repos/repo-public.gpg \ - | gpg --dearmor \ - > /etc/apt/trusted.gpg.d/openvpn-repo-public.gpg - - rm -f /etc/apt/sources.list.d/openvpn*.list - echo "deb [arch=amd64] https://build.openvpn.net/debian/openvpn/stable ${_suite} main" \ - > /etc/apt/sources.list.d/openvpn-aptrepo.list - - ${ui}.status info $"Instalando pacotes..." - system.install_pkgs openvpn tmate - - ${ui}.status info $"Configurando serviço VPN ..." - while ! [[ -z "${_vpn_user}" ]]; do - local _vpn_user=$(${ui}.prompt $"Login de usuário da VPN: ") - done - - while ! [[ -z "${_vpn_pass}" ]]; do - local _vpn_pass=$(${ui}.prompt $"Senha do usuário da VPN: ") - done - echo -ne "${_vpn_user}\n${_vpn_pass}\n" > /etc/openvpn/client/${_name}.passwd \ - && cd /etc/openvpn/client \ - && (rm -rf ../${_name}.* >/dev/null 2>&1 || true) \ - && download "installer/config/openvpn/ovpn-local.ovpn" ${_name}.conf \ - && chown daemon:daemon ${_name}.conf ${_name}.passwd \ - && systemctl disable openvpn.service \ - && systemctl enable openvpn-client@${_name}.service \ - && systemctl restart openvpn-client@${_name}.service \ - && echo "net.ipv4.tcp_window_scaling=1" > /etc/sysctl.d/50-openvpn.conf \ - && cd - - ;; - esac - - #system.remove_pkgs ${BUILD_PACKAGES} - - ${ui}.color none ${ui}.status info $"Instalação concluída. REINICIE o computador." ${ui}.prompt $"Pressione ENTER para continuar ... " } +function product.setup_repos { + local \ + _repos=${@:-} \ + _repo + + _product.repo.get_property() { + local \ + __repo_metadata="${CACHEDIR}/repos.yml" \ + __repo="${1:-}" \ + __repo_property="${2:-}" + + echo "$(parsers.yaml ${__repo_metadata} "repos.${__repo}.${__repo_property}")" + } + + _product.repo.run_script() { + local \ + __repo="${1:-}" \ + __log=$(mktemp /tmp/sig-installer-${_repo}.XXXXX) \ + __script=$(_product.repo.get_property ${1:-} run) + + rm -rf /tmp/sig-installer-${__repo}.*.log + if ! [[ -z "${__script}" ]]; then + eval "$(echo "${__script}")" 2>&1 \ + | tee -a ${__log} \ + | ${ui}.subprocess.output 10 \ + && ${ui}.subprocess.success $"Repositório configurado com sucesso!" \ + || ( + ${ui}.subprocess.failure "Erro ao configurar repositório:" ${__log} REPOCFG 50; + ${ui}.status debug "Script:\n%s" "${__script}"; + ) + ${ui}.writeln + else + ${ui}.status error "Erro ao configurar repositório:" + ${ui}.status debug "Script:\n%s" "${__script}" + fi + } + + for _repo in ${@:-}; do + local \ + _repo_summary="$(_product.repo.get_property ${_repo} summary)" \ + _repo_type=$(_product.repo.get_property ${_repo} type) + + ${ui}.status info "$(cli.print $"Configurando Repositório [%s]" ${_repo})" + ${ui}.tab 2; ${ui}.item $"Descrição: ${_repo_summary}" + ${ui}.get_cursor + + case ${_repo_type} in + "copr") echo "Não implementado" ;; + "deb-list") echo "Não implementado" ;; + "deb-sources") echo "Não implementado" ;; + "flatpak") echo "Não implementado" ;; + "ppa") echo "Não implementado" ;; + "rpm-md") echo "Não implementado" ;; + "run") _product.repo.run_script "${_repo}" ;; + "snap") echo "Não implementado" ;; + "local") true ;; + "sig") true ;; + *) true ;; + esac + done +} + function product.sigpdv.setup_sigtef { local _sigtedir="/sig/sigpdv/sigtef/lib_x86_64" @@ -1274,6 +1087,7 @@ export DISTRO="${ID}" eval cli ui=${ui:-cli} +clear ${ui}.section "%s [VERSÃO: %s] - CONFIGURAÇÃO DO INSTALADOR\n" \ ${self^^} \ ${version} \ @@ -1282,28 +1096,21 @@ ${ui}.section "%s [VERSÃO: %s] - CONFIGURAÇÃO DO INSTALADOR\n" \ self.check_os || exit ${?}; \ )" +PRIVKEY_PASSPHRASE=Sig%$ºluc03s +while [[ -z "${PRIVKEY_PASSPHRASE}" ]]; do + installer.configure +done + self.check_essential # -- Configuração do sistema #${ui}.title $"Reconfigurando o sistema operacional" -#system.setlocale #system.check_net #system.setup_ntp -#${ui}.title $"Instalando e configurando serviços" -#system.install_postgres 17 citus-13.0 -#system.install_pyenv /usr/local/share/pyenv 2.7.18 - #${ui}.title $"Configurando contas de usuários" #system.create_user sig dialout,pyenv,sudo -#${ui}.status info $"CONFIGURAÇÃO INICIAL CONCLUÍDA!" -#${ui}.init "" -#${ui}.prompt $"Pressione ENTER para continuar ... " - -CACHEDIR=$(mktemp -d /tmp/${self}.cache.XXXXX) -PRIVKEY_PASSPHRASE= - # Menu while true; do PRODUCT= @@ -1314,9 +1121,6 @@ while true; do BUILD_REQUIRES= DOWNLOADS= product.get_requires - - #product.setup_repos - product.download product.install done