novo script de instalação
This commit is contained in:
parent
a03111620f
commit
e2e305f1b0
BIN
dnsblock-agent
BIN
dnsblock-agent
Binary file not shown.
215
install.sh
215
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
|
||||
# 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 "rpz:" "$conf" 2>/dev/null; then
|
||||
config_file="$conf"
|
||||
break
|
||||
if [ -f "$conf" ] && grep -q "^[[:space:]]*rpz:" "$conf" 2>/dev/null; then
|
||||
echo "$conf"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
# Se não encontrou arquivo com RPZ, usar local.conf se existir
|
||||
if [ -z "$config_file" ]; then
|
||||
# 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
|
||||
|
||||
# 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
|
||||
|
||||
# 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" ] && [ "$conf" != "$DNSBLOCK_CONF" ]; then
|
||||
sed -i "/$include_pattern/d" "$conf"
|
||||
sed -i "/$comment_pattern/d" "$conf"
|
||||
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" \
|
||||
|
||||
5
unbound.conf
Normal file
5
unbound.conf
Normal file
@ -0,0 +1,5 @@
|
||||
# DNSBlock RPZ
|
||||
rpz:
|
||||
name: rpz.dnsblock.zone
|
||||
zonefile: /opt/dnsblock/rpz/rpz.dnsblock.zone
|
||||
rpz-action-override: nxdomain
|
||||
Loading…
x
Reference in New Issue
Block a user