Sha256: cd6b6c755b3adba2b91a70688a05b85c9b2881ff87acad369f8ce2905f7d204f

Contents?: true

Size: 1.82 KB

Versions: 1

Compression:

Stored size: 1.82 KB

Contents

module ServiceManager
  class CreateError < StandardError; end
  class ServiceNotFound < StandardError; end
  class ServiceError < StandardError; end

  class ServiceStruct < Struct.new(:service_name, :display_name, :binary_path_name)
  end

  def self.create(service_name, display_name, binary_path_name)
    cmd = ['create']
    cmd << quote(service_name)
    cmd << "DisplayName=" << display_name.inspect
    cmd << "binPath=" << binary_path_name.inspect
    status, out = sc(*cmd)
    raise CreateError.new(out) unless status == 0

    return true
  end

  def self.exist?(service_name)
    status, out = sc('query', quote(service_name))
    out =~ /#{service_name}/i
  end

  def self.open(service_name)
    status, out = sc('qc', quote(service_name), 4096)
    raise ServiceNotFound.new(out) unless status == 0

    out =~ /BINARY\_PATH\_NAME.*\: (.*)$/
    binary_path_name = $1.strip

    out =~ /DISPLAY\_NAME.*\: (.*)$/
    display_name = $1.strip

    svc = ServiceStruct.new(service_name, display_name, binary_path_name)

    yield svc if block_given?
    svc
  end

  def self.getdisplayname(service_name)
    status, out = sc('GetDisplayName', quote(service_name))
    raise ServiceNotFound.new(out) unless status == 0

    out =~ /\=(.*)$/
    $1.strip
  end

  def self.stop(service_name)
    status, out = net('stop', quote(service_name))
    raise ServiceError.new(out) unless status == 0

    return true
  end

  def self.delete(service_name)
    status, out = sc('delete', quote(service_name))
    raise ServiceError.new(out) unless status == 0

    return true
  end

  private

  def self.sc(*args)
    output = `sc #{args.join(' ')} 2>&1`
    return [$?.exitstatus, output]
  end

  def self.net(*args)
    output = `net #{args.join(' ')} 2>&1`
    return [$?.exitstatus, output]
  end

  def self.quote(text)
    text.inspect
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mongrel_service-0.4.0 lib/mongrel_service/service_manager.rb