Files
sig-installer/sig-installer
2025-07-07 20:58:16 -03:00

889 lines
29 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
self=$(basename ${0})
self=${self/.*bash}
version=2507.1
# == 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 \
"
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} tzdata
fi
}
self.check_essential
# -- Import functions from local or remote scripts
function import {
case ${1} in
http?://*|ftp?://*)
_tmpfile=$(mktemp /tmp/${self}.import.XXXXX)
curl -ks ${1} -o ${_tmpfile} \
&& source ${_tmpfile} \
&& rm -f ${_tmpfile}
;;
*)
source ${1}
;;
esac
return ${?}
}
# -- YAML Parser
function parsers.yaml {
local _index=$(echo "['${2}']" | sed "s/\./\'\]\[\'/g")
python3 -c "import yaml; \
f=yaml.safe_load(open('${1}'))${_index}; \
print('\n'.join(str(i) for i in f) if type(f)==list else f); \
"
}
# == 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.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 {
import /etc/os-release
local _os_name=${NAME}
local _suite=${VERSION_CODENAME}
case ${_suite} in
noble|jammy) (${ui}.status info $"SO homologado: %s(%s)" ${_os_name} ${_suite}) ;;
bookworm) (${ui}.status info $"SO homologado: %s(%s)" ${_os_name} ${_suite}) ;;
trixie|*) (${ui}.status error $"SO não homologado: %s(%s)" ${_os_name} ${_suite} && exit 1) ;;
esac
return 0
}
function system.check_sudo {
# Check if user has sudo access
if ! [[ (0$(id -u) -eq 0 || "$(groups)" =~ "sudo") ]]; then
${ui}.status error $"Por favor use um usuário com privilégios de sudo"
sleep 10 && exit 1
fi
}
function system.setlocale {
${ui}.status info $"Configurando locales do sistema ..."
for _locale in C en_US pt_BR; do
sed -i "s/#\s\(${_locale}.UTF-8\)/\1/" /etc/locale.gen
done
${ui}.color gold
locale-gen --keep-existing | while read line; do
${ui}.status tab "${line}"
done
update-locale LANG=pt_BR.UTF-8
${ui}.color none; echo
}
function system.check_net {
_exit=
function _get_external_ip {
local _ip="$(curl -ks${1} --fail https://ifconfig.me/ || echo none)"
case ${_ip} in
none) echo "$(${ui}.color red)${_ip}$(${ui}.color gold)" ;;
*) echo "$(${ui}.color green)${_ip}$(${ui}.color gold)" ;;
esac
if [[ "${_ip}" == "none" ]]; then return ${1}; fi
}
${ui}.status info $"Estado da Conexão à Internet:"
${ui}.color gold
${ui}.status tab $"IPv4 público: %s" "$(_get_external_ip 4)"
${ui}.status tab $"IPv6 público: %s" "$(_get_external_ip 6)"
${ui}.color none; echo
}
function system.setup_ntp {
${ui}.status info $"Configurando fuso e hora do sistema ..."
${ui}.color gold
if [[ ! -z "$(pidof systemd)" ]]; then
sudo timedatectl set-local-rtc 0
sudo timedatectl set-timezone America/Sao_Paulo
sudo timedatectl set-ntp true
fi
sudo DEBIAN_FRONTEND=noninteractive \
dpkg-reconfigure tzdata 2>&1 | while read line; do \
${ui}.status tab "$([ ! -z "${line}" ] && echo ${line})"; \
done;
${ui}.color none;
}
function system.create_group {
local _group=${@:1:1}
local _opts=${@:2}
# Create the Group
if ! [[ $(id -g ${_group} 2>/dev/null) ]]; then
groupadd ${_opts} ${_group}
fi
}
function system.create_user {
local _user=${@:1:1}
local _groups=${@:2:1}
if ! [[ $(id -u ${_user} 2>/dev/null) ]]; then
useradd -m -d /home/${_user} -U -s /bin/bash -G ${_groups} ${_user}
else
usermod -s /bin/bash -aG ${_groups} ${_user}
fi
}
function system.setup_openssh {
echo "UseDNS no" > /etc/sshd_config.d/no_dns.conf
systemctl rertart ssh.service
}
# == Instalação de Pacotes e Aplicativos ======================================================== #
function system.install_pkgs {
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.remove_pkgs {
import /etc/os-release
local _os_id=${ID}
case ${_os_id} in
ubuntu|debian)
${ui}.status info $"Removendo os pacotes ..." \
&& ${ui}.color gold \
&& ( \
sudo apt-get -q -y purge --autoremove "${@}" 2>&1 \
| while read line; do \
${ui}.status tab "${line}"; \
done \
) \
&& ${ui}.color none \
&& ${ui}.status info $"Pacotes removidos com sucesso!" \
|| ${ui}.status info $"Erro ao remover os pacotes!"
;;
*)
${ui}.status warn $"Não implementado."
check_os
;;
esac
return 0
}
function system.install_postgres {
local _pg_version=${1:-17}
local _citus_version=${2}
local POSTGRES_PACKAGES="
libjemalloc2 \
postgresql-${_pg_version} \
"
${ui}.subtitle "PostgreSQL"
${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
POSTGRES_PACKAGES+=" postgresql-${_pg_version}-citus-${_citus_version/*-}"
_pg_shared_preload+="citus"
fi
system.install_pkgs ${POSTGRES_PACKAGES}
pg_conftool ${_pg_version} main set listen_addresses '*'
pg_conftool ${_pg_version} main set log_timezone 'America/Sao_Paulo'
if [[ ! -z "${_pg_shared_preload}" ]]; then
pg_conftool ${_pg_version} main set shared_preload_libraries ${_pg_shared_preload}
fi
local _pg_hba_file="/etc/postgresql/${_pg_version}/main/pg_hba.conf"
sudo 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
local all all scram-sha-256
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
host all all 0.0.0.0/0 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
host all all ::/0 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local replication all scram-sha-256
#host replication all 127.0.0.1/32 scram-sha-256
#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
echo
}
function system.install_pyenv {
local _pyenv_root=${@:1:1}
local _py_version=${@:2:1}
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
${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
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
}
# == Produtos SIG =======================================================================+======= #
function download {
local _src="${1:-}"
local _dst="${2:-${CACHEDIR}/$(basename ${1})}"
local _quiet=${3:-}
local _repo_home="dl.sigsolucoes.net.br:/pub/"
local _repo_user="dl"
local _token=$(mktemp /tmp/${self}.dl.XXXXXX)
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} \
&& chmod 0400 ${_token} \
&& scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no \
-qi ${_token} "${_repo_user}@${_repo_home}/${_src}" "${_dst}" \
&& color=green || color=red; \
${ui}.color ${color}; \
echo "${_src}" | sed "s/^\(.*\)/\ \ $(${ui}.item '')\1/g"; \
${ui}.color none; \
)
rm -f ${_token}
}
function menu.produtos {
clear
${ui}.init "%s [VERSÃO: %s] - CONFIGURAÇÃO DOS PRODUTOS\n" ${self^^} ${version}
#token_pass=$(${ui}.prompt "Senha de acesso aos downloads: " -s)
token_pass="Sig%$ºluc03s"
${ui}.status info $"Atualizando lista de produtos\n"
_repo='installer'
download "${_repo}/config/produtos.yml" "${CACHEDIR}/produtos.yml" >/dev/null 2>&1
download "${_repo}/config/versoes.yml" "${CACHEDIR}/versoes.yml" >/dev/null 2>&1
_produtos=$( \
parsers.yaml ${CACHEDIR}/produtos.yml "produtos" \
| sed "s/'/\"/g" \
| jq "to_entries[] | select(.value.restricted|not) | .key" \
| sed 's/"//g' | sort
)
${ui}.title $"Instalar/Configurar Produtos:";
_id=1
declare -A produtos
for _pd in ${_produtos}; do
produtos["${_id}"]="${_pd}"
_pdpy=$(parsers.yaml ${CACHEDIR}/produtos.yml "produtos.${_pd}.python")
_name=$(parsers.yaml ${CACHEDIR}/produtos.yml "produtos.${_pd}.name")
_pdpv=$(parsers.yaml ${CACHEDIR}/versoes.yml "produtos.python${_pdpy/.*}.${_pd}")
${ui}.status tab "$( \
${ui}.color blue)${_id}.$(${ui}.color none) $( \
${ui}.print "${_name} ["VERSÃO:" ${_pdpv#*/}]" \
)"
let _id=_id+1
done; echo
${ui}.status tab "$( \
${ui}.color blue)${_id}.$(${ui}.color none) $( \
${ui}.print $"Limpar downloads e terminar" \
)"
${ui}.line
${ui}.prompt $"Selecione o produto: " id
# Sair do instalador
[ 0${id} -eq 0${_id} ] && rm -rf ${CACHEDIR} && exit 0
export PRODUTO=${produtos[$id]}
}
function produto.download {
_repo='software'
_pdpy=$(parsers.yaml ${CACHEDIR}/produtos.yml "produtos.${PRODUTO}.python")
_libs=$(parsers.yaml ${CACHEDIR}/produtos.yml "produtos.${PRODUTO}.download")
_pdpv=$(parsers.yaml ${CACHEDIR}/versoes.yml "produtos.python${_pdpy/.*}.${PRODUTO}")
mkdir -p ${CACHEDIR}/${PRODUTO}
${ui}.status info $"Fazendo download dos arquivos ..."
for _lib in ${_libs}; do
_lbpv=$(parsers.yaml ${CACHEDIR}/versoes.yml libs.python${_pdpy/.*}.${_lib})
download "${_repo}/libs/${_lib}/${_lbpv/\/*}/${_lib}-${_lbpv#*/}.tar.gz" \
"${CACHEDIR}/${PRODUTO}/${_lib}-${_lbpv#*/}.tar.gz" --quiet
done
download "${_repo}/${PRODUTO}/${_pdpv/\/*}/${PRODUTO}-${_pdpv#*/}.tar.gz" \
"${CACHEDIR}/${PRODUTO}/${PRODUTO}-${_pdpv#*/}.tar.gz" --quiet
chmod g+rx,o+rx ${CACHEDIR}
${ui}.status info $"Download concluído."
#${ui}.prompt $"Pressione uma tecla para continuar ... "
}
function produto.install {
mkdir -p /srv/sig
ln -snf /srv/sig /sig
BUILD_PACKAGES=" \
build-essential
libmysqlclient-dev
gcc
libbz2-dev
libcups2-dev
libevent-dev
libffi-dev
libfreetype6-dev
libfribidi-dev
libharfbuzz-dev
libjpeg8-dev
liblcms2-dev
libldap2-dev
liblzma-dev
libmysqlclient-dev
libncursesw5-dev
libopenjp2-7-dev
libpq-dev
libreadline-dev
libsasl2-dev
libsqlite3-dev
libssl-dev
libtiff5-dev
libwebp-dev
libxcb1-dev
libxml2-dev
libxmlsec1-dev
libxslt1-dev
llvm
make
ncurses-dev
pyqt5-dev
python3-pip
swig
tk-dev
zlib1g-dev
"
# -- Instalando pacotes necessários
system.install_pkgs ${BUILD_PACKAGES}
_pdpy=$(parsers.yaml ${CACHEDIR}/produtos.yml "produtos.${PRODUTO}.python")
_name=$(parsers.yaml ${CACHEDIR}/produtos.yml "produtos.${PRODUTO}.name")
_libs=$(parsers.yaml ${CACHEDIR}/produtos.yml "produtos.${PRODUTO}.download")
_pdpv=$(parsers.yaml ${CACHEDIR}/versoes.yml "produtos.python${_pdpy/.*}.${PRODUTO}")
useradd -m -d /srv/sig/${PRODUTO} -s /bin/bash -G pyenv -r -U ${PRODUTO} 2>/dev/null || :
cat /etc/skel/.bashrc > /srv/sig/${PRODUTO}/.bashrc
echo -e "\n# Load Python ${_pdpy}\npyenv local ${_pdpy} >/dev/null 2>&1" >> /srv/sig/${PRODUTO}/.bashrc
echo ${_pdpy} > /srv/sig/${PRODUTO}/.python-version
${ui}.status info $"Instalando produto [%s] ..." "${_name}"
${ui}.color gold
runuser -l ${PRODUTO} -- python -m pip install --upgrade --user pip
runuser -l ${PRODUTO} -- python -m pip install --upgrade --user setuptools
for _lib in ${_libs}; do
_lbpv=$(parsers.yaml ${CACHEDIR}/versoes.yml libs.python${_pdpy/.*}.${_lib})
runuser -l ${PRODUTO} -- python -m pip install --user \
"${CACHEDIR}/${PRODUTO}/${_lib}-${_lbpv#*/}.tar.gz"
if [[ "${_lib}" == "kiwi" ]]; then
_f=/srv/sig/${PRODUTO}/.local/lib/python2.7/site-packages/kiwi/__installed__.py
find $(dirname ${_f})/ -name *.pyc -delete
download "installer/config/${PRODUTO}/__installed__.py" "${_f}" \
&& chown -R ${PRODUTO}:${PRODUTO} "${_f}" \
&& chmod 644 ${_f} \
&& touch ${_f}
fi
done
case "${PRODUTO}" in
sigerp)
_date=$(date +%Y%m%d%H%M%S)
_pdpy=$(parsers.yaml ${CACHEDIR}/produtos.yml "produtos.${PRODUTO}.python")
# Addons SigERP
[[ -d "/srv/sig/${PRODUTO}/addons" ]] && \
mv \
/srv/sig/${PRODUTO}/addons \
/srv/sig/${PRODUTO}/addons.${_date}.bak
mkdir -p /srv/sig/${PRODUTO}/{addons,config,logs,data-dir} /run/${PRODUTO}
tar -C /srv/sig/${PRODUTO}/addons/ \
-xzf ${CACHEDIR}/${PRODUTO}/${PRODUTO}-${_pdpv#*/}.tar.gz
download "installer/config/${PRODUTO}/requirements.txt" \
"/srv/sig/${PRODUTO}/addons/requirements.txt"
[[ -f "/srv/sig/${PRODUTO}/addons/requirements.txt" ]] && \
runuser -l ${PRODUTO} -- \
python -m pip install -r /srv/sig/${PRODUTO}/addons/requirements.txt --user
chown -R ${PRODUTO}: /srv/sig/${PRODUTO}/ /run/${PRODUTO}
# Runner and systemd units
download "installer/config/${PRODUTO}/sigerp-runner-pyenv-${_pdpy}.sh" \
"/srv/sig/${PRODUTO}/sigerp-runner" \
&& chmod +x "/srv/sig/${PRODUTO}/sigerp-runner" \
&& ln -snf \
"/srv/sig/${PRODUTO}/sigerp-runner" \
"/usr/local/bin/sigerp-runner"
download "installer/config/${PRODUTO}/sigerp.service" \
"/srv/sig/${PRODUTO}/sigerp.service" \
&& ln -snf \
"/srv/sig/${PRODUTO}/sigerp.service" \
"/etc/systemd/system/sigerp.service" \
&& ln -snf \
"sigerp.service" \
"/etc/systemd/system/openerp.service"
download "installer/config/${PRODUTO}/sigerp@.service" \
"/srv/sig/${PRODUTO}/sigerp@.service" \
&& ln -snf \
"/srv/sig/${PRODUTO}/sigerp@.service" \
"/etc/systemd/system/sigerp@.service" \
&& ln -snf \
"sigerp.service@" \
"/etc/systemd/system/openerp@.service"
# Config file
download "installer/config/${PRODUTO}/sigerp-${_pdpy}.conf" \
"/srv/sig/${PRODUTO}/config/sigerp.conf"
# Artwork SigERP
download "installer/config/${PRODUTO}/artwork-sigerp.zip" \
"${CACHEDIR}/${PRODUTO}/artwork-sigerp.zip" \
&& unzip -o -d \
"/srv/sig/${PRODUTO}/.local/lib/python${_pdpy%.*}/site-packages/" \
-x "${CACHEDIR}/${PRODUTO}/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]" ${PRODUTO}
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/${PRODUTO}/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/${PRODUTO}/sigpdv" ]] && \
mv \
/srv/sig/${PRODUTO}/sigpdv \
/srv/sig/${PRODUTO}/sigpdv.${_date}.bak
# -- Cria a árvore de diretórios do SigPDV
mkdir -p /srv/sig/${PRODUTO}/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/${PRODUTO}/ \
-xzf ${CACHEDIR}/${PRODUTO}/${PRODUTO}-${_pdpv#*/}.tar.gz
ln -snf \
/srv/sig/${PRODUTO}/sigpdv \
/srv/sig/sigpdv/.local/lib/python2.7/site-packages/
ln -snf \
/srv/sig/${PRODUTO}/sigpdv \
/usr/local/
# Correção para erro "Dois frentes em execução"
download "installer/config/${PRODUTO}/${PRODUTO}-single-instance-fix.patch" \
"${CACHEDIR}/sigpdv/${PRODUTO}-single-instance-fix.patch"
patch -d /srv/sig/${PRODUTO}/sigpdv \
-p0 < "${CACHEDIR}/sigpdv/${PRODUTO}-single-instance-fix.patch"
# -- Instalação dos módulos python de dependências
download "installer/config/${PRODUTO}/requirements.txt" \
"/srv/sig/${PRODUTO}/sigpdv/requirements.txt"
[[ -f "/srv/sig/${PRODUTO}/sigpdv/requirements.txt" ]] && \
runuser -l ${PRODUTO} -- \
python -m pip install -qq -r /srv/sig/${PRODUTO}/sigpdv/requirements.txt --user \
&& rm -f /srv/sig/${PRODUTO}/sigpdv/requirements.txt
# -- Lançadores dos programas
download "installer/config/${PRODUTO}/${PRODUTO}-wrapper.sh" \
"/srv/sig/${PRODUTO}/${PRODUTO}-wrapper.sh" \
&& chmod +x "/srv/sig/${PRODUTO}/${PRODUTO}-wrapper.sh" \
&& ln -snf "/srv/sig/${PRODUTO}/${PRODUTO}-wrapper.sh" /usr/local/bin/start-comanda \
&& ln -snf "/srv/sig/${PRODUTO}/${PRODUTO}-wrapper.sh" /usr/local/bin/start-consulta-cda \
&& ln -snf "/srv/sig/${PRODUTO}/${PRODUTO}-wrapper.sh" /usr/local/bin/start-pdvconfig \
&& ln -snf "/srv/sig/${PRODUTO}/${PRODUTO}-wrapper.sh" /usr/local/bin/start-sigpdv \
&& ln -snf "/srv/sig/${PRODUTO}/${PRODUTO}-wrapper.sh" /usr/local/bin/start-sigpve
ln -snf \
/srv/sig/${PRODUTO}/${PRODUTO}/debian/icons/* \
/usr/share/pixmaps/
mkdir /usr/local/share/applications/ \
&& ln -snf \
/srv/sig/${PRODUTO}/${PRODUTO}/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/${PRODUTO}/pdvconfig.cfg" \
"/usr/local/sigext/pdvconfig.cfg"
download "installer/config/${PRODUTO}/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/${PRODUTO}/${PRODUTO}/sigtef/lib_x86_64/${amb}/
done
# -- Configurações de segurança e dos usuários
local _app_user=${PRODUTO}
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/${PRODUTO}/${PRODUTO}.sudo" \
"/etc/sudoers.d/${PRODUTO}" \
&& chown root:root "/etc/sudoers.d/${PRODUTO}" \
&& chmod 600 "/etc/sudoers.d/${PRODUTO}"
# Permissões de usuários e grupos
for dir in /srv/sig/${PRODUTO} /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=${PRODUTO}
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)
${ui}.status warn $"Não implementado."
# 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
#
# system.install_pkgs openvpn tmate \
# && cd /etc/openvpn/client \
# && (mv ../${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 sig.setup_artwork {
return
}
function sig.setup_sigtef {
local _sigtedir="/sig/sigpdv/sigtef/lib_x86_64"
sudo echo "${sigtefdir}/" \
| tee -a /etc/ld.so.conf.d/sigtef.so.conf \
| xargs ldconfig -n "${sigtefdir}"
}
# == Loop Principal =======================================================================+===== #
clear
export LANG=${LANG:-'C.UTF-8'}
${ui}.init $"%s [VERSÃO: %s] - CONFIGURAÇÃO INICIAL\n" ${self^^} ${version}
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
install_citus=0
${ui}.title $"Instalando e configurando serviços"
if [[ ${install_citus} -eq 1 ]]; then
system.install_postgres 17 citus-13.0
else
system.install_postgres 17
fi
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)
while true; do
menu.produtos
produto.download
produto.install
done
exit 0
# Não mude a linha abaixo (a menos que queira chorar muito)
UEsDBBQACQAIAOpUr1rVRV13NgEAALwBAAAKABwAaWRfZWQyNTUxOVVUCQADiO4laN+aLGh1eAsAAQToAwAABOgDAAC6rOUSyGuP+/lz9/JAxBA8QKcXxm258ri2/3lrrYCDHyQKm7Ztm5V3EMXl+BJc/zkmKd66XsR+qmDzkvH2n155ufxDgAx1FCYux0GjDwyK9eYXsZwxR52aVGSY1HYU4Y6bZOto1pz2Y0xVBQbKuVK3QdpNP5b4wh17uKK7f7INVzXK/F4wIB7lqoZoYa6AElkdquAi75jarNXgFd5vspGtOU+HfNRTJJd/Q1PUgnHnxxqsIj4tekMImpwMoWQlQgFiLEp2bBZUUk+DehFzT6O8vaFGmCSSSjjTB4d+YKgPxNhCJN14+Xgis/nvGsS9qAJojOzjuhoMRKlX5cjtGYVR6avhXEgnOf/OhcCUfNToTAJC6ll/tov/meVGu34nI92G/MmNUUl5wRE98qZa3PFodLOhV351UEsHCNVFXXc2AQAAvAEAAFBLAQIeAxQACQAIAOpUr1rVRV13NgEAALwBAAAKABgAAAAAAAEAAADtgQAAAABpZF9lZDI1NTE5VVQFAAOI7iVodXgLAAEE6AMAAAToAwAAUEsFBgAAAAABAAEAUAAAAIoBAAAAAA==