# class Chef::Provider::Service::Macosx

### Constants

PLIST_DIRS

### Public Class Methods

gather_plist_dirs() click to toggle source

    # File lib/chef/provider/service/macosx.rb, line 28
    def self.gather_plist_dirs
      locations = %w{/Library/LaunchAgents
                     /Library/LaunchDaemons
                     /System/Library/LaunchAgents
                     /System/Library/LaunchDaemons }

      locations << "#{ENV['HOME']}/Library/LaunchAgents" if ENV['HOME']
      locations
    end

### Public Instance Methods

define_resource_requirements() click to toggle source

    # File lib/chef/provider/service/macosx.rb, line 51
    def define_resource_requirements
      #super
      requirements.assert(:reload) do |a|
        a.failure_message Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :reload"
      end

      requirements.assert(:all_actions) do |a|
        a.assertion { @plist_size < 2 }
        a.failure_message Chef::Exceptions::Service, "Several plist files match service name. Please use full service name."
      end

      requirements.assert(:enable, :disable) do |a|
        a.assertion { !@service_label.to_s.empty? }
        a.failure_message Chef::Exceptions::Service,
          "Could not find service's label in plist file '#{@plist}'!"
      end

      requirements.assert(:all_actions) do |a|
        a.assertion { @plist_size > 0 }
        # No failrue here in original code - so we also will not
        # fail. Instead warn that the service is potentially missing
        a.whyrun "Assuming that the service would have been previously installed and is currently disabled." do
          @current_resource.enabled(false)
          @current_resource.running(false)
        end
      end
    end

disable_service() click to toggle source

    # File lib/chef/provider/service/macosx.rb, line 129
    def disable_service
      unless @current_resource.enabled
        Chef::Log.debug("#{@new_resource} not enabled, not disabling")
      else
        shell_out!(
          "launchctl unload -w '#{@plist}'",
          :user => @owner_uid, :group => @owner_gid
        )
      end
    end

enable_service() click to toggle source

On OS/X, enabling a service has the side-effect of starting it, and disabling a service has the side-effect of stopping it.

This makes some sense on OS/X since launchctl is an “init”-style supervisor that will restart daemons that are crashing, etc.

    # File lib/chef/provider/service/macosx.rb, line 118
    def enable_service
      if @current_resource.enabled
        Chef::Log.debug("#{@new_resource} already enabled, not enabling")
      else
        shell_out!(
          "launchctl load -w '#{@plist}'",
          :user => @owner_uid, :group => @owner_gid
        )
      end
    end

load_current_resource() click to toggle source

    # File lib/chef/provider/service/macosx.rb, line 40
    def load_current_resource
      @current_resource = Chef::Resource::Service.new(@new_resource.name)
      @current_resource.service_name(@new_resource.service_name)
      @plist_size = 0
      @plist = find_service_plist
      @service_label = find_service_label
      set_service_status

      @current_resource
    end

restart_service() click to toggle source
Calls superclass method Chef::Provider::Service::Simple#restart_service

    # File lib/chef/provider/service/macosx.rb, line 103
    def restart_service
      if @new_resource.restart_command
        super
      else
        stop_service
        sleep 1
        start_service
      end
    end

set_service_status() click to toggle source

    # File lib/chef/provider/service/macosx.rb, line 140
    def set_service_status
      return if @plist == nil or @service_label.to_s.empty?

      cmd = shell_out(
        "launchctl list #{@service_label}",
        :user => @owner_uid, :group => @owner_gid
      )

      if cmd.exitstatus == 0
        @current_resource.enabled(true)
      else
        @current_resource.enabled(false)
      end

      if @current_resource.enabled
        @owner_uid = ::File.stat(@plist).uid
        @owner_gid = ::File.stat(@plist).gid

        shell_out!(
          "launchctl list", :user => @owner_uid, :group => @owner_gid
        ).stdout.each_line do |line|
          case line
          when /(\d+|-)\s+(?:\d+|-)\s+(.*\.?)#{@service_label}/
            pid = $1
            @current_resource.running(!pid.to_i.zero?)
          end
        end
      else
        @current_resource.running(false)
      end
    end

start_service() click to toggle source
Calls superclass method Chef::Provider::Service::Simple#start_service

    # File lib/chef/provider/service/macosx.rb, line 79
    def start_service
      if @current_resource.running
        Chef::Log.debug("#{@new_resource} already running, not starting")
      else
        if @new_resource.start_command
          super
        else
          shell_out!("launchctl load -w '#{@plist}'", :user => @owner_uid, :group => @owner_gid)
        end
      end
    end

stop_service() click to toggle source
Calls superclass method Chef::Provider::Service::Simple#stop_service

    # File lib/chef/provider/service/macosx.rb, line 91
    def stop_service
      unless @current_resource.running
        Chef::Log.debug("#{@new_resource} not running, not stopping")
      else
        if @new_resource.stop_command
          super
        else
          shell_out!("launchctl unload '#{@plist}'", :user => @owner_uid, :group => @owner_gid)
        end
      end
    end