Essa dica é para quem tem um servidor
GNU/Linux rodando atrás de um firewall que bloqueie a porta 123 (NTP).
Por padrão, o GNU/Linux é capaz de sincronizar o relógio interno do seu computador via protocolo NTP (você pode configurar isso para ser automático utilizando o comando
ntpdate - há diversos tutoriais para isso na rede).
Além disso, atualizar a data e hora costuma não ser muito crítico - exceto quando você está rodando o seu servidor em ambiente de virtualização.
Explico: Dependendo da solução de virtualização adotada, quando você suspende uma máquina, ela também suspende o RELÓGIO dela, de forma que, quando ela volta ao ar, está com a data e hora de quando foi desligada!
O que fazer nessa hora? Bom, você tem duas alternativas básicas:
1 - Corrigir a data manualmente, via
sudo date -s, toda vez que você reativar a sua VM com GNU/Linux;
2 - Seguir esta dica! :D
Bom, esta solução é baseada em texto. Primeiro, vamos usar
Wget, grep e
sed, para obter a hora do servidor da Google:
wget -S --spider "http://www.google.com/" 2>&1 | grep -E -m1 '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'
Não vou explicar detalhadamente o que o comando a seguir faz, mas de uma forma geral, é:
- Resgata o index da Google;
- Acha a linha que tem a data e hora do sistema;
- Limpa essa linha, deixando apenas a data e a hora do sistema.
OK, testou bonitinho? Já sabe que funciona? Então, vamos utilizar essa linha como
input no comando
date -s, para atualizar o relógio do sistema!
Lembrando que você precisa de permissões de superusuário para isso, então, vamos utilizar o
sudo:
sudo date -s "`wget -S --spider "http://www.google.com/" 2>&1 | grep -E -m1 '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'`"
O shell vai pedir a senha de seu usuário privilegiado, e atualizar a data do sistema. Fácil, né?
Então, a penúltima parte: Vamos deixar isso automatizado no boot! digite:
sudo nano /etc/rc.local
Edite o arquivo, copiando a seguinte linha ANTES do comando:
exit 0
date -s "`wget -S --spider "http://www.google.com/" 2>&1 | grep -E -m1 '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'`"
Note que aqui, você não precisa de
sudo, já que o script "rc.local" é executado como superusuário.
Agora, seu computador atualiza a hora toda vez que você o reinicia!
Só faltou uma coisa: O caso das VMs! Bom, aí você tem que criar uma regrinha no
Crontab, para que o comando seja executado automaticamente a cada 5 ou 10 minutos, e assim, manter o sistema atualizado.
Bom, para isso, você precisa configurar o Crontab do superusuário, e não o seu! Por isso, vamos invocar o editor de Crontab com
sudo:
sudo crontab -e
Obs.: Se ele perguntar qual editor você quer utilizar, selecione o
Nano, que é o mais fácil deles.
Vá no fim do arquivo, e digite a seguinte linha:
5 * * * * date -s "`wget -S --spider "http://www.google.com/" 2>&1 | grep -E -m1 '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'`"
Isso vai configurar o seu sistema para, a cada 5 minutos, executar o comando acima e sincronizar o seu sistema!
Boa sorte a todos!