Escolar Documentos
Profissional Documentos
Cultura Documentos
LM 082 Ce
LM 082 Ce
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? ■
CAPA
Sempre disponível 31
Xen automatizado 36
Gerenciamento centralizado 41
Cruzamento de nuvens 44
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
Hipergerenciamento 67
REDES
Olhar atento 64
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
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! ■
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
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/
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
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-
54 www.linuxmagazine.com.br
Gerenciamento de hardware com Udev | ANÁLISE
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.
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.
➧ 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
Interoperabilidade
Valor agregado
ANÁLISE
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
(11) 3522-3011
Linux Magazine #82 | Setembro de 2011 Acesse www.unodata.com.br e veja nossos casos de sucesso. 63
REDES | Monitoramento APR
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
66 www.linuxmagazine.com.br
PROGRAMAÇÃO | 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
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.
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 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