Parent

Methods

Included Modules

Files

Class/Module Index [+]

Quicksearch

Chef::Application::WindowsServiceManager

This class is used to create and manage a windows service. Service should be created using Daemon class from win32/service gem. For an example see: Chef::Application::WindowsService

Outside programs are expected to use this class to manage windows services.

Constants

PAUSED
RUNNING
STOPPED

Just some state constants

Public Class Methods

new(service_options) click to toggle source
# File lib/chef/application/windows_service_manager.rb, line 72
def initialize(service_options)
  # having to call super in initialize is the most annoying
  # anti-pattern :(
  super()

  raise ArgumentError, "Service definition is not provided" if service_options.nil?

  required_options = [:service_name, :service_display_name, :service_name, :service_description, :service_file_path]

  required_options.each do |req_option|
    if !service_options.has_key?(req_option)
      raise ArgumentError, "Service definition doesn't contain required option #{req_option}"
    end
  end

  @service_name = service_options[:service_name]
  @service_display_name = service_options[:service_display_name]
  @service_description = service_options[:service_description]
  @service_file_path = service_options[:service_file_path]
end

Public Instance Methods

run(params = ARGV) click to toggle source
# File lib/chef/application/windows_service_manager.rb, line 93
def run(params = ARGV)
  parse_options(params)

  case config[:action]
  when 'install'
    if service_exists?
      puts "Service #{@service_name} already exists on the system."
    else
      ruby = File.join(RbConfig::CONFIG['bindir'], 'ruby')

      opts = ""
      opts << " -c #{config[:config_file]}" if config[:config_file]
      opts << " -L #{config[:log_location]}" if config[:log_location]

      # Quote the full paths to deal with possible spaces in the path name.
      # Also ensure all forward slashes are backslashes
      cmd = "\"#{ruby}\" \"#{@service_file_path}\" #{opts}".gsub(File::SEPARATOR, File::ALT_SEPARATOR)

      ::Win32::Service.new(
                           :service_name     => @service_name,
                           :display_name     => @service_display_name,
                           :description      => @service_description,
                           # Prior to 0.8.5, win32-service creates interactive services by default,
                           # and we don't want that, so we need to override the service type.
                           :service_type     => ::Win32::Service::SERVICE_WIN32_OWN_PROCESS,
                           :start_type       => ::Win32::Service::SERVICE_AUTO_START,
                           :binary_path_name => cmd
                           )
      puts "Service '#{@service_name}' has successfully been installed."
    end
  when 'status'
    if !service_exists?
      puts "Service #{@service_name} doesn't exist on the system."
    else
      puts "State of #{@service_name} service is: #{current_state}"
    end
  when 'start'
    # TODO: allow override of startup parameters here?
    take_action('start', RUNNING)
  when 'stop'
    take_action('stop', STOPPED)
  when 'uninstall', 'delete'
    take_action('stop', STOPPED)
    unless service_exists?
      puts "Service #{@service_name} doesn't exist on the system."
    else
      ::Win32::Service.delete(@service_name)
      puts "Service #{@service_name} deleted"
    end
  when 'pause'
    take_action('pause', PAUSED)
  when 'resume'
    take_action('resume', RUNNING)
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.