grouping and split

B

barjunk

I'm trying to do validation on a firewall rule. The rule looks like
this:

-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT


I know I can use split(' ') to break up the above entry into small
parts, but what I really want is every other one.

So '-A eth0' should be one then '-i eth0' should be the next....etc.

I guess I could use split then step through the resultant array and
make another, but I thought there might be a better ruby style answer.

Thanks for any guidance.

Mike B.
 
P

Phrogz

I'm trying to do validation on a firewall rule. The rule looks like
this:

-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT

I know I can use split(' ') to break up the above entry into small
parts, but what I really want is every other one.

So '-A eth0' should be one then '-i eth0' should be the next....etc.

irb(main):001:0> s = "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m
tcp --dport 22 -j ACCEPT"
=> "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT"

irb(main):002:0> s.scan /[^ ]+ [^ ]+/
=> ["-A eth0-IN", "-i eth0", "-s 192.168.0.0/24", "-p tcp", "-m tcp",
"--dport 22", "-j ACCEPT"]
 
B

barjunk

I'm trying to do validation on a firewall rule. The rule looks like
this:
-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT
I know I can use split(' ') to break up the above entry into small
parts, but what I really want is every other one.
So '-A eth0' should be one then '-i eth0' should be the next....etc.

irb(main):001:0> s = "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m
tcp --dport 22 -j ACCEPT"
=> "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT"

irb(main):002:0> s.scan /[^ ]+ [^ ]+/
=> ["-A eth0-IN", "-i eth0", "-s 192.168.0.0/24", "-p tcp", "-m tcp",
"--dport 22", "-j ACCEPT"]

Thanks tons for that...maybe it would be good practice to keep re-
reading the chapter on the String class and a few other key ones, like
maybe Enumerable?

Any others folks would recommend?

Mike B.
 
B

barjunk

I'm trying to do validation on a firewall rule. The rule looks like
this:
-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT
I know I can use split(' ') to break up the above entry into small
parts, but what I really want is every other one.
So '-A eth0' should be one then '-i eth0' should be the next....etc.

irb(main):001:0> s = "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m
tcp --dport 22 -j ACCEPT"
=> "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT"

irb(main):002:0> s.scan /[^ ]+ [^ ]+/
=> ["-A eth0-IN", "-i eth0", "-s 192.168.0.0/24", "-p tcp", "-m tcp",
"--dport 22", "-j ACCEPT"]


I had to modify this just a bit to work with allowable multispace
situations. An example is a rule that might look like this:

-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport
22 -j ACCEPT

it looks like this: s.scan /[^ ]+ +[^ ]+/

I suppose another solution would be to trim all the extra spaces first
with some sort of gsub, then use the scan.

Thanks again.

Mike B.
 
S

Sam Smoot

irb(main):001:0> s = "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m
tcp --dport 22 -j ACCEPT"
=> "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT"
irb(main):002:0> s.scan /[^ ]+ [^ ]+/
=> ["-A eth0-IN", "-i eth0", "-s 192.168.0.0/24", "-p tcp", "-m tcp",
"--dport 22", "-j ACCEPT"]

I had to modify this just a bit to work with allowable multispace
situations. An example is a rule that might look like this:

-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport
22 -j ACCEPT

it looks like this: s.scan /[^ ]+ +[^ ]+/

I suppose another solution would be to trim all the extra spaces first
with some sort of gsub, then use the scan.

Thanks again.

Mike B.

Another nice way to do it would be to split it up into a Hash since
that would give you distinct option/value pairs.

# s = "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -
j ACCEPT"
# => "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT"
# Hash[s.split]
# => {"-m"=>"tcp", "-p"=>"tcp", "-s"=>"192.168.0.0/24", "-i"=>"eth0",
"-j"=>"ACCEPT", "--dport"=>"22", "-A"=>"eth0-IN"}
 
C

Chris Shea

Another nice way to do it would be to split it up into a Hash since
that would give you distinct option/value pairs.

# s = "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -
j ACCEPT"
# => "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT"
# Hash[s.split]
# => {"-m"=>"tcp", "-p"=>"tcp", "-s"=>"192.168.0.0/24", "-i"=>"eth0",
"-j"=>"ACCEPT", "--dport"=>"22", "-A"=>"eth0-IN"}

Don't you need to splat the split?

mvb:~ cms$ ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.9.1]
mvb:~ cms$ irb
irb(main):001:0> s = "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m
tcp --dport 22 -j ACCEPT"
=> "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT"
irb(main):002:0> Hash[s.split]
ArgumentError: odd number of arguments for Hash
from (irb):2:in `[]'
from (irb):2
from :0
irb(main):003:0> Hash[*s.split]
=> {"-m"=>"tcp", "-p"=>"tcp", "-s"=>"192.168.0.0/24", "-i"=>"eth0", "-
j"=>"ACCEPT", "--dport"=>"22", "-A"=>"eth0-IN"}
 
S

Sam Smoot

Another nice way to do it would be to split it up into a Hash since
that would give you distinct option/value pairs.
# s = "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -
j ACCEPT"
# => "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT"
# Hash[s.split]
# => {"-m"=>"tcp", "-p"=>"tcp", "-s"=>"192.168.0.0/24", "-i"=>"eth0",
"-j"=>"ACCEPT", "--dport"=>"22", "-A"=>"eth0-IN"}

Don't you need to splat the split?

mvb:~ cms$ ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.9.1]
mvb:~ cms$ irb
irb(main):001:0> s = "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m
tcp --dport 22 -j ACCEPT"
=> "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT"
irb(main):002:0> Hash[s.split]
ArgumentError: odd number of arguments for Hash
from (irb):2:in `[]'
from (irb):2
from :0
irb(main):003:0> Hash[*s.split]
=> {"-m"=>"tcp", "-p"=>"tcp", "-s"=>"192.168.0.0/24", "-i"=>"eth0", "-
j"=>"ACCEPT", "--dport"=>"22", "-A"=>"eth0-IN"}

Yeah, I'm sorry. Got sloppy with my copy & paste and figured I could
just write it faster I guess. :)
 
B

barjunk

Another nice way to do it would be to split it up into a Hash since
that would give you distinct option/value pairs.
# s = "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -
j ACCEPT"
# => "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT"
# Hash[s.split]
# => {"-m"=>"tcp", "-p"=>"tcp", "-s"=>"192.168.0.0/24", "-i"=>"eth0",
"-j"=>"ACCEPT", "--dport"=>"22", "-A"=>"eth0-IN"}
Don't you need to splat the split?
mvb:~ cms$ ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.9.1]
mvb:~ cms$ irb
irb(main):001:0> s = "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m
tcp --dport 22 -j ACCEPT"
=> "-A eth0-IN -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j
ACCEPT"
irb(main):002:0> Hash[s.split]
ArgumentError: odd number of arguments for Hash
from (irb):2:in `[]'
from (irb):2
from :0
irb(main):003:0> Hash[*s.split]
=> {"-m"=>"tcp", "-p"=>"tcp", "-s"=>"192.168.0.0/24", "-i"=>"eth0", "-
j"=>"ACCEPT", "--dport"=>"22", "-A"=>"eth0-IN"}

Yeah, I'm sorry. Got sloppy with my copy & paste and figured I could
just write it faster I guess. :)


Although this doesn't account for a typo like leaving off some part of
the pairs...could rescue for that situation.

Thanks for all the feeback.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,533
Members
45,007
Latest member
OrderFitnessKetoCapsules

Latest Threads

Top