Reescrevendo procedimentos
This commit is contained in:
@@ -1,56 +1,66 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
self=$(basename ${0})
|
||||
self=${self/.*bash}
|
||||
version=2506.4
|
||||
|
||||
self=$(: "${0/*\/}"; echo ${_%%.*sh})
|
||||
version=2506.90
|
||||
|
||||
: ${LANG:=C.UTF-8}
|
||||
|
||||
# Read the configuration from all config files found
|
||||
CONFPATH="/etc/${self}:/usr/local/etc/${self}:.config:./config:."
|
||||
for _p in ${CONFPATH//:/\ }; do
|
||||
test -f ${_p}/${self}.conf && \
|
||||
. ${_p}/${self}.conf
|
||||
done
|
||||
|
||||
function cli { # Compressed built-in CLI
|
||||
cli.__init__() {
|
||||
local blob="\
|
||||
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 \
|
||||
0MMmahd1/gelgdo3VRQAAA== \
|
||||
"
|
||||
envfile=$(mktemp /tmp/sig-installer.env.XXXXXX)
|
||||
echo $blob | base64 -di | gunzip -dc > ${envfile}
|
||||
test -r ${envfile} && source ${envfile}
|
||||
rm -f ${envfile}
|
||||
}
|
||||
cli.__init__
|
||||
cli.clear
|
||||
}
|
||||
|
||||
# == Funções Gerais ============================================================================== #
|
||||
|
||||
function self.check_essential {
|
||||
# We need at least some programs installed
|
||||
local _essential=" \
|
||||
libarchive-tools:bsdtar \
|
||||
curl:curl \
|
||||
git-core:git \
|
||||
iproute2:ip \
|
||||
iputils-ping:ping \
|
||||
jq:jq \
|
||||
python3-yaml:jq \
|
||||
locales:locale-gen \
|
||||
openssh-server:sshd \
|
||||
sudo:sudo \
|
||||
unzip:unzip \
|
||||
tzdata:tzconfig \
|
||||
"
|
||||
|
||||
local _not_found=
|
||||
for _prog in ${_essential}; do
|
||||
if [[ -z "$(which ${_prog/*:})" ]]; then
|
||||
_not_found+=" ${_prog}"
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ ! -z "$_not_found" ]]; then
|
||||
clear
|
||||
echo -e "Os seguintes pacotes/programas são necessários para o instalador:\n"
|
||||
_pkgs=
|
||||
for _prog in ${_not_found}; do
|
||||
echo " - ${_prog/:*}: ${_prog/*:}"
|
||||
_pkgs+="${_prog/:*} "
|
||||
done
|
||||
read -p \
|
||||
$"Aperte ENTER para instalar os pacotes agora [CTRL+C para cancelar]: "
|
||||
apt-get update
|
||||
apt-get install -yq ${_pkgs}
|
||||
fi
|
||||
}
|
||||
self.check_essential
|
||||
|
||||
# -- Import functions from local or remote scripts
|
||||
function import {
|
||||
case ${1} in
|
||||
http?://*|ftp?://*)
|
||||
[[ -z "$(which curl 2>/dev/null)" ]] && return 1
|
||||
_tmpfile=$(mktemp /tmp/${self}.import.XXXXX)
|
||||
curl -ks ${1} -o ${_tmpfile} \
|
||||
&& source ${_tmpfile} \
|
||||
@@ -63,6 +73,105 @@ function import {
|
||||
return ${?}
|
||||
}
|
||||
|
||||
function self.check_sudo {
|
||||
# Check if user has sudo access
|
||||
if ! [[ (0$(id -u) -eq 0 || "$(groups)" =~ "sudo") ]]; then
|
||||
cli.status info $"Este programa deve ser executado com 'sudo'"
|
||||
cli.tab 9; cli.item $"Tente usar: $(cli.emphasis red 'sudo') ${0}"
|
||||
echo -ne "\E[0G\n"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function self.check_os {
|
||||
local _os_id="${ID}"
|
||||
local _os_name=$(cli.emphasis bold "%s" "${NAME// /-}")
|
||||
local _os_version=" $(cli.bold "${VERSION/\(*}")"${VERSION/*\(/(}""
|
||||
|
||||
cli.status info $"Sistema operacional detectado: "
|
||||
cli.tab 9
|
||||
case "${_os_id}" in
|
||||
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}") ;;
|
||||
esac
|
||||
return 0
|
||||
}
|
||||
|
||||
function self.check_essential {
|
||||
# We need at least some programs installed
|
||||
local _essential_ubuntu=" \
|
||||
libarchive-tools:/usr/bin/bsdtar \
|
||||
curl:/usr/bin/curl \
|
||||
git-core:/usr/bin/git \
|
||||
iproute2:/usr/bin/ip \
|
||||
iputils-ping:/usr/bin/ping \
|
||||
jq:/usr/bin/jq \
|
||||
python3-yaml:/usr/lib/python3/dist-packages/yaml \
|
||||
locales:/usr/sbin/locale-gen \
|
||||
openssh-server:/usr/sbin/sshd \
|
||||
sudo:/usr/bin/sudo \
|
||||
tzdata:/usr/sbin/tzconfig \
|
||||
"
|
||||
local _essential_fedora=" \
|
||||
bsdtar:/usr/bin/bsdtar \
|
||||
curl:/usr/bin/curl \
|
||||
git-core:/usr/bin/git \
|
||||
iproute:/usr/bin/ip \
|
||||
iputils:/usr/bin/ping \
|
||||
jq:/usr/bin/jq \
|
||||
python3-pyyaml:/usr/lib64/python$( \
|
||||
python3 -V 2>/dev/null | grep -iPo 'Python \K.[\d]*\.[\d]*' \
|
||||
)/site-packages/yaml \
|
||||
glibc-common:/usr/lib/locale/C.utf8 \
|
||||
glibc-langpack-en:/usr/lib/locale/en_US.utf8 \
|
||||
glibc-langpack-pt:/usr/lib/locale/pt_BR.utf8 \
|
||||
openssh-server:/usr/bin/sshd \
|
||||
sudo:/usr/bin/sudo \
|
||||
tzdata:/usr/share/zoneinfo \
|
||||
"
|
||||
|
||||
not_found=
|
||||
_essential=$(eval "echo \${_essential_${DISTRO}}")
|
||||
for _prog in ${_essential}; do
|
||||
if ! [[ -e "${_prog/*:}" ]] && [[ -z "$(which ${_prog/*:} 2>/dev/null)" ]]; then
|
||||
not_found+=" ${_prog}"
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ ! -z "$not_found" ]] || [[ 0${#not_found} -gt 0 ]]; then
|
||||
cli.status info "%s\n" $"As seguintes dependências são necessárias:"
|
||||
|
||||
local _pkgs=
|
||||
for _prog in ${not_found}; do
|
||||
local _arrow=$(cli.color green "${U_ITEM}")
|
||||
printf " %s %s [%s]\n" ${_arrow} ${_prog/*:} $(cli.color green "${_prog/:*}")
|
||||
_pkgs+="${_prog/:*} "
|
||||
done;
|
||||
system.install_pkgs "${_pkgs}"
|
||||
return ${#_pkgs}
|
||||
fi
|
||||
}
|
||||
|
||||
function self.get_token() {
|
||||
local _passphrase="Sig%$ºluc03s"
|
||||
|
||||
tail -n +$(( \
|
||||
${LINENO} + \
|
||||
$(\
|
||||
: "$( \
|
||||
grep -anP "^exit 0" ${0})"; \
|
||||
echo $(( ${_%%:*} - ${LINENO} + 2)) \
|
||||
) \
|
||||
)) ${0} | base64 -d \
|
||||
| bsdtar \
|
||||
--passphrase ${_passphrase} \
|
||||
-xOf -
|
||||
|
||||
return ${?}
|
||||
}
|
||||
|
||||
# -- YAML Parser
|
||||
: parsers.yaml file.yml key
|
||||
function parsers.yaml {
|
||||
@@ -85,39 +194,6 @@ function parsers.yaml {
|
||||
|
||||
}
|
||||
|
||||
# == UI =======================================================================+================= #
|
||||
# -- Import UI from dbtool
|
||||
ui=${ui:-cli}
|
||||
dbtool=https://raw.githubusercontent.com/infra7ti/dbtool/refs/heads/main
|
||||
import ${dbtool}/lib/ui/${ui}.bash
|
||||
|
||||
function cli.clear {
|
||||
clear
|
||||
}
|
||||
|
||||
function cli.status {
|
||||
${ui}.${@:1:1} && ${ui}.print "${@:2}"
|
||||
echo; return 0
|
||||
}
|
||||
|
||||
function cli.title {
|
||||
${ui}.color blue
|
||||
${ui}.emphasis "$(${ui}.subitem "${@^^}")"
|
||||
${ui}.color none
|
||||
${ui}.line
|
||||
}
|
||||
|
||||
function cli.subtitle {
|
||||
${ui}.subitem "${@^^} \n"
|
||||
printf "%0.s$(echo -ne "\u2508${NO_FMT}")" {1..80}
|
||||
echo
|
||||
}
|
||||
|
||||
function cli.prompt {
|
||||
read -p "$(${ui}.status tab "${1}")" ${2:-} k
|
||||
echo ${k}
|
||||
}
|
||||
|
||||
# == Configuração do Sistema====================================================================== #
|
||||
|
||||
function system.check_os {
|
||||
@@ -215,7 +291,7 @@ function system.setup_openssh {
|
||||
|
||||
# == Instalação de Pacotes e Aplicativos ======================================================== #
|
||||
|
||||
function system.install_pkgs {
|
||||
function system.install_pkgs_old {
|
||||
import /etc/os-release
|
||||
local _os_id=${ID}
|
||||
case ${_os_id} in
|
||||
@@ -241,6 +317,75 @@ function system.install_pkgs {
|
||||
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)
|
||||
case "${DISTRO}" in
|
||||
debian|ubuntu)
|
||||
printf "%0.s\n"
|
||||
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"
|
||||
;;
|
||||
fedora)
|
||||
cli.jump
|
||||
cli.status info "%s\n" $"Instalando os pacotes. Por favor aguarde ..."
|
||||
cli.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"
|
||||
;;
|
||||
*)
|
||||
cli.jump
|
||||
cli.status crit "%s" $"${DISTRO^}: Sistema operacional não suportado!"
|
||||
cli.jump
|
||||
;;
|
||||
esac
|
||||
cli.get_cursor
|
||||
}
|
||||
|
||||
function system.remove_pkgs {
|
||||
import /etc/os-release
|
||||
local _os_id=${ID}
|
||||
@@ -421,15 +566,13 @@ function system.install_pyenv {
|
||||
EOF
|
||||
}
|
||||
|
||||
|
||||
# == Installer =================================================================================== #
|
||||
|
||||
function installer.configure {
|
||||
local _passphrase
|
||||
local \
|
||||
_passphrase=$(${ui}.prompt $"Frase secreta para acesso aos downloads: ")
|
||||
|
||||
${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}
|
||||
}
|
||||
@@ -444,12 +587,13 @@ function installer.download {
|
||||
|
||||
local _token=$(mktemp /tmp/${self}.dl.XXXXXX)
|
||||
local _token_pass=${PRIVKEY_PASSPHRASE}
|
||||
local _seek=$(($(grep -anE "^exit 0" ${0} | cut -d: -f1) - ${LINENO} + 1))
|
||||
local _message="$(tail -n +$(( ${LINENO} + ${_seek} )) ${0})"
|
||||
#local _seek=$(($(grep -anE "^exit 0" ${0} | cut -d: -f1) - ${LINENO} + 1))
|
||||
#local _message="$(tail -n +$(( ${LINENO} + ${_seek} )) ${0})"
|
||||
|
||||
[[ -z "${_quiet}" ]] && ${ui}.status info $"Fazendo download [${_src}]"
|
||||
(echo ${_message} | base64 -d \
|
||||
| bsdtar --passphrase ${_token_pass} -C $(dirname ${_token}) -xOf - > ${_token} \
|
||||
#(echo ${_message} | base64 -d \
|
||||
# | bsdtar --passphrase ${_token_pass} -C $(dirname ${_token}) -xOf - > ${_token} \
|
||||
(self.get_token > ${_token} \
|
||||
&& chmod 0400 ${_token} \
|
||||
&& scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no \
|
||||
-qi ${_token} "${_repo_user}@${_repo_home}/${_src}" "${_dst}" \
|
||||
@@ -498,15 +642,25 @@ function installer.product.menu {
|
||||
_products _prod_variant _prod_name _prod_color \
|
||||
_prod_version _id _prod
|
||||
|
||||
${ui}.clear
|
||||
${ui}.init "%s [VERSÃO: %s] - CONFIGURAÇÃO DE PRODUTOS\n" ${self^^} ${version}
|
||||
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)"
|
||||
)"
|
||||
|
||||
PRIVKEY_PASSPHRASE=Sig%$ºluc03s
|
||||
#PRIVKEY_PASSPHRASE=Sig%$ºluc03s
|
||||
while [[ -z "${PRIVKEY_PASSPHRASE}" ]]; do
|
||||
installer.configure
|
||||
done
|
||||
|
||||
${ui}.status info $"Atualizando metadados de produtos... \n"
|
||||
exit 1
|
||||
${ui}.status info $"Atualizando metadados de produtos... "
|
||||
installer.download_metadata products
|
||||
installer.download_metadata versions
|
||||
installer.download_metadata repos
|
||||
@@ -1113,16 +1267,25 @@ function product.sigpdv.setup_sigtef {
|
||||
|
||||
# == Loop Principal =======================================================================+===== #
|
||||
|
||||
#clear
|
||||
export LANG=${LANG:-'C.UTF-8'}
|
||||
#${ui}.init $"%s [VERSÃO: %s] - CONFIGURAÇÃO INICIAL\n" ${self^^} ${version}
|
||||
# MAIN
|
||||
import /etc/os-release
|
||||
export DISTRO="${ID}"
|
||||
|
||||
#self.check_essential
|
||||
eval cli
|
||||
ui=${ui:-cli}
|
||||
|
||||
${ui}.section "%s [VERSÃO: %s] - CONFIGURAÇÃO DO INSTALADOR\n" \
|
||||
${self^^} \
|
||||
${version} \
|
||||
"$(
|
||||
self.check_sudo || exit ${?}; \
|
||||
self.check_os || exit ${?}; \
|
||||
)"
|
||||
|
||||
self.check_essential
|
||||
|
||||
# -- Configuração do sistema
|
||||
#${ui}.title $"Reconfigurando o sistema operacional"
|
||||
#system.check_os
|
||||
#system.check_sudo
|
||||
#system.setlocale
|
||||
#system.check_net
|
||||
#system.setup_ntp
|
||||
|
||||
Reference in New Issue
Block a user