dribbled 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,7 +11,7 @@ module Dribbled
11
11
 
12
12
  include Senedsa
13
13
 
14
- COMMANDS = %w(show check snap)
14
+ COMMANDS = %w(show check snap watch)
15
15
  COMPONENTS = %w(resources)
16
16
  DEFAULT_CONFIG_FILE = File.join(ENV['HOME'],"/.senedsa/config")
17
17
 
@@ -21,6 +21,7 @@ module Dribbled
21
21
 
22
22
  @global_options = { :debug => false, :drbdadm => 'drbdadm', :xmldump => nil, :procdrbd => '/proc/drbd', :hostname => nil }
23
23
  @action_options = { :monitor => :nagios, :mode => :active, :suffix => nil, :directory => '/tmp' }
24
+ @action_arguments = {}
24
25
  @action = nil
25
26
  end
26
27
 
@@ -56,43 +57,54 @@ module Dribbled
56
57
  opts.banner = "Usage: #{ID} [options] <action> [options]"
57
58
  opts.separator ""
58
59
  opts.separator "Actions:"
59
- opts.separator " show Displays component information"
60
+ opts.separator " show Displays resource information"
61
+ opts.separator " watch Displays resource information at a given interval"
60
62
  opts.separator " check Performs health checks"
61
63
  opts.separator " snap Saves contents of /proc/drbd and 'drbdadm dump-xml'"
62
64
  opts.separator ""
63
65
  opts.separator "General options:"
64
- opts.on('-D', '--drbdadm DRBDADM', String, "Path to drbdadm binary") { |drbdadm| @global_options[:drbdadm] = drbdadm }
65
- opts.on('-P', '--procdrbd PROCDRBD', String, "Path to /proc/drbd") { |procdrbd| @global_options[:procdrbd] = procdrbd }
66
- opts.on('-X', '--xmldump XMLDUMP', String, "Path to output for drbdadm --dump-xml") { |xmldump| @global_options[:xmldump] = xmldump}
67
- opts.on('-H', '--hostname HOSTNAME', String, "Hostname") { |hostname| @global_options[:hostname] = hostname }
68
- opts.on('-d', '--debug', "Enable debug mode") { @global_options[:debug] = true}
69
- opts.on('-a', '--about', "Display #{ID} information") { output_message ABOUT, 0 }
70
- opts.on('-V', '--version', "Display #{ID} version") { output_message VERSION, 0 }
71
- opts.on_tail('--help', "Show this message") { @global_options[:HELP] = true }
66
+ opts.on('-D', '--drbdadm DRBDADM', String, "Path to drbdadm binary") { |drbdadm| @global_options[:drbdadm] = drbdadm }
67
+ opts.on('-P', '--procdrbd PROCDRBD', String, "Path to /proc/drbd") { |procdrbd| @global_options[:procdrbd] = procdrbd }
68
+ opts.on('-X', '--xmldump XMLDUMP', String, "Path to output for drbdadm --dump-xml") { |xmldump| @global_options[:xmldump] = xmldump}
69
+ opts.on('-H', '--hostname HOSTNAME', String, "Hostname") { |hostname| @global_options[:hostname] = hostname }
70
+ opts.on('-d', '--debug', "Enable debug mode") { @global_options[:debug] = true}
71
+ opts.on('-a', '--about', "Display #{ID} information") { output_message ABOUT, 0 }
72
+ opts.on('-V', '--version', "Display #{ID} version") { output_message VERSION, 0 }
73
+ opts.on_tail('--help', "Show this message") { @global_options[:HELP] = true }
72
74
 
