greenhat 0.3.3 → 0.4.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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/bin/greenhat +1 -4
  3. data/lib/greenhat/accessors/disk.rb +42 -3
  4. data/lib/greenhat/accessors/gitlab.rb +30 -1
  5. data/lib/greenhat/accessors/memory.rb +1 -1
  6. data/lib/greenhat/archive.rb +19 -8
  7. data/lib/greenhat/cli.rb +24 -126
  8. data/lib/greenhat/entrypoint.rb +170 -0
  9. data/lib/greenhat/host.rb +25 -37
  10. data/lib/greenhat/settings.rb +6 -0
  11. data/lib/greenhat/shell/args.rb +22 -9
  12. data/lib/greenhat/shell/faststats.rb +23 -3
  13. data/lib/greenhat/shell/field_helper.rb +1 -1
  14. data/lib/greenhat/shell/filter_help.rb +232 -9
  15. data/lib/greenhat/shell/log.rb +153 -9
  16. data/lib/greenhat/shell/markdown.rb +352 -0
  17. data/lib/greenhat/shell/old_search_helper.rb +54 -0
  18. data/lib/greenhat/shell/page.rb +1 -1
  19. data/lib/greenhat/shell/pipe.rb +31 -0
  20. data/lib/greenhat/shell/platform.rb +28 -0
  21. data/lib/greenhat/shell/report.rb +106 -25
  22. data/lib/greenhat/shell/shell_helper.rb +115 -106
  23. data/lib/greenhat/shell.rb +10 -3
  24. data/lib/greenhat/thing/file_types.rb +136 -8
  25. data/lib/greenhat/thing/formatters/json.rb +4 -0
  26. data/lib/greenhat/thing/formatters/kube_json.rb +36 -0
  27. data/lib/greenhat/thing/formatters/kube_nginx.rb +48 -0
  28. data/lib/greenhat/thing/formatters/kube_webservice.rb +51 -0
  29. data/lib/greenhat/thing/formatters/nginx.rb +6 -2
  30. data/lib/greenhat/thing/formatters/registry.rb +47 -0
  31. data/lib/greenhat/thing/formatters/time_space.rb +0 -16
  32. data/lib/greenhat/thing/helpers.rb +12 -0
  33. data/lib/greenhat/thing/kind.rb +5 -0
  34. data/lib/greenhat/thing.rb +11 -0
  35. data/lib/greenhat/version.rb +1 -1
  36. data/lib/greenhat/views/api.slim +55 -0
  37. data/lib/greenhat/views/chart.slim +42 -0
  38. data/lib/greenhat/views/chart_template.slim +31 -0
  39. data/lib/greenhat/views/chartkick.js +21 -0
  40. data/lib/greenhat/views/css.slim +47 -0
  41. data/lib/greenhat/views/gitaly.slim +53 -0
  42. data/lib/greenhat/views/headers.slim +16 -0
  43. data/lib/greenhat/views/index-old.slim +51 -0
  44. data/lib/greenhat/views/index.slim +14 -14
  45. data/lib/greenhat/views/info.slim +17 -18
  46. data/lib/greenhat/views/production.slim +55 -0
  47. data/lib/greenhat/views/sidekiq.slim +55 -0
  48. data/lib/greenhat/views/time.slim +63 -0
  49. data/lib/greenhat/views/workhorse.slim +16 -0
  50. data/lib/greenhat/web/api.rb +94 -0
  51. data/lib/greenhat/web/chartkick_shim.rb +14 -0
  52. data/lib/greenhat/web/faststats.rb +44 -0
  53. data/lib/greenhat/web/gitaly.rb +65 -0
  54. data/lib/greenhat/web/helpers.rb +198 -0
  55. data/lib/greenhat/web/production.rb +104 -0
  56. data/lib/greenhat/web/sidekiq.rb +73 -0
  57. data/lib/greenhat/web/stats_helpers.rb +74 -0
  58. data/lib/greenhat/web/time.rb +36 -0
  59. data/lib/greenhat/web/workhorse.rb +43 -0
  60. data/lib/greenhat/web.rb +63 -19
  61. data/lib/greenhat.rb +2 -0
  62. metadata +78 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac7b0e70e5a13dc6f8f88a4f12fec812e38e7d838537abe83b7d4dc2e8b43663
