noms-client 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eefbee8038f40b86639c9e2c5d48fce572ae0a47
4
- data.tar.gz: 544f15add64ac39f124378f3494f4088cdfde7ef
3
+ metadata.gz: 9e24aa514edf837a8d6d263ffe707e86aefcc76f
4
+ data.tar.gz: 09e54474d3b41a4a257fa1cf98a248ad16b66cd5
5
5
  SHA512:
6
- metadata.gz: 39a017624eb96f65a3775eca26d4a78633eccf6a2367ed99b230f2a337e6908ad4de01fe52c868213f44c9ad97c7f91fe86c43a20ececa61f2c8db228189f026
7
- data.tar.gz: 955a6fbb43bc3d79e8cab1f30b38521120060f8c7599b7e4385beb878af9aa622e5467029f4457671e7270a7f65ee61478632309837bdff47c9e1cebe97b2c17
6
+ metadata.gz: c6707f63d16653725c7d9e00be5421e282db4a7195a932bd793643021f70ef8da14a04d698bcd940c1fc41ffa3d11613ec24180bb54b59e357ccb9970fb7bc1e
7
+ data.tar.gz: 35bf1ffa2984e3f338927060d46f1021b8c2b21b09d8656f70cd965468c920800aaf4752995cc3435f9cc7679767781d3f224a1cd32aac131946042e3c0f523f
data/TODO CHANGED
@@ -6,3 +6,7 @@
6
6
  * Complex requests for NCC API
7
7
  * Factor almost all of CLI into interface library (in particular,
8
8
  waitfor)
9
+
10
+ * need a way for the docs/help/usage to be additive from library.
11
+ i.e. library has new functions, docs/help/usage for how to use
12
+ them, should be displayed in noms --help
data/bin/noms CHANGED
@@ -59,6 +59,12 @@
59
59
  # cloud name - Describe named cloud
60
60
  # ncc - Describe NCC API endpoint
61
61
  # cmdb - Describe system fields
62
+ # nagios subcommand
63
+ # show type name - Show information for named type [hostgroup,host,service]
64
+ # detail host - Show object detail for named host
65
+ # query type [condition [...]] - Query for object by type [hostgroup,host,service]
66
+ # check <host> [<service>] - Run service check for host (or host check) synchronously
67
+ #
62
68
  # Options:
63
69
  # --names - Just print entity names, equivalent to
64
70
  # --fields name --noheader --nofeedback --nolabel
@@ -180,6 +186,7 @@ require 'csv'
180
186
  require 'noms/client/version'
181
187
  require 'ncc/client'
182
188
  require 'noms/cmdb'
189
+ require 'noms/nagui'
183
190
 
184
191
  $VERSION = NOMS::Client::VERSION
185
192
  $me = 'noms'
@@ -189,6 +196,8 @@ $opt = Optconfig.new('noms', {
189
196
  'url' => 'http://noms/ncc_api/v2' },
190
197
  'cmdb=s%' => {
191
198
  'url' => 'http://cmdb/cmdb_api/v1' },
199
+ 'nagui=s%' => {
200
+ 'url' => 'http://nagios/nagui/nagios_live.cgi' },
192
201
  'fields=s' => '',
193
202
  'mock=s' => nil,
194
203
  'format=s' => 'text',
@@ -201,6 +210,50 @@ $opt = Optconfig.new('noms', {
201
210
  'default-environment' => 'production',
202
211
  'default-cloud' => 'ec2',
203
212
  'format-field=s%' => {
213
+ 'hostgroup' => {
214
+ 'fields' => [
215
+ 'name','num_hosts', 'num_services'
216
+ ],
217
+ 'length' => {
218
+ 'name' => 20,
219
+ 'members' => 36,
220
+ 'num_hosts' => 5,
221
+ 'num_services' => 5
222
+ }
223
+ },
224
+ 'host' => {
225
+ 'fields' => [
226
+ 'name','state', 'plugin_output'
227
+ ],
228
+ 'length' => {
229
+ 'name' => 36,
230
+ 'state' => 5,
231
+ 'plugin_output' => 36
232
+ }
233
+ },
234
+ 'nagcheck' => {
235
+ 'fields' => [
236
+ 'host_name','address','service_description','state', 'plugin_output'
237
+ ],
238
+ 'length' => {
239
+ 'host_name' => 36,
240
+ 'address' => 16,
241
+ 'service_description' => 20,
242
+ 'state' => 5,
243
+ 'plugin_output' => 36
244
+ }
245
+ },
246
+ 'service' => {
247
+ 'fields' => [
248
+ 'host_name','description','state', 'plugin_output'
249
+ ],
250
+ 'length' => {
251
+ 'host_name' => 36,
252
+ 'description' => 20,
253
+ 'state' => 5,
254
+ 'plugin_output' => 36
255
+ }
256
+ },
204
257
  'svcinst' => {
205
258
  'fields' => [
206
259
  'name', 'type', 'note'
@@ -255,6 +308,7 @@ $opt = Optconfig.new('noms', {
255
308
  if $opt['mock']
256
309
  NCC::Client.mock! $opt['mock']
257
310
  NOMS::CMDB.mock! $opt['mock']
311
+ NOMS::Nagui.mock! $opt['mock']
258
312
  end
259
313
 
260
314
  case $opt['format']
@@ -278,6 +332,7 @@ $opt['ncc']['timeout'] ||= $opt['timeout']
278
332
 
279
333
  $cmdb = NOMS::CMDB.new($opt)
280
334
  $ncc = NCC::Client.new($opt)
335
+ $nagui = NOMS::Nagui.new($opt)
281
336
 
282
337
  def parse_format(fields, type)
283
338
  dbg "Specified fields: #{fields.inspect}"
@@ -359,7 +414,7 @@ end
359
414
 
360
415
  def record_formatted_output(object, type='instance', fields=nil)
361
416
  fields = fmt_fields(type, fields)
362
- all_fields = object.keys
417
+ all_fields = object.keys.sort
363
418
  fields = fields & all_fields
364
419
  fieldlist = parse_format($opt['fields'], type) || fields + (all_fields - fields)
365
420
  case $opt['format']
@@ -464,19 +519,111 @@ def cmdb_show(args)
464
519
  fqdn = args.shift
465
520
  system = $cmdb.query('system', 'fqdn=' + fqdn).first
466
521
  record = if ! args.empty?
467
- system.keys.inject({}) do |h, k|
522
+ system.keys.inject({}) do |h, k|
468
523
  if args.include? k
469
524
  h.merge({k => system[k]})
470
525
  else
471
526
  h
472
527
  end
473
528
  end
474
- else
475
- system
476
- end
529
+ else
530
+ system
531
+ end
477
532
  record
478
533
  end
479
534
 
535
+ def nagcheck(args)
536
+ host = args.shift
537
+ if args.empty?
538
+ $nagui.nagcheck_host(host)
539
+ else
540
+ service=args.shift
541
+ $nagui.nagcheck_service(host,service)
542
+ end
543
+ end
544
+
545
+ def nagios(args)
546
+ cmd = args.shift
547
+ case cmd
548
+ when 'query'
549
+ type = args.shift
550
+ if $opt['names']
551
+ if type == 'service'
552
+ $opt['fields'] = ['host_name','description']
553
+ else
554
+ $opt['fields'] = [$nagui.default_query_key(type)] if $opt['names']
555
+ end
556
+ end
557
+ output = $nagui.query(type,args)
558
+ if type == 'hostgroup'
559
+ output.each do |item|
560
+ item.delete('members')
561
+ end
562
+ end
563
+ formatted_output(output, type)
564
+ when 'detail'
565
+ host = args.shift
566
+ record_formatted_output($nagui.host(host), 'host')
567
+ when 'show'
568
+ type = args.shift
569
+ key = args.shift
570
+ $opt['feedback'] = false
571
+ case type
572
+ when 'host'
573
+ output = $nagui.host(key)
574
+ dbg("show host: #{output.inspect}")
575
+ if output != nil
576
+ data = [{
577
+ 'host_name' => output['name'],
578
+ 'description' => '',
579
+ 'state' => output['state'],
580
+ 'plugin_output' => output['plugin_output']
581
+ }]
582
+ output['services_with_info'].each do |svc|
583
+ data << {
584
+ 'host_name' => '',
585
+ 'description' => svc[0],
586
+ 'state' => svc[1],
587
+ 'plugin_output' => svc[3]
588
+ }
589
+ end
590
+ formatted_output(data,'service')
591
+ end
592
+ when 'hostgroup'
593
+ output = $nagui.hostgroup(key)
594
+ dbg("show hostgroup: #{output.inspect}")
595
+ if output != nil
596
+ data = [{
597
+ 'name' => output['name'],
598
+ 'members' => "#{output['num_hosts']} hosts #{output['num_services']} services",
599
+ 'num_hosts' => output['num_hosts'],
600
+ 'num_services' => output['num_services']
601
+ }]
602
+ output['members_with_state'].each do |host|
603
+ data << {
604
+ 'members' => host[0],
605
+ 'state' => host[1]
606
+ }
607
+ end
608
+ formatted_output(data,type,['name','members','state'])
609
+ end
610
+
611
+ when 'service'
612
+ service = args.shift
613
+ output = $nagui.service(key,service)
614
+ dbg("show service: #{output.inspect}")
615
+ record_formatted_output(output,type)
616
+ else
617
+ data = nil
618
+ end
619
+ when 'check'
620
+ record_formatted_output(nagcheck(args),'nagcheck')
621
+ else
622
+ $stderr.puts "Unknown nagios command '#{cmd}'"
623
+ Process.exit(2)
624
+ end
625
+ end
626
+
480
627
  def cmdb(args)
481
628
  $opt['fields'] = ['fqdn'] if $opt['names']
482
629
  cmd = args.shift
@@ -686,10 +833,12 @@ def dispatch_command(argv)
686
833
  outs svcinst argv
687
834
  when 'environment', 'env'
688
835
  outs env argv
689
- when 'instance'
836
+ when 'instance', 'inst'
690
837
  outs instance argv
691
838
  when 'waitfor'
692
839
  waitfor argv
840
+ when 'nagios', 'nag'
841
+ outs nagios argv
693
842
  when nil
694
843
  $stderr.puts "Usage:\n noms --help\n noms {desc|cmdb|instance|waitfor|...} [arg]"
695
844
  Process.exit(1)
@@ -3,5 +3,5 @@ class NOMS
3
3
  end
4
4
 
5
5
  class NOMS::Client
6
- VERSION = '1.9.0'
6
+ VERSION = '1.10.0'
7
7
  end
data/lib/noms/cmdb.rb CHANGED
@@ -100,6 +100,7 @@ class NOMS::CMDB < NOMS::HttpClient
100
100
  end
101
101
 
102
102
  # CMDB API bug means use this endpoint to create
103
+ # TODO needs update as this bug is no longer present
103
104
  def create_service(env, service, attrs)
104
105
  attrs[:name] = service
105
106
  attrs[:environment_name] = env
data/lib/noms/nagui.rb CHANGED
@@ -23,28 +23,110 @@ class NOMS
23
23
  end
24
24
 
25
25
  class NOMS::Nagui < NOMS::HttpClient
26
+
27
+ @@validtypes =['hosts','services','hostgroups','servicegroups','contacts','commands',
28
+ 'downtimes','timeperiods','status','contactgroups']
29
+
26
30
  def dbg(msg)
27
31
  if @opt.has_key? 'debug' and @opt['debug'] > 2
28
32
  puts "DBG(#{self.class}): #{msg}"
29
33
  end
30
34
  end
31
- def initialize(opt)
32
- @opt = opt
33
- self.dbg "Initialized with options: #{opt.inspect}"
34
- end
35
+
36
+ # def initialize(opt)
37
+ # @opt = opt
38
+ # self.dbg "Initialized with options: #{opt.inspect}"
39
+ # end
35
40
 
36
41
  def config_key
37
42
  'nagui'
38
43
  end
39
44
 
40
- def system(hostname)
41
- results = do_request(:GET => '/nagui/nagios_live.cgi', :query => URI.encode("query=GET hosts|Filter: name ~~ #{hostname}"))
45
+ def make_plural(str)
46
+ "#{str}s"
47
+ end
48
+
49
+ def default_query_key(type)
50
+ case type
51
+ when 'host'
52
+ 'name'
53
+ when 'service'
54
+ 'description'
55
+ when 'hostgroup'
56
+ 'name'
57
+ end
58
+ end
59
+
60
+ def make_lql(type,queries)
61
+ if !queries.kind_of?(Array)
62
+ queries=[queries]
63
+ end
64
+ lql='GET '
65
+ lql << make_plural(type)
66
+ queries.each do |q|
67
+ query = /(\w+)([!~>=<]+)(.*)/.match(q)
68
+ if query == nil
69
+ lql << "|Filter: #{default_query_key(type)} ~~ #{q}"
70
+ else
71
+ lql << "|Filter: #{query[1]} #{query[2]} #{query[3]}"
72
+ end
73
+ end
74
+ lql
75
+ end
76
+
77
+ def query(type,queries)
78
+ unless @@validtypes.include? make_plural(type)
79
+ puts "#{type} is not a valid type"
80
+ Process.exit(1)
81
+ end
82
+ query_string = make_lql(type,queries)
83
+ results = do_request(:GET => '/nagui/nagios_live.cgi', :query => URI.encode("query=#{query_string}"))
84
+ end
85
+ def hostgroup(name)
86
+ results = do_request(:GET => '/nagui/nagios_live.cgi', :query => URI.encode("query=GET hostgroups|Filter: name = #{name}"))
87
+ if results.kind_of?(Array) && results.length > 0
88
+ results[0]
89
+ else
90
+ nil
91
+ end
92
+ end
93
+ def service(host,description)
94
+ results = do_request(:GET => '/nagui/nagios_live.cgi', :query => URI.encode("query=GET services|Filter: host_name = #{host}|Filter: description = #{description}"))
95
+ if results.kind_of?(Array) && results.length > 0
96
+ results[0]
97
+ else
98
+ nil
99
+ end
100
+ end
101
+ def servicegroup(name)
102
+ results = do_request(:GET => '/nagui/nagios_live.cgi', :query => URI.encode("query=GET hosts|Filter: name = #{name}"))
103
+ if results.kind_of?(Array) && results.length > 0
104
+ results[0]
105
+ else
106
+ nil
107
+ end
108
+ end
109
+ def host(hostname)
110
+ results = do_request(:GET => '/nagui/nagios_live.cgi', :query => URI.encode("query=GET hosts|Filter: name = #{hostname}"))
42
111
  if results.kind_of?(Array) && results.length > 0
43
112
  results[0]
44
113
  else
45
114
  nil
46
115
  end
47
116
  end
117
+
118
+ def nagcheck_host(host)
119
+ url = "/nagcheck/host/#{host}"
120
+ dbg("nagcheck url= #{url}")
121
+ nagcheck=do_request(:GET => url, :query => "report=true")
122
+ end
123
+
124
+ def nagcheck_service(host,service)
125
+ url = "/nagcheck/service/#{host}/#{service}"
126
+ dbg("nagcheck url= #{url}")
127
+ nagcheck=do_request(:GET => url, :query => "report=true")
128
+ end
129
+
48
130
  def check_host_online(host)
49
131
  @opt['host_up_command'] = 'check-host-alive' unless @opt.has_key?('host_up_command')
50
132
  nagcheck=do_request(:GET => "/nagcheck/command/#{host}/#{@opt['host_up_command']}")
@@ -54,4 +136,5 @@ class NOMS::Nagui < NOMS::HttpClient
54
136
  false
55
137
  end
56
138
  end
139
+
57
140
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noms-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Brinkley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-27 00:00:00.000000000 Z
11
+ date: 2015-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler