Hello everyone,

I'm a Perl beginner and I've been trying for a while to to insert an array
in to the middle of another array after a certain pattern.
Here is what I'm trying to do...I have the Linux Iptables configuration
file, which has a custom chain called MAC which hold all the IP to MAC
entries mappings. Since I update the list manually, I usually end up with IP
addresses here and there...I managed to put all the sorted IP to MAC entries
on a seperate array, and then remove all the MAC entries from the original
file...So what I basically need to do is insert the sorted iptables array
between the INPUT and OUTPUT chains. Here is a sample output of the array,
when all MAC entries are removed...

# Generated by iptables-save v1.3.0 on Wed Jan 17 10:35:18 2007
*filter
:FORWARD DROP [7:336]
:INPUT DROP [11:904]
:MAC - [0:0]
:OUTPUT DROP [7:7994]
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -s 192.168.0.222 -j ACCEPT
-A FORWARD -s 192.168.0.25 -j ACCEPT
-A FORWARD -s 192.168.0.15 -j ACCEPT
-A FORWARD -s 192.168.0.74 -j ACCEPT
-A FORWARD -s 192.168.0.33 -j ACCEPT
-A FORWARD -s 192.168.0.247 -j ACCEPT
-A FORWARD -s 192.168.0.36 -j ACCEPT
-A FORWARD -s 192.168.0.17 -j ACCEPT
-A FORWARD -s 192.168.0.182 -j ACCEPT
-A FORWARD -s 192.168.0.99 -j ACCEPT
-A FORWARD -s 192.168.0.97 -p tcp --dport 9099 -j ACCEPT
-A FORWARD -s 192.168.0.18 -p tcp -m tcp --dport 21 -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 22 -j MAC
-A FORWARD -p udp -m udp --dport 53 -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 110 -j MAC
-A FORWARD -p tcp -m tcp --dport 6346 -j ACCEPT
-A FORWARD -s 192.168.0.204 -p tcp -m tcp --dport 21 -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 22 -j MAC
-A FORWARD -p tcp -m tcp --dport 6667 -j MAC
-A FORWARD -s 192.168.0.204 -p tcp -m tcp --dport 995 -j MAC
-A FORWARD -s 192.168.0.204 -p tcp -m tcp --dport 465 -j MAC
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth1 -p icmp -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 22 -j MAC
-A INPUT -p tcp -m tcp --dport 25 -j MAC
-A INPUT -i eth1 -p tcp -m tcp --dport 8080 -j MAC
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 2020 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 2082 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 2802 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 23 -j ACCEPT
COMMIT
# Completed on Wed Jan 17 10:35:18 2007
# Generated by iptables-save v1.3.0 on Wed Jan 17 10:35:18 2007
*nat
:OUTPUT ACCEPT [9:8239]
:POSTROUTING ACCEPT [2:245]
:PREROUTING ACCEPT [53:5377]
-A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth2 -j SNAT --to-source
202.21.179.2
COMMIT
# Completed on Wed Jan 17 10:35:18 2007

and here is the code I wrote:

#!/usr/bin/perl -w

use strict ;

my $file = "iptables.bac" ;
my @sorted_list ;
my %barrel ;
my $item = 0 ;

open IPTABLES, $file
       or die "Could not open '$file': $!\n" ;
my @content = <IPTABLES> ;

foreach (@content) {
       if (/.*-A MAC/) {
               my @chunks = split ;
               my $last_octet = $chunks[3] ;
               $last_octet =~ s/^.*\.// ;
               $barrel{$last_octet} = $_ ;
       }
}

foreach (sort { $a <=> $b } keys %barrel) {
       push @sorted_list, $barrel{$_} ;
}

foreach (@content) {
       s/.*-A MAC.*\n$// ;
}

print @content ;

Can someone please help me...Thank you in advance...!

--
Typos
FourThirty Inc.
Domain Administrator

Reply via email to