greenhat 0.3.4 → 0.5.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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/bin/greenhat +2 -6
  3. data/lib/greenhat/accessors/disk.rb +1 -3
  4. data/lib/greenhat/accessors/gitlab.rb +7 -2
  5. data/lib/greenhat/accessors/memory.rb +1 -1
  6. data/lib/greenhat/archive.rb +19 -8
  7. data/lib/greenhat/cli.rb +35 -135
  8. data/lib/greenhat/entrypoint.rb +170 -0
  9. data/lib/greenhat/host.rb +25 -37
  10. data/lib/greenhat/settings.rb +33 -5
  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 +217 -162
  15. data/lib/greenhat/shell/gitlab.rb +1 -0
  16. data/lib/greenhat/shell/log.rb +150 -25
  17. data/lib/greenhat/shell/markdown.rb +21 -25
  18. data/lib/greenhat/shell/old_search_helper.rb +54 -0
  19. data/lib/greenhat/shell/page.rb +1 -1
  20. data/lib/greenhat/shell/pipe.rb +31 -0
  21. data/lib/greenhat/shell/platform.rb +28 -0
  22. data/lib/greenhat/shell/query.rb +378 -0
  23. data/lib/greenhat/shell/report.rb +76 -24
  24. data/lib/greenhat/shell/shell_helper.rb +42 -393
  25. data/lib/greenhat/shell.rb +19 -4
  26. data/lib/greenhat/thing/file_types.rb +51 -1
  27. data/lib/greenhat/thing/formatters/api_json.rb +4 -2
  28. data/lib/greenhat/thing/formatters/bracket_log.rb +1 -1
  29. data/lib/greenhat/thing/formatters/colon_split_strip.rb +2 -2
  30. data/lib/greenhat/thing/formatters/dotenv.rb +1 -1
  31. data/lib/greenhat/thing/formatters/format.rb +0 -11
  32. data/lib/greenhat/thing/formatters/free_m.rb +2 -2
  33. data/lib/greenhat/thing/formatters/json.rb +43 -15
  34. data/lib/greenhat/thing/formatters/json_shellwords.rb +3 -2
  35. data/lib/greenhat/thing/formatters/kube_json.rb +3 -2
  36. data/lib/greenhat/thing/formatters/multiline_json.rb +1 -1
  37. data/lib/greenhat/thing/formatters/nginx.rb +11 -3
  38. data/lib/greenhat/thing/formatters/table.rb +3 -3
  39. data/lib/greenhat/thing/formatters/time_space.rb +0 -16
  40. data/lib/greenhat/thing/helpers.rb +12 -11
  41. data/lib/greenhat/thing/info_format.rb +4 -4
  42. data/lib/greenhat/thing/kind.rb +5 -0
  43. data/lib/greenhat/thing/super_log.rb +0 -101
  44. data/lib/greenhat/thing.rb +31 -25
  45. data/lib/greenhat/version.rb +1 -1
  46. data/lib/greenhat/views/api.slim +55 -0
  47. data/lib/greenhat/views/chart.slim +42 -0
  48. data/lib/greenhat/views/chart_template.slim +31 -0
  49. data/lib/greenhat/views/chartkick.js +21 -0
  50. data/lib/greenhat/views/css.slim +47 -0
  51. data/lib/greenhat/views/gitaly.slim +53 -0
  52. data/lib/greenhat/views/headers.slim +16 -0
  53. data/lib/greenhat/views/index-old.slim +51 -0
  54. data/lib/greenhat/views/index.slim +14 -14
  55. data/lib/greenhat/views/info.slim +17 -18
  56. data/lib/greenhat/views/production.slim +55 -0
  57. data/lib/greenhat/views/sidekiq.slim +55 -0
  58. data/lib/greenhat/views/time.slim +63 -0
  59. data/lib/greenhat/views/workhorse.slim +16 -0
  60. data/lib/greenhat/web/api.rb +94 -0
  61. data/lib/greenhat/web/chartkick_shim.rb +14 -0
  62. data/lib/greenhat/web/faststats.rb +44 -0
  63. data/lib/greenhat/web/gitaly.rb +65 -0
  64. data/lib/greenhat/web/helpers.rb +198 -0
  65. data/lib/greenhat/web/production.rb +104 -0
  66. data/lib/greenhat/web/sidekiq.rb +73 -0
  67. data/lib/greenhat/web/stats_helpers.rb +74 -0
  68. data/lib/greenhat/web/time.rb +36 -0
  69. data/lib/greenhat/web/workhorse.rb +43 -0
  70. data/lib/greenhat/web.rb +63 -19
  71. data/lib/greenhat.rb +2 -0
  72. metadata +74 -5
