Extract a range i.e. svr[100..130]?

What best method could extract the range of a given list of servers?

I have a field name on a UI that contains a list of servers and it can
be a range such as
svr[100…130].domain.local,svr[10…13].otherdomain.local.

What would be my best approach to single each one of those nodes out to
iterate through?

On Fri, Apr 15, 2011 at 6:08 PM, Richard S. [email protected]
wrote:

What best method could extract the range of a given list of servers?

I have a field name on a UI that contains a list of servers and it can
be a range such as
svr[100…130].domain.local,prod[10…13].otherdomain.local.

What would be my best approach to single each one of those nodes out to
iterate through?

Sorry, if I didn’t understand this well. You have a string containing
“svr[100…130].domain.local” and you want:

svr100.domain.local
svr101.domain.local

svr130.domain.local

?

If that’s the case, then this might work:

a = “svr[100…130].domain.local”
m = a.match(/(.?)[(\d+)..(\d+)](.)/)
(m[2].to_i…m[3].to_i).each {|num| puts “#{m[1]}#{num}#{m[4]}”}

=>
svr100.domain.local
svr101.domain.local
svr102.domain.local
[…snip…]
svr129.domain.local
svr130.domain.local

Jesus

“Jesús Gabriel y Galán” [email protected] wrote in post
#993035:

Sorry, if I didn’t understand this well. You have a string containing
“svr[100…130].domain.local” and you want:

svr100.domain.local
svr101.domain.local

svr130.domain.local

?

If that’s the case, then this might work:

a = “svr[100…130].domain.local”
m = a.match(/(.?)[(\d+)..(\d+)](.)/)
(m[2].to_i…m[3].to_i).each {|num| puts “#{m[1]}#{num}#{m[4]}”}

Here’s my version:

str = “svr[100…130].domain.local”

range_pattern = /
[ #a literal opening bracket
(\d+) #capture a series of one or more digits: $1
[.]{2} #two literal periods
(\d+) #capture a series of one or more digits: $2
] #a literal closing bracket
/xms

before_range, the_range, after_range = str.partition(range_pattern)
start_range, end_range = $1, $2

start_range.upto(end_range) do |i|
puts “#{before_range}#{i}#{after_range}”
end

–output:–
svr100.domain.local
svr101.domain.local
svr102.domain.local

svr129.domain.local
svr130.domain.local

Richard S. wrote in post #993057:

This is a definite step in the right direction and I appreciate your
assistance Jesus/7stud

So I have a fieldname in a UI which is named Hostnames:

Within the hostname field, it could have a single host named
svr10.domain.local or it could have a range like
svr.10.domain.local,svr[100…103].domain.local.

Essentially what I am trying to do is to get that hostname field in my
script and for each individual host and/or a range of hosts then do a
specific command or go through my work flow.

…and so what have you tried given the above suggestions?

This is a definite step in the right direction and I appreciate your
assistance Jesus/7stud

So I have a fieldname in a UI which is named Hostnames:

Within the hostname field, it could have a single host named
svr10.domain.local or it could have a range like
svr.10.domain.local,svr[100…103].domain.local.

Essentially what I am trying to do is to get that hostname field in my
script and for each individual host and/or a range of hosts then do a
specific command or go through my work flow.

undefined method `match’ for [“svr[100…103].domain.local”]:Array
(NoMethodError)

it might be that my loop is wrong, ill investigate further, thank you
again.

7stud,

you use upto but that doesnt work for 1.8.6, what method could I use in
this scenario?

On Fri, Apr 15, 2011 at 8:40 PM, Richard S. [email protected]
wrote:

undefined method `match’ for [“svr[100…103].domain.local”]:Array
(NoMethodError)

This is because you don’t have a string, you have an array. If you
have that value for example in params[:hostname], try this:

a = params[:hostname].first

and then the rest of my solution.

Jesus.

Hi jesus, svr[100…103].domain.local would be one of the keys in the
array.

My array looks like

[“svr10.domain.local”, “svr[100-103].domain.local”,
“svr[200-300].domain.local”]

Here is what i am trying to do. cfv.values is an array of nodes from a
UI field.

nodes = cfv.values.to_s.split(/[, \n]+/)
a = nodes
m = a.match(/(.?)[(\d+)…(\d+)](.)/)
final = (m[2].to_i…m[3].to_i).each {|num| puts “#{m[1]}#{num}#{m[4]}”}

final “nodes: #{final.inspect}”

final.each do |node|
puts “checking #{node}”

On Fri, Apr 15, 2011 at 11:54 PM, Richard S. [email protected]
wrote:

Here is what i am trying to do.

nodes = cfv.values.to_s.split(/[, \n]+/)

split returns an array
(Class: String (Ruby 1.8.7)). So you
can do the following:

nodes.each do |node|
m = node.match(/(.?)[(\d+)..(\d+)](.)/)
if m
(m[2].to_i…m[3].to_i).each {|num|
do_something_with(“#{m[1]}#{num}#{m[4]}”)}
else
do_something_with(node)
end
end

This will call do_something_with passing either each expanded server
name or the original string if it doesn’t match the regular
expression.

Jesus.

Richard S. wrote in post #993091:

7stud,

you use upto but that doesnt work for 1.8.6, what method could I use in
this scenario?

puts RUBY_VERSION

1.upto(5) do |i|
puts i
end

–output:–
1.8.6
1
2
3
4
5