Atualizar Instal-Proxy-Sinc.sh

This commit is contained in:
João Pedro Toledo Goncalves 2025-09-16 23:23:20 +00:00
parent 99c47ca044
commit a2c6a7a73a
1 changed files with 237 additions and 182 deletions

View File

@ -1,24 +1,24 @@
#!/bin/bash #!/bin/bash
# ============================================================================== # ==============================================================================
# INSTALADOR INTELIGENTE DO SERVIÇO PROXY-SINC (VERSÃO PROFISSIONAL) # SCRIPT DE GESTÃO DO SERVIÇO PROXY-SINC (VERSÃO FINAL)
# #
# Autor: A sua IA Assistente & Equipa de Infraestrutura iT Guys # Descrição: Instala, atualiza ou desinstala o serviço de versionamento
# Descrição: Instala ou atualiza o serviço de versionamento, guardando as # automático para configurações de servidor.
# configurações de forma persistente.
# ============================================================================== # ==============================================================================
set -e set -e
# --- Variáveis de Configuração --- # --- Variáveis de Configuração ---
# Define os caminhos de instalação padrão para os componentes do serviço.
REPO_DIR="/opt/config_repo" REPO_DIR="/opt/config_repo"
SCRIPT_INSTALL_DIR="/usr/local/sbin" SCRIPT_INSTALL_DIR="/usr/local/sbin"
SYSTEMD_DIR="/etc/systemd/system" SYSTEMD_DIR="/etc/systemd/system"
MAN_DIR="/usr/share/man/man8" MAN_DIR="/usr/share/man/man8"
CONFIG_DIR="/etc/proxy-sinc" CONFIG_DIR="/etc/proxy-sinc"
# Ficheiro para guardar as credenciais do Git de forma persistente.
CREDENTIALS_FILE="${CONFIG_DIR}/git.conf"
PATHS_FILE="${CONFIG_DIR}/paths.conf" PATHS_FILE="${CONFIG_DIR}/paths.conf"
CREDENTIALS_FILE="${CONFIG_DIR}/git.conf"
# URL do repositório onde este script de instalação está guardado.
UPDATE_SCRIPT_URL="http://git.itguys.com.br/joao.goncalves/NgixProxy_Pathfinder/raw/branch/main/Instal-Proxy-Sinc.sh" UPDATE_SCRIPT_URL="http://git.itguys.com.br/joao.goncalves/NgixProxy_Pathfinder/raw/branch/main/Instal-Proxy-Sinc.sh"
# --- Funções de Ajuda --- # --- Funções de Ajuda ---
@ -26,130 +26,124 @@ info() { echo -e "\e[32m[INFO]\e[0m $1"; }
error() { echo -e "\e[31m[ERRO]\e[0m $1" >&2; exit 1; } error() { echo -e "\e[31m[ERRO]\e[0m $1" >&2; exit 1; }
warn() { echo -e "\e[33m[AVISO]\e[0m $1"; } warn() { echo -e "\e[33m[AVISO]\e[0m $1"; }
# --- Início da Execução --- # ==============================================================================
info "Iniciando a instalação/atualização do serviço Proxy-Sinc..." # FUNÇÃO DE INSTALAÇÃO / ATUALIZAÇÃO
if [ "$EUID" -ne 0 ]; then error "Este script precisa de ser executado como root."; fi # ==============================================================================
do_install() {
# --- 1. Verificação de Dependências --- info "Iniciando a instalação/atualização do serviço Proxy-Sinc..."
info "A verificar as dependências (git, rsync)..."
apt-get update > /dev/null # --- 1. Verificação de Dependências ---
apt-get install -y git rsync > /dev/null info "A verificar as dependências..."
if ! command -v man &> /dev/null; then apt-get update > /dev/null
warn "O comando 'man' não foi encontrado. A instalar 'man-db'..." apt-get install -y git rsync > /dev/null
apt-get install -y man-db > /dev/null if ! command -v man &> /dev/null; then
fi warn "O comando 'man' não foi encontrado. A instalar 'man-db'..."
info "Dependências satisfeitas." apt-get install -y man-db > /dev/null
# --- 2. Lógica de Instalação vs. Atualização ---
mkdir -p "$CONFIG_DIR"
if [ -f "$CREDENTIALS_FILE" ]; then
# MODO DE ATUALIZAÇÃO: Carrega as credenciais existentes.
info "Ficheiro de configuração encontrado. A executar em modo de atualização."
source "$CREDENTIALS_FILE"
read -p "Identificação do Colaborador para o registo de ATUALIZAÇÃO: " DEPLOYER_ID
ACTION_TYPE="Atualização Manual"
else
# MODO DE INSTALAÇÃO: Pede as credenciais pela primeira vez.
info "Nenhum ficheiro de configuração encontrado. A executar em modo de instalação inicial."
read -p "Por favor, insira a URL HTTP ou HTTPS do seu repositório Gitea: " GIT_URL
read -p "Por favor, insira o seu NOME DE UTILIZADOR do Gitea: " GITEA_USERNAME
read -s -p "Por favor, insira o seu TOKEN DE ACESSO do Gitea (ficará oculto): " GITEA_TOKEN
echo ""
read -p "Identificação do Colaborador para o registo de INSTALAÇÃO: " DEPLOYER_ID
ACTION_TYPE="Instalação Manual Inicial"
if [ -z "$GIT_URL" ] || [ -z "$GITEA_USERNAME" ] || [ -z "$GITEA_TOKEN" ] || [ -z "$DEPLOYER_ID" ]; then
error "Todos os campos são obrigatórios."
fi fi
info "Dependências satisfeitas."
# Guarda as credenciais para uso futuro. # --- 2. Lógica de Instalação vs. Atualização ---
info "A guardar as credenciais em ${CREDENTIALS_FILE}..." mkdir -p "$CONFIG_DIR"
(
echo "GIT_URL=\"$GIT_URL\""
echo "GITEA_USERNAME=\"$GITEA_USERNAME\""
echo "GITEA_TOKEN=\"$GITEA_TOKEN\""
) > "$CREDENTIALS_FILE"
chmod 600 "$CREDENTIALS_FILE" # Torna o ficheiro legível apenas pelo root.
fi
# --- 3. Configuração do Repositório Git --- if [ -f "$CREDENTIALS_FILE" ]; then
GIT_PROTOCOL=$(echo "$GIT_URL" | grep -o '^https\?://') info "Ficheiro de configuração encontrado. A executar em modo de atualização."
GIT_DOMAIN_PATH=$(echo "$GIT_URL" | sed -e 's|https\?://||') source "$CREDENTIALS_FILE"
AUTH_GIT_URL="${GIT_PROTOCOL}${GITEA_USERNAME}:${GITEA_TOKEN}@${GIT_DOMAIN_PATH}" read -p "Identificação do Colaborador para o registo de ATUALIZAÇÃO (Login AD/Email): " DEPLOYER_ID
ACTION_TYPE="Atualização Manual"
SERVER_HOSTNAME=$(hostname -f)
GIT_COMMIT_NAME="$SERVER_HOSTNAME"
GIT_COMMIT_EMAIL="${SERVER_HOSTNAME%%.*}@itguys.com.br"
info "O autor dos commits será definido como: $GIT_COMMIT_NAME <$GIT_COMMIT_EMAIL>"
# Testa a conexão SSL de forma inteligente.
SSL_VERIFY="true"
if ! git -c http.sslVerify=true ls-remote "$GIT_URL" &> /dev/null; then
warn "A conexão com verificação SSL falhou. A tentar novamente sem verificação..."
if git -c http.sslVerify=false ls-remote "$GIT_URL" &> /dev/null; then
warn "Conexão bem-sucedida sem verificação SSL. O repositório será configurado para ignorar os erros de certificado."
SSL_VERIFY="false"
else else
error "Não foi possível conectar ao repositório Git." info "Nenhum ficheiro de configuração encontrado. A executar em modo de instalação inicial."
read -p "Por favor, insira a URL HTTP ou HTTPS do seu repositório Gitea: " GIT_URL
read -p "Por favor, insira o seu NOME DE UTILIZADOR do Gitea: " GITEA_USERNAME
read -s -p "Por favor, insira o seu TOKEN DE ACESSO do Gitea (ficará oculto): " GITEA_TOKEN
echo ""
read -p "Identificação do Colaborador para o registo de INSTALAÇÃO (Login AD/Email): " DEPLOYER_ID
ACTION_TYPE="Instalação Manual Inicial"
if [ -z "$GIT_URL" ] || [ -z "$GITEA_USERNAME" ] || [ -z "$GITEA_TOKEN" ] || [ -z "$DEPLOYER_ID" ]; then
error "Todos os campos são obrigatórios."
fi
info "A guardar as credenciais em ${CREDENTIALS_FILE}..."
(
echo "GIT_URL=\"$GIT_URL\""
echo "GITEA_USERNAME=\"$GITEA_USERNAME\""
echo "GITEA_TOKEN=\"$GITEA_TOKEN\""
) > "$CREDENTIALS_FILE"
chmod 600 "$CREDENTIALS_FILE"
fi fi
else
info "Conexão com verificação SSL bem-sucedida."
fi
# CORREÇÃO DO ERRO: Verifica se o diretório existe ANTES de tentar clonar. # --- 3. Configuração do Repositório Git ---
if [ -d "$REPO_DIR/.git" ]; then GIT_PROTOCOL=$(echo "$GIT_URL" | grep -o '^https\?://')
warn "O diretório do repositório $REPO_DIR já existe. A reconfigurar..." GIT_DOMAIN_PATH=$(echo "$GIT_URL" | sed -e 's|https\?://||')
cd "$REPO_DIR" AUTH_GIT_URL="${GIT_PROTOCOL}${GITEA_USERNAME}:${GITEA_TOKEN}@${GIT_DOMAIN_PATH}"
git remote set-url origin "$AUTH_GIT_URL"
info "URL do remoto 'origin' atualizada."
else
info "A clonar o repositório para $REPO_DIR..."
# Remove o diretório se ele existir mas não for um repo, para evitar o erro.
rm -rf "$REPO_DIR"
git clone "$GIT_URL" "$REPO_DIR"
cd "$REPO_DIR"
info "A configurar a URL do remoto com as credenciais..."
git remote set-url origin "$AUTH_GIT_URL"
fi
git config user.name "$GIT_COMMIT_NAME" SERVER_HOSTNAME=$(hostname -f)
git config user.email "$GIT_COMMIT_EMAIL" GIT_COMMIT_NAME="$SERVER_HOSTNAME"
git config http.sslVerify "$SSL_VERIFY" GIT_COMMIT_EMAIL="${SERVER_HOSTNAME%%.*}@itguys.com.br"
info "Repositório configurado com sucesso." info "O autor dos commits será definido como: $GIT_COMMIT_NAME <$GIT_COMMIT_EMAIL>"
info "A testar a conexão com o Gitea..."
SSL_VERIFY="true"
if ! git -c http.sslVerify=true ls-remote "$GIT_URL" &> /dev/null; then
warn "A conexão com verificação SSL falhou. A tentar novamente sem verificação..."
if git -c http.sslVerify=false ls-remote "$GIT_URL" &> /dev/null; then
warn "Conexão bem-sucedida sem verificação SSL."
SSL_VERIFY="false"
else
error "Não foi possível conectar ao repositório Git."
fi
else
info "Conexão com verificação SSL bem-sucedida."
fi
# --- 4. Gerar Ficheiro de Deploy --- if [ -d "$REPO_DIR/.git" ]; then
DEPLOY_LOG_DIR="$REPO_DIR/_deployment_logs" warn "O diretório do repositório $REPO_DIR já existe. A reconfigurar..."
DEPLOY_LOG_FILE="${DEPLOY_LOG_DIR}/${SERVER_HOSTNAME}.md" cd "$REPO_DIR"
git remote set-url origin "$AUTH_GIT_URL"
else
info "A clonar o repositório para $REPO_DIR..."
rm -rf "$REPO_DIR"
git clone "$GIT_URL" "$REPO_DIR"
cd "$REPO_DIR"
fi
info "A criar/atualizar o registo de deploy..." git config user.name "$GIT_COMMIT_NAME"
mkdir -p "$DEPLOY_LOG_DIR" git config user.email "$GIT_COMMIT_EMAIL"
if [ ! -f "$DEPLOY_LOG_FILE" ]; then git config http.sslVerify "$SSL_VERIFY"
echo "# Registo de Deploy do Proxy-Sinc para ${SERVER_HOSTNAME}" > "$DEPLOY_LOG_FILE" info "Repositório configurado com sucesso."
fi
echo "" >> "$DEPLOY_LOG_FILE"
echo "---" >> "$DEPLOY_LOG_FILE"
echo "**Tipo de Ação:** ${ACTION_TYPE}" >> "$DEPLOY_LOG_FILE"
echo "**Executado por:** ${DEPLOYER_ID}" >> "$DEPLOY_LOG_FILE"
echo "**Data:** $(date)" >> "$DEPLOY_LOG_FILE"
git add "$DEPLOY_LOG_FILE" # --- 4. Gerar Ficheiro de Deploy ---
git commit -m "[Deploy] ${ACTION_TYPE} por ${DEPLOYER_ID} em ${SERVER_HOSTNAME}" DEPLOY_LOG_DIR="$REPO_DIR/_deployment_logs"
git push origin main DEPLOY_LOG_FILE="${DEPLOY_LOG_DIR}/${SERVER_HOSTNAME}.md"
info "Registo de deploy enviado para o Gitea."
# --- 5. Gerar os Ficheiros do Serviço --- info "A criar/atualizar o registo de deploy..."
info "A gerar e a instalar os ficheiros do serviço..." mkdir -p "$DEPLOY_LOG_DIR"
if [ ! -f "$DEPLOY_LOG_FILE" ]; then
echo "# Registo de Deploy do Proxy-Sinc para ${SERVER_HOSTNAME}" > "$DEPLOY_LOG_FILE"
fi
echo "" >> "$DEPLOY_LOG_FILE"; echo "---" >> "$DEPLOY_LOG_FILE"
echo "**Tipo de Ação:** ${ACTION_TYPE}" >> "$DEPLOY_LOG_FILE"
echo "**Executado por:** ${DEPLOYER_ID}" >> "$DEPLOY_LOG_FILE"
echo "**Data:** $(date)" >> "$DEPLOY_LOG_FILE"
if [ ! -f "$PATHS_FILE" ]; then git add "$DEPLOY_LOG_FILE"
info "A criar o ficheiro de caminhos padrão em $PATHS_FILE" git commit -m "[Deploy] ${ACTION_TYPE} por ${DEPLOYER_ID} em ${SERVER_HOSTNAME}"
echo "# Adicione aqui os caminhos completos para os ficheiros e diretórios que deseja versionar." > "$PATHS_FILE" git push origin main
echo "/etc/nginx" >> "$PATHS_FILE" info "Registo de deploy enviado para o Gitea."
echo "/etc/fail2ban" >> "$PATHS_FILE"
fi
# Gera o script principal de commit # --- 5. Gerar e Instalar os Ficheiros do Serviço ---
cat > "$SCRIPT_INSTALL_DIR/commit_configs.sh" << 'EOF' info "A gerar e a instalar os ficheiros do serviço..."
mkdir -p "$CONFIG_DIR"
if [ ! -f "$PATHS_FILE" ]; then
info "A criar o ficheiro de caminhos padrão em $PATHS_FILE"
echo "# Adicione aqui os caminhos completos para os ficheiros e diretórios que deseja versionar." > "$PATHS_FILE"
echo "/etc/nginx" >> "$PATHS_FILE"
echo "/etc/fail2ban" >> "$PATHS_FILE"
fi
# Gera o script principal de commit
cat > "$SCRIPT_INSTALL_DIR/commit_configs.sh" << 'EOF'
#!/bin/bash #!/bin/bash
set -e set -e
REPO_PATH="/opt/config_repo" REPO_PATH="/opt/config_repo"
@ -159,49 +153,40 @@ AUTOMATION_FILES_SOURCE=("/usr/local/sbin/commit_configs.sh" "/usr/local/sbin/pr
AUTOMATION_FILES_DEST="$REPO_PATH/_automation_scripts/" AUTOMATION_FILES_DEST="$REPO_PATH/_automation_scripts/"
log_info() { echo "[INFO] $1"; } log_info() { echo "[INFO] $1"; }
log_info "--- Iniciando a verificação de sincronização [$(date)] ---" log_info "--- Iniciando a verificação de sincronização [$(date)] ---"
if [ "$EUID" -ne 0 ]; then echo "[ERRO] O script deve ser executado como root." >&2; exit 1; fi if [ ! -f "$PATHS_FILE" ]; then echo "[AVISO] Ficheiro de caminhos não encontrado." && exit 0; fi
if [ ! -d "$REPO_PATH/.git" ]; then echo "[ERRO] O diretório $REPO_PATH não é um repositório Git válido." >&2; exit 1; fi cd "$REPO_PATH" || exit 1
log_info "Sincronizando ficheiros de configuração definidos em $PATHS_FILE..." log_info "Sincronizando ficheiros de configuração..."
if [ ! -f "$PATHS_FILE" ]; then while IFS= read -r path || [ -n "$path" ]; do
echo "[AVISO] O ficheiro de caminhos $PATHS_FILE não foi encontrado." if [ -z "$path" ] || [[ "$path" =~ ^# ]]; then continue; fi
else if [ -e "$path" ]; then
while IFS= read -r path_to_sync || [ -n "$path_to_sync" ]; do rsync -avz --delete --exclude='*.swp' --exclude='*.bak' --exclude='sites-enabled/' --exclude='modules-enabled/' --exclude='/var/log/' --exclude='/var/run/' --exclude='/var/cache/' "$path" "$REPO_PATH/"
if [ -z "$path_to_sync" ] || [[ "$path_to_sync" =~ ^# ]]; then continue; fi else
if [ -e "$path_to_sync" ]; then echo "[AVISO] O caminho '$path' não existe. A ignorar."
rsync -avz --delete --exclude='*.swp' --exclude='*.bak' --exclude='sites-enabled/' --exclude='modules-enabled/' --exclude='/var/log/' --exclude='/var/run/' --exclude='/var/cache/' "$path_to_sync" "$REPO_PATH/" fi
else done < "$PATHS_FILE"
echo "[AVISO] O caminho '$path_to_sync' não existe. A ignorar."
fi
done < "$PATHS_FILE"
fi
log_info "Sincronizando ficheiros de automação..." log_info "Sincronizando ficheiros de automação..."
mkdir -p "$AUTOMATION_FILES_DEST" mkdir -p "$AUTOMATION_FILES_DEST"
for file in "${AUTOMATION_FILES_SOURCE[@]}"; do for file in "${AUTOMATION_FILES_SOURCE[@]}"; do
if [ -f "$file" ]; then rsync -aR "$file" "$AUTOMATION_FILES_DEST"; fi if [ -f "$file" ]; then rsync -aR "$file" "$AUTOMATION_FILES_DEST"; fi
done done
cd "$REPO_PATH"
# GARANTE A SEGURANÇA: Cria/atualiza o .gitignore para NUNCA versionar o ficheiro de credenciais.
echo "_automation_scripts/etc/proxy-sinc/git.conf" > .gitignore echo "_automation_scripts/etc/proxy-sinc/git.conf" > .gitignore
log_info "A verificar o status do repositório Git..."
if [ -n "$(git status --porcelain)" ]; then if [ -n "$(git status --porcelain)" ]; then
log_info "Alterações detetadas." log_info "Alterações detetadas."
git pull --ff-only git pull --ff-only
git add . git add .
COMMIT_MESSAGE="[Auto-Sync] Atualização das configurações em $(hostname -f) - $(date +'%Y-%m-%d %H:%M:%S')" COMMIT_MESSAGE="[Auto-Sync] Atualização das configurações em $(hostname -f) - $(date)"
log_info "A fazer o commit com a mensagem: $COMMIT_MESSAGE"
git commit -m "$COMMIT_MESSAGE" git commit -m "$COMMIT_MESSAGE"
log_info "A enviar as alterações para o Gitea (git push)..."
git push origin main git push origin main
echo "[SUCESSO] As alterações foram enviadas para o repositório remoto!" echo "[SUCESSO] As alterações foram enviadas!"
else else
log_info "Nenhuma alteração de configuração detetada." log_info "Nenhuma alteração de configuração detetada."
fi fi
log_info "--- Verificação de sincronização concluída [$(date)] ---" log_info "--- Verificação de sincronização concluída ---"
exit 0 exit 0
EOF EOF
# Gera o script de atualização # Gera o script de atualização
cat > "$SCRIPT_INSTALL_DIR/proxy-sinc-update" << EOF cat > "$SCRIPT_INSTALL_DIR/proxy-sinc-update" << EOF
#!/bin/bash #!/bin/bash
set -e set -e
echo "A procurar por atualizações para o serviço Proxy-Sinc..." echo "A procurar por atualizações para o serviço Proxy-Sinc..."
@ -217,7 +202,7 @@ fi
if curl \$SSL_VERIFY_FLAG -L "\$UPDATE_SCRIPT_URL" -o "\$TEMP_SCRIPT"; then if curl \$SSL_VERIFY_FLAG -L "\$UPDATE_SCRIPT_URL" -o "\$TEMP_SCRIPT"; then
chmod +x "\$TEMP_SCRIPT" chmod +x "\$TEMP_SCRIPT"
echo "Instalador baixado com sucesso. A executar a atualização..." echo "Instalador baixado com sucesso. A executar a atualização..."
sudo "\$TEMP_SCRIPT" sudo "\$TEMP_SCRIPT" install
rm "\$TEMP_SCRIPT" rm "\$TEMP_SCRIPT"
echo "Atualização concluída!" echo "Atualização concluída!"
else else
@ -226,18 +211,18 @@ fi
exit 0 exit 0
EOF EOF
# Gera os ficheiros de serviço do systemd # Gera os ficheiros de serviço do systemd
cat > "$SYSTEMD_DIR/proxy-sinc.service" << 'EOF' cat > "$SYSTEMD_DIR/proxy-sinc.service" << 'EOF'
[Unit] [Unit]
Description=Serviço de Sincronização de Configurações do Nginx para o Git Description=Serviço de Sincronização de Configurações para o Git
[Service] [Service]
Type=oneshot Type=oneshot
ExecStart=/usr/local/sbin/commit_configs.sh ExecStart=/usr/local/sbin/commit_configs.sh
EOF EOF
cat > "$SYSTEMD_DIR/proxy-sinc.timer" << 'EOF' cat > "$SYSTEMD_DIR/proxy-sinc.timer" << 'EOF'
[Unit] [Unit]
Description=Executa o serviço de sincronização de configurações a cada minuto Description=Executa a sincronização de configurações a cada minuto
[Timer] [Timer]
OnBootSec=1min OnBootSec=1min
OnUnitActiveSec=1min OnUnitActiveSec=1min
@ -246,16 +231,17 @@ Unit=proxy-sinc.service
WantedBy=timers.target WantedBy=timers.target
EOF EOF
# Gera os ficheiros de serviço para a verificação de atualizações semanal # Gera os ficheiros para a verificação de atualizações semanal
cat > "$SYSTEMD_DIR/proxy-sinc-update.service" << 'EOF' cat > "$SYSTEMD_DIR/proxy-sinc-update.service" << 'EOF'
[Unit] [Unit]
Description=Serviço de Verificação Semanal de Atualizações para o Proxy-Sinc Description=Serviço de Verificação Semanal de Atualizações para o Proxy-Sinc
[Service] [Service]
Type=oneshot Type=oneshot
# A atualização agora é executada no modo 'auto'
ExecStart=/usr/local/sbin/proxy-sinc-update ExecStart=/usr/local/sbin/proxy-sinc-update
EOF EOF
cat > "$SYSTEMD_DIR/proxy-sinc-update.timer" << 'EOF' cat > "$SYSTEMD_DIR/proxy-sinc-update.timer" << 'EOF'
[Unit] [Unit]
Description=Executa a verificação de atualizações do Proxy-Sinc toda Segunda-feira Description=Executa a verificação de atualizações do Proxy-Sinc toda Segunda-feira
[Timer] [Timer]
@ -266,8 +252,8 @@ Unit=proxy-sinc-update.service
WantedBy=timers.target WantedBy=timers.target
EOF EOF
# Gera a nova man page # Gera a nova man page
cat > "$MAN_DIR/proxy-sinc.8" << 'EOF' cat > "$MAN_DIR/proxy-sinc.8" << 'EOF'
.TH PROXY-SINC 8 "Setembro 2025" "iT Guys - Equipa de Infraestrutura" "Ferramentas de Sistema" .TH PROXY-SINC 8 "Setembro 2025" "iT Guys - Equipa de Infraestrutura" "Ferramentas de Sistema"
.SH NAME .SH NAME
proxy-sinc \- Serviço de versionamento automático de configurações de servidor proxy-sinc \- Serviço de versionamento automático de configurações de servidor
@ -281,9 +267,7 @@ proxy-sinc \- Serviço de versionamento automático de configurações de servid
.B man proxy-sinc .B man proxy-sinc
.SH DESCRIPTION .SH DESCRIPTION
.B proxy-sinc .B proxy-sinc
é um serviço de sistema que automatiza o controlo de versões de ficheiros de configuração críticos. A cada minuto, ele executa um script que sincroniza os ficheiros definidos em \fI/etc/proxy-sinc/paths.conf\fR para um repositório Git e envia as alterações para um repositório remoto. é um serviço de sistema que automatiza o controlo de versões de ficheiros de configuração críticos. A cada minuto, ele sincroniza os ficheiros e diretórios definidos em \fI/etc/proxy-sinc/paths.conf\fR para um repositório Git. Se forem detetadas alterações, ele cria um commit e envia as alterações para um repositório remoto.
.PP
A autenticação e outras configurações são guardadas em \fI/etc/proxy-sinc/git.conf\fR durante a primeira instalação.
.SH CONFIGURAÇÃO .SH CONFIGURAÇÃO
A gestão dos ficheiros e diretórios a serem sincronizados é feita através do ficheiro: A gestão dos ficheiros e diretórios a serem sincronizados é feita através do ficheiro:
.TP .TP
@ -296,10 +280,16 @@ Para forçar uma atualização, execute: \fBproxy-sinc-update\fR
Este comando baixa e executa a versão mais recente do script de instalação. Ele irá ler as suas credenciais guardadas e pedir apenas a sua identificação de colaborador para o registo de deploy. Este comando baixa e executa a versão mais recente do script de instalação. Ele irá ler as suas credenciais guardadas e pedir apenas a sua identificação de colaborador para o registo de deploy.
.SS ATUALIZAÇÃO AUTOMÁTICA .SS ATUALIZAÇÃO AUTOMÁTICA
O sistema inclui um timer (\fIproxy-sinc-update.timer\fR) que executa o comando \fBproxy-sinc-update\fR automaticamente uma vez por semana. O sistema inclui um timer (\fIproxy-sinc-update.timer\fR) que executa o comando \fBproxy-sinc-update\fR automaticamente uma vez por semana.
.SH DESINSTALAÇÃO
Para remover completamente o serviço e os seus componentes, execute o script de instalação com o argumento 'uninstall':
.sp
\fB/caminho/para/Instal-Proxy-Sinc.sh uninstall\fR
.sp
Ele irá parar os serviços, remover todos os ficheiros de sistema e perguntar se deseja apagar o diretório de configuração e o repositório local.
.SH FICHEIROS .SH FICHEIROS
.TP .TP
\fB/etc/proxy-sinc/git.conf\fR \fB/etc/proxy-sinc/git.conf\fR
Ficheiro seguro (apenas root) que guarda as credenciais do Git (URL, utilizador, token). Ficheiro seguro que guarda as credenciais do Git.
.TP .TP
\fB/etc/proxy-sinc/paths.conf\fR \fB/etc/proxy-sinc/paths.conf\fR
A lista de ficheiros e pastas a serem versionados. A lista de ficheiros e pastas a serem versionados.
@ -316,30 +306,95 @@ O script que gere a auto-atualização do serviço.
.BR systemd.timer (5) .BR systemd.timer (5)
EOF EOF
# --- 7. Mover e Instalar --- chmod +x "$SCRIPT_INSTALL_DIR/commit_configs.sh"
chmod +x "$SCRIPT_INSTALL_DIR/commit_configs.sh" chmod +x "$SCRIPT_INSTALL_DIR/proxy-sinc-update"
chmod +x "$SCRIPT_INSTALL_DIR/proxy-sinc-update" gzip -f "$MAN_DIR/proxy-sinc.8"
gzip -f "$MAN_DIR/proxy-sinc.8" info "Ficheiros instalados com sucesso."
info "Ficheiros instalados com sucesso."
# --- 8. Ativar os Serviços --- # --- Ativar os Serviços ---
info "A recarregar o systemd e a ativar os timers..." info "A recarregar o systemd e a ativar os timers..."
systemctl daemon-reload systemctl daemon-reload
systemctl enable --now proxy-sinc.timer systemctl enable --now proxy-sinc.timer
systemctl enable --now proxy-sinc-update.timer systemctl enable --now proxy-sinc-update.timer
info "Serviços ativados e a correr!" info "Serviços ativados e a correr!"
# --- Conclusão --- echo ""
echo "" info "======================================================================"
info "======================================================================" info " Instalação/Atualização Concluída!"
info " Instalação/Atualização Concluída!" info "======================================================================"
info "======================================================================" info "O serviço 'proxy-sinc' está agora ativo."
info "O serviço 'proxy-sinc' está agora ativo." info "Comandos úteis:"
info "" info " Ver o status do timer de sincronização: systemctl status proxy-sinc.timer"
info "Comandos úteis:" info " Ver os logs da última execução: journalctl -u proxy-sinc.service"
info " Ver o status do timer de sincronização: systemctl status proxy-sinc.timer" info " Para forçar uma atualização agora: sudo proxy-sinc-update"
info " Ver os logs da última execução: journalctl -u proxy-sinc.service" info " Ler o manual de ajuda: man proxy-sinc"
info " Para forçar uma atualização agora: sudo proxy-sinc-update" info " Para desinstalar no futuro: sudo $0 uninstall"
info " Ler o manual de ajuda: man proxy-sinc" info ""
info " Para adicionar novos ficheiros/pastas, edite: /etc/proxy-sinc/paths.conf" info "Para adicionar novos ficheiros/pastas, edite: /etc/proxy-sinc/paths.conf"
info "" info ""
}
# ==============================================================================
# FUNÇÃO DE DESINSTALAÇÃO
# ==============================================================================
do_uninstall() {
info "Iniciando a desinstalação do serviço Proxy-Sinc..."
info "A parar e a desativar os timers do systemd..."
systemctl stop proxy-sinc.timer 2>/dev/null || true
systemctl disable proxy-sinc.timer 2>/dev/null || true
systemctl stop proxy-sinc-update.timer 2>/dev/null || true
systemctl disable proxy-sinc-update.timer 2>/dev/null || true
info "Timers parados e desativados."
info "A remover os ficheiros do serviço..."
rm -f "$SCRIPT_INSTALL_DIR/commit_configs.sh"
rm -f "$SCRIPT_INSTALL_DIR/proxy-sinc-update"
rm -f "$SYSTEMD_DIR/proxy-sinc.service"
rm -f "$SYSTEMD_DIR/proxy-sinc.timer"
rm -f "$SYSTEMD_DIR/proxy-sinc-update.service"
rm -f "$SYSTEMD_DIR/proxy-sinc-update.timer"
rm -f "$MAN_DIR/proxy-sinc.8.gz"
systemctl daemon-reload
info "Ficheiros de sistema removidos."
read -p "Deseja remover o diretório de configuração ${CONFIG_DIR}? [s/n]: " choice
if [[ "$choice" == "s" || "$choice" == "S" ]]; then
info "A remover ${CONFIG_DIR}..."
rm -rf "$CONFIG_DIR"
fi
read -p "Deseja remover o repositório Git local ${REPO_DIR}? (AVISO: Isto não apaga o repositório remoto) [s/n]: " choice
if [[ "$choice" == "s" || "$choice" == "S" ]]; then
info "A remover ${REPO_DIR}..."
rm -rf "$REPO_DIR"
fi
echo ""
info "======================================================================"
info " Desinstalação Concluída!"
info "======================================================================"
}
# --- Ponto de Entrada Principal ---
# Determina qual função executar com base no argumento passado ao script.
case "$1" in
install)
do_install
;;
uninstall)
do_uninstall
;;
*)
# Se nenhum argumento for passado, assume a instalação.
if [ -z "$1" ]; then
do_install
else
echo "Uso: $0 [install|uninstall]" >&2
exit 1
fi
;;
esac
exit 0