class Opensips::MI::Transport::Fifo

Constants

PERMISIONS

Attributes

fifo_name[RW]
reply_dir[RW]
reply_fifo[RW]

Public Class Methods

finalize(reply_file) click to toggle source
# File lib/opensips/mi/transport/fifo.rb, line 83
def self.finalize(reply_file)
  File.unlink(reply_file) if File.exist?(reply_file)
end
init(params) click to toggle source
# File lib/opensips/mi/transport/fifo.rb, line 11
def init(params)
  fifo = Fifo.new params
  fifo.open
end
new(params) click to toggle source
# File lib/opensips/mi/transport/fifo.rb, line 17
def initialize(params)
  # set default values
  @reply_fifo = if params[:reply_fifo].nil?
                  "opensips_reply_" << SecureRandom.hex[0,8]
                else
                  @reply_fifo = params[:reply_fifo]
                end

  @reply_dir  = if params[:reply_dir].nil?
                  '/tmp/'
                else
                  params[:reply_dir]
                end
  raise ArgumentError,
    "Fifo reply directory does not exists #{@reply_dir}" unless Dir.exist? @reply_dir 

  # fifo_name is required parameter
  raise ArgumentError, 
    'Missing required parameter fifo_name' if params[:fifo_name].nil?

  @fifo_name      = params[:fifo_name]
  raise ArgumentError,
    "OpenSIPs fifo_name file does not exist: #{@fifo_name}" unless File.exist? @fifo_name
  raise ArgumentError,
    "File #{@fifo_name} is not pipe" unless File.pipe? @fifo_name

  # set finalizing method
  reply_file = File.expand_path(@reply_fifo, @reply_dir) 
  ObjectSpace.define_finalizer(self, proc{self.class.finalize(reply_file)})
end

Public Instance Methods

command(cmd, params = []) click to toggle source
# File lib/opensips/mi/transport/fifo.rb, line 57
def command(cmd, params = [])
  fd_w   = IO::sysopen(@fifo_name, Fcntl::O_WRONLY)
  fifo_w  = IO.open(fd_w)

  request = ":#{cmd}:#{@reply_fifo}\n"
  params.each do |c|
    request << "#{c}\n"
  end
  # additional new line to terminate command
  request << ?\n
  fifo_w.syswrite request

  # read response
  file   = File.expand_path(File.expand_path(@reply_fifo,@reply_dir))
  fd_r   = IO::sysopen(file, Fcntl::O_RDONLY )
  fifo_r = IO.open(fd_r)

  response = Array[]
  response << $_.chomp while fifo_r.gets
  Opensips::MI::Response.new response
ensure
  # make sure we always close files' descriptors
  fifo_r.close if fifo_r
  fifo_w.close if fifo_w
end
open() click to toggle source
# File lib/opensips/mi/transport/fifo.rb, line 48
def open
  # create fifo file
  fifo_file = File.expand_path(@reply_fifo, @reply_dir)
  Kernel.system "mkfifo -m #{PERMISIONS} #{fifo_file}" 
  raise SystemCallError,
    "Can not create reply pipe: #{fifo_file}" unless File.pipe?(fifo_file) 
  self
end