73
75
  actions = {
74
76
  :show => OptionParser.new do |aopts|
75
- aopts.banner = "Usage: #{ID} [options] show <component>"
76
- aopts.separator ""
77
- aopts.separator " <component> is resources|res"
77
+ aopts.banner = "Usage: #{ID} [options] show [resource]"
78
78
  end,
79
79
  :check => OptionParser.new do |aopts|
80
80
  aopts.banner = "Usage: #{ID} [options] check [check_options]"
81
81
  aopts.separator ""
82
82
  aopts.separator "Check Options"
83
- aopts.on('-M', '--monitor [nagios]', [:nagios], "Monitoring system") { |monitor| @action_options[:monitor] = monitor }
84
- aopts.on('-m', '--mode [active|passive]', [:active, :passive], "Monitoring mode") { |mode| @action_options[:mode] = mode }
85
- aopts.on('-H', '--nsca_hostname HOSTNAME', String, "NSCA hostname to send passive checks") { |nsca_hostname| @action_options[:nsca_hostname] = nsca_hostname }
86
- aopts.on('-c', '--config CONFIG', String, "Path to Senedsa (send_nsca) configuration" ) { |config| @action_options[:senedsa_config] = config }
87
- aopts.on('-S', '--svc_descr SVC_DESR', String, "Nagios service description") { |svc_descr| @action_options[:svc_descr] = svc_descr }
88
- aopts.on('-h', '--hostname HOSTNAME', String, "Service hostname") { |hostname| @action_options[:svc_hostname] = hostname }
83
+ aopts.on('-M', '--monitor [nagios]', [:nagios], "Monitoring system") { |monitor| @action_options[:monitor] = monitor }
84
+ aopts.on('-m', '--mode [active|passive]', [:active, :passive], "Monitoring mode") { |mode| @action_options[:mode] = mode }
85
+ aopts.on('-H', '--nsca_hostname HOSTNAME', String, "NSCA hostname to send passive checks") { |nsca_hostname| @action_options[:nsca_hostname] = nsca_hostname }
86
+ aopts.on('-c', '--config CONFIG', String, "Path to Senedsa (send_nsca) configuration" ) { |config| @action_options[:senedsa_config] = config }
87
+ aopts.on('-S', '--svc_descr SVC_DESR', String, "Nagios service description") { |svc_descr| @action_options[:svc_descr] = svc_descr }
88
+ aopts.on('-h', '--hostname HOSTNAME', String, "Service hostname") { |hostname| @action_options[:svc_hostname] = hostname }
89
89
  end,
90
90
  :snap => OptionParser.new do |aopts|
91
91
  aopts.banner = "Usage: #{ID} [options] snap [snap_options]"
92
92
  aopts.separator ""
93
93
  aopts.separator "Snap Options"
94
- aopts.on('-S','--suffix SUFFIX', String, "Suffix (defaults to PID)") { |suffix| @action_options[:suffix] = suffix }
95
- aopts.on('-D', '--directory DIRECTORY', String, "Directory (defaults to /tmp)") { |directory| @action_options[:directory] = directory }
94
+ aopts.on('-S','--suffix SUFFIX', String, "Suffix (defaults to PID)") { |suffix| @action_options[:suffix] = suffix }
95
+ aopts.on('-D','--directory DIRECTORY', String, "Directory (defaults to /tmp)") { |directory| @action_options[:directory] = directory }
96
+ end,
97
+ :watch => OptionParser.new do |aopts|
98
+ aopts.banner = "Usage: #{ID} [options] watch [watch_options] interval [count]"
99
+ aopts.separator ""
100
+ aopts.separator "Watch Arguments"
101
+ aopts.separator " interval: amount of time in seconds between each report (default: 60)"
102
+ aopts.separator " count: number of reports to produce"
103
+ aopts.separator ""
104
+ aopts.separator "Watch Options"
105
+ aopts.on('-r', '--resource RESOURCE', String, "Resource") { |resource| @action_options[:resource] = resource }
106
+ aopts.on('-c', '--cstate CSTATE_RE', String, "CState (partial match)") { |cstate| @action_options[:cstate] = cstate }
107
+ aopts.on('-d', '--dstate DSTATE_RE', String, "DState (partial match)") { |dstate| @action_options[:dstate] = dstate }
96
108
  end
97
109
  }
98
110
 
@@ -102,6 +114,13 @@ module Dribbled
102
114
  @action = @whoami == :check_drbd ? :check : @arguments.shift.to_sym
103
115
  raise OptionParser::InvalidArgument, "invalid action #@action" if actions[@action].nil?
104
116
  actions[@action].order!(@arguments)
117
+ case @action
118
+ when :show
119
+ @action_arguments[:component] = @arguments.shift
120
+ when :watch
121
+ @action_arguments[:interval] = @arguments.shift
122
+ @action_arguments[:count] = @arguments.shift
123
+ end
105
124
  end
106
125
 
107
126
  def config_options?
@@ -131,10 +150,23 @@ module Dribbled
131
150
  end
132
151
 
133
152
  def process_options
153
+ case @action
154
+ when :watch
155
+ if @action_options[:resource].nil? and @action_options[:cstate].nil? and @action_options[:dstate].nil?
156
+ @action_options[:cstate] = 'Sync'
157
+ @action_options[:dstate] = 'Inconsistent'
158
+ else
159
+ @action_options[:cstate] = '__NOMATCH__' if @action_options[:cstate].nil?
160
+ @action_options[:dstate] = '__NOMATCH__' if @action_options[:dstate].nil?
161
+ end
162
+ end
134
163
  true
135
164
  end
136
165
 
137
166
  def process_arguments
167
+ @action_arguments[:interval] = 60 if @action_arguments[:interval].nil?
168
+ @action_arguments[:interval] = @action_arguments[:interval].to_i
169
+ @action_arguments[:count] = @action_arguments[:count].nil? ? -1 : @action_arguments[:count].to_i
138
170
  true
139
171
  end
140
172
 
@@ -146,21 +178,21 @@ module Dribbled
146
178
  when :show then run_show
147
179
  when :check then run_check
148
180
  when :snap then run_snap
181
+ when :watch then run_watch
149
182
  end
150
183
 
151
184
  end
152
185
 
153
186
  def run_show
154
- #raise ArgumentError, "missing component" if @arguments.size == 0
155
- component = 'res'
156
187
 
157
- case component
158
- when 'resource', 'res'
159
- @drbdset.each do |r,resource|
160
- puts resource.to_s
161
- end
188
+ case @action_arguments[:component]
162
189
  when 'version'
163
190
  puts @drbdset.version
191
+ else
192
+ resource_name_re = @action_arguments[:component].nil? ? /.*/ : /^#{@action_arguments[:component]}$/
193
+ @drbdset.each do |r,resource|
194
+ puts resource.to_s if resource.name =~ resource_name_re
195
+ end
164
196
  end
165
197
  end
166
198
 
@@ -196,7 +228,7 @@ module Dribbled
196
228
  plugin_status = :warning
197
229
  plugin_output += res.percent.nil? ? " #{res.id}:#{po_cstate};#{po_dstate}" : " #{res.id}:#{po_cstate}[#{res.percent}%,#{res.finish}];#{po_dstate}"
198
230
  elsif not res.in_configuration?
199
- plugin_status = :ok
231
+ plugin_status = :warning
200
232
  plugin_output += " #{res.id}[unconfigured]>#{po_cstate}/;#{po_dstate}"
201
233
  else
202
234
  plugin_output += " #{res.id}>#{po_cstate};#{po_dstate}"
@@ -233,6 +265,25 @@ module Dribbled
233
265
  File.open(xmldump_file, 'w') {|f| f.write(@drbdset.resources_cfg_raw) }
234
266
  end
235
267
 
268
+ def run_watch
269
+ begin
270
+ count = @action_arguments[:count]
271
+ loop do
272
+ @drbdset = DrbdSet.new @global_options
273
+ @drbdset.each do |r,resource|
274
+ if resource.cstate =~ /#{@action_options[:cstate]}/ or resource.dstate =~ /#{@action_options[:dstate]}/ or resource.name == @action_options[:resource]
275
+ puts resource
276
+ end
277
+ end
278
+ count -= 1
279
+ break if count == 0
280
+ sleep(@action_arguments[:interval])
281
+ end
282
+ rescue Interrupt => e
283
+ exit 0
284
+ end
285
+ end
286
+
236
287
  def output_message(message, exitstatus=nil)
237
288
  m = (! exitstatus.nil? and exitstatus > 0) ? "%s: error: %s" % [ID, message] : message
238
289
  Syslog.open(ID.to_s, Syslog::LOG_PID | Syslog::LOG_CONS) { |s| s.err "error: #{message}" } unless @global_options[:debug]
@@ -1,6 +1,6 @@
1
1
  require 'xmlsimple'
2
2
  require 'ostruct'
3
- #require 'awesome_print'
3
+ require 'awesome_print'
4
4
 
5
5
  module Dribbled
6
6
 
@@ -1,3 +1,3 @@
1
1
  module Dribbled
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dribbled
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-28 00:00:00.000000000 Z
12
+ date: 2012-11-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: xml-simple