data/lib/greenhat/host.rb CHANGED
@@ -14,17 +14,23 @@ class Host < Teron
14
14
  # end
15
15
 
16
16
  def archive_name
17
- File.basename archive
17
+ archive.friendly_name
18
18
  end
19
19
 
20
20
  def find_file(file_name)
21
21
  files.find { |x| x.name == file_name }
22
22
  end
23
23
 
24
- def icon
25
- release_file = find_file files.map(&:name).grep(/_release/).first
24
+ def things
25
+ archive.things
26
+ end
26
27
 
27
- release = release_file.raw.join
28
+ def find_thing(param)
29
+ things.find { |x| x.name.include? param }
30
+ end
31
+
32
+ def icon
33
+ release = find_thing('etc/os-release').data['ID_LIKE']
28
34
 
29
35
  if release.include? 'ubuntu'
30
36
  'fa-ubuntu'
@@ -57,41 +63,36 @@ class Host < Teron
57
63
  end
58
64
  # ---------------------------
59
65
 
60
- def manifest
61
- file = find_file 'gitlab_version_manifest_json'
66
+ def gitlab_version
67
+ file = find_thing 'gitlab/version-manifest.json'
62
68
  return nil unless file
63
69
 
64
- Oj.load file.raw.join
70
+ file.data.build_version
65
71
  end
66
72
 
67
73
  def uptime
68
- file = find_file 'uptime'
74
+ file = find_thing 'uptime'
69
75
  return nil unless file
70
76
 
71
77
  file.raw
72
78
  end
73
79
 
74
80
  def uname
75
- file = find_file 'uname'
81
+ file = find_thing 'uname'
76
82
  return nil unless file
77
83
 
78
84
  file.raw.join
79
85
  end
80
86
 
81
87
  def cpuinfo
82
- file = find_file 'cpuinfo'
88
+ file = find_thing 'lscpu'
83
89
  return nil unless file
84
90
 
85
- file.raw.join("\n").split("\n\n").map do |cpu|
86
- all = cpu.split("\n").map do |row|
87
- row.delete("\t").split(': ')
88
- end
89
- { details: all[1..], order: all[0].last }
90
- end
91
+ file.data
91
92
  end
92
93
 
93
94
  def cpu_speed
94
- file = find_file 'lscpu'
95
+ file = find_thing 'lscpu'
95
96
  return nil unless file
96
97
 
97
98
  details = file.raw.find { |x| x.include? 'MHz' }
@@ -99,7 +100,7 @@ class Host < Teron
99
100
  end
100
101
 
101
102
  def total_memory
102
- file = find_file 'free_m'
103
+ file = find_thing 'free_m'
103
104
  return nil unless file
104
105
 
105
106
  value = file.raw.dig(1, 1).to_i
@@ -107,28 +108,28 @@ class Host < Teron
107
108
  end
108
109
 
109
110
  def free_m
110
- file = find_file 'free_m'
111
+ file = find_thing 'free_m'
111
112
  return nil unless file
112
113
 
113
114
  file.raw
114
115
  end
115
116
 
116
117
  def df_h
117
- file = find_file 'df_h'
118
+ file = find_thing 'df_h'
118
119
  return nil unless file
119
120
 
120
121
  file.raw
121
122
  end
122
123
 
123
124
  def netstat
124
- file = find_file 'netstat'
125
+ file = find_thing 'netstat'
125
126
  return nil unless file
126
127
 
127
128
  file.raw
128
129
  end
129
130
 
130
131
  def ulimit
131
- file = find_file 'ulimit'
132
+ file = find_thing 'ulimit'
132
133
  return nil unless file
133
134
 
134
135
  results = file.raw.map do |entry|
@@ -142,7 +143,7 @@ class Host < Teron
142
143
  end
143
144
 
144
145
  def processes
145
- file = find_file 'ps'
146
+ file = find_thing 'ps'
146
147
  return nil unless file
147
148
 
148
149
  headers = file.raw.first.split(' ', 11)
@@ -155,7 +156,7 @@ class Host < Teron
155
156
  end
156
157
 
157
158
  def systemctl_unit_files
158
- file = find_file 'systemctl_unit_files'
159
+ file = find_thing 'systemctl_unit_files'
159
160
  return nil unless file
160
161
 
161
162
  all = file.raw[1..-2].map do |x|
@@ -167,16 +168,3 @@ class Host < Teron
167
168
  all.sort_by(&:unit)
168
169
  end
169
170
  end
170
-
171
- # # Slim Wrapper
172
- # class List
173
- # attr_accessor :hosts
174
-
175
- # def initialize
176
- # self.hosts = []
177
- # end
178
-
179
- # def slim(file, host = nil)
180
- # Slim::Template.new("#{__dir__}/views/#{file}.slim").render(host)
181
- # end
182
- # end
@@ -3,22 +3,50 @@ module GreenHat
3
3
  # Helper for all things user environment / settings / history
4
4
  module Settings
5
5
  def self.settings
6
+ # round: [2],
7
+ # page: [:true] Automatic,
6
8
  @settings ||= {
7
- history: [],
8
9
  assume_json: true,
9
10
  fuzzy_file_match: true,
10
-
11
- # round: [2],
12
- # page: [:true] Automatic,
13
- truncate: TTY::Screen.width * 4,
11
+ assume_raw: false,
12
+ truncate: TTY::Screen.width * 4, # Dynamic Setting
14
13
  color: true
15
14
  }
16
15
  end
17
16
 
17
+ def self.configure_choices
18
+ [
19
+
20
+ { name: 'Assume JSON - auto injest json', value: :assume_json },
21
+ { name: 'Assume Raw - do not attempt unknown parsing', value: :assume_raw },
22
+ { name: 'Fuzzy File Match - all partial matching', value: :fuzzy_file_match },
23
+ { name: 'Color Output', value: :color }
24
+ ]
25
+ end
26
+
27
+ def self.configure_settings
28
+ puts 'Current Settings'.pastel(:green)
29
+ ap @settings.except(:truncate)
30
+ puts
31
+
32
+ prompt = TTY::Prompt.new
33
+ choice = prompt.select('Change Which Setting?', configure_choices, filter: true)
34
+
35
+ setting = configure_choices.find { |x| x.value == choice }
36
+ value = prompt.yes?("#{setting[:name]} (Y/n)")
37
+ @settings[choice] = value
38
+
39
+ File.write(settings_file, Oj.dump(@settings.except(:truncate)))
40
+ end
41
+
18
42
  def self.assume_json?
19
43
  settings.assume_json
20
44
  end
21
45
 
46
+ def self.assume_raw?
47
+ settings.assume_raw
48
+ end
49
+
22
50
  # Allow for future disabling of color output
23
51
  def self.color?
24
52
  settings.color
@@ -1,12 +1,5 @@
1
1
  module GreenHat
2
2
  # Module for Argument Parsing
3
- # Possible Args
4
- # --value=thing
5
- # --value / Default => --value=thing
6
- # --flag
7
- # --slice=value,value2
8
- # files
9
-
10
3
  # Variable Breakdown
11
4
  # Args:Array supplied or default values for entry looping action
12
5
  # Flags:Hash Key/Value filter Actionables
@@ -15,7 +8,14 @@ module GreenHat
15
8
  def self.parse(raw, skip_flags = [])
16
9
  # Don't affect original object / Better deep clone?
17
10
  cmd = raw.clone
18
- # cmd = Marshal.load(Marshal.dump(raw))
11
+
12
+ # Handle Pipe Params
13
+ pipe = nil
14
+ if cmd.include?('|')
15
+ list = cmd.split('|')
16
+ cmd = list.shift
17
+ pipe = list.map { |x| x.join(' ') }.join('|')
18
+ end
19
19
 
