Adicionar ProxySync_install.sh
This commit is contained in:
parent
e22052e9c2
commit
352ddc1705
|
|
@ -0,0 +1,227 @@
|
|||
#!/bin/sh
|
||||
# ==============================================================================
|
||||
## INSTALADOR INTELIGENTE DO SERVIÇO PROXY-SINC PARA PFSENSE/FREEBSD ##
|
||||
## ##
|
||||
## Descrição: Instala ou atualiza o serviço de versionamento para o pfSense, ##
|
||||
## guardando as configurações de forma persistente no Gitea. ##
|
||||
## ==============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
# --- Variáveis de Configuração ---
|
||||
REPO_DIR="/root/config_repo"
|
||||
SCRIPT_INSTALL_DIR="/usr/local/sbin"
|
||||
CONFIG_DIR="/usr/local/etc/proxy-sinc"
|
||||
CREDENTIALS_FILE="${CONFIG_DIR}/git.conf"
|
||||
PATHS_FILE="${CONFIG_DIR}/paths.conf"
|
||||
|
||||
# --- Funções de Ajuda ---
|
||||
info() { echo "\033[32m[INFO]\033[0m $1"; }
|
||||
error() { echo "\033[31m[ERRO]\033[0m $1" >&2; exit 1; }
|
||||
warn() { echo "\033[33m[AVISO]\033[0m $1"; }
|
||||
|
||||
# --- Início da Execução ---
|
||||
info "Iniciando a instalação/atualização do serviço Proxy-Sinc..."
|
||||
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
error "Este script precisa de ser executado como root."
|
||||
fi
|
||||
|
||||
# --- 1. Verificação de Dependências ---
|
||||
info "A verificar as dependências (git, rsync)..."
|
||||
# O pfSense usa 'pkg' como gerenciador de pacotes.
|
||||
# O 'rsync' já vem pré-instalado em versões recentes do pfSense.
|
||||
if ! command -v git &> /dev/null; then
|
||||
warn "Git não encontrado. A instalar 'git' via pkg..."
|
||||
pkg install -y git
|
||||
fi
|
||||
if ! command -v rsync &> /dev/null; then
|
||||
warn "Rsync não encontrado. Tentando instalar 'rsync'..."
|
||||
pkg install -y rsync
|
||||
fi
|
||||
info "Dependências satisfeitas."
|
||||
|
||||
# --- 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."
|
||||
# A sintaxe 'source' não é suportada por todos os shells no FreeBSD,
|
||||
# por isso usamos 'sh' para carregar a configuração de forma compatível.
|
||||
. "$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
|
||||
# Guarda as credenciais para uso futuro.
|
||||
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" # Torna o ficheiro legível apenas pelo root.
|
||||
fi
|
||||
|
||||
# --- 3. Configuração do Repositório Git ---
|
||||
GIT_PROTOCOL=$(echo "$GIT_URL" | grep -o '^https\?://')
|
||||
GIT_DOMAIN_PATH=$(echo "$GIT_URL" | sed -e 's|https\?://||')
|
||||
AUTH_GIT_URL="${GIT_PROTOCOL}${GITEA_USERNAME}:${GITEA_TOKEN}@${GIT_DOMAIN_PATH}"
|
||||
SERVER_HOSTNAME=$(hostname -s) # Use -s para hostname simplificado
|
||||
GIT_COMMIT_NAME="pfSense: $SERVER_HOSTNAME"
|
||||
GIT_COMMIT_EMAIL="pfsense-sync@local.host"
|
||||
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 2>&1; 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 2>&1; 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
|
||||
error "Não foi possível conectar ao repositório Git. Verifique a URL, token e conectividade de rede."
|
||||
fi
|
||||
else
|
||||
info "Conexão com verificação SSL bem-sucedida."
|
||||
fi
|
||||
|
||||
# Clonar ou reconfigurar o repositório.
|
||||
if [ -d "$REPO_DIR" ]; then
|
||||
warn "O diretório do repositório $REPO_DIR já existe. A reconfigurar..."
|
||||
cd "$REPO_DIR"
|
||||
git remote set-url origin "$AUTH_GIT_URL"
|
||||
info "URL do remoto 'origin' atualizada."
|
||||
else
|
||||
info "A clonar o repositório para $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"
|
||||
git config user.email "$GIT_COMMIT_EMAIL"
|
||||
git config http.sslVerify "$SSL_VERIFY"
|
||||
info "Repositório configurado com sucesso."
|
||||
|
||||
# --- 4. Gerar Ficheiro de Deploy ---
|
||||
DEPLOY_LOG_DIR="$REPO_DIR/_deployment_logs"
|
||||
DEPLOY_LOG_FILE="${DEPLOY_LOG_DIR}/${SERVER_HOSTNAME}.md"
|
||||
info "A criar/atualizar o registo de deploy..."
|
||||
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"
|
||||
|
||||
git add "$DEPLOY_LOG_FILE"
|
||||
git commit -m "[Deploy] ${ACTION_TYPE} por ${DEPLOYER_ID} em ${SERVER_HOSTNAME}"
|
||||
git push origin main
|
||||
info "Registo de deploy enviado para o Gitea."
|
||||
|
||||
# --- 5. Gerar os Ficheiros do Serviço ---
|
||||
info "A gerar e a instalar os ficheiros do serviço..."
|
||||
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 "/cf/conf/config.xml" >> "$PATHS_FILE"
|
||||
fi
|
||||
|
||||
# Gera o script principal de commit
|
||||
cat > "$SCRIPT_INSTALL_DIR/commit_configs.sh" << 'EOF'
|
||||
#!/bin/sh
|
||||
set -e
|
||||
REPO_PATH="/root/config_repo"
|
||||
CONFIG_DIR="/usr/local/etc/proxy-sinc"
|
||||
PATHS_FILE="${CONFIG_DIR}/paths.conf"
|
||||
AUTOMATION_FILES_SOURCE=("/usr/local/sbin/commit_configs.sh" "${PATHS_FILE}" "${CONFIG_DIR}/git.conf")
|
||||
AUTOMATION_FILES_DEST="$REPO_PATH/_automation_scripts/"
|
||||
log_info() { echo "[INFO] $1"; }
|
||||
log_info "--- Iniciando a verificação de sincronização [$(date)] ---"
|
||||
if [ "$(id -u)" -ne 0 ]; then echo "[ERRO] O script deve ser executado como root." >&2; exit 1; 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
|
||||
log_info "Sincronizando ficheiros de configuração definidos em $PATHS_FILE..."
|
||||
if [ ! -f "$PATHS_FILE" ]; then
|
||||
echo "[AVISO] O ficheiro de caminhos $PATHS_FILE não foi encontrado."
|
||||
else
|
||||
while IFS= read -r path_to_sync || [ -n "$path_to_sync" ]; do
|
||||
if [ -z "$path_to_sync" ] || $(echo "$path_to_sync" | grep -q '^#'); then continue; fi
|
||||
if [ -e "$path_to_sync" ]; then
|
||||
# Para o pfSense, a única config que realmente importa é o config.xml.
|
||||
# RSync é mais complexo, para um único arquivo, 'cp' é mais simples.
|
||||
if [ "$path_to_sync" = "/cf/conf/config.xml" ]; then
|
||||
log_info "Sincronizando /cf/conf/config.xml para a raiz do repositório."
|
||||
cp "$path_to_sync" "$REPO_PATH/config.xml"
|
||||
else
|
||||
log_info "Sincronizando $path_to_sync para o repositório..."
|
||||
rsync -avz --delete "$path_to_sync" "$REPO_PATH/"
|
||||
fi
|
||||
else
|
||||
echo "[AVISO] O caminho '$path_to_sync' não existe. A ignorar."
|
||||
fi
|
||||
done < "$PATHS_FILE"
|
||||
fi
|
||||
log_info "Sincronizando ficheiros de automação..."
|
||||
mkdir -p "$AUTOMATION_FILES_DEST"
|
||||
for file in $AUTOMATION_FILES_SOURCE; do
|
||||
if [ -f "$file" ]; then rsync -aR "$file" "$AUTOMATION_FILES_DEST"; fi
|
||||
done
|
||||
cd "$REPO_PATH"
|
||||
# GARANTE A SEGURANÇA: Cria/atualiza o .gitignore para NUNCA versionar o ficheiro de credenciais.
|
||||
echo "_automation_scripts/usr/local/etc/proxy-sinc/git.conf" > .gitignore
|
||||
log_info "A verificar o status do repositório Git..."
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
log_info "Alterações detetadas."
|
||||
git pull --ff-only
|
||||
git add .
|
||||
COMMIT_MESSAGE="[Auto-Sync] Atualização das configurações em $(hostname -s) - $(date +'%Y-%m-%d %H:%M:%S')"
|
||||
log_info "A fazer o commit com a mensagem: $COMMIT_MESSAGE"
|
||||
git commit -m "$COMMIT_MESSAGE"
|
||||
log_info "A enviar as alterações para o Gitea (git push)..."
|
||||
git push origin main
|
||||
echo "[SUCESSO] As alterações foram enviadas para o repositório remoto!"
|
||||
else
|
||||
log_info "Nenhuma alteração de configuração detetada."
|
||||
fi
|
||||
log_info "--- Verificação de sincronização concluída [$(date)] ---"
|
||||
exit 0
|
||||
EOF
|
||||
|
||||
chmod +x "$SCRIPT_INSTALL_DIR/commit_configs.sh"
|
||||
|
||||
# --- 6. Agendamento com Cron do pfSense ---
|
||||
info "A configuração será agendada para execução via CRON no pfSense."
|
||||
info "Por favor, adicione manualmente o seguinte comando no agendador de tarefas do GUI do pfSense:"
|
||||
info ""
|
||||
info " Comando: /usr/local/sbin/commit_configs.sh"
|
||||
info " Usuário: root"
|
||||
info " Frequência: (escolha a sua, e.g., '0' em minutos, '*/6' em horas para a cada 6h)"
|
||||
info ""
|
||||
warn "NOTA: A auto-atualização do script não foi migrada, pois o pfSense não usa systemd. Você precisará atualizar manualmente o script."
|
||||
|
||||
# --- Conclusão ---
|
||||
echo ""
|
||||
info "======================================================================"
|
||||
info " Instalação/Atualização Concluída!"
|
||||
info "======================================================================"
|
||||
info "O script de sincronização está pronto."
|
||||
info ""
|
||||
info "Próximos passos:"
|
||||
info " 1. Vá para o GUI do pfSense em 'System' -> 'Cron'."
|
||||
info " 2. Crie uma nova entrada para executar o script."
|
||||
info " 3. Edite o arquivo '/usr/local/etc/proxy-sinc/paths.conf' para adicionar ou remover caminhos de sincronização."
|
||||
info ""
|
||||
Loading…
Reference in New Issue