greenhat 0.4.0 → 0.6.1
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 +4 -4
- data/bin/greenhat +1 -2
- data/lib/greenhat/accessors/disk.rb +1 -1
- data/lib/greenhat/accessors/gitlab.rb +4 -2
- data/lib/greenhat/archive.rb +7 -1
- data/lib/greenhat/cli.rb +24 -11
- data/lib/greenhat/entrypoint.rb +37 -34
- data/lib/greenhat/host.rb +1 -1
- data/lib/greenhat/logbot.rb +1 -1
- data/lib/greenhat/paper/flag_helper.rb +18 -0
- data/lib/greenhat/paper/paper_helper.rb +118 -0
- data/lib/greenhat/paper.rb +34 -0
- data/lib/greenhat/reports/builder.rb +98 -0
- data/lib/greenhat/reports/helpers.rb +101 -0
- data/lib/greenhat/reports/internal_methods.rb +156 -0
- data/lib/greenhat/reports/reports/errors.rb +49 -0
- data/lib/greenhat/reports/reports/faststats.rb +42 -0
- data/lib/greenhat/reports/reports/full.rb +143 -0
- data/lib/greenhat/reports/runner.rb +58 -0
- data/lib/greenhat/reports/shared.rb +37 -0
- data/lib/greenhat/reports/shell_helper.rb +34 -0
- data/lib/greenhat/reports.rb +79 -0
- data/lib/greenhat/settings.rb +35 -8
- data/lib/greenhat/shell/args.rb +9 -9
- data/lib/greenhat/shell/color_string.rb +1 -1
- data/lib/greenhat/shell/faststats.rb +24 -5
- data/lib/greenhat/shell/field_helper.rb +1 -1
- data/lib/greenhat/shell/filter_help.rb +65 -185
- data/lib/greenhat/shell/gitlab.rb +1 -0
- data/lib/greenhat/shell/log.rb +24 -30
- data/lib/greenhat/shell/markdown.rb +355 -352
- data/lib/greenhat/shell/process.rb +11 -5
- data/lib/greenhat/shell/query.rb +534 -0
- data/lib/greenhat/shell/report.rb +415 -410
- data/lib/greenhat/shell/reports.rb +41 -0
- data/lib/greenhat/shell/shell_helper.rb +95 -387
- data/lib/greenhat/shell.rb +22 -3
- data/lib/greenhat/thing/file_types.rb +30 -1
- data/lib/greenhat/thing/formatters/api_json.rb +4 -2
- data/lib/greenhat/thing/formatters/bracket_log.rb +1 -1
- data/lib/greenhat/thing/formatters/clean_raw.rb +1 -1
- data/lib/greenhat/thing/formatters/colon_split_strip.rb +2 -2
- data/lib/greenhat/thing/formatters/dotenv.rb +1 -1
- data/lib/greenhat/thing/formatters/format.rb +0 -11
- data/lib/greenhat/thing/formatters/free_m.rb +2 -2
- data/lib/greenhat/thing/formatters/json.rb +41 -17
- data/lib/greenhat/thing/formatters/json_shellwords.rb +3 -2
- data/lib/greenhat/thing/formatters/kube_json.rb +3 -2
- data/lib/greenhat/thing/formatters/multiline_json.rb +1 -1
- data/lib/greenhat/thing/formatters/nginx.rb +5 -1
- data/lib/greenhat/thing/formatters/runner_log.rb +70 -0
- data/lib/greenhat/thing/formatters/table.rb +17 -3
- data/lib/greenhat/thing/formatters/time_json.rb +12 -1
- data/lib/greenhat/thing/helpers.rb +0 -11
- data/lib/greenhat/thing/info_format.rb +4 -4
- data/lib/greenhat/thing/kind.rb +1 -1
- data/lib/greenhat/thing.rb +21 -25
- data/lib/greenhat/version.rb +1 -1
- data/lib/greenhat.rb +6 -8
- metadata +32 -4
- data/lib/greenhat/pry_helpers.rb +0 -51
- data/lib/greenhat/thing/super_log.rb +0 -102
@@ -1,352 +1,355 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
end
|
1
|
+
# Deprecated in favor of reports module
|
2
|
+
# TODO: Remove / Replace for markdown report
|
3
|
+
# module GreenHat
|
4
|
+
# # Root Level Shell / Report Helper
|
5
|
+
# module Shell
|
6
|
+
# def self.markdown_report(raw)
|
7
|
+
# _files, flags, _args = Args.parse(raw)
|
8
|
+
|
9
|
+
# archives = if flags.archive
|
10
|
+
# Archive.all.select do |archive|
|
11
|
+
# flags.archive.any? { |x| archive.name.include? x.to_s }
|
12
|
+
# end
|
13
|
+
# else
|
14
|
+
# Archive.all
|
15
|
+
# end
|
16
|
+
|
17
|
+
# ShellHelper.show(archives.map(&:report_markdown).map(&:show).flatten, flags)
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
|
22
|
+
# module GreenHat
|
23
|
+
# # Report Generator Helper
|
24
|
+
#
|
25
|
+
# class ReportMarkdown
|
26
|
+
# include ActionView::Helpers::NumberHelper
|
27
|
+
|
28
|
+
# attr_accessor :archive, :host, :os_release, :selinux_status, :cpu, :uname,
|
29
|
+
# :timedatectl, :uptime, :meminfo, :gitlab_manifest, :gitlab_status,
|
30
|
+
# :production_log, :api_log, :application_log, :sidekiq_log,
|
31
|
+
# :exceptions_log, :gitaly_log, :free_m, :disk_free
|
32
|
+
|
33
|
+
# # Find Needed Files for Report
|
34
|
+
#
|
35
|
+
# def initialize(archive)
|
36
|
+
# self.archive = archive
|
37
|
+
# self.host = archive.things.find { |x| x.name == 'hostname' }
|
38
|
+
# self.os_release = archive.things.find { |x| x.name == 'etc/os-release' }
|
39
|
+
# self.selinux_status = archive.things.find { |x| x.name == 'sestatus' }
|
40
|
+
# self.cpu = archive.things.find { |x| x.name == 'lscpu' }
|
41
|
+
# self.uname = archive.things.find { |x| x.name == 'uname' }
|
42
|
+
# self.timedatectl = archive.things.find { |x| x.name == 'timedatectl' }
|
43
|
+
# self.uptime = archive.things.find { |x| x.name == 'uptime' }
|
44
|
+
# self.meminfo = archive.things.find { |x| x.name == 'meminfo' }
|
45
|
+
# self.free_m = archive.things.find { |x| x.name == 'free_m' }
|
46
|
+
# self.gitlab_manifest = archive.things.find { |x| x.name == 'gitlab/version-manifest.json' }
|
47
|
+
# self.gitlab_status = archive.things.find { |x| x.name == 'gitlab_status' }
|
48
|
+
# self.production_log = archive.things.find { |x| x.name == 'gitlab-rails/production_json.log' }
|
49
|
+
# self.api_log = archive.things.find { |x| x.name == 'gitlab-rails/api_json.log' }
|
50
|
+
# self.application_log = archive.things.find { |x| x.name == 'gitlab-rails/application_json.log' }
|
51
|
+
# self.exceptions_log = archive.things.find { |x| x.name == 'gitlab-rails/exceptions_json.log' }
|
52
|
+
# self.gitaly_log = archive.things.find { |x| x.name == 'gitaly/current' }
|
53
|
+
# self.sidekiq_log = archive.things.find { |x| x.name == 'sidekiq/current' }
|
54
|
+
# self.disk_free = archive.things.find { |x| x.name == 'df_hT' }
|
55
|
+
# end
|
56
|
+
|
57
|
+
# def show
|
58
|
+
# output = [
|
59
|
+
# archive.friendly_name,
|
60
|
+
# ''
|
61
|
+
# ]
|
62
|
+
|
63
|
+
# # GitLab Version
|
64
|
+
# output << "**GitLab #{gitlab_version}**\n" if gitlab_manifest || gitlab_status
|
65
|
+
|
66
|
+
# # OS
|
67
|
+
# output << "**OS**\n"
|
68
|
+
|
69
|
+
# output << collect_host
|
70
|
+
# output << ''
|
71
|
+
|
72
|
+
# # Memory
|
73
|
+
# if meminfo || free_m
|
74
|
+
# output << "**Memory**\n"
|
75
|
+
# # output << memory_perc if meminfo
|
76
|
+
# output << memory_free if free_m
|
77
|
+
# output << ''
|
78
|
+
# end
|
79
|
+
|
80
|
+
# # Disk
|
81
|
+
# if disk_free
|
82
|
+
# output << disks
|
83
|
+
# output << ''
|
84
|
+
# end
|
85
|
+
|
86
|
+
# # Gitlab
|
87
|
+
# output << gitlab_services if gitlab_status
|
88
|
+
|
89
|
+
# output << ''
|
90
|
+
|
91
|
+
# output << "**Errors**\n" if production_log || api_log || application_log || sidekiq_log
|
92
|
+
# output << collect_errors
|
93
|
+
|
94
|
+
# # Final Space / Return
|
95
|
+
# output << ''
|
96
|
+
# output
|
97
|
+
# end
|
98
|
+
# # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
99
|
+
|
100
|
+
# def collect_host
|
101
|
+
# output = []
|
102
|
+
# output << hostname if host
|
103
|
+
# output << distro if os_release
|
104
|
+
# output << selinux if selinux_status
|
105
|
+
# # output << arch if cpu
|
106
|
+
# output << kernel if uname
|
107
|
+
# output << sys_time if timedatectl
|
108
|
+
# output << sys_uptime if uptime
|
109
|
+
# output << load_average if uptime && cpu
|
110
|
+
|
111
|
+
# groups = output.each_slice((output.size / 2.to_f).round).to_a
|
112
|
+
|
113
|
+
# table = TTY::Table.new do |t|
|
114
|
+
# loop do
|
115
|
+
# break if groups.all?(&:empty?)
|
116
|
+
|
117
|
+
# t << groups.map(&:shift)
|
118
|
+
# end
|
119
|
+
# end
|
120
|
+
|
121
|
+
# "```\n#{table.render(:basic, padding: [0, 2, 0, 0])}\n```"
|
122
|
+
# end
|
123
|
+
|
124
|
+
# def collect_errors
|
125
|
+
# output = []
|
126
|
+
# output << production_errors if production_log
|
127
|
+
# output << application_errors if application_log
|
128
|
+
# output << sidekiq_errors if sidekiq_log
|
129
|
+
# output << api_errors if api_log
|
130
|
+
# output << exception_errors if exceptions_log
|
131
|
+
# output << gitaly_errors if gitaly_log
|
132
|
+
|
133
|
+
# # Keep Alphabetical Sort / Allow for only one
|
134
|
+
# slice_size = (output.size / 3.to_f).round
|
135
|
+
# slice_size = 1 unless slice_size.positive?
|
136
|
+
|
137
|
+
# groups = output.each_slice(slice_size).to_a
|
138
|
+
|
139
|
+
# table = TTY::Table.new do |t|
|
140
|
+
# loop do
|
141
|
+
# break if groups.all?(&:empty?)
|
142
|
+
|
143
|
+
# t << groups.map(&:shift)
|
144
|
+
# end
|
145
|
+
# end
|
146
|
+
|
147
|
+
# "```\n#{table.render(:basic, padding: [0, 2, 0, 0])}\n```"
|
148
|
+
# end
|
149
|
+
|
150
|
+
# def exception_errors
|
151
|
+
# count = exceptions_log.data.count
|
152
|
+
|
153
|
+
# "Exception: #{count}"
|
154
|
+
# end
|
155
|
+
|
156
|
+
# def gitaly_errors
|
157
|
+
# count = gitaly_log.data.count { |x| x.level == 'error' }
|
158
|
+
|
159
|
+
# "Gitaly: #{count}"
|
160
|
+
# end
|
161
|
+
|
162
|
+
# def production_errors
|
163
|
+
# count = production_log.data.count { |x| x.status == 500 }
|
164
|
+
|
165
|
+
# "Production: #{count}"
|
166
|
+
# end
|
167
|
+
|
168
|
+
# def api_errors
|
169
|
+
# count = api_log.data.count { |x| x.status == 500 }
|
170
|
+
|
171
|
+
# "API: #{count}"
|
172
|
+
# end
|
173
|
+
|
174
|
+
# def application_errors
|
175
|
+
# results = ShellHelper.filter_internal([
|
176
|
+
# 'gitlab-rails/application_json.log',
|
177
|
+
# '--message!="Cannot obtain an exclusive lease"',
|
178
|
+
# '--severity=error',
|
179
|
+
# "--archive=#{archive.name}"
|
180
|
+
# ].join(' '))
|
181
|
+
|
182
|
+
# "Application: #{results.count}"
|
183
|
+
# end
|
184
|
+
|
185
|
+
# def sidekiq_errors
|
186
|
+
# count = sidekiq_log.data.count { |x| x&.severity == 'ERROR' }
|
187
|
+
|
188
|
+
# "Sidekiq: #{count}"
|
189
|
+
# end
|
190
|
+
|
191
|
+
# def gitlab_services
|
192
|
+
# [
|
193
|
+
# "**Services**\n",
|
194
|
+
# "\n",
|
195
|
+
# GreenHat::GitLab.services_markdown(archive)
|
196
|
+
# ].join
|
197
|
+
# rescue StandardError => e
|
198
|
+
# LogBot.fatal('GitLab Services', message: e.message, backtrace: e.backtrace.first)
|
199
|
+
# end
|
200
|
+
|
201
|
+
# def gitlab_version
|
202
|
+
# txt = gitlab_manifest.data.dig(:software,
|
203
|
+
# :'gitlab-rails', :display_version) || gitlab_manifest.data.build_version
|
204
|
+
|
205
|
+
# if txt.include? '-ce'
|
206
|
+
# txt += ' - [😱 CE](https://about.gitlab.com/support/statement-of-support.html#free-and-community-edition-users)!'
|
207
|
+
# end
|
208
|
+
|
209
|
+
# "Version: #{txt}"
|
210
|
+
# end
|
211
|
+
|
212
|
+
# def hostname
|
213
|
+
# "Hostname: #{host.data.first}"
|
214
|
+
# end
|
215
|
+
|
216
|
+
# def distro
|
217
|
+
# [
|
218
|
+
# "Distro: [#{os_release.data.ID}] ",
|
219
|
+
# os_release.data.PRETTY_NAME
|
220
|
+
# ].join
|
221
|
+
# end
|
222
|
+
|
223
|
+
# def selinux
|
224
|
+
# status = selinux_status.data['SELinux status']
|
225
|
+
|
226
|
+
# [
|
227
|
+
# 'SeLinux: ',
|
228
|
+
# status,
|
229
|
+
# ' (',
|
230
|
+
# selinux_status.data['Current mode'],
|
231
|
+
# ')'
|
232
|
+
# ].join
|
233
|
+
# end
|
234
|
+
|
235
|
+
# def arch
|
236
|
+
# [
|
237
|
+
# 'Arch: ',
|
238
|
+
# cpu.data.Architecture
|
239
|
+
# ].join
|
240
|
+
# end
|
241
|
+
|
242
|
+
# def kernel
|
243
|
+
# # TODO: Better way to consistently get uname info?
|
244
|
+
# value, build = uname.data.first.split[2].split('-')
|
245
|
+
# [
|
246
|
+
# 'Kernel: ',
|
247
|
+
# value,
|
248
|
+
# " (#{build})"
|
249
|
+
# ].join
|
250
|
+
# end
|
251
|
+
|
252
|
+
# # Helper for finding if NTP is enabled
|
253
|
+
# def ntp_keys
|
254
|
+
# [
|
255
|
+
# 'Network time on', 'NTP enabled', 'NTP service', 'System clock synchronized'
|
256
|
+
# ]
|
257
|
+
# end
|
258
|
+
|
259
|
+
# def sys_time
|
260
|
+
# # Ignore if Empty
|
261
|
+
# return false if timedatectl.data.nil?
|
262
|
+
|
263
|
+
# ntp_statuses = timedatectl.data.slice(*ntp_keys).values.compact
|
264
|
+
|
265
|
+
# ntp_status = ntp_statuses.first
|
266
|
+
|
267
|
+
# # Fall Back
|
268
|
+
# ntp_status ||= 'unknown'
|
269
|
+
|
270
|
+
# [
|
271
|
+
# 'Sys Time: ',
|
272
|
+
# timedatectl.data['Local time'],
|
273
|
+
# "(ntp: #{ntp_status})"
|
274
|
+
# ].join
|
275
|
+
# end
|
276
|
+
|
277
|
+
# # Strip/Simplify Uptime
|
278
|
+
# def sys_uptime
|
279
|
+
# init = uptime.data.first.split(', load average').first.strip
|
280
|
+
|
281
|
+
# "Uptime: #{init.split('up ', 2).last}"
|
282
|
+
# end
|
283
|
+
|
284
|
+
# def load_average
|
285
|
+
# cpu_count = cpu.data['CPU(s)'].to_i
|
286
|
+
# intervals = uptime.data.first.split('load average: ', 2).last.split(', ').map(&:to_f)
|
287
|
+
|
288
|
+
# # Generate Colorized Text for Output
|
289
|
+
# intervals_text = intervals.map do |interval|
|
290
|
+
# value = percent(interval, cpu_count)
|
291
|
+
|
292
|
+
# "#{interval} (#{value}%)"
|
293
|
+
# end
|
294
|
+
|
295
|
+
# [
|
296
|
+
# 'LoadAvg: ',
|
297
|
+
# "[CPU #{cpu_count}] ",
|
298
|
+
# intervals_text.join(', ')
|
299
|
+
# ].join
|
300
|
+
# end
|
301
|
+
|
302
|
+
# def memory_free
|
303
|
+
# free = free_m.data.find { |x| x.kind == 'Mem' }
|
304
|
+
|
305
|
+
# return unless free
|
306
|
+
|
307
|
+
# pad = 6
|
308
|
+
# list = [
|
309
|
+
# "#{title('Total', pad)} #{number_to_human_size(free.total.to_i * (1024**2))}",
|
310
|
+
# "#{title('Used', pad)} #{number_to_human_size(free.used.to_i * (1024**2))}",
|
311
|
+
# "#{title('Free', pad)} #{number_to_human_size(free.free.to_i * (1024**2))}",
|
312
|
+
# "#{title('Avail', pad)} #{number_to_human_size(free.available.to_i * (1024**2))}"
|
313
|
+
# ]
|
314
|
+
|
315
|
+
# # Keep Alphabetical Sort
|
316
|
+
# groups = list.each_slice((list.size / 2.to_f).round).to_a
|
317
|
+
|
318
|
+
# table = TTY::Table.new do |t|
|
319
|
+
# loop do
|
320
|
+
# break if groups.all?(&:empty?)
|
321
|
+
|
322
|
+
# t << groups.map(&:shift)
|
323
|
+
# end
|
324
|
+
# end
|
325
|
+
|
326
|
+
# "```\n#{table.render(:basic, padding: [0, 2, 0, 0])}\n```"
|
327
|
+
# end
|
328
|
+
|
329
|
+
# def disks
|
330
|
+
# # GreenHat::Disk.df({archive: []})
|
331
|
+
# file = GreenHat::Disk.df({ archive: [archive.name] })
|
332
|
+
|
333
|
+
# disk_list = GreenHat::Disk.markdown_format(file.first, false, 3)
|
334
|
+
|
335
|
+
# # Preapre / Indent List
|
336
|
+
# [
|
337
|
+
# '**Disks**',
|
338
|
+
# "\n\n```\n#{disk_list.join("\n")}\n```"
|
339
|
+
# ].join
|
340
|
+
# end
|
341
|
+
|
342
|
+
# # ----------------------------
|
343
|
+
# # Helpers
|
344
|
+
# # ----------------------------
|
345
|
+
# def percent(value, total)
|
346
|
+
# ((value / total.to_f) * 100).round
|
347
|
+
# end
|
348
|
+
|
349
|
+
# # Helper to Make Cyan Titles
|
350
|
+
# def title(name, ljust = 16)
|
351
|
+
# "#{name}:".ljust(ljust)
|
352
|
+
# end
|
353
|
+
# end
|
354
|
+
# # rubocop:enable Metrics/ClassLength
|
355
|
+
# end
|