Em primeiro lugar, feliz ano novo.
Há pouco tempo, propus o uso de um arquivo hosts para tornar a navegação mais rápida e segura. Juntamente com a explicação dos mecanismos e motivos para adotar um arquivo hosts com essa funcionalidade, desenvolvi também (reiterando: sem talento em programação) um script para fazer essa atualização de forma automatizada.
Fiquei muito satisfeito em receber contribuições de um leitor e também as críticas de diversos outros, de forma que apresento agora uma versão melhorada do script upd_hostsfile.
Em primeiro lugar, esta nova versão verifica se está sendo executada pelo usuário root e sai com erro caso contrário, exatamente como proposto pelo leitor.
Além disso, o script passa agora a baixar a versão em texto do arquivo hosts do projeto MVPS. São mais kilobytes de download (pouco mais de 600 neste momento, contra 150 da versão zipada), mas isto facilita grandemente os demais procedimentos no script.
No mecanismo de funcionamento, contamos agora com um diretório, /etc/hosts.d/
, que abriga, por padrão, um arquivo 0_local
e um arquivo MVPS-hosts
. O arquivo /etc/hosts
, portanto, é composto pela concatenação de todos os arquivos contidos em /etc/hosts.d/
— por isso o nome 0_local
no arquivo, para que ele seja incluído no início do arquivo /etc/hosts
.
O arquivo /etc/hosts.d/0_local
passa a conter, por padrão, o conteúdo do /etc/hosts
que foi criado manualmente pelo usuário ou automaticamente pela distribuição — o próprio script upd_hostsfile
se encarrega de copiar esses conteúdos do /etc/hosts
original para o /etc/hosts.d/0_local
.
Com esta alteração, o arquivo /etc/hosts.d/MVPS-hosts
passa a abrigar uma cópia exata do arquivo distribuído pelo projeto MVPS, o que facilita enormemente sua manutenção.
Desbloqueios persistentes
A principal crítica à primeira versão do script upd_hostsfile
foi a falta de um mecanismo de persistência dos hosts desbloqueados. Na primeira versão, era perfeitamente possível desativar o bloqueio de um host simplesmente comentando a linha correspondente no arquivo /etc/hosts
. No entanto, ao atualizar o arquivo na semana seguinte, esse desbloqueio ao host seria perdido.
Na versão atual do upd_hostsfile
, o usuário pode usar o arquivo /etc/hosts.unblock
para listar todos os hosts que devem ser desbloqueados, e essa configuração é persistente, mesmo após atualizações dos arquivos MVPS-hosts
e /etc/hosts
.
Falar é fácil...
...Mostre-me o código!
E aí vai o código, disponível também no Bitbucket (script compactado e repositório mercurial com instruções):
#!/bin/bash
# upd_hostsfile
######################################
# This script downloads the latest
# version of MVPS' hosts file and
# appends it to our /etc/hosts file.
# It first checks if there's been
# any changes and, if so, copies the
# updated version over the old one.
#####################################
# This script is meant to be run as a
# cron job, so NO INTERACTION is
# allowed.
#####################################
# HISTORY
# 2010-12-28 Added hosts.d and hosts.unblock functionalities.
# 2010-12-05 Script created.
#####################################
#####################################
# Root check!
####################################
[ "${UID}" -ne "0" ] && echo "You must be root to run this program" && \
exit 3
#####################################
# Config section
####################################
# Choose you downloader program.
#DOWNLOADER="/usr/bin/curl"
#DOWNLOADER="/usr/bin/filezilla"
DOWNLOADER="/usr/bin/wget --quiet"
# Downloader options
#DOWNLOADEROPTS="--proxy-user=johnsmith --proxy-password=secret"
#DOWNLOADEROPTS="--limit-rate=100k"
# Diff utility location
DIFF="/usr/bin/diff -q"
# Unzip utility location. Unzip to stdout, please.
#UNZIP="/usr/bin/unzip -qq -a -c"
# Location of your hosts file. Don't change this unless you KNOW what
# you're doing
HOSTSFILE="/etc/hosts"
# We can now split the hosts file into multiple under this directory
HOSTSDDIR="/etc/hosts.d"
# Centralized unblocked hosts file
UNBLOCKHOSTSFILE="/etc/hosts.unblock"
# TODO: FUTURE VERSION WILL SPLIT SCRIPT AND CONFIG
# Config file
#CONFIGFILE="/etc/upd_hosts.conf"
# Feel free to choose any other path & filename for the downloaded file
#LATESTDOWNLOAD="/etc/MVPS-hosts.zip"
LATESTDOWNLOAD="/etc/hosts.d/MVPS-hosts"
# Change this _ONLY IF_ mvps changes it, or if you prefer to use another
# hosts file provider
URL="http://www.mvps.org/winhelp2002/hosts.txt"
# Where downloads should be kept temporarily while they get tested for
# updates
DOWNLOADFILENAME="/tmp/MVPS-hosts"
# What to write to $HOSTSFILE when creating it from merged files
MERGEDHEADER="#########################################
# This file was autogenerated by upd_hostsfile.
# If you want to change it, please do it at
# ${HOSTSDDIR}/0_local.
#########################################"
####################################
# Functions
###################################
function mergehostsdir {
echo "${MERGEDHEADER}" > "${HOSTSFILE}"
cat "${HOSTSDDIR}"/* >> "${HOSTSFILE}"
# Handle unblocked hosts
if [ -f "${UNBLOCKHOSTSFILE}" ]; then
for host in $( <"${UNBLOCKHOSTSFILE}"); do
sed -e "/^\(127\.0\.0\.1[[:space:]]*${host}.*\)$/# \1/" -i "${HOSTSFILE}"
done
fi
}
function checkfirstrun {
# This function checks if this is the first time this script is being
# run and takes every needed action.
if [ ! -d "${HOSTSDDIR}" ]; then
echo "I need the directory ${HOSTSDDIR}. Creating it."
mkdir -p "${HOSTSDDIR}"
echo "Copying the current ${HOSTSFILE} to ${HO