4
- data.tar.gz: 84246bc31bd38af74e9f4f8d95f2f7ffa1ca33978dc0d0862ec0b50eaff20196
3
+ metadata.gz: 4205de8b256423c08291a212511d4d6ecd613d21f232d0d6b4641881779f1303
4
+ data.tar.gz: 695ce3fb852d8a3167b853b3b8c07448f031305e51072f34e7afb3aed75ca50e
5
5
  SHA512:
6
- metadata.gz: ba104ea8d7b4e52babf8bdf27ea4f3dbdb9e92820589881bab639a01e8558c355389a0f10b3c17dbe5c7ac881f10364ad06ec0c973934f06d735f948bb57fbd3
7
- data.tar.gz: a2013229826758ca61335f5cf8d58c3a4a4206e656dce084f90781c264e4930c5c3fd09b7475a43dd31819bc2562e85e5799de775cc5db9dfaa3f73c0228ac3a
6
+ metadata.gz: 6d4653882946a783ddc0e11094205e42b33338afe53334cc9774956047a1b00eb54bca964925efbed47ca4c410e5007d6e5ac79f10376274b50beb1ffaedc8f0
7
+ data.tar.gz: c2002b0458b334799e4b04a446a9ca0193091f264e7077b9eac84c310423e6c0547d79094da45fa5fa9ce475d110756952602d3274b34f97b4162e7ee4226871
data/bin/greenhat CHANGED
@@ -2,11 +2,8 @@
2
2
 
3
3
  require 'greenhat'
4
4
 
5
- # DEV ONLY
6
- require 'pry'
7
-
8
5
  Dir.mktmpdir('greenhat-sauce') do |tmp|
9
6
  $TMP = tmp
10
7
  $STDOUT_CLONE = $stdout.clone
11
- GreenHat::Cli.start ARGV
8
+ GreenHat::Entrypoint.start ARGV
12
9
  end
@@ -30,7 +30,6 @@ module GreenHat
30
30
  end
31
31
 
32
32
  # Unified Output Handler
33
- # rubocop:disable Metrics/MethodLength
34
33
  def self.format_output(file, name = false, limit = nil, filter = %w[tmpfs loop])
35
34
  output = []
36
35
 
@@ -62,7 +61,7 @@ module GreenHat
62
61
  disk.use.rjust(5).ljust(5).pastel(:green),
63
62
  ' ['.pastel(:blue),
64
63
  ('=' * (disk.use.to_i / 2)).pastel(:green),
65
- ' ' * (50 - disk.use.to_i / 2),
64
+ ' ' * (50 - (disk.use.to_i / 2)),
66
65
  ']'.pastel(:blue)
67
66
  ].join
68
67
 
@@ -78,6 +77,46 @@ module GreenHat
78
77
 
79
78
  output
80
79
  end
81
- # rubocop:enable Metrics/MethodLength
80
+
81
+ # Unified Output Handler
82
+ def self.markdown_format(file, name = false, limit = nil, filter = %w[tmpfs loop])
83
+ output = []
84
+
85
+ output << file.friendly_name if name
86
+
87
+ # Reject TMPFS
88
+ disks = file.data.sort_by { |x| x.use.to_i }.reverse
89
+
90
+ # Filter
91
+ disks.reject! { |x| filter.any? { |y| x.filesystem.include? y } }
92
+
93
+ disks = disks[0..limit - 1] if limit
94
+
95
+ pad_mount, pad_size, pad_used, pad_avail = GreenHat::Disk.padding(disks)
96
+
97
+ # Headers
98
+ output << [
99
+ 'Mount'.ljust(pad_mount),
100
+ 'Size'.ljust(pad_size),
101
+ 'Used'.ljust(pad_used),
102
+ 'Avail'.ljust(pad_avail),
103
+ '% Use'.ljust(pad_avail)
104
+ ].join
105
+
106
+ # Table Summary
107
+ disks.map do |disk|
108
+ # Whole Thing
109
+ output << [
110
+ disk.mounted_on.ljust(pad_mount),
111
+ disk[:size].to_s.ljust(pad_size),
112
+ disk.used.to_s.ljust(pad_used),
113
+ disk.avail.to_s.ljust(pad_avail),
114
+ disk.use.rjust(5).ljust(5)
115
+ ].join
116
+ end
117
+
118
+ output
119
+ end
120
+ # =
82
121
  end
