Arquivo da tag: date

Script para ntp fake (AKA como atualizar horário via http usando shell script)

Resumo da história:

Preciso que uma máquina virtual tenha a hora sempre correta mas não posso instalar o vmware tools e nem usar ntp para isso. Como fazer?

 

A história completa:

Tenho uma máquina virtual onde não consigo instalar o vmware-tools (máquina extremamente customizada, quase nada funciona ali sem muita modificação). Esta máquina virtual está numa rede onde não tem um servidor ntp e, para “ajudar”, o firewall desta rede não permite que eu acesse nenhum servidor ntp externo. Preciso que o horário nesta máquina esteja correto (ok, um ou outro segundo não é problema, mas a data estar na “semana passada” definitivamente não é bom).

Por sorte esta máquina consegue acessar http (via proxy, óbvio) então, tudo o que eu precisava era de uma página web que sempre tivesse a hora correta.

No Brasil, quem é o “responsável” pela hora oficial é o Observatório Nacional. Navegando pelo site deles encontrei uma url que tem a hora legal brasileira e é atualizada a cada segundo.

No meio daquela página vai ter a hora assim: 20/3/2012 15:45:38. Mas o comando date espera receber esta hora assim: 032015452012.38 (se lê de dois em dois dígitos, exceto o ano: mês; dia; hora; minuto; ano; “.” e segundo).

Então basicamente o que eu precisei é “ler” a página e “traduzir” para o formato que o comando “date” do Linux entende.

 

A gambiarra (AKA “solução” do problema):

Abri o source da página e tentei entender onde a data e hora estava. Vi que a hora que preciso aparece no meio de algumas tags html na terceira linha após o texto “Hora Oficial”.

O trecho do source em questão:

<TD ALIGN="CENTER" BGCOLOR=#E0FFFF><B>Hora Oficial de Brasília</B></TD>
</TR>
<TR>
<TD ALIGN="CENTER" BGCOLOR=#ffcc66><B>20/3/2012 15:45:38</B></TD>

 

Separei somente a linha que queria e “limpei” todas as tags, deixando somente a hora.

20/3/2012 15:45:38

Para o script ler a página, usei o comando curl, grep para procurar no texto por “Hora Oficial” e separar as próximas três linhas, tail para separar a última dessas três linhas e, finalmente, sed para remover as tags html.

O código usado (porco, confesso, mas pode rodar no seu shell) , é esse:

curl -s http://pcdsh01.on.br/HoraLegalBrasileira.asp|grep -A3 “Hora Oficial”|tail -1|sed ‘s/<TD ALIGN=”CENTER” BGCOLOR=#ffcc66><B>//g;s/<\/B><\/TD>//g’
 

Armazenei a saída desse comando numa variável, no caso “hora_full”.

Então traduzi a hora que ele me retornou para o formato do date (mais um código porco, mas está “didático”):

hora=`echo $hora_full|cut -d ” ” -f 2|cut -d : -f 1`
minuto=`echo $hora_full|cut -d ” ” -f 2|cut -d : -f 2`
segundo=`echo $hora_full|cut -d ” ” -f 2|cut -d : -f 3|tr -d ‘\r’`
mes=`echo $hora_full|cut -d “/” -f 2`
dia=`echo $hora_full|cut -d “/” -f 1`
ano=`echo $hora_full|cut -d “/” -f 3|cut -d ” ” -f 1`

E juntei tudo como parâmetro para o comando date:

date $mes$dia$hora$minuto$ano.$segundo

Se seu usuário tiver permissão para alterar a data do sistema, isto deverá “sincronizar” com o horário legal brasileiro.

PS: depois (AKA talvez um dia) eu coloque o script todo, inclusive com verificação se o usuário tem ou não permissão para acertar o horário do sistema.