#!/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==