83
122
  end
@@ -35,6 +35,7 @@ module GreenHat
35
35
  end
36
36
 
37
37
  # Show GitLab Services in a grid / include versions
38
+ # rubocop:disable Metrics/PerceivedComplexity
38
39
  def self.services(archive, indent = 0)
39
40
  manifest = archive.things.find { |x| x.type == 'gitlab/version-manifest.json' }
40
41
  gitlab_status = archive.things.find { |x| x.name == 'gitlab_status' }
@@ -43,6 +44,7 @@ module GreenHat
43
44
 
44
45
  list = gitlab_status.data.keys.sort.map do |service|
45
46
  color = gitlab_status.data.dig(service, 0, :status) == 'run' ? :green : :red
47
+ status = gitlab_status.data.dig(service, 0, :status) == 'run' ? '↑' : '↓'
46
48
 
47
49
  # Collect Service version from manifest
48
50
  version = manifest.data.software[service.to_sym]&.display_version
@@ -50,7 +52,7 @@ module GreenHat
50
52
  # If able to identify version use / fallback
51
53
  if version
52
54
  [
53
- service.pastel(color),
55
+ "#{service}#{status}".pastel(color),
54
56
  "(#{version})".pastel(:bright_black)
55
57
  ].join(' ')
56
58
  else
@@ -71,5 +73,32 @@ module GreenHat
71
73
 
72
74
  table.render(:unicode, padding: [0, 1, 0, 1], indent: indent)
73
75
  end
76
+ # rubocop:enable Metrics/PerceivedComplexity
77
+
78
+ def self.services_markdown(archive)
79
+ # manifest = archive.things.find { |x| x.type == 'gitlab/version-manifest.json' }
80
+ gitlab_status = archive.things.find { |x| x.name == 'gitlab_status' }
81
+
82
+ list = gitlab_status.data.keys.sort.map do |service|
83
+ status = gitlab_status.data.dig(service, 0, :status) == 'run' ? '↑' : '↓'
84
+
85
+ "#{service}#{status}"
86
+ end
87
+
88
+ # Keep Alphabetical Sort
89
+ groups = list.each_slice((list.size / 3.to_f).round).to_a
90
+
91
+ table = TTY::Table.new do |t|
92
+ loop do
93
+ break if groups.all?(&:empty?)
94
+
95
+ t << groups.map(&:shift)
96
+ end
97
+ end
98
+
99
+ "```\n#{table.render(:basic)}\n```"
100
+ end
101
+
102
+ # ==
74
103
  end
75
104
  end
@@ -6,7 +6,7 @@ module GreenHat
6
6
  end
7
7
 
8
8
  def self.percentage(used, total)
9
- return 0 if used.to_i.zero?
9
+ return 0 if used.to_i.zero? || total.to_i.zero?
10
10
 
11
11
  # Show at least one bar if below 1%
12
12
  [1, ((used.to_i / total.to_f).round(1) * 100).round].max
@@ -7,7 +7,7 @@ module GreenHat
7
7
  Dir.mkdir path
8
8
 
9
9
  # Initially Copy file into tmpdir
10
- FileUtils.cp(archive_path, "#{path}/")
10
+ FileUtils.cp_r(archive_path.to_s, "#{path}/")
11
11
 
12
12
  # Extract Everything
13
13
  loop do
@@ -28,9 +28,6 @@ module GreenHat
28
28
 
29
29
  archive = Archive.new(name: archive_path, path: path)
30
30
  archive.save
31
- # file = list[2]
32
- # thing = archive.things_create(file: file)
33
- # thing.setup
34
31
 
35
32
  list.each do |file|
36
33
  # Ensure Valid Content
@@ -54,8 +51,13 @@ module GreenHat
54
51
  # Handle Different Types of Archives
55
52
  def self.unpack(archive_path, path)
56
53
  case File.extname archive_path
54
+ when '.tgz'
55
+ base_path = archive_path.gsub(File.basename(archive_path), '')
56
+ `bsdtar -xzf "#{archive_path}" -C #{base_path}`
57
+ FileUtils.rm(archive_path)
57
58
  when '.tar'
58
- `bsdtar -xf "#{archive_path}" -C #{path}`
59
+ base_path = archive_path.gsub(File.basename(archive_path), '')
60
+ `bsdtar -xf "#{archive_path}" -C #{base_path}`
59
61
  FileUtils.rm(archive_path)
60
62
  when '.gz'
61
63
  `gzip -d "#{archive_path}"`
@@ -75,7 +77,7 @@ module GreenHat
75
77
  end
76
78
 
77
79
  def self.archive_types
78
- %w[s gz tar]
80
+ %w[s gz tar tgz]
79
81
  end
80
82
  # -- Archive Loader ----------------------------------------------
81
83
  end
@@ -102,7 +104,16 @@ class Archive < Teron
102
104
  "#<Archive name: '#{name}'>"
103
105
  end
104
106
 
105
- def report
106
- GreenHat::Report.new(self)
107
+ def report(flags)
108
+ GreenHat::Report.new(self, flags)
109
+ end
110
+
111
+ def report_markdown
112
+ GreenHat::ReportMarkdown.new(self)
113
+ end
114
+
115
+ # Helper for finding thing
116
+ def thing?(thing_name = 'gitlab-workhorse/current')
117
+ things.find { |x| x.name == thing_name }
107
118
  end
108
119
  end
data/lib/greenhat/cli.rb CHANGED
@@ -1,8 +1,31 @@
1
1
  # Top level namespace
2
2
  module GreenHat
3
- # CLI Methods
3
+ # CLI Methods / Shell Specific COmmands
4
4
  # rubocop:disable Metrics/ModuleLength
5
5
  module Cli
6
+ # CLI Start
7
+ def self.start
8
+ value ||= '' # Empty Start
9
+
10
+ loop do
11
+ line = reader.read_line(readline_notch, value: value)
12
+ value = '' # Remove Afterwards
13
+
14
+ if reader.breaker
15
+ value = line
16
+ puts ''
17
+ next
18
+ end
19
+
20
+ break if line =~ /^exit/i
21
+
22
+ Settings.cmd_add(line) unless line.blank?
23
+
24
+ process
25
+ run
26
+ end
27
+ end
28
+
6
29
  def self.cursor
7
30
  @cursor = TTY::Cursor
8
31
  end
@@ -348,117 +371,6 @@ module GreenHat
348
371
  @quiet = !@quiet
349
372
  end
350
373
 
351
- def self.cli_help
352
- Shell.version
353
- puts
354
- puts 'Usage'.pastel(:yellow)
355
- puts ' greenhat <sos-archive.tgz> <sos-archive2.tgz> '
356
- puts ' greenhat <sos-archive.tgz> -q --command=df'
357
- puts
358
-
359
- puts 'Options'.pastel(:yellow)
360
- puts ' --report, -r'.pastel(:green)
361
- puts ' Run `report` against archives and exit'
362
- puts
363
-
364
- puts ' --quiet, -r'.pastel(:green)
365
- puts ' Surpress GreenHat logging output'
366
- puts
367
-
368
- puts ' --load, -l'.pastel(:green)
369
- puts ' Automatically attempt to read/parse/preload all included files'
370
- puts
371
-
372
- puts ' --command, -c'.pastel(:green)
373
- puts ' Run and then exit a GreenHat Shell command'
374
- puts
375
-
376
- puts ' --version, -v'.pastel(:green)
377
- puts ' Print version and exit'
378
- puts
379
- end
380
-
381
- # Arguments before general processing
382
- def self.pre_args(flags, files)
383
- # Help
384
- if flags?(%i[help h], flags)
385
- cli_help
386
- exit 0
387
- end
388
-
389
- # Version
390
- if flags?(%i[version v], flags)
391
- Shell.version
392
- exit 0
393
- end
394
-
395
- # Quiet Flag
396
- @quiet = true if flags?(%i[quiet q], flags)
397
-
398
- # rubocop:disable Style/GuardClause
399
- # MIA Files
400
- if files.empty? || files.count { |x| File.exist? x }.zero?
401
- puts "No arguments or files don't exist".pastel(:red)
402
- puts 'Usage: greenhat <sos-archive.tgz> <sos-archive2.tgz>'
403
- cli_help
404
- Shell.version
405
- end
406
- # rubocop:enable Style/GuardClause
407
- end
408
-
409
- # Arguments to be handled after general processing
410
- def self.post_args(flags)
411
- # Run report and exit / Don't Clear for reports
412
- if flags?(%i[report r], flags)
413
- @quiet = true
414
- # Don't Use Pagination
415
- GreenHat::Shell.report(['--raw'])
416
- exit 0
417
- else
418
- clear_screen
419
- end
420
-
421
- # CTL Tails need to be parsed for new 'things'
422
- Thing.where(kind: :gitlab_tail)&.map(&:process)
423
-
424
- Thing.all.each(&:process) if flags?(%i[load l], flags)
425
- end
426
-
427
- # Helper to Simplify checking flags
428
- def self.flags?(list = [], flags = {})
429
- list.any? { |x| flags.key? x }
430
- end
431
-
432
- # If no arguments Supplied Print and quit - rather than nasty exception
433
- def self.start(raw)
434
- Settings.start
435
- files, flags, args = Args.parse(raw)
436
- pre_args(flags, files)
437
- load_files files
438
- run_command(args) if args.any? { |arg| run_command?(arg) }
439
- post_args(flags)
440
-
441
- value ||= '' # Empty Start
442
-
443
- loop do
444
- line = reader.read_line(readline_notch, value: value)
445
- value = '' # Remove Afterwards
446
-
447
- if reader.breaker
448
- value = line
449
- puts ''
450
- next
451
- end
452
-
453
- break if line =~ /^exit/i
454
-
455
- Settings.cmd_add(line) unless line.blank?
456
-
457
- process
458
- run
459
- end
460
- end
461
-
462
374
  def self.run_command?(arg)
