diff --git a/dnsblock-agent b/dnsblock-agent index 92768b7..01276ba 100755 Binary files a/dnsblock-agent and b/dnsblock-agent differ diff --git a/install.sh b/install.sh index eb9fe7c..195aad5 100755 --- a/install.sh +++ b/install.sh @@ -22,12 +22,13 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Configurações do Unbound UNBOUND_CONF_DIR="/etc/unbound/unbound.conf.d" UNBOUND_MAIN_CONF="/etc/unbound/unbound.conf" -DNSBLOCK_CONF="$UNBOUND_CONF_DIR/dnsblock.conf" -DNSBLOCK_INCLUDE='include: "/etc/unbound/unbound.conf.d/dnsblock.conf"' +DNSBLOCK_UNBOUND_CONF="$INSTALL_DIR/unbound.conf" +DNSBLOCK_INCLUDE='include: "/opt/dnsblock/unbound.conf"' # Variáveis globais SERIAL="" NO_SERIAL=false +UNBOUND_ERROR="" # ============================================================================ # FUNÇÕES UTILITÁRIAS @@ -67,35 +68,33 @@ verificar_dependencias() { # Solicitar o serial via whiptail solicitar_serial() { - local serial="" + local input="" - serial=$(whiptail --title "DNSBlock Agent - Ativação" \ + input=$(whiptail --title "DNSBlock Agent - Ativação" \ --inputbox "Digite o serial de ativação do agente:\n\n(Deixe em branco para instalar sem serial)" \ - 12 60 3>&1 1>&2 2>&3) + 12 60 "" 3>&1 1>&2 2>&3) local status=$? if [ $status -ne 0 ]; then - # Usuário cancelou com ESC ou Cancel whiptail --title "Instalação Cancelada" \ --msgbox "A instalação foi cancelada pelo usuário." 8 45 exit 0 fi - if [ -z "$serial" ]; then - # Serial em branco - perguntar se deseja continuar + if [ -z "$input" ]; then if whiptail --title "Instalação sem Serial" \ --yesno "Você não informou um serial.\n\nDeseja instalar sem serial?\n\n(O serviço será ativado mas não inicializado)\n\nVocê pode obter seu serial em:\nhttp://painel.dnsblock.com.br" \ 14 55; then NO_SERIAL=true - echo "" + SERIAL="" else whiptail --title "Instalação Cancelada" \ --msgbox "A instalação foi cancelada pelo usuário." 8 45 exit 0 fi else - echo "$serial" + SERIAL="$input" fi } @@ -104,7 +103,7 @@ atualizar_config_serial() { local serial="$1" local config_file="$INSTALL_DIR/config.json" - if [ -f "$config_file" ]; then + if [ -f "$config_file" ] && [ -n "$serial" ]; then sed -i "s/\"serial_key\":[[:space:]]*\"[^\"]*\"/\"serial_key\": \"$serial\"/" "$config_file" fi } @@ -113,85 +112,76 @@ atualizar_config_serial() { # FUNÇÕES DE CONFIGURAÇÃO DO UNBOUND # ============================================================================ -# Encontrar o arquivo de configuração apropriado do Unbound +# Encontrar arquivo de configuração do Unbound para adicionar o include encontrar_arquivo_config_unbound() { - local config_file="" + # Prioridade: arquivo com RPZ existente > local.conf > unbound.conf principal - # Verificar se existe algum arquivo com configuração RPZ - for conf in "$UNBOUND_CONF_DIR"/*.conf; do - if [ -f "$conf" ] && grep -q "rpz:" "$conf" 2>/dev/null; then - config_file="$conf" - break - fi - done - - # Se não encontrou arquivo com RPZ, usar local.conf se existir - if [ -z "$config_file" ]; then + # Primeiro, verificar se existe algum arquivo com bloco RPZ + if [ -d "$UNBOUND_CONF_DIR" ]; then + for conf in "$UNBOUND_CONF_DIR"/*.conf; do + if [ -f "$conf" ] && grep -q "^[[:space:]]*rpz:" "$conf" 2>/dev/null; then + echo "$conf" + return 0 + fi + done + + # Se existe local.conf, usar ele if [ -f "$UNBOUND_CONF_DIR/local.conf" ]; then - config_file="$UNBOUND_CONF_DIR/local.conf" - elif [ -f "$UNBOUND_MAIN_CONF" ]; then - config_file="$UNBOUND_MAIN_CONF" + echo "$UNBOUND_CONF_DIR/local.conf" + return 0 fi fi - echo "$config_file" + # Verificar arquivo principal + if [ -f "$UNBOUND_MAIN_CONF" ]; then + # Verificar se tem bloco RPZ + if grep -q "^[[:space:]]*rpz:" "$UNBOUND_MAIN_CONF" 2>/dev/null; then + echo "$UNBOUND_MAIN_CONF" + return 0 + fi + # Mesmo sem RPZ, usar o principal + echo "$UNBOUND_MAIN_CONF" + return 0 + fi + + # Nenhum arquivo encontrado + return 1 } -# Verificar se o include já existe +# Verificar se o include do DNSBlock já existe verificar_include_existente() { - local include_pattern='include:[[:space:]]*"/etc/unbound/unbound.conf.d/dnsblock.conf"' + local include_pattern='include:[[:space:]]*"/opt/dnsblock/unbound.conf"' + # Verificar no arquivo principal if [ -f "$UNBOUND_MAIN_CONF" ] && grep -qE "$include_pattern" "$UNBOUND_MAIN_CONF" 2>/dev/null; then return 0 fi - for conf in "$UNBOUND_CONF_DIR"/*.conf; do - if [ -f "$conf" ] && grep -qE "$include_pattern" "$conf" 2>/dev/null; then - return 0 - fi - done + # Verificar nos arquivos do diretório conf.d + if [ -d "$UNBOUND_CONF_DIR" ]; then + for conf in "$UNBOUND_CONF_DIR"/*.conf; do + if [ -f "$conf" ] && grep -qE "$include_pattern" "$conf" 2>/dev/null; then + return 0 + fi + done + fi return 1 } # Configurar o Unbound para usar o DNSBlock configurar_unbound() { - # Criar diretório de configuração do Unbound se não existir - if [ ! -d "$UNBOUND_CONF_DIR" ]; then - mkdir -p "$UNBOUND_CONF_DIR" - chown unbound:unbound "$UNBOUND_CONF_DIR" - fi + UNBOUND_ERROR="" # Criar o diretório RPZ mkdir -p "$RPZ_DIR" chown unbound:unbound "$RPZ_DIR" - # Criar arquivo de configuração do DNSBlock para o Unbound - cat > "$DNSBLOCK_CONF" << 'EOF' -rpz: - name: rpz.dnsblock.zone - zonefile: /opt/dnsblock/rpz/rpz.dnsblock.zone - rpz-action-override: nxdomain -EOF - - chown unbound:unbound "$DNSBLOCK_CONF" - chmod 644 "$DNSBLOCK_CONF" - - # Adicionar include se não existir - if ! verificar_include_existente; then - local config_file=$(encontrar_arquivo_config_unbound) - - if [ -z "$config_file" ]; then - return 1 - fi - - if grep -q "rpz:" "$config_file" 2>/dev/null; then - sed -i "/rpz:/i # DNSBlock\n$DNSBLOCK_INCLUDE\n" "$config_file" - else - echo "" >> "$config_file" - echo "# DNSBlock" >> "$config_file" - echo "$DNSBLOCK_INCLUDE" >> "$config_file" - fi + # Copiar arquivo de configuração do DNSBlock para o Unbound (já vem no pacote) + if [ -f "$SCRIPT_DIR/unbound.conf" ]; then + cp "$SCRIPT_DIR/unbound.conf" "$DNSBLOCK_UNBOUND_CONF" + chown unbound:unbound "$DNSBLOCK_UNBOUND_CONF" + chmod 644 "$DNSBLOCK_UNBOUND_CONF" fi # Criar arquivo RPZ vazio se não existir @@ -213,45 +203,104 @@ EOF chmod 644 "$rpz_file" fi - # Verificar configuração do Unbound - if ! unbound-checkconf &>/dev/null; then - rm -f "$DNSBLOCK_CONF" - remover_include_unbound + # Verificar se o include já existe + if verificar_include_existente; then + # Já configurado, apenas verificar e reiniciar + if unbound-checkconf 2>&1; then + systemctl restart unbound 2>/dev/null || true + return 0 + else + UNBOUND_ERROR="Configuração do Unbound com erros. Verifique manualmente." + return 1 + fi + fi + + # Encontrar arquivo de configuração do Unbound + local config_file + config_file=$(encontrar_arquivo_config_unbound) + + if [ -z "$config_file" ]; then + UNBOUND_ERROR="Não foi possível encontrar arquivo de configuração do Unbound." return 1 fi + # Fazer backup do arquivo + cp "$config_file" "${config_file}.bak.dnsblock" + + # Verificar se existe bloco RPZ no arquivo + if grep -q "^[[:space:]]*rpz:" "$config_file" 2>/dev/null; then + # Existe bloco RPZ - adicionar include ANTES do primeiro bloco rpz + # Usando awk para inserir antes da primeira ocorrência de rpz: + awk -v include="# DNSBlock\n$DNSBLOCK_INCLUDE\n" ' + /^[[:space:]]*rpz:/ && !inserted { + print "# DNSBlock" + print "include: \"/opt/dnsblock/unbound.conf\"" + print "" + inserted=1 + } + {print} + ' "$config_file" > "${config_file}.tmp" && mv "${config_file}.tmp" "$config_file" + else + # Não existe bloco RPZ - adicionar include no final do arquivo + echo "" >> "$config_file" + echo "# DNSBlock" >> "$config_file" + echo "$DNSBLOCK_INCLUDE" >> "$config_file" + fi + + # Verificar configuração do Unbound + local check_output + check_output=$(unbound-checkconf 2>&1) + + if [ $? -ne 0 ]; then + # Erro na configuração - restaurar backup + mv "${config_file}.bak.dnsblock" "$config_file" + UNBOUND_ERROR="Erro na configuração do Unbound:\n$check_output" + return 1 + fi + + # Remover backup + rm -f "${config_file}.bak.dnsblock" + # Reiniciar o Unbound - systemctl restart unbound 2>/dev/null || true + if ! systemctl restart unbound 2>&1; then + UNBOUND_ERROR="Falha ao reiniciar o Unbound. Verifique o serviço manualmente." + return 1 + fi return 0 } # Remover o include do DNSBlock dos arquivos de configuração remover_include_unbound() { - local include_pattern='include:[[:space:]]*"/etc/unbound/unbound.conf.d/dnsblock.conf"' + local include_pattern='include:[[:space:]]*"/opt/dnsblock/unbound.conf"' local comment_pattern='#[[:space:]]*DNSBlock' + # Remover do arquivo principal if [ -f "$UNBOUND_MAIN_CONF" ]; then - sed -i "/$include_pattern/d" "$UNBOUND_MAIN_CONF" - sed -i "/$comment_pattern/d" "$UNBOUND_MAIN_CONF" + sed -i "/$include_pattern/d" "$UNBOUND_MAIN_CONF" 2>/dev/null || true + sed -i "/$comment_pattern/d" "$UNBOUND_MAIN_CONF" 2>/dev/null || true + # Remover linhas em branco duplicadas + sed -i '/^$/N;/^\n$/d' "$UNBOUND_MAIN_CONF" 2>/dev/null || true fi - for conf in "$UNBOUND_CONF_DIR"/*.conf; do - if [ -f "$conf" ] && [ "$conf" != "$DNSBLOCK_CONF" ]; then - sed -i "/$include_pattern/d" "$conf" - sed -i "/$comment_pattern/d" "$conf" - fi - done + # Remover dos arquivos do diretório conf.d + if [ -d "$UNBOUND_CONF_DIR" ]; then + for conf in "$UNBOUND_CONF_DIR"/*.conf; do + if [ -f "$conf" ]; then + sed -i "/$include_pattern/d" "$conf" 2>/dev/null || true + sed -i "/$comment_pattern/d" "$conf" 2>/dev/null || true + sed -i '/^$/N;/^\n$/d' "$conf" 2>/dev/null || true + fi + done + fi } # Remover configuração do Unbound remover_configuracao_unbound() { + # Remover include dos arquivos de configuração remover_include_unbound - if [ -f "$DNSBLOCK_CONF" ]; then - rm -f "$DNSBLOCK_CONF" - fi - + # Verificar se a configuração está OK e reiniciar if unbound-checkconf &>/dev/null; then systemctl restart unbound 2>/dev/null || true fi @@ -288,7 +337,6 @@ instalar() { sleep 0.2 echo "15"; echo "# Copiando binário..." - # Copiar o binário if [ -f "$SCRIPT_DIR/dnsblock-agent" ]; then cp "$SCRIPT_DIR/dnsblock-agent" "$INSTALL_DIR/" chmod +x "$INSTALL_DIR/dnsblock-agent" @@ -299,7 +347,6 @@ instalar() { sleep 0.2 echo "25"; echo "# Criando config.json..." - # Criar config.json a partir do exemplo if [ -f "$SCRIPT_DIR/config.json.example" ]; then cp "$SCRIPT_DIR/config.json.example" "$INSTALL_DIR/config.json" else @@ -308,17 +355,23 @@ instalar() { fi sleep 0.2 + echo "30"; echo "# Copiando configuração do Unbound..." + if [ -f "$SCRIPT_DIR/unbound.conf" ]; then + cp "$SCRIPT_DIR/unbound.conf" "$INSTALL_DIR/" + fi + sleep 0.2 + echo "35"; echo "# Configurando permissões..." touch "$INSTALL_DIR/logs/agent.log" chown -R unbound:unbound "$INSTALL_DIR" chmod 755 "$INSTALL_DIR" sleep 0.2 - echo "40"; echo "# Aguardando..." + echo "40" } | whiptail --title "DNSBlock Agent - Instalação" --gauge "Preparando arquivos..." 8 60 0 # Solicitar serial (fora do gauge para funcionar corretamente) - SERIAL=$(solicitar_serial) + solicitar_serial # Exibir progresso - Fase 2: Configurar serial e serviço { @@ -352,9 +405,15 @@ instalar() { fi sleep 0.2 - echo "100"; echo "# Concluído!" + echo "100" } | whiptail --title "DNSBlock Agent - Instalação" --gauge "Configurando sistema..." 8 60 45 + # Verificar se houve erro no Unbound + if [ -n "$UNBOUND_ERROR" ]; then + whiptail --title "Aviso - Configuração do Unbound" \ + --msgbox "Houve um problema ao configurar o Unbound:\n\n$UNBOUND_ERROR\n\nO agente foi instalado, mas você precisará configurar o Unbound manualmente." 14 65 + fi + # Exibir mensagem final if [ -n "$SERIAL" ]; then whiptail --title "Instalação Concluída" \ @@ -370,7 +429,7 @@ instalar() { # ============================================================================ desinstalar() { - if [ ! -d "$INSTALL_DIR" ] && [ ! -f "$SERVICE_FILE" ] && [ ! -f "$DNSBLOCK_CONF" ]; then + if [ ! -d "$INSTALL_DIR" ] && [ ! -f "$SERVICE_FILE" ]; then whiptail --title "Não Instalado" \ --msgbox "O DNSBlock Agent não parece estar instalado." 8 50 exit 0 @@ -404,7 +463,7 @@ desinstalar() { rm -rf "$INSTALL_DIR" sleep 0.3 - echo "100"; echo "# Concluído!" + echo "100" } | whiptail --title "DNSBlock Agent - Desinstalação" --gauge "Removendo DNSBlock Agent..." 8 60 0 whiptail --title "Desinstalação Concluída" \ diff --git a/unbound.conf b/unbound.conf new file mode 100644 index 0000000..beeaeed --- /dev/null +++ b/unbound.conf @@ -0,0 +1,5 @@ +# DNSBlock RPZ +rpz: + name: rpz.dnsblock.zone + zonefile: /opt/dnsblock/rpz/rpz.dnsblock.zone + rpz-action-override: nxdomain \ No newline at end of file