Archive for fevereiro 2011

Problemas de Proxy com AD no Endian Firewall.

Ano passado, no mês novembro depois de vários dias tentando resolver um problema que estava tendo ao ingressar o Endian Firewall 2.4.0 no AD, para controlar as políticas de acesso da internet por grupos, consegui resolver o problema.

E aqui, descrevo como resolvi o problema, apesar desse tempo todo sem postar esta solução, a mesma se encontrava no fórum da comunidade brasileira do Endian, neste link e no Bugs do Endian, neste outro link.

A ocorrência deste bug, era um tanto inconsistente e foi meio complicado ter que reproduzir o mesmo, já que o firewall estava em produção.
Após várias tentantivas, análise de log, força de vontade e tempo, consegui parar os serviços e resolver esta pendência.

Depois de várias tentativas de aplicar as políticas de acesso no proxy o mesmo deixava de funcionar adequadamente, aplicando políticas erradas ou bloqueando tudo.

Depois de várias análises de log e de arquivos de configuração, ficou evidente que o problema estava no script restartdansguardian.py (feito em python).
O problema estava basicamente na listagem de diretórios, que estava sendo considerada como string.

Quando o número de content filters ultrapassava 9, chegando a 10 ou mais, a listagem ficava invertida, como descrito abaixo.

Listagem normal em numeral: 1, 2, 3, 4, 5, 6, 7, 8, 9 e 10.

Listagem utilizando string: 1, 10, 2, 3, 4, 5, 6, 7, 8 e 9.

Isso fez com que o dansguardian gerasse as configurações de forma incorreta, jogando para a variável groupname um valor totalmente diferente das configurações do content filter.
Por exemplo, o arquivo de configuração dansguardianf10.conf responsável pelo grupo Segurança, tinha a variável groupname com o valor “Custo content2“.

A resolução do problema se deu, seguindo os seguintes passos, que deram norte para o debug do script python:

# ls -1 /etc/dansguardian/profiles/ [ Aqui ele mostra a listagem como se fosse string. ]
# ls -1 /etc/dansguardian/profiles/ | sed “s/^\(.\)$/0\1/” | sort | sed “s/^0\(.\)$/\1/” [ Aqui vimos como a listagem deveria ser. ]

OBS.: A listagem pode ser feita usando, sort -n.

Mesmo ao ler o script, não foi achado nada.
Ao executar o comando com a opção de debug, tivemos a resposta:

# restartdansguardian -d [ Mostrou onde se encontrava o erro do script. ]

Agora ao entrar no arquivo /usr/local/bin/restartdansguardian.py.

# vi /usr/local/bin/restartdansguardian.py

Procuramos pela linha que continha “.Include” e chegando a função, def getprofiles() responsável pela criação dos content filters.
O processo de debug se deu ao executar linha por linha da função getprofiles.

def getprofiles():
       if file_exists(DANSGUARDIAN_SETTINGS):
          profiles = glob(DANSGUARDIAN_SETTINGS)
      else:
          profiles = glob(DANSGUARDIAN_SETTINGS_DEFAULT)
      profiles += glob("%s/*/settings" % DANSGUARDIAN_PROFILES)
      profiles = sorted(map(lambda p: os.path.dirname(p), profiles))
      debug(profiles)
      return profiles

O processo.

# python

Python 2.4.6 (#1, Nov 10 2009, 07:02:03)
[GCC 3.4.6 20060404 (e 3.4.6-10.endian8)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import os
>>> import glob
>>> profile = glob.glob (“/var/efw/dansguardian/settings”)
>>> profiles = glob.glob (“/var/efw/dansguardian/settings”)
>>> profiles += glob.glob (“%s/*/settings” % “/var/efw/dansguardian/profiles”)
>>> profiles
[‘/var/efw/dansguardian/settings’, ‘/var/efw/dansguardian/profiles/content2/settings’,
‘/var/efw/dansguardian/profiles/content3/settings’, ‘/var/efw/dansguardian/profiles/content4/settings’,
‘/var/efw/dansguardian/profiles/content5/settings’, ‘/var/efw/dansguardian/profiles/content6/settings’,
‘/var/efw/dansguardian/profiles/content7/settings’, ‘/var/efw/dansguardian/profiles/content8/settings’,
‘/var/efw/dansguardian/profiles/content9/settings’, ‘/var/efw/dansguardian/profiles/content10/settings’,
‘/var/efw/dansguardian/profiles/content11/settings’, ‘/var/efw/dansguardian/profiles/content12/settings’,
‘/var/efw/dansguardian/profiles/content13/settings’, ‘/var/efw/dansguardian/profiles/content14/settings’,
‘/var/efw/dansguardian/profiles/content15/settings’, ‘/var/efw/dansguardian/profiles/content16/settings’]
>>> profiles = sorted(map(lambda p: os.path.dirname(p), profiles))
>>> profiles
[‘/var/efw/dansguardian’, ‘/var/efw/dansguardian/profiles/content10’,
‘/var/efw/dansguardian/profiles/content11’, ‘/var/efw/dansguardian/profiles/content12’,
‘/var/efw/dansguardian/profiles/content13’, ‘/var/efw/dansguardian/profiles/content14’,
‘/var/efw/dansguardian/profiles/content15’, ‘/var/efw/dansguardian/profiles/content16’,
‘/var/efw/dansguardian/profiles/content2’, ‘/var/efw/dansguardian/profiles/content3’,
‘/var/efw/dansguardian/profiles/content4’, ‘/var/efw/dansguardian/profiles/content5’,
‘/var/efw/dansguardian/profiles/content6’, ‘/var/efw/dansguardian/profiles/content7’,
‘/var/efw/dansguardian/profiles/content8’, ‘/var/efw/dansguardian/profiles/content9’]

A descoberta.

>>> profile = glob.glob (“/var/efw/dansguardian/settings”)
>>> profiles = glob.glob (“/var/efw/dansguardian/settings”)
>>> profiles += glob.glob (“%s/*/settings” % “/var/efw/dansguardian/profiles”)
>>> profiles
[‘/var/efw/dansguardian/settings’, ‘/var/efw/dansguardian/profiles/content2/settings’,
‘/var/efw/dansguardian/profiles/content3/settings’, ‘/var/efw/dansguardian/profiles/content4/settings’,
‘/var/efw/dansguardian/profiles/content5/settings’, ‘/var/efw/dansguardian/profiles/content6/settings’,
‘/var/efw/dansguardian/profiles/content7/settings’, ‘/var/efw/dansguardian/profiles/content8/settings’,
‘/var/efw/dansguardian/profiles/content9/settings’, ‘/var/efw/dansguardian/profiles/content10/settings’,
‘/var/efw/dansguardian/profiles/content11/settings’, ‘/var/efw/dansguardian/profiles/content12/settings’,
‘/var/efw/dansguardian/profiles/content13/settings’, ‘/var/efw/dansguardian/profiles/content14/settings’,
‘/var/efw/dansguardian/profiles/content15/settings’, ‘/var/efw/dansguardian/profiles/content16/settings’]
>>> profiles = map(lambda p: os.path.dirname(p), profiles)
>>> profiles
[‘/var/efw/dansguardian’, ‘/var/efw/dansguardian/profiles/content2’,
‘/var/efw/dansguardian/profiles/content3’, ‘/var/efw/dansguardian/profiles/content4’,
‘/var/efw/dansguardian/profiles/content5’, ‘/var/efw/dansguardian/profiles/content6’,
‘/var/efw/dansguardian/profiles/content7’, ‘/var/efw/dansguardian/profiles/content8’,
‘/var/efw/dansguardian/profiles/content9’, ‘/var/efw/dansguardian/profiles/content10’,
‘/var/efw/dansguardian/profiles/content11’, ‘/var/efw/dansguardian/profiles/content12’,
‘/var/efw/dansguardian/profiles/content13’, ‘/var/efw/dansguardian/profiles/content14’,
‘/var/efw/dansguardian/profiles/content15’, ‘/var/efw/dansguardian/profiles/content16’]
>>>

OBS.: The glob module finds all the pathnames matching a specified pattern according to the rules used by the Unix shell. (Tirado das referências do python.)

E ao debugar a linha 174 do script, temos o responsável pelo problema, o sorted.

A solução foi a seguinte. Substituímos a linha abaixo:

profiles = sorted(map(lambda p: os.path.dirname(p), profiles))

Por essas:

#profiles = sorted(map(lambda p: os.path.dirname(p), profiles))
profiles = map(lambda p: os.path.dirname(p), profiles)

Restart no dansguardian e verificamos que as políticas estavam corretas.
Testes foram realizados e mostraram que as políticas agora estavam sendo aplicadas corretamente.

Gostaria de agradecer ao Enderson Maia, que ajudou a debugar o script python. x)

Em brever, mais algumas coisas sobre Endian, Oracle e Arch Linux. Enjoy and happy Arching.

Algumas coisas precisam mudar.

Nos últimos meses, fiquei pensando que rumo dar ao projeto Arch Linux Brasil, muito antes da saída de pessoas como Flores, Thotypous e Kalib.

Como de outras vezes pensei seriamente e muito, sobre a minha saída do projeto. Mas, como vi uma situação meio delicada e não queria ver o mesmo acabar, decidi ficar e tentar segurar a barra, tirar a água do barco que estava para afundar (ou afundou, como já vieram falar, que praticamente não existimos mais e sinceramente, parece verdade).

Desde o surgimento do Arch Linux Brasil em 2006, com a ajuda do Douglas Soares, Hugo Doria, Egon Braun, Israel Jr., Denis Bachmann, Armando, Allen Franco, Anselmo Lacerda e Denis Falqueto, sempre pensei no crescimento e divulgação da distribuição Arch Linux e por que não do Arch Linux Brasil?

Com o passar dos tempos, vi muita coisa mudar, saída do Judd Vinet da liderança do Arch, repositório current virando core e os repositórios/pacotes sendo redefinidos.

Vi também um maldito kernel 2.6.27 quebrar vários sistemas por falta de competência dos desenvolvedores, que acabaram implementando os signoffs (que sinceramente, precisa melhorar essa política).

As coisas foram melhorando, e entre 2008/2009 (creio que foram os melhores anos do Arch Linux Brasil), tivemos desenvolvedores e trusted users no Arch, querendo ou não, acabavam levando o nome do Arch Linux Brasil, tanto para o Brasil quanto para fora.

Boas coisas aconteram, durante esses 5 anos de existência, mas também vieram as responsabilidades, status e visibilidade para o projeto e suas atividades.

Chegou em determinados momentos que várias pessoas começaram a colaborar, projeto crescia e as coisas tomaram outras proporções.
Isso era bom até determinado ponto, onde, começamos a chamar pessoas para integrar a parte “dev” do projeto. Para elas, chegar a este lugar as fizeram diminuir ou até mesmo, pararem e nunca mais colaboraram.

Várias desculpas eram dadas, a cobraça por parte dos usuários que não conseguiam se virar, acabou crescendo e o que era motivo de prazer, virou obrigação e tornando as coisas chatas de se fazerem.

Quando as coisas deixam de ser prazerosas de se fazer, começamos a deixar de lado, não é?

Alguns devs, saíram alegando falta de tempo, outros por não terem mais vontade de colaborar, outros começaram a usar outros sistemas operacionais, muitos problemas aconteceram com os updates da distribuição, e consequentemente muitos usuários começaram a deixar a distribuição.

Não julgo ninguém por isso, mas também, uma coisa me deixou muito chateado nesse tempo. A falta de compromisso de todos, quando digo todos, é todos mesmos, até da minha pessoa.

Quando planejavamos algumas medidas para dar continuidade aos trabalhos que queriamos realizar, muitos ficavam só esperando pelos outros e acabavam também, ganhando os créditos pelo trabalho e não o Arch Linux Brasil.

E estes links [1] e [2] me fizeram pensar, estamos na mesma situação e pra mudar esse quadro, será difícil.

Pergunto, será que tudo que fazemos precisa de retorno?

Acho que essa resposta seria, sim. Pois quando trabalhamos e damos conta do recado, queremos um aumento. Se não queremos um aumento, queremos um simples reconhecimento de um bom trabalho está sendo realizado.

Dizer que o Arch Linux Brasil, está morto, para uns pode ser exagero. Diria que estamos apenas hibernando. E vários fatores nos levaram para o estado atual do projeto e também da distribuição.
Posso citar vários, sendo que apenas 2, podem dar uma ideia.

1- Mentalidade dos desenvolvedores da distribuição Arch Linux;
2- Vontade e estímulo dos usuários da distribuição.

Sempre que reclamo, falo que boa parte dos problemas das distribuições se resume aos usuários da mesma. E parece que com o passar do tempo, a confirmação disto fica mais evidente. Quando deixamos de corresponder as espectativas, as coisas tendem a sair de rumo. É o que acontece hoje.

Falei várias vezes para pessoas próximas a mim, “acerte por 40, 50 anos da sua vida. Se ao final dela você errar ao menos 1 vez, será julgado por este erro, e tudo que você fez, não terá mais valor.”

Quando se acompanha um projeto de perto, sabemos onde estão as falhas, não precisamos fazer chamadas de trabalho ou qualquer coisa do tipo, como deu a entender no link [2].

A vontade de falar mais sobre isso é grande e poderia gerar mais polêmica e até mesmo insatisfação de várias pessoas. Lembrando, apesar do Linus ter conseguido criar o Kernel Linux, se não fossem por seus usuários, o mesmo não chegaria onde está hoje.

Então, o mesmo vale para as outras coisas.

PS.:
Lembrei do Software Freedom Day de 2009, onde Alexos, Gomex, Hugo e Eu conversavamos sobre algumas coisas que falei aqui.
Parece que foi ontem e algumas coisas não mudam. Simplesmente impressionante.