463
375
  %i[command c].any? do |x|
464
376
  arg[:field] == x
@@ -478,20 +390,6 @@ module GreenHat
478
390
  exit 0
479
391
  end
480
392
 
481
- def self.load_files(files)
482
- # TODO: Web Helpers?
483
- # suppress_output { GreenHat::Web.start }
484
-
485
- # Don't double up on archives / Only Existing files
486
- puts 'Loading Archives'.pastel(:blue) unless Cli.quiet
487
- files.uniq.each do |file|
488
- next unless File.exist?(file)
489
-
490
- puts "- #{file}".pastel(:magenta) unless Cli.quiet
491
- ArchiveLoader.load file
492
- end
493
- end
494
-
495
393
  def self.suppress_output
496
394
  original_stderr = $stderr.clone
497
395
  original_stdout = $stdout.clone
@@ -0,0 +1,170 @@
1
+ # Top level namespace
2
+ module GreenHat
3
+ # Entrypoint Methods
4
+ # Command Line Args / File Parsing etc
5
+ module Entrypoint
6
+ # If no arguments Supplied Print and quit - rather than nasty exception
7
+ def self.start(raw)
8
+ @clear = true # Reset screen by default
9
+ Settings.start
10
+ files, flags, args = Args.parse(raw)
11
+ pre_args(flags, files)
12
+ load_files files
13
+ Cli.run_command(args) if args.any? { |arg| Cli.run_command?(arg) }
14
+ post_args(flags)
15
+ post_setup(flags)
16
+
17
+ Cli.start # Kick over to CLI
18
+ end
19
+
20
+ # Arguments before general processing
21
+ def self.pre_args(flags, files)
22
+ # Help
23
+ if flags?(%i[help h], flags)
24
+ cli_help
25
+ exit 0
26
+ end
27
+
28
+ # Version
29
+ if flags?(%i[version v], flags)
30
+ Shell.version
31
+ exit 0
32
+ end
33
+
34
+ # Assume Raw Setting
35
+ Settings.settings[:assume_raw] = true if flags?(%i[no-prompt np], flags)
36
+ Settings.settings[:assume_raw] = false if flags?(%i[prompt p], flags)
37
+
38
+ # Quiet Flag
39
+ @quiet = true if flags?(%i[quiet q], flags)
40
+
41
+ if flags?(%i[load-local ll], flags)
42
+ # Hook in loading local
43
+ Shell.load_local(false)
44
+ elsif files.empty? || files.count { |x| File.exist? x }.zero?
45
+ # MIA Files
46
+ puts "No arguments or files don't exist".pastel(:red)
47
+ puts 'Usage: greenhat <sos-archive.tgz> <sos-archive2.tgz>'
48
+ puts 'See `--help`'
49
+
50
+ @clear = false # Don't hide messages
51
+
52
+ Shell.version
53
+ end
54
+ end
55
+
56
+ # Arguments to be handled after general processing
57
+ def self.post_args(flags)
58
+ # Supress Color
59
+ GreenHat::Settings.settings[:color] = false if flags?(%i[no-color n], flags)
60
+
61
+ # Run report and exit / Don't Clear for reports
62
+ if flags?(%i[report r], flags)
63
+ @quiet = true
64
+ # Don't Use Pagination
65
+ GreenHat::Shell.report(['--raw'])
66
+ exit 0
67
+ elsif flags?(%i[full-report f], flags)
68
+ @quiet = true
69
+ # Don't Use Pagination
70
+ GreenHat::Shell.report(['--raw', '--full'])
71
+ exit 0
72
+ elsif flags?(%i[markdown m], flags)
73
+ @quiet = true
74
+ # Don't Use Pagination
75
+ GreenHat::Shell.markdown_report(['--raw'])
76
+ exit 0
77
+ elsif @clear
78
+ Cli.clear_screen
79
+ end
80
+ end
81
+
82
+ def self.post_setup(flags)
83
+ # CTL Tails need to be parsed for new 'things'
84
+ Thing.where(kind: :gitlab_tail)&.map(&:process)
85
+ Thing.where(kind: :kube_webservice)&.map(&:process)
86
+
87
+ Thing.all.each(&:process) if flags?(%i[load l], flags)
88
+
89
+ Shell.web if flags?(%i[web w], flags)
90
+ end
91
+
92
+ # Helper to Simplify checking flags
93
+ def self.flags?(list = [], flags = {})
94
+ list.any? { |x| flags.key? x }
95
+ end
96
+
97
+ def self.load_files(files)
98
+ # Don't double up on archives / Only Existing files
99
+ puts 'Loading Archives'.pastel(:blue) unless Cli.quiet
100
+ files.uniq.each do |file|
101
+ next unless File.exist?(file)
102
+
103
+ puts "- #{file}".pastel(:magenta) unless Cli.quiet
104
+ ArchiveLoader.load file
105
+ end
106
+ end
107
+
108
+ # rubocop:disable Metrics/MethodLength
109
+ def self.cli_help
110
+ Shell.version
111
+ puts
112
+ puts 'Usage'.pastel(:yellow)
113
+ puts ' greenhat <sos-archive.tgz> <sos-archive2.tgz> '
114
+ puts ' greenhat <sos-archive.tgz> -q --command=df'
115
+ puts
116
+
117
+ puts 'Options'.pastel(:yellow)
118
+ puts ' --report, -r'.pastel(:green)
119
+ puts ' Run `report` against archives and exit'
120
+ puts
121
+
122
+ puts ' --full-report, -f'.pastel(:green)
123
+ puts ' Run `report` with all details. e.g. include fast-stats top/errors'
124
+ puts
125
+
126
+ puts ' --markdown, -m'.pastel(:green)
127
+ puts ' Run `markdown_report` against archives and exit'
128
+ puts
129
+
130
+ puts ' --quiet, -r'.pastel(:green)
131
+ puts ' Surpress GreenHat logging output'
132
+ puts
133
+
134
+ puts ' --load, -l'.pastel(:green)
135
+ puts ' Automatically attempt to read/parse/preload all included files'
136
+ puts
137
+
138
+ puts ' --load-local, -ll'.pastel(:green)
139
+ puts ' Load log files from locations on an Omnibus install'
140
+ puts
141
+
142
+ puts ' --prompt, -p'.pastel(:green)
143
+ puts ' Override settings / Assume Prompt'
144
+ puts
145
+
146
+ puts ' --no-prompt, -np'.pastel(:green)
147
+ puts ' Do not prompt for file types / Assume Raw or JSON'
148
+ puts
149
+
150
+ puts ' --command, -c'.pastel(:green)
151
+ puts ' Run and then exit a GreenHat Shell command'
152
+ puts
153
+
154
+ puts ' --web, -w'.pastel(:green)
155
+ puts ' Start Sinatra Webservice on load (4567)'
156
+ puts
157
+
158
+ puts ' --no-color, -n'.pastel(:green)
159
+ puts ' Disable color output'
160
+ puts
161
+
162
+ puts ' --version, -v'.pastel(:green)
163
+ puts ' Print version and exit'
164
+ puts
165
+ end
166
+ # rubocop:enable Metrics/MethodLength
167
+
168
+ # ==========================================================
169
+ end
170
+ end