Problemas com XML

0 views
Skip to first unread message

Marcos Barbosa

unread,
Oct 10, 2009, 9:47:10 PM10/10/09
to SoftwareLivreVS
Pessoal, estou com o seguinte problema: Tenho um arquivo com o
conteúdo neste formato:

<firewall_rules>
<rule ip_address="127.0.0.1" port="22" protocol="tcp" />
<rule ip_address="192.168.0.1" port="" protocol="udp" />
</firewall_rules>

E preciso que imprima na comandos com esse formato:
iptables -A OUTPUT -d <endereço IP> -p <protocolo> --dport <porta> -j
ACCEPT

Alguém consegue pensar em um script (shell se possível) que execute um
for (para pegar cada linha), coloque o valor de cada campo em uma
variável e depois imprima a linha na tela? Seria de grande ajuda.
Obrigado.

Adriano Rafael Gomes

unread,
Oct 10, 2009, 10:55:36 PM10/10/09
to softwar...@googlegroups.com
Em Sat, 10 Oct 2009 18:47:10 -0700 (PDT)
Marcos Barbosa <marcoseste...@gmail.com> escreveu:

> Alguém consegue pensar em um script (shell se possível) que execute um
> for (para pegar cada linha), coloque o valor de cada campo em uma
> variável e depois imprima a linha na tela? Seria de grande ajuda.
> Obrigado.

Marcos, tente o seguinte. Crie um arquivo "firewall.sh" com esse
conteúdo:

#!/bin/sh

grep "<rule" | cut -d '"' --output-delimiter='@' -f 2,4,6 | while read i
do
IP=$(echo $i | cut -d '@' -f 1)
PORT=$(echo $i | cut -d '@' -f 2)
PROTO=$(echo $i | cut -d '@' -f 3)
echo -n "iptables -A OUTPUT "
[ -n "$IP" ] && echo -n "-d $IP "
[ -n "$PROTO" ] && echo -n "-p $PROTO "
[ -n "$PORT" ] && echo -n "--dport $PORT "
echo "-j ACCEPT"
done

E depois rode:

$ cat firewall.xml | sh firewall.sh

Cuidado: esse script é totalmente POG ;-)

Marcos Barbosa

unread,
Oct 11, 2009, 11:01:34 AM10/11/09
to SoftwareLivreVS
Muito bom o código, só tem um defeito: Se mudar a ordem dos parametros
(colocar o protocolo antes da porta por exemplo) fica errado. Esse
programa tem que ser flexivel por que o arquivo XML pode ser
preenchido tanto por um programa quanto por um usuário. Alias, duas
coisas: O que é POG e qual a licença desse script?

On 10 out, 23:55, Adriano Rafael Gomes <adrian...@gmail.com> wrote:
> Em Sat, 10 Oct 2009 18:47:10 -0700 (PDT)
> Marcos Barbosa <marcosestevesbarb...@gmail.com> escreveu:

Carlinhus

unread,
Oct 11, 2009, 12:16:30 PM10/11/09
to softwar...@googlegroups.com
Programação orientada a gambiarras ?

2009/10/11 Marcos Barbosa <marcoseste...@gmail.com>



--
Carlos Lehn | Tecnologia & Desenvolvimento
www.carlinhoslehn.com
9294-9732

Marcos Barbosa

unread,
Oct 11, 2009, 12:19:54 PM10/11/09
to SoftwareLivreVS
SFTB :) (Se Funciona Tá Bom)

On 11 out, 13:16, Carlinhus <carlinhu...@gmail.com> wrote:
> Programação orientada a gambiarras ?
>
> 2009/10/11 Marcos Barbosa <marcosestevesbarb...@gmail.com>

Adriano Rafael Gomes

unread,
Oct 11, 2009, 5:10:35 PM10/11/09
to softwar...@googlegroups.com
Em Sun, 11 Oct 2009 08:01:34 -0700 (PDT)
Marcos Barbosa <marcoseste...@gmail.com> escreveu:

> Muito bom o código, só tem um defeito: Se mudar a ordem dos parametros


> (colocar o protocolo antes da porta por exemplo) fica errado.

Deve ter mais do que só 1 defeito, mas realmente esse é um deles.

> Esse
> programa tem que ser flexivel por que o arquivo XML pode ser
> preenchido tanto por um programa quanto por um usuário.

Tente escrever um parser XML.

> Alias, duas coisas: O que é POG e qual a licença desse script?

POG:
http://desciclo.pedia.ws/wiki/Programa%C3%A7%C3%A3o_Orientada_a_Gambiarras

O script é de domínio público. Use-o a vontade.

Rodolfo Stangherlin

unread,
Oct 11, 2009, 2:19:26 PM10/11/09
to softwar...@googlegroups.com
Fiz em Python. Crie um arquivo com o seguinte conteúdo:

#!/usr/bin/env python
import sys
import xml.etree.ElementTree as ET

REGRA = 'iptables -A OUTPUT -d %(ip_address)s -p %(protocol)s --dport
%(port)s -j ACCEPT'

if len(sys.argv) != 2:
print "use: %s <nome do arquivo>" % sys.argv[0]
sys.exit()
tree = ET.parse(sys.argv[1])
for i in tree.findall("rule"):
print REGRA % i.attrib


Lembre-se da indentação (Python usa ela para identificar os blocos). A
única coisa que não trata é caso um dos atributos não seja informado
no XML. Pra funcionar, é preciso ter instalado o pacote
"python-elementtree".

Se usar e precisar de mais ajuda, só dá um grito!

Vlw


--
Rodolfo
Reply all
Reply to author
Forward
0 new messages