module Construqt::Util

Constants

PORTS_DEF_REGEXP
PORT_NAME_REGEXP

Public Class Methods

add_clean_ip_pattern(pat) click to toggle source
# File lib/construqt/util.rb, line 85
def self.add_clean_ip_pattern(pat)
  @clean_if << pat
end
add_gre_prefix(name) click to toggle source
# File lib/construqt/util.rb, line 76
def self.add_gre_prefix(name)
  unless name.start_with?("gt")
    return "gt"+name
  end

  name
end
clean_bgp(name) click to toggle source
# File lib/construqt/util.rb, line 99
def self.clean_bgp(name)
  name.gsub(/[^a-z0-9]/, '_')
end
clean_if(prefix, name) click to toggle source
# File lib/construqt/util.rb, line 89
def self.clean_if(prefix, name)
  unless name.start_with?(prefix)
    name = prefix+name
  end

  name = name.gsub(/[^a-z0-9]/, '')
  @clean_if.each { |pat| name.gsub!(pat, '') }
  name
end
createRangeDefinition(ports) click to toggle source
# File lib/construqt/util.rb, line 107
def self.createRangeDefinition(ports)
  ranges=[]
  lastPort=nil

  #remove duplicates
  ports.uniq.sort do |l,r|
    fc = l.to_s.length <=> r.to_s.length
    fc!=0 ? fc : l<=>r
  end.each do |port|
    port = port.to_s
    if  (ranges.length>0 && portNeighbors?(port, ranges[ranges.length-1]["to"]))
      ranges[ranges.length-1]["to"] = port
    else
      ranges << {"from" => port, "to" => port}
    end
  end

  ranges = ranges.map do |range|
    range["from"] == range["to"] ? range["from"] : range["from"] +"-"+range["to"]
  end
  #puts "self.createRangeDefinition[#{ports}]=>#{ranges}"
  ranges.join(",")
end
expandRangeDefinition(list_str) click to toggle source
# File lib/construqt/util.rb, line 133
def self.expandRangeDefinition(list_str)
  ports = list_str.strip.split(",").map do |range_def|
    range = range_def.split("-")
    if (range.length==1)
      range
    elsif (range.length==2)
      range[0]=~/#{PORT_NAME_REGEXP}/
      prefix_from=$1
      from = $2
      range[1]=~/#{PORT_NAME_REGEXP}/
      prefix_to=$1
      to = $2
      throw "port prefixes differ" unless prefix_from==prefix_to
      (from.to_i .. to.to_i).map {|n| prefix_from + n.to_s }
    else
      throw "invalid range found #{range_def}"
    end
  end
  ports.flatten
end
generate_mac_address_from_name(name) click to toggle source
# File lib/construqt/util.rb, line 154
def self.generate_mac_address_from_name(name)
  # http://www.iana.org/assignments/ethernet-numbers/ethernet-numbers.xhtml
  '8f:'+Digest::SHA256.hexdigest("#{name}").scan(/../)[0,5].join(':')
end
indent(body, ident) click to toggle source
# File lib/construqt/util.rb, line 159
def self.indent(body, ident)
  if ident.kind_of?(Fixnum)
    ident = (1..ident).to_a.map{' '}.join('')
  end
  body.lines.map { |line| ident+line.chomp.strip }.join("\n")
end
password(a) click to toggle source
# File lib/construqt/util.rb, line 72
def self.password(a)
  a
end
portNeighbors?(port1, port2) click to toggle source
# File lib/construqt/util.rb, line 103
def self.portNeighbors?(port1, port2)
  port2.succ == port1 || port1.succ == port2
end
write_str(str, *path) click to toggle source
# File lib/construqt/util.rb, line 64
def self.write_str(str, *path)
  path = File.join("cfgs", *path)
  FileUtils.mkdir_p(File.dirname(path))
  File.open(path, 'w') {|f| f.write(str) }
  Construqt.logger.info "Write:#{path}"
  return str
end