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