20
20
  # Extract Files
21
21
  files = cmd.grep_v(/^-+([^=]+)/)
@@ -33,6 +33,9 @@ module GreenHat
33
33
  # And / Or
34
34
  flag_defaults(flags, skip_flags)
35
35
 
36
+ # Set command includes
37
+ flags[:pipe] = pipe if pipe
38
+
36
39
  [files, flags, args]
37
40
  end
38
41
 
@@ -78,19 +81,29 @@ module GreenHat
78
81
  # Arg Scan (Split -- values into keys)
79
82
  def self.arg_scan(arg)
80
83
  arg.scan(/^-+([^=]+)=(.*)/).map do |field, value|
84
+ logic = :include?
81
85
  bang = false
86
+
87
+ # Exclude Logic
82
88
  if field.include? '!'
83
89
  field.delete!('!')
84
90
  bang = true
85
91
  end
86
92
 
93
+ # Numeric Magic Logic
94
+ logic = :<= if field.include? '<'
95
+ logic = :>= if field.include? '>'
96
+ field.delete!('<')
97
+ field.delete!('>')
98
+
87
99
  # Symbolize
88
100
  field = field.to_sym
89
101
 
90
102
  {
91
103
  field: field,
92
104
  value: arg_normalize(field, value),
93
- bang: bang
105
+ bang: bang,
106
+ logic: logic
94
107
  }
95
108
  end
96
109
  end
@@ -137,7 +137,7 @@ module GreenHat
137
137
  # --limit=X
138
138
  # --sort=count,fail,max,median,min,p95,p99,rps,score
139
139
  # ========================================================================
140
- def self.top(raw)
140
+ def self.top(raw = [], internal = false)
141
141
  unless TTY::Which.exist? 'fast-stats'
142
142
  faststats_installation
143
143
  return false
@@ -155,6 +155,9 @@ module GreenHat
155
155
  ]
156
156
  end
157
157
 
158
+ # Quick exit for internal processing
159
+ return results.flatten if internal
160
+
158
161
  ShellHelper.show(results.flatten, flags)
159
162
  end
160
163
  # ========================================================================
@@ -162,14 +165,14 @@ module GreenHat
162
165
  # ========================================================================
163
166
  # ===== [ Fast Stats - Errors ] ====================
164
167
  # ========================================================================
165
- def self.errors(raw)
168
+ def self.errors(raw = [], internal = false)
166
169
  unless TTY::Which.exist? 'fast-stats'
167
170
  faststats_installation
168
171
  return false
169
172
  end
170
173
 
171
174
  # Add Color Output
172
- raw.push '--color-output'
175
+ raw.push '--color-output' if Settings.settings.color?
173
176
  files, flags, cmd = ShellHelper::Faststats.parse(raw)
174
177
 
175
178
  LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
@@ -182,6 +185,9 @@ module GreenHat
182
185
  ]
183
186
  end
184
187
 
188
+ # Quick exit for internal processing
189
+ return results.flatten if internal
190
+
185
191
  ShellHelper.show(results.flatten, flags)
186
192
  end
187
193
  # ========================================================================
@@ -236,6 +242,20 @@ module GreenHat
236
242
  files.any? { |x| thing.name.include? x }
237
243
  end
238
244
  end
245
+
246
+ # =====================================
247
+ # Internal Helpers
248
+ # =====================================
249
+ def self.faststats?
250
+ TTY::Which.exist?('fast-stats')
251
+ end
252
+
253
+ def self.run(thing, cmd = '')
254
+ # Blank return if cannot possibly run
255
+ return {} unless thing || !faststats?
256
+
257
+ Oj.load `fast-stats #{cmd} #{thing.file} --format=json`
258
+ end
239
259
  end
240
260
  end
241
261
  end
@@ -60,7 +60,7 @@ module GreenHat
60
60
  auto = fields.split(',').last
61
61
 
62
62
  # Field Finder
63
- matches = fields_find(files, auto, flags)
63
+ matches = fields_find(files, auto, flags).uniq
64
64
 
65
65
  if matches.count == 1
66
66
  "--#{cmd}=#{(complete + matches).join(',')}"