nagios-gearman-downtime 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/bin/downtime_client +90 -0
  2. data/bin/downtime_worker +54 -0
  3. metadata +83 -0
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env ruby
2
+ require 'gearman'
3
+ require 'base64'
4
+ require "openssl"
5
+ require "thor"
6
+ require "../lib/nagios-gearman-downtime"
7
+
8
+ class Downtime < Thor
9
+
10
+ default_task 'show_help'
11
+
12
+ desc "show_help", 'Display help for downtime client'
13
+
14
+ def show_help
15
+ puts <<-HELP
16
+
17
+ Usage:
18
+ downtime_client set --duration=duration in minutes --gearman-server=Gearman server address
19
+
20
+ --object_type [host,
21
+ hostgroup_host,
22
+ hostgroup_svc,
23
+ servicegroup_host,
24
+ servicegroup_svc,
25
+ service,
26
+ enable_servicegroup,
27
+ disable_servicegroup], default => host
28
+
29
+ --object_name default => 'hostname -f', the name of the object type
30
+
31
+
32
+ --encryption true/false - default => false
33
+ --key Key to encrypt request - must be identical to the gearman_server key
34
+ --queue gearman server queue default => downtime
35
+
36
+
37
+ --start_time default => now
38
+ --end_time default => now + duration
39
+ --duration time in minutes, default => 1 minute
40
+
41
+ --author Author of downtime (default hostname)
42
+ --comment default => 'Downtime recieved by gearman server'
43
+ HELP
44
+ end
45
+
46
+ desc "set", "Send Downtime request to Gearman server - downtime queue"
47
+
48
+ method_option :gearman_server, :banner => 'Gearman server address', :desc => 'Gearman server address', :required => true
49
+ method_option :gearman_port, :desc => 'Gearman server port', :default => '4730'
50
+ method_option :encryption, :desc => 'Enable encryption of request( true / false)', :type => 'boolean', :default => false
51
+ method_option :key, :desc => 'Key to encrypt request - must be identical to the gearman_server key', :default => ''
52
+ method_option :object_type, :desc => 'Object type in nagios',:enum => %w{ host hostgroup_host hostgroup_svc servicegroup_host servicegroup_svc service enable_servicegroup disable_servicegroup}, :default => 'host'
53
+ method_option :object_name, :desc => 'Name of the object in nagios - default to hostname -f ', :default => `hostname -f`.chomp
54
+ method_option :start_time, :desc => 'Downtime start_time in epoch - default now', :default => Time.now.to_i
55
+ method_option :end_time, :desc => 'Downtime end_time in epoch - default now'
56
+ method_option :duration, :banner => 'duration in minutes', :desc => 'duration of downtime in minutes', :required => true
57
+ method_option :fixed, :desc => 'downtime start and end is fixed', :default => 1
58
+ method_option :author, :desc => 'Author of downtime (default hostname)', :default => `hostname -f`.chomp
59
+ method_option :comment, :desc => 'Comment for downtime', :default => 'Downtime recieved by gearman server'
60
+ method_option :trigger_id, :desc => 'triggered by the ID of another scheduled downtime entry', :default => 0
61
+
62
+ def set
63
+ duration = options[:duration].to_i * 60
64
+ puts "duration: #{duration}"
65
+ end_time = options[:end_time] || Time.now.to_i + duration
66
+
67
+ args = {
68
+ :gearman_job_server => ["#{options[:gearman_server]}:#{options[:gearman_port] || 4730}"],
69
+ :encryption => options[:encryption],
70
+ :key => options[:key],
71
+ :queue => 'downtime',
72
+ :object_type => options[:object_type],
73
+ :object_name => options[:object_name],
74
+ :start_time => options[:start_time],
75
+ :end_time => end_time,
76
+ :duration => duration,
77
+ :fixed => options[:fixed],
78
+ :author => options[:author],
79
+ :comment => options[:comment],
80
+ :trigger_id => options[:trigger_id]
81
+ }
82
+
83
+
84
+ args.merge!(:job => ::Nagios::Gearman::Downtime.build_payload(args))
85
+
86
+ ::Nagios::Gearman::Downtime.send_external_cmd(args)
87
+ end
88
+ end
89
+
90
+ Downtime.start
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+ require 'gearman'
3
+ require 'base64'
4
+ require 'openssl'
5
+ require 'logger'
6
+
7
+ logger = Logger.new(STDOUT)
8
+
9
+ key = `grep key /etc/mod-gearman/worker.conf`.chomp.split('=').last.strip
10
+ logger.info "key: #{key}"
11
+
12
+ servers = []
13
+ servers << `grep server /etc/mod-gearman/worker.conf`.chomp.split('=').last.strip
14
+ logger.info "servers: #{servers}"
15
+
16
+ def aes256_decrypt(key, data)
17
+ key = null_padding(key)
18
+ aes = OpenSSL::Cipher.new('AES-256-ECB')
19
+ aes.decrypt
20
+ aes.key = key
21
+ aes.update(data) + aes.final
22
+ end
23
+
24
+ def null_padding(key)
25
+ padding = (32 - key.bytesize) if(key.kind_of?(String) && 32 != key.bytesize)
26
+ key += "\0" * padding
27
+ end
28
+
29
+
30
+ def process_external_cmd(data)
31
+ path = '/var/lib/icinga/rw/icinga.cmd'
32
+
33
+ File.open(path, 'a') do |pipe|
34
+ puts "Sending downtime: #{data}"
35
+ pipe.puts data
36
+ pipe.close
37
+ end
38
+ end
39
+
40
+ w = Gearman::Worker.new(['0.0.0.0:4730'])
41
+ logger.info w.status
42
+
43
+ w.add_ability('downtime') do |data,job|
44
+ logger.info "Data recieved:\n#{data}"
45
+ decoded_data = Base64.strict_decode64(data.gsub("\n", ''))
46
+
47
+ decrypt = aes256_decrypt(key, decoded_data)
48
+ logger.info "decrypted data:\n#{decrypt}"
49
+
50
+ process_external_cmd(decrypt)
51
+ logger.info "Finished processing job"
52
+ end
53
+
54
+ loop { w.work }
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nagios-gearman-downtime
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ami Mahloof
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-03-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: gearman-ruby
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: thor
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: Gearman Client & Worker for sending downtime and enable / disable notifications
47
+ for service groups
48
+ email: ami.mahloof@gmail.com
49
+ executables:
50
+ - downtime_client
51
+ - downtime_worker
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - bin/downtime_client
56
+ - bin/downtime_worker
57
+ homepage: https://github.com/gtforge/nagios-gearman-downtime
58
+ licenses:
59
+ - MIT
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 1.8.25
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: Send external commands to mod-gearman
82
+ test_files: []
83
+ has_rdoc: