naplug 1.6.1 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Naplug
1
+ # Naplug [![Gem Version](https://badge.fury.io/rb/naplug.png)](http://badge.fury.io/rb/naplug)
2
2
 
3
3
  *Naplug* is a [Nagios plugin](http://nagiosplug.sourceforge.net/developer-guidelines.html) library for Ruby focused on plugin internals: organization, status, performance data, output and exit code handling. It does not implement any functionality related to option and argument parsing, as there are fine tools already available for this purpose. It aims to ease the task of writing Nagios plugins in Ruby and _handling the paperwork_, allowing the plugin developer to concentrate on the test logic of the plugin. Its internal design is largely modeled after the very excellent [Worlkflow](https://github.com/geekq/workflow) library.
4
4
 
@@ -246,6 +246,33 @@ Which produces:
246
246
  naplug@plugin:~: examples/exception+
247
247
  OK: divided by zero is infinity
248
248
 
249
+ ### Performance Data
250
+
251
+ Naplug supports plugin performance data, which is only available after a plugin has been `exec`ed. Within plugins, two methods are relevant: `perfdata!` and `perfdata`, which set and get performance data metrics, respectively:
252
+
253
+ class PerfDataPlugin
254
+
255
+ include Naplug
256
+
257
+ plugin :p do |p|
258
+ p.status.ok!
259
+ p.output! "#{p.tag}:#{p[:instance]} with argument metric #{p[:metric]}"
260
+ p.perfdata! :metric, p[:metric]
261
+ p.perfdata! '"_met ric!', 30, :max => 70
262
+ end
263
+
264
+ end
265
+
266
+ pd = PerfDataPlugin.new :instance => :x1, :p => { :metric => 10 }
267
+ pd.exec!
268
+
269
+ This yields:
270
+
271
+ naplug@plugin:~: perfdata_uniplug
272
+ OK: p:x1 with argument metric 10 | metric=10;;;; '"_met ric!'=30;;;;70
273
+
274
+ It is also possible to access performance data from within the user-defined plugin class through the `perfdata` method, which returns an array of [`PerformanceData`](http://rubydoc.info/gems/naplug/Naplug/PerformanceData) objects.
275
+
249
276
  ### Plugs: Plugins within Plugins
250
277
 
251
278
  Up until now, *Naplug* has essentially provided *syntactic sugar* to define and use what amounts to single-purpose plugins, along with some convenience methods to represent status and produce output. But plugins sometimes need to perform a number of possibly independent tasks to reach a final, _aggregated_ status.
@@ -318,6 +345,71 @@ Tagged arguments have priority over shared ones.
318
345
  :plug1 => { :file => '/var/tmp/file', :critical => 120 },
319
346
  :plug2 => { :ok => 0, :warning => 5, :critical => 10 })
320
347
 
348
+ #### Performance Data
349
+
350
+ As mentioned earlier, Naplug supports plugin performance data, through two methods of `Plugin`, `perfdata!` and `perfdata`:
351
+
352
+ class PerfDataPlugPlugin
353
+
354
+ include Naplug
355
+
356
+ plugin :p do |p|
357
+
358
+ plugin :p1 do |p1|
359
+ p1.status.ok!
360
+ p1.output! "#{p.tag}:#{p1.tag} #{p[:instance]}"
361
+ p1.perfdata! :metric, p1[:metric], :max => 70
362
+ p1.perfdata! '"_met ric!', 30, :max => 70
363
+ end
364
+
365
+ plugin :p2 do |p2|
366
+ p2.status.ok!
367
+ p2.output! "#{p.tag}:#{p2.tag} #{p[:instance]}"
368
+ p2.perfdata! 'p2/metric', p2[:metric], :crit => 70
369
+ end
370
+
371
+ plugin :p3 do |p3|
372
+ p3.status.ok!
373
+ p3.output! "#{p.tag}:#{p3.tag} #{p[:instance]}"
374
+ end
375
+ end
376
+ end
377
+
378
+ # Note: the following code is meant to show some of the behavior related to Performance Data:
379
+ plugin = PerfDataPlugPlugin.new :instance => :x1, :p1 => { :metric => 10 }, :p2 => { :metric => 50 }
380
+ plugin.exec
381
+
382
+ # Plugin Perfdata Ancestors
383
+ plugin.perfdata.each do |pd|
384
+ puts "#{pd.tag} has #{pd.to_a.size} labels and its tree is #{pd.ancestors :mode => :tags}"
385
+ end
386
+
387
+ plugin.perfdata.each do |pd|
388
+ puts "plugin #{pd.tag} has #{pd.labels}"
389
+ end
390
+
391
+ which produces:
392
+
393
+ plugin@naplug:~: perfdata_multiplug
394
+ perfdata p1 has 2 labels and its tree is p/p1
395
+ perfdata p2 has 1 labels and its tree is p/p2
396
+ plugin p1 has ["metric", "'\"_met ric!'"]
397
+ plugin p2 has ["p2/metric"]
398
+
399
+ Some of this functionality is intended to ease integration with, for instance, Graphite:
400
+
401
+ g = Graphite.new :hostname => 'graphite', :port => 2013
402
+ h = `hostname`.gsub(/\./,'_')
403
+
404
+ plugin.perfdata.each do |pd|
405
+ pd.to_a.each do |l|
406
+ g.push "#{h}_app_#{l}
407
+ end
408
+ end
409
+ g.flush!
410
+
411
+ This would push the collected performance data metrics to Graphite with an invented API. Note that Nagios performance data labels are not always legal graphite metric names (`"\"_met ric!'` above). Naplug makes no attempt to address this.
412
+
321
413
  #### A Plugged Plugin Example
322
414
 
323
415
  Take a service for which we wish to monitor three conditions:
@@ -457,7 +549,7 @@ A future release will allow the execution order to be changed through an `order!
457
549
 
458
550
  If tags are omitted from the list, the missing plugs are pushed to the end of the line in the last order set.
459
551
 
460
- #### Enabling and Disabling Plugs
552
+ ### Enabling and Disabling Plugs
461
553
 
462
554
  Currently, when plugs are defined, they are assumed to be enabled and will be executed when `exec!` is invoked. There may be cases when it may be desirable or necessary to disable specific plugins, which will be accomplished through the `disable!` instance method. A disabled plug can be re-enabled via the `enable!` plugin method:
463
555
 
@@ -38,7 +38,6 @@ class MultiPluginPlugin
38
38
 
39
39
  end
40
40
 
41
-
42
41
  x1 = MultiPluginPlugin.new :instance => :x1, :one => { :p1 => { :instance => :x1 }}
43
42
  x2 = MultiPluginPlugin.new :instance => :x2, :one => { :p1 => { :instance => :x2 }}
44
43
  x1.one!
File without changes
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby -rubygems
2
+
3
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
5
+
6
+ require 'naplug'
7
+ require 'awesome_print'
8
+
9
+ class PerfDataPlugPlugin
10
+
11
+ include Naplug
12
+
13
+ plugin :p do |p|
14
+
15
+ plugin :p1 do |p1|
16
+ p1.status.ok!
17
+ p1.output! "#{p.tag}:#{p1.tag} #{p[:instance]}"
18
+ p1.perfdata! :metric, p1[:metric], :max => 70
19
+ p1.perfdata! '"_met ric!', 30, :max => 70
20
+ end
21
+
22
+ plugin :p2 do |p2|
23
+ p2.status.ok!
24
+ p2.output! "#{p.tag}:#{p2.tag} #{p[:instance]}"
25
+ p2.perfdata! 'p2/metric', p2[:metric], :crit => 70
26
+ end
27
+
28
+ plugin :p3 do |p3|
29
+ p3.status.ok!
30
+ p3.output! "#{p.tag}:#{p3.tag} #{p[:instance]}"
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ plugin = PerfDataPlugPlugin.new :instance => :x1, :p1 => { :metric => 10 }, :p2 => { :metric => 50 }
38
+ plugin.exec
39
+
40
+ # Plugin Perfdata Ancestors
41
+ plugin.perfdata.each do |pd|
42
+ puts "perfdata #{pd.tag} has #{pd.to_a.size} labels and its tree is #{pd.ancestors :mode => :tags}"
43
+ end
44
+
45
+ plugin.perfdata.each do |pd|
46
+ puts "plugin #{pd.tag} has labels #{pd.labels}"
47
+ end
48
+
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
5
+
6
+ require 'rubygems'
7
+ require 'naplug'
8
+ #require 'awesome_print'
9
+
10
+ class PerfDataPlugin
11
+
12
+ include Naplug
13
+
14
+ plugin :p do |p|
15
+ p.status.ok!
16
+ p.output! "#{p.tag}:#{p[:instance]} with argument metric #{p[:metric]}"
17
+ p.perfdata! :metric, p[:metric]
18
+ p.perfdata! '"_met ric!', 30, :max => 70
19
+ end
20
+
21
+ end
22
+
23
+ pd = PerfDataPlugin.new :instance => :x1, :p => { :metric => 10 }
24
+ pd.exec!
@@ -19,7 +19,7 @@ module Naplug
19
19
  puts "Working with a status:"
20
20
  status = Naplug::Status.new
21
21
  puts " status #{status} has exit code #{status.to_i} after initialization"
22
- status.ok
22
+ status.ok!
23
23
  puts " status #{status} has exit code #{status.to_i} after status.ok"
24
24
 
25
25
  puts "Comparing statuses:"
@@ -1,3 +1,17 @@
1
+ #--
2
+ #
3
+ # Author:: Gerir Lopez-Fernandez
4
+ # Homepage:: https://github.com/gerirgaudi/naplug/
5
+ # Date:: 25 Feb 2014
6
+ #
7
+ # See the file LICENSE for licensing information.
8
+ #
9
+ #---------------------------------------------------------------------------
10
+
11
+ #--
12
+ # Naplug::ClassMethods and Naplug::InstanceMethods
13
+
14
+
1
15
  require 'rubygems'
2
16
  require 'naplug/plugin'
3
17
 
@@ -7,31 +21,43 @@ module Naplug
7
21
 
8
22
  module ClassMethods
9
23
 
24
+ # @!scope class
25
+
26
+ # @!attribute [r] plugins
27
+ # @return [Hash<Symbol, Plugin>] metaplugins
10
28
  attr_reader :plugins
11
29
 
30
+ # Create a metaplugin (which basically contains a tag and a block)
31
+ # @param tag [Symbol] the plugin tag
32
+ # @return [Plugin] a metaplugin
12
33
  def plugin(tag = :main, &block)
13
34
  @plugins = Hash.new unless @plugins
14
35
  @plugins[tag] = create_metaplugin tag, block
15
36
  end
16
37
 
38
+ # A list of plugin tags
39
+ # @return [Array<Symbol>] the list of plugin tags
17
40
  def tags
18
41
  self.plugins.keys
19
42
  end
20
43
 
21
44
  private
22
45
 
46
+ # Create a metaplugin (helper)
23
47
  def create_metaplugin(tag,block)
24
48
  module_eval do
25
- define_method "#{tag}".to_sym do; plugin; end # <tag> methods for quick access to plugins
49
+ define_method "#{tag}".to_sym do; @plugins[tag]; end # <tag> methods for quick access to plugins
26
50
  define_method "#{tag}!".to_sym do; self.exec! tag; end # <tag>! methods to involke exec! on a given plugin
27
51
  end
28
- Plugin.new tag, :meta, block
52
+ Plugin.new tag, block, :meta => true, :parent => self
29
53
  end
30
54
 
31
55
  end
32
56
 
33
57
  module InstanceMethods
34
58
 
59
+ # @!scope instancce
60
+
35
61
  attr_reader :plugins
36
62
 
37
63
  def initialize(args = {})
@@ -42,10 +68,14 @@ module Naplug
42
68
  args! args
43
69
  end
44
70
 
71
+ # Returns the arguments of the plugin
72
+ # @return [Hash] a hash by argument key of argument values
45
73
  def args
46
74
  @_args
47
75
  end
48
76
 
77
+ # Sets and propagates plugin arguments
78
+ # @param [Hash <Symbol, Object>] args
49
79
  def args!(args)
50
80
  @_args.merge! args
51
81
  @plugins.each do |tag,plugin|
@@ -56,25 +86,45 @@ module Naplug
56
86
  end
57
87
 
58
88
  def to_str(tag = default_plugin.tag)
59
- s_format = perfdata(tag) ? '%s: %s | %s' : '%s: %s'
60
- s_array = perfdata(tag) ? [@plugins[tag].status,@plugins[tag].output,perfdata(tag)] : [@plugins[tag].status,@plugins[tag].output]
89
+ pd = perfdata(tag)
90
+ if pd.empty?
91
+ s_format = '%s: %s'
92
+ s_array = [@plugins[tag].status,@plugins[tag].output]
93
+ else
94
+ s_format = '%s: %s | %s'
95
+ s_array = [@plugins[tag].status,@plugins[tag].output,pd.join(' ').strip]
96
+ end
61
97
  s_format % s_array
62
98
  end
63
99
 
100
+ # Execute, evaluate and exit the plugin according to the plugin status, outputting the plugin's text output (and performance data, if applicable)
101
+ # @param tag [Symbol] a plugin tag
64
102
  def exec!(tag = default_plugin.tag)
65
103
  exec tag
66
104
  eval tag
67
105
  exit tag
68
106
  end
69
107
 
70
- def exec(tag = default_plugin.tag)
71
- rexec @plugins[tag]
108
+ # Execute the plugin
109
+ # @param tag [Symbol] a plugin tag
110
+ def exec(t = default_plugin.tag)
111
+ plugin = target_plugin t
112
+ if plugin.has_plugins?
113
+ plugin.plugins.each_value { |p| exec p }
114
+ else
115
+ plexec plugin
116
+ end
72
117
  end
73
118
 
74
119
  def eval(tag = default_plugin.tag)
75
120
  @plugins[tag].eval
76
121
  end
77
122
 
123
+ def eval!(tag = default_plugin.tag)
124
+ @plugins[tag].eval
125
+ exit tag
126
+ end
127
+
78
128
  def eject!(payload = nil)
79
129
  o = case payload
80
130
  when String then payload
@@ -86,24 +136,27 @@ module Naplug
86
136
  Kernel::exit 3
87
137
  end
88
138
 
89
- private
90
-
91
- def rexec(plug)
92
- if plug.has_plugins?
93
- plug.plugins.each_value { |p| rexec p }
139
+ # @return [Array<PerformanceData>] a list of performance data objects
140
+ def perfdata(tag = default_plugin.tag)
141
+ plugin = @plugins[tag]
142
+ if plugin.has_plugins?
143
+ plugin.plugins.values.select { |plug| plug.perfdata }.map { |plug| plug.perfdata }
94
144
  else
95
- plexec plug
145
+ plugin.perfdata ? [plugin.perfdata] : []
96
146
  end
97
147
  end
98
148
 
149
+ private
150
+
99
151
  def plexec(p)
100
152
  begin
101
153
  @_running = p.tag
102
154
  instance_exec p, &p.block
103
155
  @_running = nil
104
156
  rescue Naplug::Error => e
105
- p.status.unknown!
106
- p.output! "#{e.backtrace[1][/[^\/]+:\d+/]}: #{e.message}"
157
+ p.status.unknown!
158
+ p.output! "#{e.backtrace[1][/[^\/]+:\d+/]}: #{e.message}"
159
+ p.payload! e
107
160
  rescue => e
108
161
  p.status.unknown!
109
162
  p.output! "#{e.backtrace[0][/[^\/]+:\d+/]}: #{e.message}"
@@ -125,12 +178,11 @@ module Naplug
125
178
  raise Naplug::Error, 'unable to determine default plugin'
126
179
  end
127
180
 
128
- def perfdata(tag = default_plugin.tag)
129
- plugin = @plugins[tag]
130
- if plugin.has_plugins?
131
- plugin.plugins.values.map { |plug| plug.perfdata }.join(' ').gsub(/^\s+$/,'').strip!
132
- else
133
- plugin.perfdata
181
+ def target_plugin(target)
182
+ case target
183
+ when Symbol then @plugins[target]
184
+ when Plugin then target
185
+ else raise Naplug::Error, "unable to determine target plugin"
134
186
  end
135
187
  end
136
188
 
@@ -1,4 +1,6 @@
1
1
  require 'json'
2
+ require 'socket'
3
+ require 'timeout'
2
4
  require 'naplug/status'
3
5
 
4
6
  module Naplug
@@ -47,6 +49,65 @@ module Naplug
47
49
  }
48
50
  end
49
51
 
52
+ end
53
+
54
+ module ENGraphite
55
+
56
+ class Client
57
+
58
+ attr_reader :metrics
59
+
60
+ def initialize(options)
61
+ raise ArgumentError, 'missing graphite server address' if options[:graphite].nil?
62
+ @graphite = options[:graphite]
63
+ @port = options[:port].nil? ? 2003 : options[:port].to_i
64
+ @prefix = options[:prefix].nil? ? '' : options[:prefix]
65
+ @metrics = []
66
+ end
67
+
68
+ def metric path, value, time = Time.now
69
+ @metrics.push(Metric.new(path,value,time))
70
+ end
71
+
72
+ def metrics!
73
+ @metrics.each do |metric|
74
+ metric = "#{@prefix}.#{metric.to_s}\n"
75
+ print metric
76
+ end
77
+ end
78
+
79
+ def flush!(options = { :timeout => 3})
80
+ begin
81
+ Timeout.timeout(options[:timeout]) do
82
+ s = TCPSocket.open(@graphite,@port)
83
+ @metrics.each do |metric|
84
+ metric = "#{@prefix}.#{metric.to_s}\n"
85
+ s.write metric
86
+ end
87
+ s.close
88
+ end
89
+ rescue Timeout::Error => e
90
+ raise Naplug::Error, "graphite timeout (#{options[:timeout]}s)"
91
+ rescue Errno::ECONNREFUSED, SocketError => e
92
+ raise Naplug::Error, 'graphite socket error'
93
+ end
94
+ end
95
+ end
96
+
97
+ class Metric
98
+
99
+ attr_reader :path, :value, :time
100
+
101
+ def initialize(path,value,time = Time.now)
102
+ @path = path
103
+ @value = value
104
+ @time = time
105
+ end
106
+
107
+ def to_s
108
+ '%s %d %d' % [@path,@value,@time.to_i]
109
+ end
110
+ end
50
111
 
51
112
  end
52
113
 
@@ -1,52 +1,111 @@
1
+ require 'ostruct'
2
+
1
3
  module Naplug
2
4
 
3
5
  class PerformanceData
4
6
 
5
- attr_reader :tag, :data
7
+ include Enumerable
6
8
 
7
- class MissingLabel < StandardError; end
8
- class InvalidField < StandardError; end
9
- class ThatIsNoHash < StandardError; end
9
+ attr_reader :tag, :data, :meta
10
10
 
11
- FIELDS = [:label, :value, :uom, :warn, :crit, :min, :max] # label=value[UOM];[warn];[crit];[min];[max]
11
+ FIELDS = [:label, :value, :uom, :warn, :crit, :min, :max]
12
12
 
13
- def initialize(tag)
14
- @tag = tag
13
+ def initialize(plugin)
14
+ @tag = plugin.tag
15
15
  @data = Hash.new
16
+ @meta = OpenStruct.new :plugin => plugin, :ancestors => traverse_to_root(plugin)
16
17
  end
17
18
 
18
- def to_s(label = nil)
19
- label_ary = label.nil? ? @data.keys : [label]
19
+ # performance data format: 'label=value[UOM];[warn];[crit];[min];[max]'
20
+ def to_str(label = nil)
21
+ label_ary = label.nil? ? labels : [curate_label(label)]
20
22
  label_ary.map do |l|
21
23
  '%s=%s%s;%s;%s;%s;%s' % FIELDS.map { |k| @data[l][k] }
22
24
  end.join(' ').strip
23
25
  end
24
26
 
25
- def []=(label,value,args = {})
26
- raise ThatIsNoHash, 'hash of fields is not a hash' unless args.is_a? Hash
27
- args.keys.each { |field| raise InvalidField unless FIELDS.include? field }
28
- raise MissingLabel, 'missing label' unless label
29
- @data[label] = { :label => label, :value => value }.merge args
27
+ # List of performance data label entries
28
+ # @return [Array<Hash<label,field_data>>] an array of hashes keyed by field
29
+ def to_a
30
+ @data.values
31
+ end
32
+
33
+ # @raise Naplug::Error if the label contains invalid characters, the value is not a number, or specify invalid fields
34
+ def []=(label,valuefields)
35
+ value, fields = valuefields
36
+ if validate_label label and validate_value value and validate_fields fields
37
+ @data[curate_label(label)] = { :label => curate_label(label), :value => value }.merge fields
38
+ else
39
+ raise Naplug::Error, "invalid performance data label (#{label}), value (#{value}), field representation (#{fields.class}) or field (#{fields.keys.join(',')})"
40
+ end
41
+ end
42
+
43
+ def each(&block)
44
+ @data.values.each(&block)
30
45
  end
31
- alias_method :store, :[]=
32
46
 
33
47
  def [](label)
34
- @data[label]
48
+ @data[curate_label(label)]
35
49
  end
36
- alias_method :fetch, :[]
37
50
 
38
51
  def delete(label)
39
- @data.delete(label)
52
+ @data.delete(curate_label(label))
40
53
  end
41
54
 
42
- def has_label?(label)
43
- @data.has_key? label
55
+ def include?(label)
56
+ @data.has_key? curate_label(label)
44
57
  end
45
- alias_method :include?, :has_label?
58
+ alias_method :has_label?, :include?
59
+
60
+ def keys
61
+ @data.keys
62
+ end
63
+ alias_method :labels, :keys
46
64
 
47
65
  def fields
48
66
  FIELDS
49
67
  end
50
68
 
69
+ # @return [Plugin] plugin performance data belongs to
70
+ def plugin
71
+ @meta.plugin
72
+ end
73
+
74
+ # @return [Array<Plugin>] of parent plugins
75
+ def ancestors(options = { :mode => :tags, :separator => :/ })
76
+ options[:separator] = :/ if options[:separator].nil?
77
+ options[:mode].nil? ? @meta.ancestors : @meta.ancestors.map { |a| a.tag }.join(options[:separator].to_s)
78
+ end
79
+
80
+ private
81
+
82
+ # can contain any characters except the equals sign or single quote (')
83
+ def validate_label(l)
84
+ l.nil? or l.to_s.index(/['=]/) ? false : true
85
+ end
86
+
87
+ def validate_value(v)
88
+ true # v =~ /^[0-9.-]+$/ ? true : false
89
+ end
90
+
91
+ def validate_fields(fields)
92
+ fields.is_a? Hash and fields.keys.select { |field| not FIELDS.include? field }.empty? ? true : false
93
+ end
94
+
95
+ # single quotes for the label are optional; required if spaces are in the label
96
+ def curate_label(l)
97
+ l.to_s.index(/\s+/) ? "'#{l}'" : l.to_s
98
+ end
99
+
100
+ def traverse_to_root(plugin)
101
+ lineage = []
102
+ loop do
103
+ break unless plugin.is_a? Plugin
104
+ lineage.push plugin
105
+ plugin = plugin.parent
106
+ end
107
+ lineage.reverse
108
+ end
109
+
51
110
  end
52
111
  end
@@ -8,27 +8,26 @@ module Naplug
8
8
 
9
9
  class Plugin
10
10
 
11
- attr_reader :block, :plugins, :tag
11
+ attr_reader :block, :plugins, :tag, :meta
12
12
 
13
13
  class DuplicatePlugin < StandardError; end
14
14
 
15
- def initialize(tag, meta = false, block)
15
+ DEFAULT_META = { :debug => false, :enabled => true }
16
+
17
+ def initialize(tag, block, meta = {})
16
18
  @tag = tag
17
19
  @block = block
18
20
  @plugins = Hash.new
19
21
 
20
22
  @_args = Hash.new
21
23
  @_data = OpenStruct.new :status => Status.new, :output => Output.new, :payload => nil, :perfdata => nil
22
- @_meta = OpenStruct.new :status => meta, :enabled => true, :debug => true
24
+ @_meta = OpenStruct.new DEFAULT_META.merge meta
23
25
 
24
26
  begin; instance_eval &block ; rescue => e; nil ; end
25
27
 
26
28
  end
27
29
 
28
- # @param format [Symbol] the format type, `:text` or `:html`
29
- # @return [True, False<String>, nil] the object or objects to
30
- # find in the database. Can be nil.@return [String] the object converted into the expected format.
31
- # # true if this plugin is a metaplugin, false otherwise
30
+ # @return [True, False] true if this plugin is a metaplugin, false otherwise
32
31
  def is_meta?
33
32
  @_meta.status
34
33
  end
@@ -53,6 +52,10 @@ module Naplug
53
52
  not @_meta.enabled
54
53
  end
55
54
 
55
+ def parent
56
+ @_meta.parent
57
+ end
58
+
56
59
  # true when a plugin contains plugs
57
60
  def has_plugins?
58
61
  @plugins.empty? ? false : true
@@ -91,8 +94,8 @@ module Naplug
91
94
  end
92
95
 
93
96
  def perfdata!(label,value,f = {})
94
- @_data.perfdata ||= PerformanceData.new @tag
95
- @_data.perfdata.store label, value, f
97
+ @_data.perfdata ||= PerformanceData.new self
98
+ @_data.perfdata[label] = value, f
96
99
  end
97
100
 
98
101
  def payload
@@ -124,7 +127,7 @@ module Naplug
124
127
  @_args[k] = v
125
128
  end
126
129
 
127
- def to_s
130
+ def to_str
128
131
  '%s: %s' % [status,output]
129
132
  end
130
133
 
@@ -141,7 +144,7 @@ module Naplug
141
144
 
142
145
  def plugin(tag, &block)
143
146
  raise DuplicatePlugin, "duplicate definition of #{tag}" if @plugins.key? tag
144
- @plugins[tag] = Plugin.new tag, block
147
+ @plugins[tag] = Plugin.new tag, block, :parent => self
145
148
  self.define_singleton_method tag do
146
149
  @plugins[tag]
147
150
  end
@@ -1,3 +1,3 @@
1
1
  module Naplug
2
- VERSION = '1.6.1'
3
- end
2
+ VERSION = '1.7.1'
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: naplug
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.7.1
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: 2014-02-24 00:00:00.000000000 Z
12
+ date: 2014-02-26 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'A Ruby library for Nagios plugins '
15
15
  email: gerir@evernote.com
@@ -26,8 +26,6 @@ files:
26
26
  - lib/naplug/version.rb
27
27
  - lib/naplug.rb
28
28
  - examples/almostalwaysok
29
- - examples/alwaysok
30
- - examples/alwaysunknown
31
29
  - examples/dupplugin
32
30
  - examples/exception
33
31
  - examples/exception+
@@ -36,7 +34,11 @@ files:
36
34
  - examples/multiplug
37
35
  - examples/multiplugin
38
36
  - examples/multiplugins
37
+ - examples/o_alwaysok
38
+ - examples/perfdata_multiplug
39
+ - examples/perfdata_uniplug
39
40
  - examples/status
41
+ - examples/u_alwaysunknown
40
42
  - LICENSE
41
43
  - README.md
42
44
  homepage: https://github.com/gerirgaudi/naplug
@@ -65,3 +67,4 @@ signing_key:
65
67
  specification_version: 3
66
68
  summary: A Ruby library for Nagios plugins
67
69
  test_files: []
70
+ has_rdoc: