Você está na página 1de 30

Expediente editorial

Diretor Geral
Rafael Peregrino da Silva
Super-hiper-ultra-mega-blaster
rperegrino@linuxmagazine.com.br
Editores
Gostou do título? Foi mesmo para chamar sua atenção para o quebra-quebra
Flávia Jobstraibizer
fjobs@linuxmagazine.com.br
que está ocorrendo entre as grandes empresas rivais do mercado de celula-
Kemel Zaidan res – encrenca cujas dimensões podem realmente ser caracterizadas como

EDITORIAL
kzaidan@linuxmagazine.com.br
Editora de Arte
“super-hiper-ultra-mega-blaster”. De um lado do ringue, Apple; do outro, fa-
Larissa Lima Zanini
llima@linuxmagazine.com.br
bricantes de celulares equipados com a distribuição Linux Android (Samsung,
Estagiário Motorola – agora Google –, HTC e quem mais se aventurar). Na prática,
Felipe Brumatti Sentelhas
fsentelhas@linuxmagazine.com.br entretanto, os canhões jurídicos da empresa de Steve Jobs estão apontados
Colaboradores atualmente para a Samsung e o seu Galaxy Tab, Motorola e HTC, apesar
Andrej Radonic, Alexandre Borges, Alexandre Santos,
Augusto Campos, Ben Martin, Charly Kühnast, Chris de (ainda) não estarem na linha de frente no que se refere às acusações da
Binnie, Dan Frost, Jon ‘maddog’ Hall, Klaus Knopper,
Kurt Seifried, Ludger Schmitz, Mike Adolphs, Ralf Apple, já estão recebendo mensagens “sutis” de que haverá encrenca pela
Spenneberg, Thorsten Scherf, Timo Dreger, Zack Brown.
Tradução
frente. Em miúdos, a Apple acusa a Samsung de ter copiado o iPad no Galaxy
Rodrigo Afonso Garcia Tab, bem como ter violado direitos autorais da empresa de Cupertino. Neste
Revisão
Ana Hunger caso, estamos falando apenas do “design” e do desenho externo do tablet, e
Editores internacionais não de violação de patentes da empresa da maçã. Como resultado, a corte
Uli Bantle, Andreas Bohle, Jens-Christoph Brendel,
Hans-Georg Eßer, Markus Feilner, Oliver Frommel, alemã proibiu a comercialização do Galaxy Tab, a priori, em toda a União
Marcel Hilzinger, Mathias Huber, Anika Kehrer,
Kristian Kißling, Jan Kleinert, Daniel Kottmair, Europeia – à exceção da Holanda, onde corre outro processo em paralelo –,
Thomas Leichtenstern, Jörg Luther, Nils Magnus.
proibição essa que ficou limitada posteriormente “apenas” à Alemanha. E,
Anúncios:
Rafael Peregrino da Silva (Brasil)
correndo por fora, encontramos uma acuada Microsoft, tentando extorquir
anuncios@linuxmagazine.com.br
Tel.: +55 (0)11 3675-2600
de fabricantes de smartphones equipados com Android a bagatela de US$
Penny Wilby (Reino Unido e Irlanda)
15 por aparelho vendido, sob o pretenso argumento de que seria dona de vá-
pwilby@linux-magazine.com rias tecnologias usadas pelo sistema operacional desenvolvido pelo Google.
Amy Phalen (América do Norte)
aphalen@linuxpromagazine.com Já escrevi alhures (http://migre.me/5vIWR) o que penso a respeito de paten-
Hubert Wiest (Outros países)
hwiest@linuxnewmedia.de
tes de software (e de patentes em geral), mas os desdobramentos da guerra
Diretor de operações de patentes deflagradas nesse segmento, além de confirmarem minha opi-
Claudio Bazzoli
cbazzoli@linuxmagazine.com.br nião a respeito desse câncer da inovação, merecem algumas considerações.
Na Internet:
A meu ver, o jogo todo tem por função a manutenção do monopólio das
www.linuxmagazine.com.br – Brasil
www.linux-magazin.de – Alemanha
ideias e, com isso, a instauração de monopólios no mercado. Dane-se o con-
www.linux-magazine.com – Portal Mundial
www.linuxmagazine.com.au – Austrália
sumidor, que não pode ter o melhor produto possível, uma vez que a empresa
www.linux-magazine.es – Espanha
www.linux-magazine.pl – Polônia
X, que teria o melhor produto, não poderá comercializá-lo com o recurso Y,
www.linux-magazine.co.uk – Reino Unido
www.linuxpromagazine.com – América do Norte
pois o mesmo foi patenteado pela empresa W, e a empresa X é muito pequena
e não tem como pagar à empresa W pela licença ou pelos royalties que lhe
Apesar de todos os cuidados possíveis terem sido tomados
durante a produção desta revista, a editora não é responsável garantiriam o direito de usar uma ideia que ela já havia tido antes para um
por eventuais imprecisões nela contidas ou por consequências
que advenham de seu uso. A utilização de qualquer material da determinado recurso, mas que não protegeu a tempo, usando o “maravilhoso”
revista ocorre por conta e risco do leitor.
Nenhum material pode ser reproduzido em qualquer meio, em
sistema de concessão de patentes. Ou, se a empresa tiver condições de pagar
parte ou no todo, sem permissão expressa da editora. Assu-
me-se que qualquer correspondência recebida, tal como car-
pelos royalties, o preço do produto ficará 10% mais caro, o que prejudicará
tas, emails, faxes, fotografias, artigos e desenhos, sejam for-
necidos para publicação ou licenciamento a terceiros de forma
a sua competitividade, deixando-o em desvantagem frente a concorrência.
mundial não-exclusiva pela Linux New Media do Brasil, a me-
nos que explicitamente indicado.
Já pararam para analisar o absurdo disso tudo? Quer coisa mais an-
Linux é uma marca registrada de Linus Torvalds. ticapitalista? Trata-se da institucionalização do monopólio de ideias,
Linux Magazine é publicada mensalmente por: pura e simplesmente, o que deixa alijados do mundo uma série de em-
Linux New Media do Brasil Editora Ltda.
Rua São Bento, 500 preendedores que não têm cacife para bancar esse jogo. A brincadeira
Conj. 802 – Sé
01010-001 – São Paulo – SP – Brasil toda acontece no Olimpo das megacorporações, que podem se dar ao
Tel.: +55 (0)11 3675-2600
Direitos Autorais e Marcas Registradas © 2004 - 2011–:
luxo de gastar somas incalculáveis em ações judiciais monumentais. E,
Linux New Media do Brasil Editora Ltda.
Impressão e Acabamento: RR Donnelley
no caso do Android, praticamente todas as vantagens que lhe confere o
Distribuída em todo o país pela Dinap S.A., fato de o sistema ser em grande parte de código aberto, acabam escor-
Distribuidora Nacional de Publicações, São Paulo.
Atendimento Assinante rendo pelo ralo do esgoto das patentes, que terminam por encarecer o
www.linuxnewmedia.com.br/atendimento produto, dificultando a sua adoção por diversos fabricantes.
São Paulo: +55 (0)11 3675-2600
Rio de Janeiro: +55 (0)21 3512 0888 Sou só eu, ou mais alguém acredita que há algo de muito podre
Belo Horizonte: +55 (0)31 3516 1280
ISSN 1806-9428 Impresso no Brasil em tudo isso? ■

Rafael Peregrino da Silva


Diretor de Redação

Linux Magazine #82 | Setembro de 2011 3


ÍNDICE

CAPA
Sempre disponível 31

Cada vez mais acessíveis, as tecnologias utilizadas por data centers


espalhados pelo mundo, hoje estão disponíveis para usuários domésticos.

Pulp: a sensação dos administradores 32

Se você usa software livre, provavelmente precisa gerenciar múltiplos


repositórios de software e manter todas as informações atualizadas. O
Pulp dá a você uma abordagem centralizada da gestão de repositórios.

Xen automatizado 36

Algumas técnicas básicas ajudam os administradores a alcançar


um bom nível de instalação do hypervisor comercial XenServer.

Gerenciamento centralizado 41

Se você gerencia muitos computadores idênticos em um parque


computacional, não gostaria de ter que atualizar cada um deles
individualmente somente para instalar uma atualização de segurança.
O Citrix Provisioning Services 5.0 oferece uma alternativa conveniente.

Cruzamento de nuvens 44

Ao configurar hospedagem em múltiplas infraestruturas de nuvem, você


evita aprisionamento ao fornecedor e ainda ganha benefícios adicionais.

4 www.linuxmagazine.com.br
Linux Magazine 82 | ÍNDICE

COLUNAS ANÁLISE
Klaus Knopper 08 Costura dupla 48

Charly Kühnast 10
Zack Brown 12
Augusto Campos 14
Kurt Seifried 16
Alexandre Borges 18

NOTÍCIAS Por mais de 10 anos, especialistas vêm prevendo a


Geral 20 inevitável mudança do IPv4 para IPv6. NAT e CIDR
mantiveram o IPv4 no topo desde então, mas isso irá
➧ Google e Mozilla trabalham juntos para que aplicativos web se integrem
mudar no final deste ano. Para onde devemos ir?
➧ Nova versão do Ruby traz mudanças em sua licença
➧ Uma nova linguagem para consultas NoSQL
Hardware sob controle 52
➧ Twitter irá liberar o código fonte do Storm O Udev executa e gerencia seu hardware no Linux.
Explore o poderoso sistema e saiba como customizar a
configuração de seu hardware dentro das regras de udev.
CORPORATE
Notícias 22 Valor agregado 60
➧ Google compra patentes da IBM
➧ Dell abre código de sua solução para o OpenStack
➧ Red Hat lança o JBoss Application Server 7
➧ Canonical anuncia um novo programa de parcerias

Entrevista: Jon Melamut 26


Em sua primeira participação no FISL, o vice-presidente de
operações e produtos da Canonical nos concedeu uma entrevista
exclusiva onde falou dos planos da empresa para o Brasil.

Coluna: Jon “maddog” Hall 28

Coluna: Alexandre Santos 30


A ferramenta Opsi permite que administradores
gerenciem clientes Windows a partir de um servidor
TUTORIAL Linux. A versão 4.0.1 ganhou novos recursos.

Hipergerenciamento 67
REDES
Olhar atento 64

A inovadora ferramenta de gerenciamento Archipel usa o protocolo


Jabber para conversar com servidores Xen, KVM, openvZ e VMware.

PROGRAMAÇÃO
Mistura de códigos 72
É claro que você tem um firewall, mas e se um
intruso começar o seu trabalho de dentro da rede? As
ferramentas de monitoramento ARP fiscalizam mudanças
súbitas que podem indicar um ataque local.

SERVIÇOS
Editorial 03
A mistura de linguagens de programação não deve
restringir seu projeto de software. Aprenda a expor Emails 06
objetos e templates C++ ao código PHP e como registrar Linux.local 78
chamadas PHP que o código C++ possa utilizar. Preview 82

Linux Magazine #82 | Setembro de 2011 5


Tecnologia para data centers

Sempre disponível

CAPA
Cada vez mais acessíveis, as tecnologias utilizadas por data centers espalhados
pelo mundo, hoje estão disponíveis para usuários domésticos.
por Flávia Jobstraibizer

V
ocê estranharia saber que pode possuir em sua rede
doméstica os mesmos recursos e ferramentas utili- Matérias de capa
zadas por grandes data centers? Se a sua resposta
Pulp: a sensação dos administradores 32
é sim, então saiba que isso é uma realidade cada vez mais
presente no dia a dia dos usuários domésticos. AutomatiXendo 36
Atualmente, as empresas que provêem serviços de cloud Gerenciamento centralizado 41
computing (computação em nuvem), segurança de infor-
Cruzamento de nuvens 44
mação, e outros segmentos, estão cada vez mais atualiza-
das com o mercado e utilizando ferramentas que, uma vez
sendo softwares livres, estão acessíveis para que você, usuá-
rio e leitor da Linux Magazine possa testá-las, aprender a
utilizá-las e com isso, atestar a segurança do que você poderá
potencialmente utilizar e contratar em um futuro próximo.
Nesta edição da Linux Magazine, você vai conhecer al-
gumas das ferramentas utilizadas por data centers, como é o
caso do Archipel, inovadora ferramenta de gerenciamento que
trabalha em conjunto com Xen, KVM, openVZ e VMware.
Outro destaque desta edição, e que interessará muito aos
profissionais de virtualização, é o artigo sobre XenServer,
no qual são abordadas técnicas para realizar a instalação
em larga escala – e de forma automatizada – da ferramenta.
Um aplicativo popular e muito útil, é o Arpwatch. Co-
nhecida e utilizada há muitos anos, a ferramenta possui
diversas e melhoradas versões desenvolvidas por diversos
desenvolvedores ao longo dos anos e é imprescindível no
arsenal de armas de monitoramento de rede. E se você pre-
cisa checar e manter sistemas sempre disponíveis, estude-a
e verá todo o potencial que terá nas mãos.
Os fãs de programação, também não precisam mais reclamar.
Nesta edição, trouxemos um completo tutorial de PHP com
C++. A mistura de códigos é uma realidade em diversas empresas
que possuem sistemas legados e isso não deve ser um fator limi-
tante para a continuidade de um projeto. Aprenda como obter
o máximo das duas linguagens trabalhando conjuntamente.
Com a facilidade de acesso às ferramentas utilizadas por
empresas e líderes do segmento de tecnologia, os usuários
atualmente possuem maiores chances de tornarem-se es-
pecialistas e utilizar melhor os recursos oferecidos pelos
provedores. Aproveite esta facilidade e especialize-se! ■

Linux Magazine #XX | Mês de 200X 31


ANÁLISE | IPv4/IPv6 em dual-stack

IPv4/IPv6 em dual-stack
ANÁLISE

Costura dupla
Por mais de 10 anos, especialistas vêm prevendo a inevitável mudança do IPv4 para IPv6. NAT e CIDR
mantiveram o IPv4 no topo desde então, mas isso irá mudar no final deste ano. Para onde devemos ir?
por Ralf Spenneberg

Simplicidade é tudo
M
uitos administradores de considerável necessidade até que
sistemas não terão que en- os estoques sejam completamente Os administradores devem estar se
frentar o assunto IPv6 du- finalizados – o que deve acontecer perguntando onde conseguir endere-
rante os próximos dois anos, porque em breve. Nesse caso, empresas não ços IPv6. As pessoas com as quais você
eles têm endereços IPv4 suficientes têm alternativa se não usar endereços conversa são fornecedores de endereços
para garantir o seu acesso à Internet IPv6. No momento, essa não é uma IPv4. No entanto, apenas alguns ofere-
4, graças a tradução de endereços de solução muito boa porque apenas cem acesso nativo a IPv6. No momento,
rede (NAT). O acesso à Internet 6 não um pequeno percentual de usuários esta é uma questão a ser resolvida atra-
é necessário para esses administrado- com acesso a IPv6 pode ter acesso vés de um túnel: usar o IPv4 para criar
res, porque eles não oferecem serviços às ofertas de sua empresa. um túnel para um provedor de túnel
críticos para os negócios no momento. 2. A empresa trabalha com clien- IPV6, que oferece acesso à Internet 6
No entanto, esse não é o caso de tes e parceiros na Ásia. Em muitos por meio dele. Eles também oferecem
todos os administradores em todas as casos, corporações asiáticas introdu- endereços IPv6 (tipicamente na forma
redes. Em alguns casos, faria sentido ziram uma solução de duplo NAT de um prefixo /48) e os roteiam por
para um administrador se familiarizar há muitos anos. E por muitos anos, meio do túnel. A SixX [1] e a Hurrica-
com o IPv6 e adotá-lo, mas algo que alguns fornecedores na região asi- ne Electric [2] servem principalmente
deve ficar claro para todo administra- ática atribuíram somente endere- a consumidores corporativos.
dor é que uma migração completa do ços IP privados para seus clientes Após o registro, irão lhe oferecer o
IPv4 para o IPv6 é algo improvável e mascararam esses endereços. Os túnel e alguns endereços IPv6 de for-
de acontecer nos próximos 10 anos. clientes, por outro lado, usam rote- ma gratuita (até o presente momento).
Posto isso, alguns novos serviços adores para converter os endereços Então eles inserem esses endereços
devem ser oferecidos na Internet 6 IP privados usados internamente, o em seus servidores whois, mantendo
somente em alguns anos e os adminis- que frequentemente causa proble- a atribuição dos endereços detectá-
tradores vão precisar deles. Eles não mas. VPN e VoIP, em particular, são veis para terceiros. As maneiras de
têm alternativa senão introduzir IPv6 dois serviços que causam grandes se configurar os túneis mudam prin-
nas suas redes. E por quais razões? problemas para administradores. cipalmente de acordo com a ponta
1. Sua empresa quer oferecer mais Com IPv6, clientes têm acesso glo- do túnel no lado do cliente, caso esta
serviços na rede e necessita de en- bal a todos os sistemas, o que garante possua endereço IPv4 estático, dinâ-
dereços IPv4 adicionais para tanto. conectividade descomplicada. Mas para mico ou mascarado de forma privada.
Solicitar novos endereços não tem acessar os serviços da empresa, o com- No primeiro caso, tudo o que
sido um problema até agora, mas a putador deve executar em dual stack você precisa fazer no Debian é criar
organização European IP Networks (pilha dupla). Os sistemas, que antes um dispositivo de túnel adicional
(RIPE), em particular, só emite en- só eram acessíveis via IPv4, precisam ao criar a seguinte entrada para seu
dereços IPv4 para provedores em receber um endereço IPv6 também. /etc/network/interfaces:

48 www.linuxmagazine.com.br
IPv4/IPv6 em dual-stack | ANÁLISE

iface ipv6tunnel inet6 v4tunnel


endpoint <EndIPv4doProvTunel>
local <EndIPv4Local>
address <EndIPv6Local>
netmask 64
mtu 1480
gateway <EndIPv6doProvTunel>
ttl 255

Essas linhas dão ao sistema acesso à


Internet 6 por meio do túnel. Se o pro-
vedor do túnel roteia um prefixo IPv6
através do túnel, o administrador pode
usar um daemon de anúncio de rotea-
mento ou um DHCPv6 em sua rede.
Uma alternativa é vincular en-
dereços IPv6 estáticos. Já que os
hosts agora têm conectividade IPv4
e IPv6, a solução recebe o nome de
operação em dual-stack.
Figura 1 No Dual-Stack Lite, o fornecedor economiza endereços IPv4 globais
Dual-Stack Lite ao manipular NAT de endereços IPv4 privados, para endereços IPv4
globais (NAT44).
ou NAT64?
Apesar da escassez de endereços cliente envia um pacote IPv4 com para seu roteador e os sistemas que
IPv4, os métodos Dual-Stack Lite seu endereço privado de origem. O residem nele. A questão importante é
(DS-Lite) e NAT64 precisam garantir roteador então encapsula o pacote que esses sistemas só usam o servidor
a possibilidade de os clientes acessa- em um pacote IPv6, utilizando a DNS do provedor para a resolução
rem a Internet 4. Nos dois casos, o conexão IPv6 para enviá-lo a um sis- de nomes, de três maneiras:
provedor fornece a seus clientes um tema especial no lado do provedor, • A resolução de nomes atribui apenas
endereço IPv6 global para o roteador que extrai o pacote IPv4 e usa NAT44 um endereço IPV6: clientes usam
e um prefixo para os sistemas que para convertê-lo em um endereço seus endereços IPv6 globais para
estiverem por trás dele. No caso do IPv4 global. Para que isso aconteça, acessar o sistema-alvo;
DS-Lite (figura 1), o provedor atribui o fornecedor precisa implementar • A resolução de nomes retorna tan-
um endereço IPv4 privado adicional componentes Carrier-Grade NAT to um endereço IPv4 quanto um
para o roteador do cliente. (CGN) extremamente poderosos. endereço IPv6: o cliente prefere
O roteador, em si, usa DHCP para O sistema também costuma ser o endereço IPv6 e o utiliza para
distribuir endereços IPv4 privados na chamado de Address Family Transition acessar o sistema-alvo;
rede interna. O sistema agora tem Router (AFTR). Um administrador que • A resolução de nome retorna apenas
um endereço IPv6 global e um IPv4 trabalhe no provedor pode implemen- um endereço IPv4: nesse caso, o ser-
privado, cada um com seus gateways tar ATFR usando Linux e um pacote vidor DNS do provedor intervém:
que apontam para o roteador. Quan- de software AFTR do Internet Soft- ele faz o spoof de um endereço IPv6
do um usuário acessa um website, o ware Consortium [3]. Uma vez que o adicional e acrescenta ele à resposta.
sistema primeiro desempenha uma roteador do lado do cliente não mais Para que isso aconteça, o servidor
resolução de nome. Se a resposta tem posse de endereços IPv4 globais, depende de uma representação hexa-
contém somente um endereço IPv6, não posso utilizar serviços como o decimal do endereço IPv4 e do prefixo
o host usa o endereço IPv6 global para DynDNS ou port folding; no entanto, IPv6 previamente definido. O admi-
acessar o sistema-alvo. Se a resposta quem cuida disso tudo é o IPv6, mas nistrador do servidor DNS pode usar
do DNS contém tanto um endere- de uma forma bem superior. tanto o prefixo reservado 64:FF9B::/96
ço IPv4 quanto um IPv6, o sistema No caso da segunda variante, ou um espectro livre de seu próprio
operacional atual prefere IPv6 e, de NAT64, um fornecedor usa uma estoque de endereços IPv6. O cliente
novo, utiliza-o para acessar o sistema- abordagem diferente para dar aos recebe os dois endereços na resposta
-alvo. O DS-Lite entra na jogada no clientes acesso à Internet 4. O clien- DNS e preferirá o endereço IPV6.
caso de alvos somente com IPv4. O te só ganha endereços IPv6 globais O cliente manda os pacotes corres-

Linux Magazine #82 | Setembro de 2011 49


ANÁLISE | IPv4/IPv6 em dual-stack

pondentes para o gateway padrão do tar, mas o sentido oposto pode ser de cabeça administrativa que será
lado do provedor, quando o roteador bem mais complicado. oferecer seus serviços também via
identifica o endereço IPv6 que pas- Os endereços IPv4 não possuem IPv6. Apesar do bem-sucedido dia
sou pelo spoof ao analisar o prefixo. espaço suficiente para encapsular do IPv6, em junho, no qual muitos
O sistema extrai o endereço IPv4 endereços IPV6 em endereços IPv4 provedores ofereceram seus serviços
encapsulado e desempenha NAT ao com spoof, evitando que o DNS46 em IPv6 por um dia, participantes
efetuar a tradução do protocolo de e NAT46 funcionem independentes proeminentes como Facebook, Goo-
IPv6 para IPv4. Os desenvolvedores se um do outro porque eles precisam gle e YouTube descontinuaram suas
referem a esse método como NAT64 trocar informações constantemente. operações em dual-stack.
(figura 2) e a camada necessária Embora algumas implementações vi-
de aplicação de um gateway DNS áveis existam, o RFC 2766 NAT-PT Conclusão
como DNS64. Várias implementa- foi alterado em 2007 (sendo mantido Enquanto os maiores provedores de
ções desse tipo existem para Linux. apenas por razões históricas) por con- serviço se recusarem a suportar o
Um exemplo é a última versão do ta de vários problemas (RFC 4966). acesso IPv6 a seus serviços, o formato
BIND, que já suporta o uso como Para um sistema somente em IPV4, continuará desinteressante para os
um servidor DNS64. O componente não há atualmente uma solução dis- consumidores. Até que isso mude,
NAT64 pode ser manipulado tanto ponível para o acesso a hosts disponí- provedores DSL provavelmente co-
pelo aplicativo que é executado no veis somente via IPv6. Um proxy em meçarão a emitir endereços IPv4
espaço do usuário (userspace) Tay- dual-stack pode oferecer uma forma privados para seus clientes, como
ga [4], quanto pelo componente de contornar isso: os clientes usariam aconteceu na Ásia. ■
do kernel Ecdysis [5]. IPv4 para contatar o proxy e acessar
Um dos problemas com a imple- o sistema IPv6 alvo. No entanto, essa
mentação de NAT64 é a crescente po- técnica suporta somente protocolos
O autor
pularidade do DNSSEC, que detecta que permitem o uso de gateways na Ralf Spenneberg é instrutor free-
qualquer modificação e falsificação camada de aplicação, como DNS, lancer de Unix/Linux, consultor, au-
nas respostas DNS, ignorando-as. SMTP, HTTP ou HTTPS. tor e CEO de sua própria empresa de
treinamento. Ralf publicou diversos
NAT-PT O futuro livros sobre detecção de invasão,
SELinux, firewall e VPNs. A segunda
O documento RFC 2766 defi- Já que somente uma pequena por- edição de seu último livro, VPN on Li-
niu um NAT/tradutor de protocolo centagem dos roteadores DSL exis- nux, foi publicada recentemente.
(NAT-PT) em 2000. Ao contrário tentes suportam IPv6, os provedores
do NAT64, ele também suporta precisam substituir os dispositivos
NAT46, o que torna possível que terminais do lado dos consumidores
Mais informações
não apenas sistemas IPv6 acessem antes de poder introduzir o IPv6 de [1] SixXs: http://www.sixxs.net/
quaisquer alvos IPv4, mas também forma abrangente – um processo caro
que sistemas IPv4 acessem quais- o qual os consumidores não querem [2] Hurricane Electric:
http://www.he.net/
quer endereços IPv6. Uma vez que pagar. Por essa razão, provedores
o IPv4 pode ser facilmente embarca- atrasarão a substituição o quanto [3] AFTR: http://www.isc.
do em endereços IPv6 com spoof, o for possível, o que levará muitos org/software/aftr
NAT64 é bem simples de implemen- provedores de acesso a evitar a dor
[4] Tayga: http://www.
litech.org/tayga/

[5] Ecdysis: http://ecdysis.


viagenie.ca/

Gostou do artigo?
igo?
Queremos ouvir sua opinião.
Fale conosco em
m
cartas@linuxmagazine.com.br
zine.com r
Este artigo no nosso
osso ssite::
Figura 2 No NAT64, o provedor faz a intermediação de um endereço IPv6
http://lnm.com.br/article/5693
r/artic 569
para mascará-lo para IPv4.

50 www.linuxmagazine.com.br
ANÁLISE | Gerenciamento de hardware com Udev

Entenda o Udev

Hardware sob controle


ANÁLISE

O Udev executa e gerencia seu hardware no Linux. Explore o poderoso sistema e saiba
como customizar a configuração de seu hardware dentro das regras de udev.
por Klaus Knopper

N
os velhos tempos, drivers de seus subdiretórios. Os dois tipos prin- (sda), que tem 0 (zero) como “minor
hardware faziam com que cipais de arquivos de dispositivos são device ID” para todo o disco. Os núme-
os dispositivos se tornassem os block devices e os character devices. ros 1 e 2 são os identificadores “minor”
operacionais e acessíveis aos usuários. Block devices (b) permitem acesso das duas primeiras partições do disco.
Embora eles ainda estejam presentes, arbitrário de leitura e escrita no espa- A próxima entrada de disco (o se-
hoje em dia pensamos neles como ço do endereço do hardware, orga- gundo disco SATA – sdb) começa com
módulos – partes do kernel que po- nizados em unidades como “blocos” o identificador “minor” 16. O grupo
dem tanto ser compilados em uma (1024 bytes é o tamanho comum de floppy indica que o segundo disco é
parte estática do sistema, executados um bloco). Os exemplos mais co- um dispositivo de mídia removível, tal-
durante a inicialização ou quando muns são discos rígidos e memórias. vez um drive USB de memória flash.
um novo componente é adicionado. Character devices (c) originalmente Em vez de suportar acesso direto
O udev [1] é a ponte entre o supor- oferecem acesso de leitura e escrita de leitura e escrita para o hardware,
te ao hardware crítico do kernel e o caractere a caractere para o disposi- arquivos de dispositivos suportam
espaço do usuário (userspace). tivo, como os de dados em fita, entre controles I/O (entrada e saída), que
Neste artigo, exploro o sistema outros. Mas também são usados para são comandos que você pode enviar
udev e mostro como adicionar re- controlar recursos de hardware. para o driver do dispositivo enquanto
gras para customizar o processo de O kernel do Linux mantém con- abre o arquivo do dispositivo por meio
configuração de hardware. trole sobre qual hardware pertence de uma requisição do sistema ioctl().
a qual dispositivo, por número ao Você pode usar controles de I/O para
Dispositivos e invés de nome. Esses números são operações como particionar e apagar
sistemas de arquivos os “major device ID” e “minor device
ID”, os quais podem ser descobertos
blocos, ou reconfigurar um dispositivo.
As chamadas read/write e ioctl já
“Tudo é um arquivo”, no Linux. Essa por meio do comando: foram os únicos meios de acessar hard-
filosofia se aplica especialmente ao ware via dispositivos, mas a situação foi
acesso a hardware por meio de arquivos ls -l /dev/devicename
de dispositivos, normalmente locali- No exemplo da listagem 1, 8 é o “ma- Listagem 2: cpuinfo
zados dentro do diretório /dev ou em jor device ID” do primeiro HD SATA 01 $ cat /proc/cpuinfo
02 processor : 0
Listagem 1: IDs dos dispositivos 03 vendor_id : GenuineIntel
04 cpu family : 6
01 $ ls -l /dev/sd[ab] /dev/sd[ab][1-2] 05 model : 28
02 brw-rw---- 1 root disk 8, 0 24. Apr 21:50 /dev/sda 06 model name : Intel(R)
03 brw-rw---- 1 root disk 8, 1 24. Apr 21:50 /dev/sda1 Atom(TM) CPU Z520 @ 1.33GHz
04 brw-rw---- 1 root disk 8, 2 24. Apr 21:50 /dev/sda2 07 stepping : 2
05 brw-rw---- 1 root floppy 8, 16 24. Apr 21:50 /dev/sdb 08 cpu MHz : 800.000
06 brw-rw---- 1 root floppy 8, 17 24. Apr 21:50 /dev/sdb1 09 cache size : 512 KB
07 brw-rw---- 1 root floppy 8, 18 24. Apr 21:50 /dev/sdb2 10 ...

52 www.linuxmagazine.com.br
Gerenciamento de hardware com Udev | ANÁLISE

aprimorada com a chegada de sistemas cação de dispositivo PCI real ou virtual, embutida contendo os IDs de dispo-
de arquivos virtuais de configuração, que abrange uma identificação do forne- sitivo conhecidos. O comando acima
como o procfs e devfs. Sistemas de cedor e uma identificação do dispositivo. identificou corretamente o driver do
arquivos virtuais como esses contêm O kernel Linux lê essas informações e kernel (ath9k) associado ao par com-
informações mais verbais e amigáveis exibe-as nos subdiretórios /sys: posto pelo ID do fornecedor e pelo ID
sobre as configurações do hardware. do dispositivo (0x168c:0x002b), como o
$ cat /sys/devices/pci0000:00/
O procfs, que é padrão em todos 0000:00:1c.1/0000:01:00.0/vendor comando modinfo mostra (listagem 3).
os sistemas Linux modernos, per- 0x168c Um importante papel do udev, quan-
mite que você veja informações de $ cat /sys/devices/pci0000:00/ do ele encontra um novo hardware,
0000:00:1c.1/0000:01:00.0/device
processos, sistema e hardware em 0x002b
é ler a assinatura do dispositivo (PCI
tempo quase real, somente ao ler o ID) e procurar por um módulo que
conteúdo dos arquivos residentes no A parte ambiciosa é identificar um contenha o ID. O udev executa, então,
diretório /proc (listagem 2). driver que funcione com o dispositivo. o módulo via modprobe, a menos que
Ele também permite a configura- Se você sabe o ID (número identifica- ele esteja na blacklist (lista negra) em
ção de opções diferentes, não neces- dor) do fornecedor e do dispositivo, pode /etc/modprobe.d/*.conf. O mecanismo
sariamente relacionadas ao hardware, usar o comando lspci com o banco de hotplug notifica que o udev tem um
enquanto o sistema está em opera- dados pci.ids para procurar por nomes novo dispositivo adicionado ao sistema,
ção, como direcionamento de IP ou de dispositivos “legíveis para humanos”, mas sem um script especial para lidar
gerenciamento de cache do drive. além do driver do dispositivo que deve com os eventos (o diretório /proc/sys/
# Enable IP-forwarding (routing) colocá-lo em estado operacional. kernel/hotplug deve estar vazio).
$ echo 1 >
/proc/sys/net/ipv4/ip_forward $ lspci -k -d 0x168c:0x002b
01:00.0 Network controller: Pré-requisitos
# Tell drive cache management Atheros Communications Inc. Apesar de não ser essencial, a maioria
to only sync every 30 seconds AR9285 Wireless Network Adapter das distribuições envolvem serviços
$ echo 3000 > /proc/sys/vm/ (PCI-Express) (rev 01) do sistema udev em scripts que subs-
dirty_writeback_centisecs Subsystem: AzureWave Device 1089
Kernel driver in use: ath9k tituem o /dev com um pequeno disco
O sistema de arquivos virtual ainda de memória. O disco de memória cria
mais novo, sysfs, suporta um nível No Linux, o nome do dispositivo é e remove nós de dispositivo rapidamen-
de interação com o hardware que vai irrelevante. É importante selecionar o te; essa técnica requer que um certo
muito além de simples controles I/O. módulo do kernel que lida com o dis- arquivo seja criado (como o /dev/null,
Todos os dispositivos de hardware e positivo. Cada módulo tem uma tabela /dev/zero, /dev/console) sem que sejam
componentes da placa principal do
computador têm diretórios sysfs com Listagem 3: modinfo
informações e arquivos de controle, 01 $ modinfo ath9k
os quais permitem que se escrevam 02 filename: /lib/modules/2.6.39-rc4/kernel/drivers/net/
scritps em Shell para controlar o 03 wireless/ ath/ ath9k/ ath9k.ko
hardware. O udev é a ponte entre a 04 license: Dual BSD/GPL
05 description: Support for Atheros 802.11n wireless LAN cards.
parte do kernel (como os módulos e 06 author: Atheros Communications
hardware que suportam os recursos do 07 alias: pci:v0000168Cd00000032sv*sd*bc*sc*i*
mesmo) e o userpace (programas para 08 alias: pci:v0000168Cd00000030sv*sd*bc*sc*i*
09 alias: pci:v0000168Cd0000002Esv*sd*bc*sc*i*
acessar e trabalhar com os hardwares). 10 alias: pci:v0000168Cd0000002Dsv*sd*bc*sc*i*
Além disso, o udev tem alguns 11 alias: pci:v0000168Cd0000002Csv*sd*bc*sc*i*
plugins que permitem interação com 12 alias: pci:v0000168Cd0000002Bsv*sd*bc*sc*i*
a sessão do desktop do usuário e pro- 13 alias: pci:v0000168Cd0000002Asv*sd*bc*sc*i*
14 alias: pci:v0000168Cd00000029sv*sd*bc*sc*i*
gramas de ajuda que exigem caixas 15 alias: pci:v0000168Cd00000027sv*sd*bc*sc*i*
de diálogo e pop-ups sempre que o 16 alias: pci:v0000168Cd00000024sv*sd*bc*sc*i*
status do hardware mudar. 17 alias: pci:v0000168Cd00000023sv*sd*bc*sc*i*
18 depends: ath9k_hw,mac80211,ath9k_common,ath,cfg80211
19 vermagic: 2.6.39-rc4 SMP preempt mod_unload modversions ATOM
Detecção de hardware 20 parm: debug:Debugging mask (uint)
Detectar hardware é relativamente fácil 21 parm: nohwcrypt:Disable hardware encryption (int)
no Linux, porque todo dispositivo de 22 parm: blink:Enable LED blink on activity (int)
23 parm: btcoex_enable:Enable wifi-BT coexistence (int)
hardware tem um número de identifi-

Linux Magazine #82 | Setembro de 2011 53


ANÁLISE | Gerenciamento de hardware com Udev

disparados por detecção de hardware.


Listagem 4: udevadm monitor
Se o /dev/null ou dispositivos virtuais
01 $ udevadm monitor --property --kernel --udev
02 o monitor retornará os eventos recebidos para:
de console ou terminal, principalmen-
03 DEV - o evento no qual udev envia após o processamento da regra te, estão faltando, os scripts tendem
04 KERNEL - o uevent do kernel a criar diversos erros porque a saída
05 UDEV [1303690744.003838] add /devices/pci0000:00/0000:00:1d.7/ padrão e as mensagens de erros não
usb1/1-2 (usb)
06 UDEV_LOG=3 podem ser redirecionadas. Portanto, os
07 ACTION=add scripts de init do udev mantêm uma
08 DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-2 cópia dos arquivos de dispositivos que
09 SUBSYSTEM=usb
10 DEVNAME=/dev/bus/usb/001/003 são copiados tão logo o disco de me-
11 DEVTYPE=usb_device mória /dev é montado. O udev precisa
12 PRODUCT=1221/3234/0 manter controle sobre seus próprios
13 TYPE=0/0/0
14 BUSNUM=001 arquivos de configuração e mudanças
15 DEVNUM=003 no sistema de arquivos virtuais, o que
16 SEQNUM=2272 requer opções do kernel no tempo de
17 ID_VENDOR=USB2.0
18 ID_VENDOR_ENC=USB2.0
compilação para programar o inotify.
19 ID_VENDOR_ID=1221 Para interagir com outros programas
20 ID_MODEL=Flash_Disk do userspace relacionados a informa-
21 ID_MODEL_ENC=Flash\x20Disk ções e acesso de hardware, o udev vem
22 ID_MODEL_ID=3234
23 ID_REVISION=0000 com a biblioteca de sistema libudev.
24 ID_SERIAL=USB2.0_Flash_Disk_1000000000000D8A
25 ID_SERIAL_SHORT=1000000000000D8A
26 ID_BUS=usb
Ação!
27 ID_USB_INTERFACES=:080650: As três principais ações das quais
28 MAJOR=189 o udev é responsável são adicionar
29 MINOR=2 hardware (add), remover hardware
30 KERNEL[1303690745.279285] add /devices/pci0000:00/0000:00:1d.7/
usb1/1-2/1-2:1.0/host2/target2:0:0/2:0:0:0/block/sdb (block) (remove) e alterar ou notificar sobre
31 UDEV_LOG=3 hardware existente (change). Para mo-
32 ACTION=add nitorar os resultados desses comandos,
33 DEVPATH= /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/
host2/target2:0:0/2:0:0:0/block/sdb
use o comando udevadm monitor. As
34 SUBSYSTEM=block opções --property, --kernel e --udev
35 DEVNAME=sdb produzem uma quantidade impres-
36 DEVTYPE=disk sionante de informações cada vez
37 SEQNUM=2285
38 MAJOR=8 que algo acontece no seu conjunto
39 MINOR=16 de hardware. Filtrei um exemplo para
40 KERNEL [1303690745.279497] add /devices/pci0000:00/0000:00:1d.7/ mostrar as partes mais interessantes
usb1/1-2/1-2:1.0/host2/target2:0:0/2:0:0:0/block/sdb/sdb1 (block)
41 UDEV_LOG=3 sobre o que acontece quando um dri-
42 ACTION=add ve de memória flash USB é plugado.
43 DEVPATH= /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/ O retorno do udevadm monitor (lis-
host2/target2:0:0/2:0:0:0/block/sdb/sdb1
44 SUBSYSTEM=block tagem 4) mostra o caminho de dis-
45 DEVNAME=sdb1 positivo do sistema a partir do sysfs,
46 DEVTYPE=partition números ID major e minor e nomes
47 SEQNUM=2286
48 MAJOR=8
de dispositivos sob os quais encontra-se
49 MINOR=17 a primeira partição do drive USB, /
50 KERNEL [1303690745.281684] add /devices/pci0000:00/0000:00:1d.7/ dev/sdb1. Alguns dos pares de valor
usb1/1-2/1-2:1.0/host2/target2:0:0/2:0:0:0/scsi_generic/sg1 keyword = value mostrados na lista-
(scsi_generic)
51 UDEV_LOG=3 gem 4 são variáveis de ambiente que
52 ACTION=add são exportadas para Shells de scripts
53 DEVPATH= /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/ e programas chamados pelo udev.
host2/target2:0:0/2:0:0:0/scsi_generic/sg1
54 SUBSYSTEM=scsi_generic Com a informação pronta, o udev
55 DEVNAME=sg1 começa a conferir as regras (rules).
56 SEQNUM=2287 As regras oferecem uma camada
57 MAJOR=21
para que o usuário atribua nomes

54 www.linuxmagazine.com.br
Gerenciamento de hardware com Udev | ANÁLISE

representativos a cada dispositivo no As regras Os arquivos de regras, portanto, têm


/dev, permitindo sua manipulação. Nos últimos dois anos, a sintaxe dos uma sintaxe rígida, específica do
Elas são especificadas por arquivos .rules do udev passou por udev. Essas regras são pré-compiladas
meio dos arquivos residentes em várias modificações no que diz res- na inicialização do udev, em vez de
/lib/udev/rules.d para os padrões peito a nomes de objetos e variáveis avaliadas em cada evento.
pré-definidos do sistema (as quais de ambiente. Neste artigo, cubro a Em um arquivo de regras, uma linha
você pode mudar, claro) e no versão 167 do udev. de código (que pode ser dividida em
/etc/udev/rules.d para opções adicio- Se os arquivos *.rules fossem sim- várias com o uso da barra invertida (\),
nais definidas pelo administrador. O ples como scripts Shell, dirigidos por tal como nos scripts Shell) lida com
udev executa esses arquivos de regras variáveis de ambientes, seria fácil uma regra. A regra é definida por dois
em ordem alfabética, mesclando os dois demais. Infelizmente, essa aborda- tipos de declarações: matches (tabela
caminhos citados. Nomes de arquivo gem seria ineficiente porque muitos 1) e actions (tabela 2), separadas por
para regras geralmente começam com eventos podem ser disparados cada vírgulas, que são checadas e executa-
um número de dois dígitos, e a maioria vez que algo muda, o que pode acon- das desde que a declaração anterior
termina com a extensão .rules. tecer centenas de vezes por segundo. retorne o valor verdadeiro (true).

Combinação* Contém
Valores “add” para dispositivos removíveis recentemente plugados;
ACTION=="valor" “change” para dispositivos já ligados, mas ainda não reportados ou
reconfigurados; “remove” para dispositivos removidos ou desativados.
DRIVER=="valor" O driver (ou módulo de kernel) em uso para a condução do dispositivo.
O nome interno do kernel para o dispositivo (normalmente o mesmo
KERNEL=="valor" nome do dispositivo no diretório /dev). Wildcards Shell como ? (caracter
arbitrário) ou * (sequência arbitrária de caracteres) são suportados.
“block”, “pmcia”, “tty”, “usb” e outros, reportados no campo
SUBSYSTEM=="valor"
SUBSYSTEM no monitor udevadm ou comando info.
Lê o nome do arquivo chave do diretório sysfs do dispositivo.
SYSFS{keyword}=="valor"
Caiu em desuso com as versões ATTR e ATTRS do udev.
Atributo de palavra-chave reportado pelo udev (normalmente lido do
ATTR{keyword}=="valor"
/proc ou /sys) para o dispositivo atualmente detectado ou identificado.
Similar ao ATTR, mas para um “dispositivo pai” (parent device), que pode ser,
ATTRS{keyword}=="valor"
por exemplo, um disco, controlador ou sistema bus contendo partições.
O mesmo que KERNEL, SUSBSYSTEM e DRIVER relacionados ao dispositivo
KERNELS, SUBSYSTEMS, DRIVERS
detectado, mas criado para dispositivos pai (parent devices).
ENV{keyword}=="valor" Uma variável de ambiente.
* Use != ao invés de == se você quiser verificar se o dispositivo é diferente.
Tabela 1: Combinações nas regras do udev.

Ação Resultado
Configura e exporta uma variável de ambiente para o uso nas
ENV{keyword}="valor" próximas regras ou comandos. Variáveis de ambiente podem ser lidas
novamente em arquivos de rules udev por $env{keyworkd}.
MODE="permissões" Modo de permissão numérica para o arquivo de dispositivo criado em /dev.
GROUP="grupo" Configura o grupo para o arquivo de dispositivo criado em /dev.
Owner="nome_do_usuario" Configura o dono do arquivo de dispositivo criado em /dev.
Cria um único arquivo simbólico de ligação para o arquivo de dispositivo
SYMLIN="nome_arquivo"
adicional, associado com o dispositivo no diretório /dev.
Similar ao anterior, com a diferença de que adiciona um link a
SYMLIN+="nome_arquivo"
mais, em vez de substituir todos os links por um.
RUN="linha_comando" Executa um comando Shell único.
Como o anterior, mas eventualmente adiciona outro comando após o
RUN+="linha_comando"
definido anteriormente, em vez de substituir todos os outros comandos.
ATTR{keyword}="valor" Sobrescreve um atributo udev para as combinações subsequentes de rules udev.

Tabela 2: Ações nas regras do udev.

Linux Magazine #82 | Setembro de 2011 55


ANÁLISE | Gerenciamento de hardware com Udev

A sintaxe, de forma geral, em uma Ao olhar para os vários arquivos de # /etc/udev/rules.d/99


linha de regras, é: regras na biblioteca /lib/udev/rules.d, -mount-backup-disk.rules

MATCH (match) == "texto", você pode se perguntar como desco- ACTION=="add", SUBSYSTEM=="block",
MATCH=="texto", ... , ações brir todos os atributos dos dispositivos ATTR{partition}=="1",
(ATTR/ATTRS) necessários para criar uma \ATTRS{serial}=="07A21A006E442637",
regra correspondente. O comando \RUN+="/bin/bash -c 'mkdir -p
Listagem 5: udevadm info /backup; mount -o umask=000
udevadm dá acesso a informações so- /dev/%k /backup'"
01 $ udevadm info --query=all
--attribute-walk -name=/dev/sdb 1
bre dispositivos específicos ligados ao
02 looking at device ‘/devices/ sistema, as quais você pode encontrar ACTION=="remove", SUBSYSTEM=="block",
pci0000:00/0000:00:1d.7/ ATTR{partition}=="1",
usando o nome do dispositivo corrente \ATTRS{serial}=="07A21A006E442637",
usb1/1-1/1-1:1.0/host8/
target8:0:0/8:0:0 :0/block/ – nesse exemplo, a primeira partição \RUN+="/bin/umount -l /backup'"
sdb/sdb1’: do segundo disco SATA/SCSI/USB
03 KERNEL=="sdb1" /dev/sdb1. O comando mostra o resul- Essa regra confere se a primeira par-
04 SUBSYSTEM=="block"
05 DRIVER=="" tado da listagem 5; abreviei a listagem tição do dispositivo recentemente adi-
06 ATTR{partition}=="1" para as partes mais relevantes da cria- cionado possui um número serial único
07 ATTR{start}=="8064" ção de regras udev. como 07A21A006E442637. Se encontrada,
08 ATTR{size}=="15638656"
09 ATTR{ro}=="0" Os atributos ATTR da listagem 5 a partição é montada como /backup.
10 [...] estão diretamente associados com O parâmetro umask para o mount li-
11 [...] o “block device” que consultei, en- bera as permissões de um sistema de
12 looking at device ‘/devices/
pci0000:00/0000:00:1d.7/ quanto os valores ATTRS são tirados dos arquivos VFAT ou NTFS para leitura e
usb1/1-1/1-1:1.0/host8/ dispositivos do hardware de origem escrita, de forma que você não precisa
target8:0:0/8:0:0:0/block/sdb’: – o disco SCSI e o subsistema de ar- ser usuário root para criar arquivos no
13 KERNEL=="sdb"
14 SUBSYSTEM=="block" mazenamento USB. O udev confere /backup. Se você usa um sistema de
15 [...] todas essas combinações ao avaliar um arquivos que suporta permissões de
16 ATTRS{removable}=="1" arquivo de regra, de forma que você arquivo, deve remover -o umask=000 e
17 ATTRS{ro}=="0"
18 ATTRS{size}=="15646720" possa usar combinações diferentes programar as permissões do diretório
19 ATTRS{events}== para chegar à melhor combinação. montado para um valor conveniente
"media_change" As ações do udev na tabela 2 po- para um usuário sem privilégios no
20 looking at parent
device ‘/devices/ dem ocorrer no momento em que o sistema. A regra de amostra para a
pci0000:00/0000:00:1d.7/ hardware é identificado (outras ações ação remove irá desmontar o diretó-
usb1/1-1/1-1:1.0/host8/ são possíveis, mas raramente usadas). rio /backup, caso ele não tenha sido
target8:0:0/8:0:0:0’:
21 KERNELS=="8:0:0:0" Para arquivos de regras, o udev su- desmontado pelo usuário, de forma
22 SUBSYSTEMS=="scsi" porta um esquema de substituição que o dispositivo possa ser realocado.
23 DRIVERS=="sd" para os valores de strings, como pode Você pode começar um backup
24 ATTRS{vendor}==" "
25 ATTRS{model}=="USB ser visto na tabela 3. imediatamente com a ação add ao
DISK 2.0 " Você encontrará um conjunto estender o primeiro comando RUN
26 ATTRS{rev}=="PMAP" completo de combinações, ações e depois da montagem com algo como:
27 ATTRS{state}=="running"
28 [...] opções de configuração do udev no
29 looking at parent ... && tar -zcPf /backup/
Linux Archieve [2]. backup-'date +'%Y-%m-%d''
device ‘/devices/
pci0000:00/0000:00:1d.7/ .tar.gz /home/work
usb1/1-1’: Escreva suas
30
31
KERNELS=="1-1"
SUBSYSTEMS=="usb" próprias regras e desmontando (umount) a partição
depois disso.
32 DRIVERS=="usb"
33 ATTRS{bMaxPower}=="200mA" Se quiser personalizar a forma com que O próximo exemplo adicionará um
34 ATTRS{urbnum}=="412" seu sistema trata um dispositivo de hard- link simbólico chamado cdrom e outro
35 ATTRS{idVendor}=="13fe"
36 ATTRS{idProduct}=="3600" ware, você pode escrever sua própria chamado dvd, se o dispositivo detectado
37 ATTRS{bcdDevice}=="0100" regra de udev. O seguinte exemplo é for identificado como um drive de CD
38 [...] uma simples regra udev para memó- ou DVD, possivelmente substituindo
39 ATTRS{manufacturer}==" "
40 ATTRS{product}== ria flash USB examinada neste artigo. um link prévio para o arquivo de dis-
"USB DISK 2.0" Neste caso, eu quero montar a positivo, de forma que o link simbólico
41 ATTRS{serial}== memória flash no ponto /backup sempre aponte para o dispositivo adi-
"07A21A006E442637
quando ela é plugada: cionado mais recentemente.

56 www.linuxmagazine.com.br
Gerenciamento de hardware com Udev | ANÁLISE

A linha END{ID_CDROM}==”?*” busca mudanças [3]. Mesmo que a página Esse teste é somente para debug. Ele
uma variável de ambiente ID_CDROM do manual diga que esse passo não não executa o programa e pode dar re-
que não esteja vazia, o que signifi- é necessário – porque o udev moni- sultados incorretos porque alguns valores
ca que o dispositivo foi identificado tora os diretórios de configurações podem ser diferentes ou não disponíveis
como drive de CD ou DVD. regularmente – achei útil durante em uma simulação (listagem 6).
meus experimentos, reiniciar o udev: O teste revela quais scripts seriam
# /etc/udev/rules.d/
99-cdrom-link.rules sudo /etc/init.d/udev reload executados para esse dispositivo e
SUBSYSTEM=="block", mostra quais variáveis estão progra-
ou
ACTION=="change|add", madas para a execução.
ENV{ID_CDROM}=="?*", \ sudo udevadm control --reload-rules
SYMLINK+="cdrom", SYMLINK+="dvd"
Interação com o
O próximo exemplo inicia o daemon Testes e debug usuário do desktop
do bluetooth quando um dispositivo O comando udevadm test executa uma
bluetooth é plugado, e interrompe o dae- simulação em seus arquivos de con- O udev inicia todas as suas ações
mon quando o dispositivo é removido. figuração com o caminho completo como usuário root por padrão, en-
Adicionalmente, o modem se- do dispositivo como um parâmetro. tão você não deve se preocupar com
rial do dispositivo bluetooth con- privilégios insuficientes ao lidar com
$ udevadm info --query=path
figurado como /dev/rfcomm3 em --name=/dev/sdb1 /devices/ dispositivos. No entanto, o usuário
/etc/bluetooth/rfcomm.conf é vinculado pci0000:00/0000:00:1d.7/ root não tem acesso ao desktop grá-
a /dev/modem, de forma que programas usb1/1-1/1-1:1.0/host7/ fico ao ser executado pelo usuário
target7:0:0/7:0:0:0/block/sdb/sdb1
como o wvdial encontrem-no facilmente: sem privilégios, por duas boas razões:
Use o caminho para o udevadm test: ➧ O servidor Xorg tem suas pró-
# /etc/udev/rules.d/99
-bluetooth-modem.rules $ udevadm test --action=add prias permissões de sistema, habili-
# Start/stop bluetooth daemon /devices/pci0000:00/0000:00:1d.7/ tando ou desabilitando acesso à tela
on detection of bluetooth usb1/1-1/1-1:1.0/host7/ com “cookies”, de forma a recusar
host adapter target7:0:0/7:0:0:0/block/sdb/sdb1
ACTION=="add|change",
que outro usuário root inicie um
\SUBSYSTEM=="bluetooth", run_command: calling: test programa gráfico em uma sessão já
\KERNEL=="hci*", udevadm_test: version 167 iniciada por outro usuário.
\RUN+="/etc/init.d/bluetooth start"
ACTION=="remove",
\SUBSYSTEM=="bluetooth", Listagem 6: udevadm test
\KERNEL=="hci*",
\RUN+="/etc/init.d/bluetooth stop" 01 parse_file: reading '/lib/udev/rules.d/40-hplip.rules' as rules file
02 (checagem de montes de outros arquivos de regras ...)
# Set modem link to bluetooth 03 util_run_program: '/sbin/blkid -o udev -p /dev/sdb1' started
serial device rfcomm3 only 04 util_run_program: '/sbin/blkid' (stdout) 'ID_FS_TYPE=vfat'
ACTION=="add|change", 05 util_run_program: '/sbin/blkid' (stdout)
SUBSYSTEM=="tty", 06 'ID_FS_USAGE=filesystem'
\KERNEL=="rfcomm3", 07 util_run_program: '/sbin/blkid -o udev -p /dev/sdb1'
SYMLINK+="modem" 08 returned with exitcode 0
09 (outros programas de auxílio que investigam o dispositivo ...)
O exemplo final adiciona uma 10 udevadm_test: ID_FS_VERSION=FAT32
regra para criar logs de tempo e va- 11 udevadm_test: ID_FS_TYPE=vfat
12 udevadm_test: ID_FS_USAGE=filesystem
riáveis de ambiente exportadas para 13 (outras saídas de debug do udev)
o /tmp/udev-env.log, as quais podem 14 udevadm_test: run: '/usr/local/bin/askmount /dev/sdb1'
ser úteis no desenvolvimento de shell 15 udev adm_test: run: '/bin/sh -c '/usr/sbin/rebuildfstab
-u knopper -i''
scripts que usam essas variáveis. 16 (mais programas definidos por RUN+=”programa” ...)
# /etc/udev/rules.d/99
-log-env.rules Substituição Se expande para
ACTION=="add|change|remove", O nome de kernel do dispositivo (como
\RUN+="/bin/bash -c '(date; env; %k
sda1 ou video0 sem o prefixo /dev).
echo) >>/tmp/udev-env.log'"
$env{keyword} A variável de ambiente keyword.
Após adicionar novos arquivos $attr{keyword} Ao valor contido no atributo do udev ATTR{keyword}.
de regras, ou alterar velhos arqui-
vos, o udev deve notificar sobre as Tabela 3: Substituições de valores nas regras do udev.

Linux Magazine #82 | Setembro de 2011 57


ANÁLISE | Gerenciamento de hardware com Udev

➧ Em um ambiente multiusuário, A filosofia “multiusuário” pre- tar acesso ao display local para o
é aparentemente difícil saber qual u- vê que os usuários e o sistema não usuário root. O script na listagem 7
suário, usando qual display remoto, devem interferir nos processos é um diálogo interativo que pede
é responsável pela inclusão de um de outro usuário. Se quiser es- permissão para montar a partição
novo dispositivo. crever scripts para iniciar progra- de um pen drive USB recente-
A forma correta para um geren- mas gráficos por meio do udev, mente plugado. O chamarei com
ciamento de hardware amigável no você pode “trapacear” ao conquis- /usr/local/bin/askmount.
desktop do usuário é por meio de
programas individuais que acessam Listagem 7: askmount
informações do udev via libudev,
01 #!/bin/bash
parte da distribuição do udev. Pro- 02 # /usr/local/bin/askmount
gramas que usam o libudev podem 05 # (C) Klaus Knopper 2011
ser facilmente conferidos para even- 06 # License: GPL V2
07
tos relacionados a hardware, e então 08 # $DEVNAME (caminho absoluto), $ID_MODEL (product name)
notificados caso algo mude. 09 # and $ID_FS_TYPE (sistema de arquivos) are environment variables
Para tornar as coisas mais complexas, 10 # exported by udev.
11
você tem o dbus, um “barramento de 12 [ -n "$DEVNAME" ] || DEVNAME="$1"
sistema virtual” que recebe informa- 13
ções de udisks e upower (ambos usando 14 if [ -z "$DEVNAME" ]; then
15 echo " $0 deve ser chamado com partição como argumento, saindo." >&2
o libudev como clientes para o udev) 16 exit 1
sempre que algo acontece relacionado 17 fi
ao disco ou à gestão de energia. Progra- 18
19 # Conseguir acesso ao primeiro display que executar X
mas de desktop, como o gerenciador de 20
arquivos, podem se comunicar com o 21 export DISPLAY=":0"
dbus para saber se qualquer dispositivo 22 export XAUTHORITY=" $(ps f -C xinit -C Xorg -C X | sed -n
‘s/.*-auth \(.*\)/\1/p’ | head -1)"
de interesse aparece ou desaparece 23
sem se conectar ao udev diretamente. 24 # Checar se possui $XAUTHORITY antes de continuar.
Esse método é, atualmente, a forma 25 if [ ! -r "$XAUTHORITY" ]; then
26 echo "Sem acesso ao display local, saindo." >&2
recomendada de acessar informações 27 exit 1
de hardware do sistema udev. Do ponto 28 fi
de vista do desenvolvedor, isso irá subs- 29
30 # Solicitando permissão do usuário para montar o dispositivo.
tituir completamente o HAL (camada 31
de abstração de hardware, em inglês). 32 if zenity --question --title="Novo dispositivo encontrado"
Você ainda pode encontrar uma in- --text="$ID_MODEL\n
33 Would you like to mount $DEVNAME?" ; then
terface para o Hal ao examinar seu 34
/lib/udev/rules.d/90-hal.rules: 35 # Ponto de montagem criado,
substituindo no /dev/ por /media/ no $DEVNAME
# pass all events to the HAL daemon 36 mountpoint="${DEVNAME/\/dev\///media/}"
RUN+="socket:@/org/freedesktop/ 37 mkdir -p "$mountpoint"
hal/udev_event" 38
40 options="users"
41
Se o HAL estiver em execução, 42 # Se o sistema não suportar permissões,
o udev enviará as informações de 43 # setar o padrão para leitura e escrita para todos.
44 case "$ID_FS_TYPE" in
todos os hardwares para o socket 45 *fat|msdos|ntfs) options="$options,umask=000" ;;
associado e o HAL notificará todos 46 esac
os programas compatíveis com ele. 47
48 # Feita a montagem, informar ao usuário sobre sucesso ou falha.
Aparentemente, no Debian Testing, 49 if mount -o "$options" "$DEVNAME" "$mountpoint"; then
o HAL sequer é um programa neces- 50 zenity --info --timeout=5 --title="Dispositivo montado"
sário, e você pode removê-lo com --text="Feito, agora você tem acesso ao dispositivo.
Não esqueça de desmontá-lo antes de desconectar."
segurança. Programas de desktop 53 else
ainda conseguirão processar infor- 54 zenity --info --timeout=5 --title="Error" --text="Desculpe,
mações relacionadas ao hardware não foi possível montar $DEVNAME."
55 fi
via dbus ou diretamente do libudev.

58 www.linuxmagazine.com.br
Gerenciamento de hardware com Udev | ANÁLISE

O script usa uma variável de am- plugar na entrada USB uma memória ifconfig debice hw ether new_mac),
biente que é programada pelo blkid, flash com partições que contenham o udev adicionará outra entrada
ferramenta auxiliar do udev, ID_FS_TYPE sistemas de arquivos, serão parecidas para ele.
(contendo o tipo de sistema de arqui- com as caixas da figura 1.
vos da partição) e uma variável DEVNA- Conclusão
ME exportada pelo udev que contém Persistência Embora o udev ainda esteja em de-
o caminho completo do dispositivo. Um caso de uso interessante de senvolvimento, ele já emergiu como
A listagem 7, que está disponível regras udev, as quais estão ativadas uma ferramenta bem definida de
para download no website da Linux por padrão na maioria das distri- especificações de configuração, que
Magazine [4], usa o Zenity para ofe- buições, é atribuir nomes persis- permite aos usuários obter informa-
recer caixas gráficas de diálogo. Você tentes para dispositivos específicos, ções sobre o hardware e criar scripts
pode ainda executar o script de forma uma vez que eles foram detectados para tarefas relacionadas a ele.
independente do udev e testá-lo, mas pela primeira vez. Durante a de- A interface libudev para programas
ele só consegue montar um dispositivo tecção do dispositivo, as regras em C/C++ torna possível a escrita de códi-
de forma bem sucedida quando execu- /lib/udev/rules.d/*generator.rules go que pode reagir diretamente a mu-
tado como root. Nesse caso, as variáveis criam e atualizam outro arquivo danças na configuração do hardware.
de informação ID_MODEL e ID_FS_TYPE de regras contendo um número Com o udev, os usuários podem
não estarão disponíveis, a menos que serial único de dispositivos como manipular configurações – indepen-
você as configure manualmente. interfaces de rede, drives de CD e dentemente do desktop – por meio
Agora, crie o arquivo de regras: DVD e discos rígidos. Ao usar os do dbus a partir da sessão do usuário
arquivos gerados, o udev "lembra", gráfico, acessando várias ferramentas
# /etc/udev/rules.d/99-
askmount.rules por exemplo, como o disco foi no- administrativas para gerenciamento
meado, quando ele foi encontrado de dispositivos que dependem do
ACTION=="add", SUBSYSTEM=="block", pela primeira vez e sobrescreve o udev e do dbus. ■
\ENV{ID_FS_USAGE}=="filesystem",
\RUN+="/usr/local/bin/askmount
nome do dispositivo de forma a
$env{DEVNAME}" restaurar seu nome anterior. Pode Mais informações
ser reconfortante saber que um
Se tudo funcionar (diga ao udev disco sempre será encontrado sob [1] Página do udev no kernel.
para recarregar as regras), as caixas o mesmo nome de dispositivo, sem org: http://www.kernel.
de diálogos exibidas pelo Zenity, ao o impacto de outros hardwares. Por org/pub/linux/utils/
outro lado, a numeração consecuti- kernel/hotplug/udev.html
va de discos ou dispositivos de rede [2] Lista completa das
pode levar a números muito eleva- combinações e ações do
dos dependendo da quantidade de udev: http://www.kernel.
dispositivos com a qual se está tra- org/pub/linux/utils/kernel/
balhando. Se você perder ou que- hotplug/udev/udev.html
brar um dispositivo, o nome nunca
mais será reutilizado, a menos que [3] Dicas e truques udev
no wiki do Archlinux:
você edite o arquivo persistente
https://wiki.archlinux.
( /etc/udev/rules.d/*persistent.
org/index.php/udev
rules) manualmente.
Um dispositivo de rede per- [4] Códigos para este artigo:
sistente fica assim no /etc/udev/ http://lnm.com.br/
rules.d/70-persistent-net.rules: issues/82/askmount.zip

# USB device (rt73usb)


SUBSYSTEM=="net", Gostou do artigo?
igo?
ACTION=="add", DRIVERS=="?*",
\ATTR{address}== Queremos ouvir sua opinião.
"00:23:cd:fd:4d:95", Fale conosco em
m
Figura 1:O udev permite que você \KERNEL=="wlan*", NAME="wlan1" cartas@linuxmagazine.com.br
zine.com r
acrescente caixas de diálogo
Este artigo no nosso
osso ssite::
para personalizar o processo Se você ousar mudar o endereço
de inicialização do hardware. http://lnm.com.br/article/5661
r/artic 566
de hardware do dispositivo (usando

Linux Magazine #82 | Setembro de 2011 59


ANÁLISE | Gerenciamento de clientes Windows com Opsi

Interoperabilidade

Valor agregado
ANÁLISE

A ferramenta Opsi permite que administradores gerenciem clientes Windows


a partir de um servidor Linux. A versão 4.0.1 ganhou novos recursos.
por Ludger Schmitz

Q
uando a versão 4.0.1 do Opsi de um protocolo SMB (Samba) na rá a velocidade de download caso
foi lançada, após um grande ponta errada de uma linha DSL, ou alguém esteja usando a interface de
lançamento do 4.0, não se pior, de uma conexão UMTS (rede rede ativamente.
esperava nada de especial de celulares 3G), levaria a erros e Se a conexão for interrompida, o
de um complemento. Mas quem instalações extremamente longas, download é retomado em uma pró-
pensava assim foi surpreendido pelo caso a conexão fosse interrompida. xima oportunidade. Esse processo
gerenciador de clientes Windows de Além disso, o laptop de quem viaja continua até que todos os arquivos
código aberto [1]. As melhorias na muito a trabalho nunca teria a possi- requisitados estejam disponíveis local-
versão nova agora atendem ambientes bilidade de alcançar o servidor Opsi mente e só aí o usuário é informado
com um grande número de clientes. pela falta de conexão de rede. Em da instalação eminente e convidado
As mudanças na versão 4.0.1 estão re- outras palavras, uma solução com- a reiniciar a máquina. A instalação
lacionadas a ambientes distribuídos. pletamente diferente era necessária. acontece à moda típica do Opsi an-
O Opsi usa cache local ou arquivos tes do login; nesse caso, nenhuma
Conexões lentas de instalação com dados de configu- conexão de rede é necessária porque
A mudança mais importante certa- ração. Se um cliente Opsi – em uma todos os dados estão disponíveis local-
mente é o recurso de integrar clientes rede sem fio – instala algum software, mente. Os resultados da instalação
em conexões lentas. Um cliente Opsi ele primeiro usa os protocolos CIFS/ são armazenados em cache local e
típico na rede local contacta o servi- HTTPS para executar os arquivos re- transferidos ao servidor em uma pró-
dor Opsi depois do boot para conferir quisitados e dados em um disco local. xima oportunidade (na próxima vez
se existe algo para ser instalado e, se Para evitar a interrupção dos usuários que houver conexão de rede dispo-
for o caso, ele monta um canal de durante seu trabalho, isso acontece nível). O software é iniciado na hora
compartilhamento para poder insta- em segundo plano com uso dinâmico do boot (isso pode ser desabilitado),
lar o software. A tentativa de instalar da largura de banda disponível. Isso assim como um conjunto de outros
algo banal, como o Adobe Reader, significa que o cliente Opsi reduzi- eventos que tentam abrir uma cone-

60 www.linuxmagazine.com.br
ANÁLISE | Gerenciamento de clientes Windows com Opsi

xão – quando a interface de rede é software de um repositório – ao invés de sofrer com usuários acionando
ativada, por exemplo. de usar toda a rede. Mas, se o cliente o suporte a cada vez que precisa-
é um laptop e pertence a equipe de rem de uma ferramenta trivial que
Segurança na nuvem? vendas de rua? Novamente, o lap- está faltando. Uma forma legal de
A abordagem coberta neste artigo top pegará o software do repositório responder a isso é usar um sistema
permite que os administradores não vinculado, mesmo que aconteça de de software sob demanda. Os ad-
somente cuidem dos laptops de uma estar geograficamente mais perto de ministradores podem vincular uma
força de vendas externas, por exemplo, outro repositório. seleção de produtos dentro do grupo
como também integrem escritórios, O próximo recurso que entra em de software sob demanda, do qual os
matrizes e filiais com apenas alguns cena nesse momento é a vinculação usuários podem requisitar a instala-
computadores na outra ponta da rede dinâmica de repositórios. Embora o ção em seus computadores. Os soft-
sem fio, tudo com o gerenciador cliente permaneça vinculado para wares são instalados com privilégios
centralizado Opsi. Isso significa que seu repositório principal, você pode de administrador pelo cliente Opsi,
você pode agora gerenciar e manter também fornecer uma lista de repo- como definido pelo administrador
localizações que poderiam repre- sitórios que contêm o software requi- no pacote.
sentar problemas de segurança por sitado. Por meio de um algoritmo,
falta de atualizações centralizadas. o cliente pode agora decidir qual Detalhes
Considerando essas novas opções, repositório de uma lista é o melhor Os novos recursos pelos quais passei
parece lógico usar o servidor Opsi para ele. Uma vez que o algoritmo até agora são baseados em projetos
para gerenciar um grande número pode ser definido livremente, você financiados através de taxas, o que
de computadores distribuídos, e o tem condições de basear sua escolha, significa que eles não se tornarão gra-
servidor poderia ficar na nuvem para por exemplo, no endereço de rede tuitos e de código aberto até que os
servir a esse propósito. A tecnologia ou nas taxas de latência. desenvolvedores tenham recuperado
permite essa abordagem e o Opsi seus custos. Além dessas extensões
também ganhou melhorias na sea- Trabalho facilitado comerciais, algumas melhorias me-
ra da segurança. A autenticação de Decidir qual software implementar nores foram adicionadas diretamente
servidores e clientes, introduzida em clientes corporativos é frequen- ao núcleo de código aberto do Opsi.
recentemente, melhorou esse ponto temente o dilema de administrado- Para resumir, só abordarei as melho-
para casos em que um invasor tenta res de sistemas: o problema é que rias mais importantes.
realizar um spoof (técnica maliciosa) normalmente eles não querem ins- Começarei com a mais notável,
no servidor Opsi e comprometer os talar softwares desnecessários, mas que é a interface de gerenciamento.
clientes Opsi. Apesar disso, o forne- também não querem correr o risco Você agora pode armazenar as sele-
cedor ainda alerta aos administra-
dores para manterem as medidas de
seguranças adicionais, como VPNs,
além do uso de serviços de consulto-
ria no caso de aplicativos na nuvem.
Afinal, se um invasor comprometer o
servidor Opsi, ele passa a ter acesso
a todos os clientes conectados a ele.

Aqui e lá
Suporte gratuito para múltiplos lugares
é um recurso usado frequentemente
no Opsi. Localizações externas e um
grande número de clientes tendem
a usar seus próprios repositórios des-
centralizados de software. Os clientes
nessas localizações podem ser vincu-
lados a um repositório específico em
uma interface de gerenciamento. Após Figura 1: A janela DaemonInfo oferece ao administrador uma visão geral útil
fazer isso, o cliente então atualiza o sobre a sequência de atividades de um cliente Opsi.

62 www.linuxmagazine.com.br
Gerenciamento de clientes Windows com Opsi | ANÁLISE

ções de colunas de dados a serem Outras melhorias que valem a que você não invista em extensões
exibidos para clientes ou produtos, pena destacar, no lado do servidor: comerciais, o cliente Opsi permite
ao invés de ter que configurar isso se você quer usar o Opsi Wake-on- uma configuração mais granular da
cada vez que se reinicia o sistema. -LAN em um ambiente distribuído, interação do usuário.
A ferramenta também pode identi- irá gostar dos suportes para broadcasts Tudo isso dito, o Opsi claramente
ficar e exibir facilmente os clientes diretos na rede. As opções de con- traz avanços como uma ferramenta
que estão online, com o pressionar figuração para resolução de nomes de gerenciamento profissional de
de um botão. Formas de busca aju- foram aprimoradas para manter os clientes, tanto no que diz respeito a
dam o administrador a encontrar clientes sob alcance, apesar das di- detalhes, quanto ao escopo de apli-
os clientes mais facilmente e as ins- ferentes configurações de DHCP e cativos. E faz você pensar o que os
talações que falharam são exibidas DNS. Você também pode atribuir desenvolvedores têm em mente para
em um grupo separado. Uma busca senhas livremente para as imagens a próxima versão – talvez suporte
separada também ajuda a encontrar de boot, o que não era possível an- para clientes Linux? ■
clientes que precisam de atualizações tes, sendo este um recurso que me-
de um produto específico (quadro 1). lhora a segurança. Por fim, mesmo Mais informações
[1] Site do Opsi: http://
Quadro 1: Mostre seu trabalho www.opsi.org/
O cliente Opsi abrange componentes múltiplos que são executados ao mes-
mo tempo. Embora todos os componentes escrevam no mesmo arquivo de Gostou do artigo?
igo?
log usando o horário da gravação para diferenciação, é muito fácil perder o Queremos ouvir sua opinião.
controle sobre quem fez o quê. A introdução da extensão WAN para Opsi Fale conosco em
m
não tornou isso muito fácil; no entanto, o lado cliente agora oferece a visu- cartas@linuxmagazine.com.br
zine.com r
alização das atividades. A tarefa desempenhada por vários componentes é
exibida coletivamente em uma linha de tempo, dando ao administrador uma Este artigo no nosso
osso ssite::
visão geral útil sobre o que tem acontecido (figura 1). http://lnm.com.br/article/5654
r/artic 565

BA
SE
AD
Você está com a cabeça nas nuvens?
O
EM
SO
Nós também.
FT NG
FIL
W
AR PHISHI
TR E
OD LI
EE VR
NT
RA E
DA
ES
AÍD 30 D
A IA
AntiSpam SaaS UNODATA GRÁ S
ÁVEL TIS!
CUSTOMIZ
FLEXÍVEL E
OS
FEIT
T IS
SA EN
LINUXM VIE UM E-MA
%
100 E GAN AGAZINE@U IL PARA
ES HE + 1 NODAT
NT
MÊS G A.COM
RÁTIS
IE DE ANT .BR
CL ISPAM

Para empresas que não querem ou não


podem administrar sua infra-estrutura de e-mail
o AntiSpam SaaS UNODATA é uma ótima opção.

Disponível em Software, nuvem e Appliance


3 em 1 - AntiSpam, AntiVírus e AntiFraude
Instalação em menos de 15 minutos

(11) 3522-3011
Linux Magazine #82 | Setembro de 2011 Acesse www.unodata.com.br e veja nossos casos de sucesso. 63
REDES | Monitoramento APR

Ferramentas de monitoramento ARP

Olhar
REDES

atento
É claro que você tem um firewall, mas
e se um intruso começar o seu trabalho
de dentro da rede? As ferramentas de
monitoramento ARP fiscalizam mudanças
súbitas que podem indicar um ataque local.
por Chris Binnie

U
m time dedicado trabalha endereço IP pode ser um endereço spoof das comunicações é normal-
duro para aplicar os patches não utilizado ou até um que já está mente conhecido como Man-In-The-
de segurança desenvolvidos em uso por outro dispositivo. -Middle (da sigla MITM, homem no
para os softwares no seu sistema. O Se o invasor pega um endereço IP meio, em tradução livre), porque o
firewall mantém longe os invasores já em uso, o objetivo normalmente é atacante coloca um dispositivo entre
que tentam invadir a rede pela In- desempenhar algum tipo de intercep- o seu computador e o computador
ternet. Mas, você tem um sistema tação ou redirecionamento de servi- de destino. O redirecionamento do
equivalente para descobrir ataques ço. Sob algumas circunstâncias, um serviço pode ser uma simples questão
que começam de dentro da rede? invasor pode tentar convencer o resto de alterar o endereço MAC para di-
Por sorte, um pré-requisito para da rede de que seu dispositivo tem a zer ao seu computador para usar um
quase qualquer ataque de rede é a mesma identidade que um de seus servidor de DNS diferente, de forma
aquisição de um endereço IP. Para computadores (em outras palavras, que, quando você tenta se conectar ao
se comunicar com sua rede de forma copiar o endereço MAC devidamen- site do banco, você na verdade visita
útil (em vez de, por exemplo, pegar te codificado na placa de rede pelo um site falso e dá seus dados pesso-
toneladas de dados criptografados de fabricante e que, por acaso, é fácil de ais a ele sem perceber. O ideal seria
uma conexão sem fio), um invasor ser alterado temporariamente). que você fosse avisado não só quando
precisa vincular um endereço IP na Um ataque onde o invasor vincula um endereço MAC associado a um
rede primeiro. Isso se aplica tanto a um endereço de IP existente, de for- endereço IP mudasse, mas também
conexões com fio quanto sem fio. O ma a cuidadosamente filtrar e fazer quando qualquer endereços IP que
não foi usado fosse vinculado a algum
dispositivo de forma inesperada.
Esse artigo introduz algumas ferra-
mentas úteis que usam o Address Reso-
lution Protocol (ARP), ou protocolo de
resolução de endereços, para observar
mudanças inesperadas em atribuições
de endereços IP na rede local.

Arpwatch
O arpwatch é uma ferramenta sim-
ples que observa os endereços IP na
Figura 1 Um e-mail do Arpwatch proporciona detalhes simples sobre cada evento. sua rede e procura por mudanças sus-

64 www.linuxmagazine.com.br
Monitoramento APR | REDES

peitas. O ARP constrói uma tabela


mostrando qual endereço IP é usado
por qual dispositivo, perguntando
efetivamente a todos os dispositivos Figura 2 Somente os fatos: o formato do log do Arpwatch.
da rede local (ou domínio broad-
cast, mais precisamente) “Quem
está usando esse endereço IP?”, até A notificação de e-mail que o Ar- endereços IP, podem questionar
que um dos dispositivos responda pwatch envia pode alertar o usuá- de forma inteligente, em reverso,
“Eu tenho esse endereço IP”. Essa rio quase instantaneamente. Os qual endereço IP tem qual ende-
simplicidade torna o protocolo fácil relatórios são relativamente sim- reço MAC. Esse recurso é de im-
de se utilizar, mas o torna vulnerável ples e poderiam ser formatados em portância fundamental para alguns
a abusos, como no ataque MITM mensagens SMS se necessário. A cenários de ataque.
descrito anteriormente. figura 2 ilustra a brevidade dos logs O seguinte exemplo pede ao Ar-
O Arpwatch monitora mudan- do Arpwatch. ping para procurar por endereços
ças nas respostas ARP e manda um O primeiro segmento de um ende- MAC duplicados pertencentes a um
e-mail para o administrador do sis- reço MAC é normalmente (mas não endereço IP:
tema quando algo digno de obser- sempre) alocado para um fabricante
arping -d 97.98.99.100 -I eth1
vação acontece. Além de fornecer ou fornecedor de placa de rede es-
uma forma fácil de auditar quantos pecífico e é facilmente reconhecível Após receber um alerta do Arpwa-
endereços IP estão em uso na rede, a partir de algum banco de dados tch informando que algo mudou na
é uma forma de obter alertas a partir existente na Internet. Uma lista mais rede, esse comando deve lançar algu-
de diversas interfaces de uma só vez formal e não tão prática de vínculos ma luz sobre os dispositivos que estão
(tanto com ou sem fio). está disponível por meio do IEEE compartilhando o mesmo endereço
Note que algumas redes usam [1]. Essa tabela faz a identificação IP (experimentando assim conectivi-
spoofing ARP para redirecionar trá- de um dispositivo desconhecido dade falha ou tentando algum tipo
fego de usuários para propósitos mais fácilmente para o usuário e, de ataque MITM).
legítimos. Imagine, por exemplo, em troca, mantém os alarmes falsos Por meio da interface eth1, o co-
que você está logando na rede de em níveis mínimos. mando envia quatro questões, per-
um restaurante pela primeira vez. Agora que você sabe o endereço guntando “Quem tem esse endereço
Enquanto puxa a cadeira com seu MAC do dispositivo de um invasor, IP?” e espera pelas respostas. A figura
prato e, antes que o restaurante per- e potencialmente se é um laptop 3 mostra quatro respostas idênticas
mita seu acesso à Internet, você é ou um smartphone usando dicas do mostrando que somente um ende-
redirecionado para uma página de endereço MAC do fornecedor (pre- reço MAC possui um endereço IP
“política de uso aceitável”, na qual sumindo que ele não foi alterado), atribuído, portanto nenhuma entrada
precisa concordar com os termos de você está a caminho para rastrear as duplicada é visível neste momento.
uso para ter acesso ao serviço. Ao atividades dos dispositivos na LAN
manter controle de cada interface, (mesmo se ele mudar o endereço ArpON
usando um arquivo de log do mo- MAC, você ao menos será alertado Agora que você sabe detectar e rece-
mento e data em que um endereço sobre o dispositivo). ber relatórios durante ataques ARP,
IP foi vinculado ao endereço MAC, provavelmente está se perguntando
o Arpwatch pode oferecer uma visão Arping se outra ferramenta pode oferecer
inestimável sobre mudanças – antes A ferramenta mais popular para con- uma forma mais sofisticada e auto-
imperceptíveis na rede. ferir endereços ARP duplicados em matizada de combater ataques de
Os logs do Arpwatch rastreiam uma rede local é o Arping. Como rede localizados. A ferramenta é o
os endereços MAC registrados, os o Ping, que manda ondas sonares ArpOn, ou Arp Handler Inspection.
endereços IP atribuídos, o horário e escuta por respostas, quando as Enquanto o Arpwatch somente relata
associado a última atividade cor- ondas colidem com alguma coisa, problemas e deixa a solução para o
respondente, nomes de dispositivo o Arping grita para a rede local administrador, o ArpON é projetado
(aliases ou nomes DNS) e a inter- (ou domínio broadcast). Algumas para automatizar a resolução de pro-
face da qual eles foram observados. implementações de Arping, ao blemas seguindo algumas políticas
A figura 1 mostra os detalhes em invés de perguntar somente quais predefinidas. Detalhes completos do
um e-mail gerado pelo Arpwatch. endereços MAC possuem quais pacote, incluindo alguns diagramas

Linux Magazine #82 | Setembro de 2011 65


REDES | Monitoramento APR

Linux, Unix, e BSD, há também o


Arpalert. Cada uma das alternativas
contém um conjunto diferente de
recursos. Embora o Arpwatch seja
excelente, nenhuma delas é capaz
de alcançar os mesmos recursos e
Figura 3 Respostas idênticas indicam que não há entradas duplicadas visíveis sofisticação da ArpON.
na rede. Quando aplicada em conjunto
com o conhecimento de um admi-
úteis para iniciantes, estão disponíveis todos os dispositivos na rede. Vale a nistrador de rede experiente, as fer-
no website do ArpON [2]. pena mencionar que, neste modo, ramentas de monitoramento ARP
Além dos recursos básicos de mo- todos os outros dispositivos que não são muito poderosas, mesmo com a
nitoramento ARP, o ArpON vem com estiverem executando o ArpON não maioria das ferramentas de bloqueio
poder de fogo adicional em seu arse- serão protegidos de ataques, o que automático de ataques desabilitada.
nal. Por exemplo, uma sessão ArpON faz dele mais adequado para uma Com níveis altamente detalhados
pode também, automaticamente, pequena rede que execute dispo- de relatórios e um grau menor de
detectar e resolver uma sessão de sitivos homogêneos, por exemplo, automação, essas ferramentas defini-
interceptação e sequestro de e-mail um grupo ou cluster de servidores tivamente agem como uma camada
criptografado e conversas pela web. de e-mail em uma pequena rede adicional de proteção tanto para re-
Ao criar um novo cache de en- (ou subrede) própria. des domésticas quanto industriais. ■
tradas ARP logo no início, o ArpON O ArpON tem um projeto não
efetivamente limpa a tabela, elimi- invasivo que não tenta alterar o
nando assim a possibilidade de que protocolo ARP, que foi criado para Quadro 1: Desempenho
o cache de entradas ARP tenha sido redes de dados a muitos anos atrás e do ArpON
corrompido com informação falsas certamente poderia ser aprimorado O ArpON foi desenvolvido tendo
e incorretas (este tipo de ataque é para se compatibilizar aos ataques de em mente o desempenho da fer-
chamado de ARP Cache Poisoning, hoje. Não importando os problemas ramenta e portanto tem um núme-
ou envenenamento do cache ARP). associados com o ARP, ele oferece ro limitado de recursos. Uma ferra-
menta alternativa chamada S-Arp
Ao contrário de outras ferramentas alto desempenho por conta de sua (Secure Arp) acrescenta um nível
de monitoramento do ARP, o ArpON simplicidade. O ArpON, por outro de criptografia que provê seguran-
se recusa ativamente a atualizar no- lado, não impede essa eficiência, ça adicional mas deixa o protocolo
vas entradas sem uma referência em além de lidar competentemente ARP mais lento por adicionar mais
um cache confiável, essencialmente com redes DHCP, onde os dispo- cálculos numéricos e injetar mais
ignorando qualquer coisa que não sitivos normalmente são associados dados no fluxo de tráfego.
esteja clara, o que acaba com um a um novo endereço IP toda vez
ataque antes que ele comece. que se conectam. Dado o poder do
O ArpOn tem três níveis de ins- ArpON, vale a pena lembrar que Mais informações
talação. Executá-lo em um nó de desabilitar partes do software para [1] Mapeamento de endereços
monitoramento em um dispositivo criar seu próprio laboratório de teste MAC para fornecedores:
pode oferecer proteção unidirecio- em uma rede local pode ser também http://standards.ieee.org/
nal, onde um daemon instalado um excelente exercício. develop/regauth/oui/oui.txt
pode eficientemente pegar e desafiar
[2] ArpON: http://arpon.
mudanças no cache do ARP. Com Conclusão sourceforge.net/
proteção bidirecional, pelo menos O ArpON está atualmente dispo-
dois nós de monitoramento são ne- nível para Linux, Mac OS X, Free-
cessários para queseja possível inter- BSD, NetBSD e OpenBSD. Embora Gostou do artigo?
igo?
ceptar o tráfego entre os dois nós e, ainda não tenha sido portado para
Queremos ouvir sua opinião.
assim, decifrar um ataque para reagir Windows, você pode encontrar fer-
Fale conosco em
m
de forma apropriada. Configurado ramentas similares para este e outros cartas@linuxmagazine.com.br
gazine.com br
com todas as suas armas no modo sistemas operacionais.
de proteção distribuído, o ArpON No Windows, procure por um pro- Este artigo no nosso
osso site:
e:
http://lnm.com.br/article/5694
br/arti 569
precisa ser instalado e executado em duto chamado WinARP Watch. Para

66 www.linuxmagazine.com.br
PROGRAMAÇÃO | PHP com C++

PHP com C++

Mistura de códigos
PROGRAMAÇÃO

A mistura de linguagens de
programação não deve restringir seu
projeto de software. Aprenda a expor
objetos e templates C++ ao código
PHP e como registrar chamadas PHP
que o código C++ possa utilizar.
por Ben Martin

A
linguagem PHP ganhou po- Ruby. Dependendo de como você total deste tipo de código em C++
pularidade por conta dos usa o SWIG, não será necessário através do PHP, você precisa ter a
aplicativos web, já que possui manter nenhum código de ligação possibilidade de possuir o código
interfaces para bancos de dados e ser- para fazer as coisas funcionarem. de retorno (call back) C++ cha-
viços web. Frameworks (ambientes Por exemplo, o SWIG pode usar mado dentro do código PHP (seus
de desenvolvimento) inteiros, como o arquivo de cabeçalho C++ para functors e slots de sinais). Tudo isso
o Zend [1][2] são escritos em PHP. gerar o código de ligação necessário precisa acontecer no código C++,
Embora toda essa popularidade e para que o PHP crie objetos naquela que sequer sabe que está fazendo
as muitas interfaces sejam mara- classe e chame os métodos naqueles chamadas dentro de uma imple-
vilhosas, pode acontecer de você objetos. Se quiser adicionar um novo mentação PHP dentro do slot ou
ter lógicas de negócios escritas em método ou classe, simplesmente do functor.
C ou C++ que gostaria de acessar adicione o SWIG ao projeto C++, O SWIG é uma ferramenta útil
com o código web PHP. Uma opção reconstrua-o, e ele ficará automati- de se conhecer porque pode gerar
seria reescrever o código em PHP e camente disponível no PHP. vínculos para muitas linguagens.
fazer novos testes, mas dessa forma Embora os artigos sobre a vincu- Além de PHP, Perl, Python e Ruby,
você teria que manter duas versões lação de linguagens normalmente você pode usar SWIG com dialetos
do mesmo programa. Ao invés dis- discutam o acesso de uma lingua- LISP, Ocaml e outras linguagens.
so, você pode pegar o código C++ gem a partir de outra, você frequen- Partes extensas desse artigo podem
que quer usar e deixar com que o temente perceberá que precisa ir ser, então, aplicadas para gerar vín-
SWIG (Simplified Wrapper and In- pelos dois caminhos. Os projetos culos para outras linguagens.
terface Generator) [3] faça o traba- modernos em C++, por exemplo,
lho pesado ao criar vinculações de permitem que objetos mandem Começar de
linguagem que permitam o acesso
ao código em PHP.
“sinais” quando eventos interes-
santes ocorrem, possuem functors
forma simples
O SWIG é uma ferramenta de (funções de objeto para mapear Para compilar os exemplos a seguir,
desenvolvimento de código aber- o intervalo entre categorias) que você precisa instalar os pacotes de
to que faz a interface de C e C++ são registrados para serem usados desenvolvimento do PHP. No Fe-
com diversas linguagens de scripts, como chamadas durante o proces- dora, por exemplo, ele se chama
incluindo PHP, Perl, Python, Tcl e samento [4]. Para tirar vantagem php-devel.

72 www.linuxmagazine.com.br
PHP com C++ | PROGRAMAÇÃO

O primeiro exemplo é uma classe Dado o cabeçalho e o arquivo


Listagem 1: Classe simple1
C++ bastante simples para dar uma de implementação para simple1.hh
01 #include <string>
noção sobre como opera o SWIG. e simple1.cpp, os comandos 02
Depois, vamos observar algumas g++ -shared -fpic simple1.cpp 03 class simple1
das coisas que você precisará para -o libsimple1.so 04 {
sudo install -m 755 05 protected:
um binding mais sério, tal como a 06 int m_prot1;
libsimple1.so /usr/local/lib
exposição de STLs (bibliotecas pa- 07 int hidden( int a );
drão de template, em inglês) como gerarão uma biblioteca comparti- 08 public:
a std::vector, std::map e correlatas; lhada libsimple1.so. Perceba que 09
10 sim ple1( const std::
a forma de expor ponteiros inteli- os comandos forçam o uso de PIC string& name );
gentes; alguns recursos de geração (código independente de posição, 11
de linguagem de interface como a em inglês) [5] porque está gerando 12 int m_pubA;
13 std::string m_pubB;
renomeação de métodos e funções uma biblioteca compartilhada. 14 int shown( int a );
para a linguagem-alvo e finalmente, O PIC tem a vantagem de po- 15 };
como ligar sinais C++ e mecanismos der ser carregado em diferentes
de slot para chamar funções PHP a localizações na memória, o que é
partir de sinais C++. útil para bibliotecas compartilhadas Listagem 2: simple1
Cada exemplo utilizará o conheci- porque permite ao link dinâmico 01 #include “simple1.hh”
02
mento adquirido nas etapas anterio- movê-las quando múltiplas biblio- 03 int
res e talvés eu omita alguns detalhes tecas quiserem o mesmo endereço. 04 simple1::hidden( int a )
cobertos em exemplos anteriores para Nesse ponto, presumo que você já 05 {
06 return a;
economizar espaço. Para manter as tem a libsimple1.so instalado no
07 }
coisas simples, evitarei ferramentas /usr/local/lib e seu sistema confi- 08
automáticas e simplesmente mostrarei gurado para encontrá-la neste lugar. 09 simple1::simple1( const
os comandos usados para compilar e Outra forma é usar o LD_LIBRARY_PATH std::string& name )
10 :
gerar código em cada passo. e -L se você quiser usar a biblioteca 11 m_pubB( name )
Embora o uso do SWIG requei- a partir da localização atual. 12 {
ra algum conhecimento adicional, O arquivo de cabeçalho e a bi- 13 }
o processo é o mesmo para expor blioteca compartilhada são quase 14
15 int
classes maiores e muitas classes ao tudo o que você precisa para usar a 16 simple1::shown( int a )
mesmo tempo. Com o SWIG, você classe simple1 de um programa C++, 17 {
pode expor uma classe única ou embora você possa incluir o cabeça- 18 return a+a;
19 }
centenas de classes de forma igual- lho e vincular ao objeto comparti-
mente rápida. lhado (libsimple1.so) e utilizando o
simple1 de muitos aplicativos C++. A definição de interface SWIG
Exposição de uma Até aqui, tudo se resume a puro de- para simple1 é:
classe C++ para PHP senvolvimento C++.
Agora, é hora de usar o SWIG
%module simple1module
%include stl.i
A declaração da primeira classe, sim- para gerar os vínculos de lingua- %include "simple1.hh"
ple1, é exibida no cabeçalho simple1. gem de forma que você possa criar %{
#include "simple1.hh"
hh exibido na listagem 1. Para limpar objetos simple1 e chamar métodos %}
a interface um pouco, usei a classe neles a partir do PHP. O SWIG
std::string para aceitar uma string utiliza um arquivo de definição de as quais não possuem declaração
com o nome do objeto que está ar- interface que descreve as classes, de classe ou alguma coisa que re-
mazenado em m_pubB. O método hi- funções e assim por diante, que meta a duplicação da definição do
dden não pode ser chamado do PHP deve ser exposto à linguagem para simple1 (listagem 1). A primeira li-
porque é protegido. O método shown a qual você quer gerar vínculos. nha declara o nome do módulo para
simplesmente retorna duas vezes o A princípio, isso pode soar como este vínculo. Uma das restrições
valor dado a ele como o primeiro qualquer outro pesadelo de manu- aqui é que o nome do módulo não
parâmetro. A implementação é exibi- tenção. Você não precisa manter o pode ser usado por uma classe da
da na listagem 2. Tudo isso é código arquivo de definição de interface à qual você está expondo, portanto
C++ comum. medida que muda o código C++? você não pode ter um módulo no-

Linux Magazine #82 | Setembro de 2011 73


PROGRAMAÇÃO | PHP com C++

meado simple1, porque o mesmo já invólucro (wrapper) será escrito por maps, mas por enquanto é suficiente
é usado por uma classe. Para que padrão no simple1_wrap.cpp. dizer que o stl.i diz ao SWIG como
as coisas fiquem melhores e mais Esse código wrapper gerado pro- fazer a classe std::string e outras
claras, uso o nome simple1module. vavelmente precisará de acesso a classes STL se tornarem disponíveis
O único lugar no qual esse nome alguns dos arquivos de cabeçalho no script PHP.
aparece é no código PHP, quando para compilar. Por exemplo, você Agora que você fez a parte difícil
ele inclui (include()) aquele mó- não pode chamar simple1::shown() e criou simple.i, os dois comandos
dulo – então você pode criar um sem ter a declaração da classe no
swig -c++ -php5 simple1.i
nome bem descritivo. escopo. Isto é, em um programa g++ -shared -fpic 'php-config
O resto do arquivo parece se re- C++ normal tal qual simple1.wrap. --includes' -Dzend_error_
petir ao incluir simple1.hh duas ve- cpp, você primeiro tem que usar #in- noreturn=zend_error simple1_
wrap.cpp -L'pwd' -lsimple1 -o
zes. A razão para essa duplicação é clude “simple1.hh” antes de chamar
simple1module.so
que a diretiva %include diz ao SWIG shown(). O SWIG copiará o bloco
para examinar outras definições de de código definido por %{ ... %} geram a vinculação de linguagem
interface (foo.i) ou os arquivos de dentro do arquivo de código do PHP e a compilam junto da bi-
cabeçalho C/C++ para os quais wrapper gerado (simpe1_wrapp.cpp), blioteca compartilhada. A primeira
você gostaria de criar vínculos. O de forma que a compilação dê cer- linha gera um simple1.wrap.cpp e
SWIG lerá qualquer arquivo de to. Nesse exemplo, você precisará um simple1module.php. O primeiro
cabeçalho listado com %include, do simple1.hh no escopo, de forma arquivo é o código C++, que permite
fazendo o parse e gerando o código que ele esteja no #include dentro acesso à classe simple1 do PHP. O
para encapsulá-lo para a linguagem do código entre chaves. segundo arquivo é um script PHP,
que você escolheu. O código do Em resumo, a linha %include “sim- para o qual você usa o include()
ple1.hh” diz ao SWIG para gerar em um arquivo PHP para carregar
Listagem 3: Código PHP código de forma que o PHP possa a vinculação da linguagem e esta-
usando a classe simple1 chamar métodos da classe simple1. A belecer acesso. A segunda linha usa
01 <?php linha também permite que o código GCC para compilar o arquivo fonte
02 gerado (simple1_wrap.cpp) seja com- simple1_wrapp.cpp – gerado em uma
03 include_once pilado com o gcc porque a definição biblioteca compartilhada – e vincu-
("simple1module.php");
04 print "started...\n";
da classe simple1 está no escopo. O lá-lo a biblioteca da classe simple1.
05 SWIG não se importa com o que Dessa forma, o módulo simple1mo-
06 $foo = new simple1( "hello" ); está escrito dentro das chaves – você dule contém tanto o código SWIG
07 pode colocar o que quiser dentro do “de cola”, quanto a implementação
08 print "foo.pubB : " .
$foo->m_pubB . "\n"; bloco gerado dentro do arquivo sim- do simple1.
09 print "foo.shown() : " . ple1_wrap.cpp. A biblioteca compartilhada
$foo->shown(181) . "\n"; A linha %include stl.i inclui um simple1module.so é uma extensão PHP
10 arquivo typemap do próprio SWIG. e deve ser instalada no diretório de
11 ?>
Mais a frente, iremos analisar os type- extensões da linguagem:
Listagem 4: Uso de
containers padrão Listagem 5: Arquivo de interface SWIG, simple2.i
01 #include <string> 01 %module simple2module
02 #include <vector> 02 %include stl.i
03 #include <map> 03 %include "simple2.hh"
04 04
05 class simple2 05 %{
06 { 06 #include "simple2.hh"
07 ... 07 %}
08 std::pair< std::string, 08
std::string > getPair(); 09 namespace std {
09 std::vector< std::string > 10 specialize_std_map_on_key(int,CHECK,CONVERT_FROM,CONVERT_TO)
getVector(); 11 }
10 std: :vector< std::string > 12 %template(IntVector) std::vector< int >;
getMapRange( const std::map< 13 %template(StringVector) std::vector< std::string >;
int, std::string >& a ); 14 %template(StringPair) std::pair< std::string, std::string >;
11 }; 15 %template(IntStringMap) std::map< int, std::string >;

74 www.linuxmagazine.com.br
PHP com C++ | PROGRAMAÇÃO

php-config --extension-dir
sudo install -m 755 simple1module. conseguiu criar um objeto sim- Outro truque que um typemap
so 'php-config --extension-dir' ple1, acessar seus dados e chamar pode executar é criar novos mé-
um método bastante natural para todos na interface cliente. Você
O primeiro comando diz onde o PHP. A vantagem de usar o SWIG deve estar se perguntando como o
PHP está procurando extensões, e dessa forma é que, se você modifi- SWIG pode injetar novos métodos
o segundo instala a biblioteca sim- car a classe simple1, o SWIG cuida em classes C++ existentes, o que
ple1module.so de forma que o PHP de atualizar toda a extensão PHP normalmente não é permitido. O
possa encontrá-la automaticamente. para você. SWIG pode adicionar métodos a
A única coisa que falta ser feita é classes porque está gerando um
pegar a classe simple1 em C++ para C++ e PHP: wrapper que a linguagem cliente
um spin do PHP. O script simple1_
test.php da listagem 3 cria um novo
contêineres padrão chama. Então, pode criar um outro

objeto simple1, chama um método Agora que você sabe como o SWIG Listagem 6: Utilizar o
e lê uma variável de instância do funciona e como utilizá-lo com o simple2 do PHP
objeto C++. PHP, pode usar esse conhecimento 01 <?php
Como você pode ver, não faz para expor código C++ mais com- 02
diferença para o código PHP se a plexo ao PHP, incluindo código 03 include_once("simple2module.
php");
classe simple1 é escrita em C++ ou que aceita ou retorna std::vector, 04
PHP. O código PHP nem liga para std::list, std::map, ou outras cole- 05 $foo = new simple2( "hello" );
o fato de que o constructor (méto- ções; códigos que usam ponteiros 06
do construtor) está esperando uma inteligentes para gestão de recur- 07 // blocoA
08 $a = new IntVector();
string C++ (std::string) em vez de sos e códigos que têm classes que 09 $a->push(5);
uma string PHP. emitem sinais, permitindo respostas 10 $a->push(15);
Você pode ver o código em ação abertas a eventos. 11 $a->push(35);
na listagem 3, usando o comando: A classe simple2, mostrada na lis- 12 while( ! $a->is_empty() )
13 {
$ php -d enable_dl=On simple1_ tagem 4, se constrói sobre a classe 14 print "pop: " .
test.php simple1 e adiciona três novos méto- $a->pop() . "\n";
started... dos, mostrados no final da definição 15 }
foo.pubB : hello 16
de classe. Perceba que o getMapRan- 17 // blocoB
foo.shown() : 362
ge leva a referência a um std::map 18 $b = new StringVector();
Uma vez que o simple1_test.php como seu argumento em vez de fa- 19 echo var_dump($b);
inclui o simple1module.php, o arqui- zer uma cópia. Nenhuma mudança 20 $b->push("hi manual");
21 $b->push("hello");
vo de extensão simple1module.so será à definição de classe C++ foi feita 22 print "b.sz:" .
carregado, permitindo que objetos para tornar a vida mais fácil, ao criar $b->size() . "\n";
simple1 sejam criados. Dependen- vínculos de linguagens ou no uso 23 while( ! $b->is_empty() )
24 {
do da sua configuração, talvez você do SWIG. A definição de três novos
25 print "pop: " .
precise habilitar o carregamento métodos é padrão e cria somente $b->pop() . "\n";
dinâmico de bibliotecas com o pa- dados de teste, retornando-o. 26 }
râmetro -d. A biblioteca comparti- O arquivo de interface SWIG, 27
28 // blocoE
lhada simple1module.so está vincula- simple2.i, é exibido na listagem 5. 29 print "–– calling simple2::
da à biblioteca C++ compartilhada Para descobrir como expor tipos getMapRange() –––––––––\n";
libsimple1.so para trazê-lo na imple- mais complicados, como templa- 30 $m = new IntStringMap();
mentação da classe simple1. tes STL, para PHP, o SWIG usa 31 $m->set( 7, "value" );
32 $m->set( 13, "else" );
Embora um esforço inicial seja typemap. Por exemplo, algumas lin- 33 $v = $foo->getMapRange( $m );
requerido para expor uma simples guagens têm tipos de classe Integer 34 echo var_dump($v);
classe PHP, os únicos novos arqui- em vez de usar somente 32/64/N bits 35 print "getVec.ret.sz:" .
$v->size() . "\n";
vos que você realmente criou ma- de armazenamento, como o C/C++. 36 while( ! $v->is_empty() )
nualmente foram o arquivo SWIG Um typemap pode distinguir como o 37 {
simple1.i e o script PHP. O arquivo SWIG converte tipos C/C++, como 38 print "pop: " .
simple1.i é apenas uma inclusão int ou std::string, para tipos que a $v->pop() . "\n";
39 }
do cabeçalho simple1.hh e algumas linguagem cliente pode usar, como 40 ?>
inclusões SWIG. No final, você o PHP nesse caso.

Linux Magazine #82 | Setembro de 2011 75


PROGRAMAÇÃO | PHP com C++

método com o código para desem- método pop de uma coleção ao Embora o SWIG cuide de boa
penhar alguma operação ou pode invés da combinação do método parte das questões, agora você
renomear métodos na classe, mas back();/pop_back(), que um pro- precisa lidar com um pouco mais
tudo isso acontece somente no có- gramador C++ usaria. de complexidade. Por exemplo,
digo wrapper. As últimas linhas do arquivo você instanciou alguns templates
Você pode querer renomear simple2.i dizem ao SWIG quais explicitamente e especificou um
um método para um formato mais instâncias de templates devem typemap porque um tipo primiti-
natural para a linguagem cliente. ser encapsuladas. Normalmente, vo é passado por valor ao invés de
Por exemplo, um programador em C++, você não lista explicita- um ponteiro.
PHP pode esperar encontrar um mente quais types são usadas para O script PHP simple2_test.php
método is_empty() para testar se a instanciar uma classe do template exibido na listagem 6 leva a nova
coleção possui itens ou não, em – o compilador faz isso para você extensão para um spin. Como se
vez de usar o método empty() que automaticamente, porque templates pode ver no blocoB, você pode criar
a std::vector oferece. Criar no- estão sendo usados [6]. O problema uma std::vector<std::string> a
vos métodos também pode fazer com o SWIG é que ele olha somen- partir do PHP, além de popular e
com que a interface do wrapper te para o cabeçalho que contém a enumerá-la diretamente. Perceba
fique mais atrativa para os pro- definição da classe do template. O que o código PHP usa esses no-
gramadores. Por exemplo, um SWIG não tem uma forma de sa- mes de métodos porque o typemap
programador pode procurar um ber sozinho a definição para quais stc_vector.i renomeou o método
instâncias da classe template criar empty() para is_empty() e criou um
Listagem 7: Declaração de wrappers, então você precisa dizer único método pop() de forma que
classe simple3 ao SWIG que quer instâncias int e não tenhamos que chamar back()
01 #include <tr1/memory> std::string do std::vector e quais e pop_back() do PHP. No blocoE,
02 class simple3; instâncias std::map e std::pair ele um std::map<> é criado e passado
03 typedef std::tr1::shared_
ptr< simple3 > h_simple; deve fazer. para o código C++ para atualizar
04 A linha specialize_std_map_on_key um std::vector<> como resultado.
05 class simple3 (linha 10, listagem 5) é a inclusão mais
06 { ...
07 public:
complicada para o simple2.i. Olhan- Smart pointers: tarefas
08 ~simple3();
09 static h_simple
do o arquivo PHP std_map.i com o
SWIG, você perceberá uma coleção
em tempo real
createSimple( const de macros especializadas. Normal- Um grande problema com os exem-
std::string& name );
mente, o mapa do arquivo typemap plos relativos ao simple1 e simple2
presume que a chave e o valor usado é que objetos da classe não são
Listagem 8: Arquivo de pelo wrapper são ponteiros para ob- acessados por meio de ponteiros
interface SWIG simple3 jetos C++. Isso funciona bem para inteligentes. Para alguns exem-
01 %{ coisas como std::string porque o plos simples, isso não importa
02 #include "simple3.hh"
03 %}
código do wrapper gerado passará em muito, mas para projetos em C++
04 torno dos ponteiros para std::string maiores, objetos provavelmente
05 %include <tr1/memory> ao retornar um std::string para o serão acessados com o uso de pon-
06 namespace std { PHP, ou ao aceitar uma como parte teiros inteligentes, como a classe
07 namespace tr1 {
08 template < class T > da requisição da API. shared_ptr<> do C++ Technical
09 class shared_ptr O problema é que o int é atraves- Report 1 [7].
10 { sado pelo valor entre C++ e o PHP A declaração simple3.hh na lista-
11 public:
em vez de atravessar um nível do gem 7 é baseada em simple2.hh, mas
12 shared_ptr( const
shared_ptr<T>& ); ponteiro, de forma que você precise adiciona provisões de ponteiros inte-
13 T* operator->(); chamar a specialize_std_map_on_key ligentes. A implementação create-
14 }; para que o SWIG saiba que se ele Simple cria uma instância de objeto
15 };
16 };
fizer o wrapper um stc::map com o e a retorna como shared_ptr<>.
17 int como chave, deve esperar que A interface SWIG é exibida
18 %template(h_simple) std:: a chave int seja passada por um na listagem 8. Na primeira im-
tr1::shared_ptr< simple3 >; valor, ao invés de ser passada por pressão, parece que o template
19 ...
meio de um ponteiro. tr1::shared_ptr está sendo decla-

76 www.linuxmagazine.com.br
PHP com C++ | PROGRAMAÇÃO

rado aqui. Mas como a declara- nome como um argumento, e o de uma classe como método para o
ção aparece fora do bloco %{...%}, nome de um método existente na binding da linguagem. Essa abor-
você está se comunicando com classe para o resto da linha. dagem pode ser prática quando não
o SWIG por meio da declaração Primeiro, você deve declarar o fizer muito sentido para a linguagem
tr1::shared_ptr. Ao declarar o mé- verdadeiro método empty() para dizer chamar um método. ■
todo operator->(), o SWIG ficará ao SWIG a assinatura apropriada;
ciente de que uma resposta T* então, deverá renomeá-lo. Perceba O autor
pode ser obtida de um shared_ que você pode usar o %rename com
Ben Martin trabalha com sistemas
ptr<T>, que é, no final das contas, métodos de classes que foram pre- de arquivos há mais de dez anos
a principal coisa que você quer de viamente incluídas com %included. e, em seu doutorado, pesquisa a
um ponteiro inteligente. Você não O SWIG então gera o código – por combinação de sistemas de arqui-
precisa realmente que o SWIG exemplo, simple3_wrapp.cpp, que de- vos semânticos com a análise de
faça o wrapper das declarações pende que a classe std::vector tenha conceitos formais para melhorar a
interação entre humanos e siste-
reais e completas do ponteiro. um verdadeiro método empty(0). A
mas de arquivos.
Em vez disso, você só precisa do palavra-chave estendida inclui no-
suficiente para obter o que há no vos métodos que você gostaria de
T*. A distinção de mostrar somente classificar para ter em um vínculo Mais informações
parte da declaração de classe para de linguagem. Você deve estar se
[1] Framework Zend: http://
o SWIG pode ser útil quando a perguntando como o C++ pode, framework.zend.com/Zend/
declaração C++ real é complexa, magicamente, ter métodos adicio-
mas você não precisa de exposição nais. Na verdade, o C++ não muda. [2] Interface do Google Web
total. Não há risco aqui, porque O método pop() é o único disponível Services: http://framework.
a std::tr1::shared_ptr<> real tem na classe PHP ou, mais exatamen- zend.com/manual/en/
um método operator->() compatí- te, só existe no código C++ gerado zend.gdata.html
vel com a implementação, então especificamente para o vínculo da [3] Página do SWIG: http://
quando compilar o simple3_wrapp. linguagem – no simple3_wrap.cpp, www.swig.org/
cpp gerado pelo SWIG, o método por exemplo.
será encontrado. Como alternativa, você pode usar [4] Biblioteca libsigc++: http://
O uso de ponteiros inteligentes é a palavra-chave %ignore para dizer libsigc.sourceforge.net/
bem natural no PHP: ao SWIG para não criar o wrapper
[5] Código independente de
$foo = simple3::createSimple posição (PIC): http://
( "hello" ); Listagem 9: Estender o en.wikipedia.org/wiki/
print "foo.pubB : " . std::vector com SWIG Position-independent_code
$foo->m_pubB . "\n"; 01 namespace std {
02 [6] Padrões de template
A principal diferença é usar méto- 03 template<class T> curiosamente recorrentes:
do estático create-Simple para obter o class vector { http://en.wikipedia.org/
ponteiro do objeto. Para compilar o 04 public: wiki/Curiously_Recurring_
05 ... Template_Pattern
simple3, você pode precisar adicionar 06 bool empty() const;
um -I /usr/include/c++/4.4.4 para 07 %rename(is_empty) empty; [7] Relatório técnico do C++
a invocação do SWIG. 08 ...
sobre ponteiros inteligentes:
09 %extend {
http://en.wikipedia.
Modificações 10 T pop() throw
(std::out_of_range) { org/wiki/Technical_
Já mostrei como o std::vector<> 11 if (self->size() Report_1#Smart_pointers
foi encapsulado pelo std_vector.i == 0)
para renomear o método empty() e 12 throw std::out_of_
range(“ pop from Gostou do artigo?
igo?
incluir o novo método pop() den- empty vector”); Queremos ouvir sua opinião.
tro da classe std::vector, pelo me- 13 T x = self->back(); Fale conosco em
m
nos até onde o PHP pode ver. A 14 self->pop_back();
cartas@linuxmagazine.com.br
zine.com r
parte relevante do php/std_vecotr. 15 return x;
16 } Este artigo no nosso
osso ssite::
ir do SWIG, está na listagem 9. A 17 ... http://lnm.com.br/article/5712
r/artic 571
palavra-chave %rename leva o novo

Linux Magazine #82 | Setembro de 2011 77


Linux Magazine #83
PREVIEW

Linux 3.0
Na próxima edição da Linux Magazine,
você vai conhecer tudo o que acontece
por trás do Linux 3.0 e os planos para as
futuras versões do sistema operacional.
Conheça ainda o Intel Threading
Building Blocks, que em sua versão
3.0, traz inúmeras novidades no mundo
da paralelização.
E para continuar focado no importan-
tíssimo assunto que é a migração do
protocolo IP para a versão 6, vamos
falar sobre segurança em IPv6.
Não perca! ■

Admin Magazine #3
Conexão segura
Quem precisa conectar computadores
com sistemas operacionais diferentes
frequentemente precisa procurar por
soluções adequadas. O tema de capa
da próxima edição da Admin apresenta
softwares propiciam uma estreita re-
lação entre Windows e Linux e que
também servem para conexões com
roteadores e firewall como os da Cisco,
Juniper ou Checkpoint.

82 www.linuxmagazine.com.br

Você também pode gostar