Ir al contenido

Actualización automática del /etc/hosts

Esta fue una solución tonta para un problema tonto, pero puede ser útil en el futuro para otras cosas. 

Un proceso de usuario estaba estableciendo conexiones frecuentes con un puñado de FQDN. 

Al no tener ninguna capacidad de almacenamiento en caché de IP, cada intento de conexión fue precedido por una búsqueda de DNS.

Cuando el DNS fue lento, el proceso experimentó un colapso importante. 

Una “solución” fácil fue agregar esos FQDN a etc/hosts

Aunque eran bastante estáticos, no los controlé y sus IP podrían haber cambiado en cualquier momento.

Entonces escribí este pequeño script destinado a ejecutarse de vez en cuando desde el cron para ver si las IP han cambiado y actualizar /etc/hosts según sea necesario. 

Estoy casi seguro de que había una manera de solucionar este problema en lugar de este script, pero hay tantos cosas sin ver …

Puede tomar el script aquí o copiarlo desde abajo.

#!/bin/bash
# Resuelve la IP de dominio IP y actualiza /etc/hosts cuando es necesario. Esto puede ser útil si
# DNS lookup es lento y tienes un proceso que sigue peticionando 
# dominios una y otra vez. Pero, al mismo tiempo, no quieres simplemente 
# que reemplace el nombre de dominio con una IP estática que puede cambiar en algún momento en el futuro.

configure() {
  tt="$(date +'%Y-%m-%d_%H%M%S')"
  f="/etc/hosts"
  DIG="$(which dig 2>/dev/null | head -1)"
  declare -a ad=('domain1.com' 'domain2.com' 'domain3.com')
}

verify() {
  if [ ! -f "${f}" ] || [ ! -w "${f}" ]
  then
    echo "File ${f} cannot be opened for writing. Exiting..."
    exit 1
  fi

  if [ -z "${DIG}" ] || [ ! -x "${DIG}" ]
  then
    echo "Unable to find the 'dig' utility. Please install 'bind-utils'. Exiting..."
    exit 1
  fi
}

ip_check() {
  for fqdn in $(printf '%s\n' ${ad[@]})
  do
    ipo=$(grep -m1 -E "\b${fqdn}\b" "${f}" | awk '{print $1}' | grep -m1 -oE "([0-9]{1,3}\.){3}([0-9]{1,3})")
    ipn=$(grep -m1 -oE "([0-9]{1,3}\.){3}([0-9]{1,3})" <(${DIG} +short ${fqdn}))
    if [ -z "${ipo}" ] && [ ! -z "${ipn}" ]
    then
      /bin/cp -p "${f}" "${f}_${tt}"
      echo -e "${ipn}\t${fqdn}" >> "${f}"
    elif [ ! -z "${ipo}" ] && [ ! -z "${ipn}" ]
    then
      if [ "${ipo}" != "${ipn}" ]
      then
        /bin/cp -p "${f}" "${f}_${tt}"
        sed -i "s/${ipo}/${ipn}/g" "${f}"
      fi
    fi
  done
}

# RUNTIME
configure
verify
ip_check
Compartir:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *