Rapaz, finalmente estou voltando a escrever por aqui. A coisa tava difícil. Muita coisa pra fazer e ao mesmo tempo nada pra fazer ! Entenderam ? Não ?! Nem eu .. mas vamos ao que interessa.

Estava eu em um belo dia de sol ( aqui em Palmas todo dia é dia de Sol e que SOL ) trabalhando e olhando os logs de alguns servidores que mantenho quando para minha surpresa notei que todos estavam com os horários diferentes. Qual o problema disso ?! O problema, é que se o meu chefe me pedisse para fazer uma auditoria e ver quem foi que acessou tal site e cruzar esta informação com o horário de login da máquina, eu taria LASCADO. Deu para vislumbrar a coisa toda ? Então… fui a batalha.

Como diacho eu sincronizo os relógios das máquinas ?!?!

E depois que consegui vei a pergunta:

Como é que eu faço para esta P&*%^ saber que aqui eu não uso Horário de Verão ?!

Essa foi minha pergunta. Ai lembrei do protocolo NTP, que serve exatamente para isso.

Segundo a Wikipédia, em url http://pt.wikipedia.org/wiki/NTP :

Network Time Protocol (NTP) é um protocolo desenvolvido sob o modelo TCP/IP para permitir a sincronização dos relógios dos sistemas de uma rede de computadores. O NTP assume especial relevo em organizações cujas operações devam ser compatibilizadas em termo de timestamp.

A sincronização dos relógios é feita por requisição, mediante um cliente que questiona periodicamente um servidor. Utiliza-se a porta UDP 123 como camada de transporte. O protocolo especifica desvios e outras formas de calcular o atraso induzido na comunicação, tal como a própria latência da transmissão.”


CONFIGURANDO UM SERVIDOR NTP! O ORÁCULO DAS HORAS!

Sabendo disso achei um artigo muito bom que explica Como Montar um Servidor NTP. Segui os passos iniciais e coloquei o meu servidor para rodar. O meu arquivo de configuração /etc/ntp.conf , ficou assim :

#Nao permite alteracao por parte de servidores externos
restrict default nomodify notrap noquery

#permite controle total a partir da interface local
restrict 127.0.0.1

# Libera acesso a rede local
restrict xxx.xxx.xxx.xxx mask xxx.xxx.xxx.xxx nomodify notrap

driftfile /var/lib/ntp/drift/ntp.drift # path for drift file

logfile /var/log/ntp # alternate log file

# Servidor para sincronizar o relógio
# Será usado em ordem
# o pcdsh05.on.br e stratum 1 todos os outros são stratum 2
server pcdsh05.on.br
server ntp.cais.rnp.br
server ntp.puc-rio.br
server ntp1.pucpr.br
server ntp.pop-rs.rnp.br

Observação: Como o servidor era um Suse Linux rodando o NOES (Novell Enterprise Server) o serviço NTP, chama-se XNTPD e existe uma diretiva no arquivo de configuração /etc/sysconfig/xntp que precisa ser alterada para que o mesmo utilize o /etc/ntp.conf. Deve-se colocar em AUTO a diretiva XNTPD_INITIAL_NTPDATE , como mostra o cabeçalho do arquivo.

## Path: Network/NTP
## Description: Network Time Protocol (NTP) server settings
## Type: string
## Default: AUTO-2
## ServiceRestart: xntpd
#
# Usually it's a good idea to get the current time and date
# from some other ntp server, before the local xntpd is started.
# - Set XNTPD_INITIAL_NTPDATE="AUTO" to query ALL servers listed
# in the configuration file (/etc/ntp.conf).
# - Set XNTPD_INITIAL_NTPDATE="AUTO-{NUMBER}" to query the first {NUMBER}
# servers listed in the configuration file. E.g. "AUTO-2".
# Otherwise provide a space-separated list of ntp servers to query, or
# set XNTPD_INITIAL_NTPDATE="" to do no initial query at all.
#
XNTPD_INITIAL_NTPDATE="AUTO"

Feita as devidas configurações, basta reiniciar o serviço, no caso do SUSE NOES, /etc/init.d/xntpd restart. Vale salientar que o mesmo demora alguns minutos para sincronizar com os servidores na internet.

O último passo é configurar os máquinas clientes para sincronizarem com o nosso server.


FAZENDO AS MÁQUINAS MORTAIS PERGUNTAR AO ORÁCULO(SERVIDOR): What time is it ?!

Ubuntu

Se sua máquina for um UBUNTU, basta clicar com o botão direito sobre a data e escolher AJUSTAR DATA E HORA. Será pedida a senha do administrador e na janela que aparecer , na opção de configuração, escolher : Manter sincronizado com servidores na Internet. Na opção Servidores de Horário, clicar em Selecionar servidores e adicionar o IP do seu servidor. Pronto! :D

Windows

Se sua máquina estiver rodando um Windows, clique com o botão direito sobre a data e escolha ajustar data e hora. Na janela que aparecer, clique na guia Horário na Internet e marque a opção: Sincronizar automaticamente com um servidor de horário na Internet e em Servidor digite o IP do seu servidor NTP. Em seguida clique em Atualizar Agora. Se por algum motivo ele disser que não pode sincronizar, que está com raiva, de mal, e não faz isso nem a pau, como aconteceu comigo, tenha calma e não quebre o seu computador, é apenas o Windows. :D Então, se vc usa o windows XP ou 2000, menos mal, vá na linha de comando e digite :

net stop w32time
net time /setsntp:SERVIDOR
net start w32time

Servidor linux

Agora, se a máquina que vc está querendo sincronizar for um servidor, o processo é análogo ao que fizemos para configurar o serviço NTP anteriormente, só temos que configurar para que ele busque o horário em nosso servidor de hora e não na Internet, ou ainda, criar um pequeno script, como mostrado abaixo e colocá-lo no cron para que ele execute de hora em hora ou na frequência que você desejar.

Pequeno Script:

#!/bin/sh
ntpdate

Configuração no /etc/ntp.conf caso deseje utilizar o serviço ntp para sincronizar

driftfile /var/lib/ntp/drift/ntp.drift # path for drift file
logfile /var/log/ntp # alternate log file
server


E ESTE TAL DE HORÁRIO DE VERÃO ?! COMO FAÇO PRA DIZER QUE TOU OU NUM TOU ?!

Bem pessoal, é o seguinte. Depois de todo este trabalho quase destruo meu terminal devido a não conseguir dizer uma coisa tão simples para o server: EU NÃO TOU USANDO HORÁRIO DE VERÃO P&%$#@! :D

Depois de muito fuçar aqui e ali, recorrer muito ao ORÁCULO DA INFORMAÇÃO, vulgo Google, acabei descobrindo várias coisinhas interessantes.

1 - O S.O., no caso do Linux, não atrasa ou adianta uma hora de acordo se você está ou não em horário de verão. O que ele faz é alterar o seu Timezone, que segundo a wikipédia significa:

” A time zone is a region of the Earth that has adopted the same standard time, usually referred to as the local time “

Ou seja, na verdade ele altera o seu Fuso Horário. Sabe aquela história de o seu horário ser GMT - 3 ou GMT - 2 ?! Então é isso. Ao entrar em horário de verão ele altera o seu timezone de GMT - 3, caso você esteja neste fuso horário, para GMT - 2, o que aparentemente significa adiantar uma hora no seu relógio como gosta de anunciar os jornais ;D.

Mais informações sobre timezone: http://en.wikipedia.org/wiki/Timezone

2 - Nós temos DOIS RELÓGIOS !?! É isso mesmo. É igual a árbitro de futebol. Já notou ? Tem um em cada braço ! :D

Um é o chamado Hardware Clock, que é aquele que funciona independentemente de qualquer programa, SO, etc. Também conhecido como Real Time Clock, RTC, BIOS Clock, CMOS Clock. Pense num bicho conhecido! :D O outro é o System Time que é um relógio que, digamos, tem dentro do kernel do linuxe é controlado por interrupções. Quando você inicia o linux ele ajusta o System Time com o Hardware Clock e depois disso esqueçe este último, por isso podemos ter dois horários na mesma máquina! :D Você pode usar o comando hwclock para ajustar o seu Hardware Clock. Cuidado! O date só modifica o System Clock. Sacou ?! :D

Para saber mais um pouco digite : man hwclock

Tá tudo bem! Mas e dai ?! E dai meu amigo, que esta história toda me levou a descobrir que o linux trata as zonas (GMT-3, GMT-2, etc etc etc ), através de arquivos de timezone, que são arquivos que servem para dizer se existem alterações nas mesmas em determinados períodos do ano, como acontece com o Horário de Verão. O seu fuso horário , ou seja, timezone, é regido pelo arquivo /etc/timezone, que é um arquivo binário! Tou avisando logo antes que você tente olhar dentro do bicho! :D

Este arquivo pode ser modificado para a sua realidade. No meu caso o mesmo já vinha definido para alterar o Fuso Horário para GMT - 2, quando o horário de verão começou a valer. E este era meu problema, pois aqui, nós não temos horário de verão. Então, toda vez que eu alterava a hora, virava e mexia, ele adiantava o relógio.

Vamos a luta. Alterar o nosso aquivo /etc/timezone para que ele não altere o nosso relógio na vigência do horário de verão.

1 - Crie um arquivo .zic, com qualquer nome, dentro de um diretório qualquer (no meu caso eu criei dentro de /usr/share/zoneinfo/Brazil/, que é onde ficam os arquivos de timezone).

vim timeZoneSemHorarioVerao.zic

2 - Dentro deste arquivo coloque o conteúdo abaixo e salve.


Rule Brazil 2007 only - Nov 5 00:00 0 -
Rule Brazil 2008 only - Feb 25 00:00 0 -

Zone Brazil/East -3:00 Brazil BR%sT

Explicação:

Primeira e Segunda linhas:
Rule = Regra
Brazil = Nome da regra que estamos criando
2007 = Ano em que a regra terá validade
only = Indica que a regra vale apenas para este ano
- = - (é isso mesmo. Um sinal de menos e pronto! )
Nov = Mês em que a regra começa a valer
5 = Dia do mês em que a regra começa a valer
00:00 = Hora do dia em que a regra começa a valer
0 = Aqui vai a quantidade de tempo que será acrescentado ao fuso. Se fosse para valer o horário de verão colocaríamos 1, o que faria o GMT - 3 , passar para GMT - 2 , afinal, lembrando da matemática do jardim de infância, -3 + 1 = -2

Terceira Linha
Zone = Indica que é um arquivo de zona.
Brazil/East = Nome do fuso horário.
- 3:00 = Quantidade de horas que deve ser adicionada ao nosso relógio.
Brazil = Nome da Regra criada na linha 1 e 2
BR%sT = Formato que será usado para abreviação do fuso horário. BRT = Brazilian Time (horário Normal) , BRST = Brazilian Saving Time (Horário de Verão). Digiter o comando date e veja que lá vai aparecer BRT ou BRST após o horário.

Caso queira se aprofundar: man zic

Olha só como ficaria o arquivo se tivesse que configurar para dizer ao linux para mudar o meu fuso se o horário de verão começasse dia 05 de novembro e acabasse dia 25 de fevereiro.

Rule Brazil 2007 only - Nov 05 00:00 1 S
Rule Brazil 2008 only - Feb 25 00:00 0 -

Se tiver a curiosidade de querer saber como está configurado o seu arquivo de zonas e verificar quando é que começa e acaba o horário de verão, digite:

zdump -v Brazil/East

3 - BACKUP! SEMPRE BACKUP! Para não chorar depois da M%$#@ feita. Copiemos o arquivo /usr/share/zoneinfo/Brazil/East.

cp /usr/share/zoneinfo/Brazil/East /usr/share/zoneinfo/Brazil/East.ORIGINAL

4 - Criemos o arquivo de timezone: zic

zic timeZoneSemHorarioVerao.zic

Após isso o arquivo /usr/share/zoneinfo/Brazil/East será atualizado.

5 - Último passo. Copiar o novo arquivo East para o lugar do localtime

cp /usr/share/zoneinfo/Brazil/East /etc/localtime

Para ver se tá tudo beleza basta usar o comando date e verificar a hora. :D Também dá para usar o zdump. Neste caso, vc deve obter algo do tipo :

Brazil/East Fri Dec 13 20:45:52 1901 UTC = Fri Dec 13 17:45:52 1901 BRT isdst=0 gmtoff=-10800
Brazil/East Sat Dec 14 20:45:52 1901 UTC = Sat Dec 14 17:45:52 1901 BRT isdst=0 gmtoff=-10800
Brazil/East Mon Jan 18 03:14:07 2038 UTC = Mon Jan 18 00:14:07 2038 BRT isdst=0 gmtoff=-10800
Brazil/East Tue Jan 19 03:14:07 2038 UTC = Tue Jan 19 00:14:07 2038 BRT isdst=0 gmtoff=-10800

Observe que apesar de você ter especificado os anos e tudo mais eles não aparecem ai. Bem, ao meu ver, é porque simplesmente não tem horário de verão para você ! :D

Acho que é só pessoal.

Ops. Ia esquecendo. Referência Bibliográfica. :D Ou vocês acham que aprendi tudo isso sozinho só tendo idéias ?! :D :D Tenho que dar os créditos :D

http://www.dicas-l.com.br/dicas-l/20061001.php

http://bazar2.conectiva.com.br/pipermail/linux-br/2007-October/045034. html

http://listas.csirt.pop-mg.rnp.br/pipermail/infoseg/2006-October/00154 2.html