Здравствуйте.
Цепляю первоначальную версию скриптика, предназначенного для
миграции состояния iptables в конфигурацию etcnet (на сейчас
используется в ALT Linux 3.0+) [1].

Предполагается дописать конвертор с использованием human readable
syntax из недавних версий etcnet [2].

Бродят раздумья по части дописывания класса Rule и чего-нить
хорошего в нём, с другой стороны -- цели написать валидатор нет.

Также из замеченного по ходу -- обвязка вокруг /sbin/iptables [3],
в данном случае совершенно бесполезная. :)

[1] http://linux.kiev.ua/~mike/works/misc/iptables2etcnet/
[2] http://wiki.sisyphus.ru/admin/etcnet/firewall
[3] http://raa.ruby-lang.org/project/iptctl/

-- 
 ---- WBR, Michael Shigorin <[EMAIL PROTECTED]>
  ------ Linux.Kiev http://www.linux.kiev.ua/
#!/usr/bin/env ruby
# a script to convert _currently_ active iptables rules as dumped by
# iptables-save into /etc/net "human readable" format as documented
# in http://wiki.sisyphus.ru/admin/etcnet/firewall#h468-6 [ru]
# Copyleft 2006 by Michael Shigorin <[EMAIL PROTECTED]>

require "iptables-save.rb"

DEBUG=true

#IPT_SAVE = "/sbin/iptables-save"
IPT_SAVE = "/bin/cat iptables"
SYNTAX = "/etc/net/ifaces/default/fw/iptables/syntax"
FWOUTDIR = "ifaces/default/fw/iptables"

NEWTABLE = /^\*([a-z]+)$/
NEWCHAIN = /^:([A-Za-z0-9_-]+) (\w+) \[(\d+):(\d+)\]$/
NEWRULE = /^-A (\w+) (.*)$/
HEADER = /^(# Generated by .*)$/
COMMIT = /^COMMIT$/ 

tables = Iptables.new
chains = Table.new(nil)

# slurp existing rules
# FIXME: exception handling
IO.popen(IPT_SAVE) do |rules|
        rules.each do |line|
                case line
                when NEWTABLE then chains = Table.new($1)       # see 
appropriate regexp
                when NEWCHAIN then chains.add(Chain.new($1,$2))
                when NEWRULE  then chains[$1].add($2.strip)
                when COMMIT   then tables.add(chains.commit)
                end
        end
end

# OK, now fluch them out
# FIXME: IO errors handling!
tables.each do |table|
        tabledir = File.join(FWOUTDIR, table.name)              # one dir per 
table
        `/bin/mkdir -p #{tabledir}`
        table.each do |chain|
                File.open(File.join(tabledir, chain.name), "w") do |f|
                        chain.each do |rule|
                                f.puts(rule)
                        end
                end
        end
end

# FIXME: figure out what's up with other policies
File.open(File.join(FWOUTDIR, "..", "options"), "w") do |f|
        tables["filter"].each do |chain|
                case chain.name
                when "INPUT", "OUTPUT", "FORWARD"
                        f.puts("IPTABLES_#{chain.name}_POLICY=#{chain.policy}")
                end
        end
end
#!/usr/bin/env ruby
# simple library to accomodate iptables-save data
# Copyleft 2006 by Michael Shigorin <[EMAIL PROTECTED]>

class ArrayExt < Array
        
        def initialize(name = nil)
                @name = name
        end
        
        attr_reader :name
        
        def add(item)   # push another one onto the stack
                self << item
        end
        
        def list        # returns an array of my object names
                collect { |x| x.name }
        end
        
        def [](key)             # Pickaxe example ;-)
                #return self[key] if key.kind_of?(Integer)
                return find { |x| x.name == key }
        end

        def inspect; "<#{name}> #{super}"; end

end


class Iptables < ArrayExt; end


class Table < ArrayExt
        
        def initialize(name)
                super(name)
                @committed = false
        end
        
        attr_reader :committed
        
        def add(chain)
                self << chain unless @committed
        end

        def commit
                @committed = true
                self
        end
        
end


class Chain < ArrayExt
        
        def initialize(name, policy = "ACCEPT")
                super(name)
                @policy = policy
        end
        
        attr_reader :policy
        
end

Attachment: pgprYOi2Q4ySv.pgp
Description: PGP signature

_______________________________________________
Sysadmins mailing list
[email protected]
https://lists.altlinux.org/mailman/listinfo/sysadmins

Ответить