class Opensips::MI::Response

Attributes

code[R]
message[R]
rawdata[R]
result[R]
success[R]

Public Class Methods

new(data) click to toggle source
# File lib/opensips/mi/response.rb, line 8
def initialize(data)
  raise InvalidResponseData, 
    'Invalid parameter' unless data.is_a? Array
  raise EmptyResponseData, 
    'Empty parameter array' if data.empty?

  if /^(?<code>\d+) (?<message>.+)$/ =~ data.shift.to_s
    @code = code.to_i
    @message = message
  else
    raise InvalidResponseData,
      'Invalid response parameter. Can not parse'
  end

  @success = (200..299).include?(@code)

  # successfull responses have additional new line
  @rawdata = data
  @result = nil
end

Public Instance Methods

cache_fetch() click to toggle source

returns struct

# File lib/opensips/mi/response.rb, line 73
def cache_fetch
  res = Hash.new
  @rawdata.each do |r|
    if /^(?'label'[^=]+)=\s+\[(?'value'[^\]]+)\]/ =~ r
      label.strip!
      res[label.to_sym] = value
    end
  end
  @result = OpenStruct.new res
  self
end
dlg_list() click to toggle source

returns hash of dialogs

# File lib/opensips/mi/response.rb, line 106
def dlg_list
  # parse dialogs information into array
  # assuming new block always starts with "dialog::  hash=..."
  calls, key = Hash.new, nil
  @rawdata.each do |l|
    l.strip!
    if l.match(/^dialog::\s+hash=(.*)$/)
      key = $1
      calls[key] = Hash.new
      next
    end
    # building dialog array
    if l.match(/^([^:]+)::\s+(.*)$/)
      calls[key][$1.to_sym] = $2
    end
  end
  @result = calls
  self
end
dr_gw_status() click to toggle source
# File lib/opensips/mi/response.rb, line 126
def dr_gw_status
  return self if @rawdata.empty?
  if /\AEnabled::\s+(?<status>yes|no)/ =~ @rawdata[0]
    self.class.send(:define_method, :enabled, proc{status.eql?('yes')})
    return self
  end
  @result = dr_gws_hash
  self
end
ps() click to toggle source

returns array containing list of opensips processes

# File lib/opensips/mi/response.rb, line 137
def ps
  processes = []
  @rawdata.each do |l|
    l.slice! "Process::  "
    h = {}

    l.split(" ", 3).each do |x|
      key, val = x.split("=", 2)
      h[key.downcase.to_sym] = val
    end

    processes << OpenStruct.new(h)
  end

  @result = processes
  self
end
ul_dump() click to toggle source

Parse user locations records to Hash

# File lib/opensips/mi/response.rb, line 30
def ul_dump
  res = {}
  aor = nil
  contact = nil

  @rawdata.each do |r|
    next if r.start_with?("Domain")
    r = r.strip
    key, val = r.split(":: ")

    if key == "AOR"
      aor = val
      res[aor] = []
      next
    elsif key == "Contact"
      contact = {}
      res[aor] << contact
    end

    contact[key.gsub(?-, ?_).downcase.to_sym] = val if key
  end

  @result = res
  self
end
ul_show_contact() click to toggle source

returns Array of registered contacts

# File lib/opensips/mi/response.rb, line 86
def ul_show_contact
  result = []
  @rawdata.each do |r|
    _, contact = r.strip.split("Contact:: ")
    next unless contact

    params = contact.split(';')

    res = {contact: params.shift}

    params.each do |p|
      key, val = p.split('=')
      res[key.gsub(?-, ?_).downcase.to_sym] = val
    end
    result << res
  end
  @result = result
end
uptime() click to toggle source

returns struct

# File lib/opensips/mi/response.rb, line 57
def uptime
  res = Hash.new
  @rawdata.each do |r|
    next if /^Now::/ =~ r
    if /^Up since:: [^\s]+ (?'mon'[^\s]+)\s+(?'d'\d+) (?'h'\d+):(?'m'\d+):(?'s'\d+) (?'y'\d+)/ =~ r
      res[:since] = Time.local(y,mon,d,h,m,s)
    end
    if /^Up time:: (?'sec'\d+) / =~ r
      res[:uptime] = sec.to_i
    end
  end
  @result = OpenStruct.new res
  self
end

Private Instance Methods

dr_gws_hash() click to toggle source
# File lib/opensips/mi/response.rb, line 156
def dr_gws_hash
  return nil if @rawdata.empty?
  res = {}
  @rawdata.map do |gw|
    if /\AID::\s+(?<id>[^\s]+)\s+IP=(?<ip>[^:\s]+):?(?<port>\d+)?\s+Enabled=(?<status>yes|no)/ =~ gw
      res[id] = {
        enabled: status.eql?('yes'),
        ipaddr: ip,
        port: port
      }
    end
  end
  res.empty? ? nil : res
end