module ForemanHooks

Public Class Methods

attach_hook(klass, events) click to toggle source
# File lib/foreman_hooks.rb, line 69
def attach_hook(klass, events)
  if events.keys.detect { |event| ['create', 'update', 'destroy'].include? event }
    unless klass.ancestors.include?(ForemanHooks::OrchestrationHook)
      logger.debug "Extending #{klass} with foreman_hooks orchestration hooking support"
      klass.send(:include, ForemanHooks::OrchestrationHook)
    end
  end

  unless klass.ancestors.include?(ForemanHooks::CallbackHooks)
    logger.debug "Extending #{klass} with foreman_hooks Rails hooking support"
    klass.send(:include, ForemanHooks::CallbackHooks)
  end
end
discover_hooks() click to toggle source

Find all executable hook files under $hook_root/model_name/event_name/

# File lib/foreman_hooks.rb, line 15
def discover_hooks
  hooks = {}
  Dir.glob(File.join(hooks_root, '**', '*')) do |filename|
    next if filename.end_with? '~'
    next if filename.end_with? '.bak'
    next if File.directory? filename
    next unless File.executable? filename

    relative = filename[hooks_root.size..-1]
    next unless relative =~ %r{^/(.+)/([^/]+)/([^/]+)$}
    klass = $1.camelize
    event = $2
    script_name = $3
    hooks[klass] ||= {}
    hooks[klass][event] ||= []
    hooks[klass][event] << filename
    logger.debug "Found hook to #{klass.to_s}##{event}, filename #{script_name}"
  end
  hooks
end
events(klass = nil) click to toggle source
'event1', 'event2'
# File lib/foreman_hooks.rb, line 51
def events(klass = nil)
  filtered = if klass
               klass = klass.name if klass.kind_of? Class
               Hash[hooks.select { |k,e| k == klass }]
             else
               hooks
             end
  filtered.values.map(&:keys).flatten.uniq.map(&:to_sym)
end
find_hooks(klass, event) click to toggle source
# File lib/foreman_hooks.rb, line 61
def find_hooks(klass, event)
  klass = klass.name if klass.kind_of? Class
  return unless filtered = hooks[klass]
  return unless filtered = filtered[event.to_s]
  return if filtered.empty?
  filtered
end
hooks() click to toggle source

{'ModelClass' => {'event_name' => ['/path/to/01.sh', '/path/to/02.sh']}}

# File lib/foreman_hooks.rb, line 37
def hooks
  unless @hooks
    @hooks = discover_hooks
    @hooks.each do |klass,events|
      events.each do |event,hooks|
        logger.info "Finished discovering #{hooks.size} hooks for #{klass}##{event}"
        hooks.sort!
      end
    end
  end
  @hooks
end
hooks_root() click to toggle source
# File lib/foreman_hooks.rb, line 10
def hooks_root
  File.join(Rails.application.root, 'config', 'hooks')
end
logger() click to toggle source
# File lib/foreman_hooks.rb, line 83
def logger; Rails.logger; end