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
@@ -27,7 +27,8 @@ module GreenHat
|
|
27
27
|
'df_h' => {
|
28
28
|
format: :table,
|
29
29
|
pattern: [
|
30
|
-
/df_h
|
30
|
+
/df_h/,
|
31
|
+
/df_hT/
|
31
32
|
]
|
32
33
|
},
|
33
34
|
'df_inodes' => {
|
@@ -64,6 +65,13 @@ module GreenHat
|
|
64
65
|
%r{log/syslog}
|
65
66
|
]
|
66
67
|
},
|
68
|
+
'gitlab-runner.log' => {
|
69
|
+
format: :runner_log,
|
70
|
+
log: true,
|
71
|
+
pattern: [
|
72
|
+
/gitlab-runner.log/
|
73
|
+
]
|
74
|
+
},
|
67
75
|
'etc/fstab' => {
|
68
76
|
format: :clean_raw,
|
69
77
|
pattern: [
|
@@ -123,6 +131,13 @@ module GreenHat
|
|
123
131
|
%r{consul/current}
|
124
132
|
]
|
125
133
|
},
|
134
|
+
'gitlab-kas/current' => {
|
135
|
+
format: :time_space,
|
136
|
+
log: true,
|
137
|
+
pattern: [
|
138
|
+
%r{gitlab-kas/current}
|
139
|
+
]
|
140
|
+
},
|
126
141
|
'sentinel/current' => {
|
127
142
|
format: :time_space,
|
128
143
|
log: true,
|
@@ -151,6 +166,13 @@ module GreenHat
|
|
151
166
|
%r{mailroom/mail_room_json.log}
|
152
167
|
]
|
153
168
|
},
|
169
|
+
'gitlab_migrations' => {
|
170
|
+
format: :raw,
|
171
|
+
log: true,
|
172
|
+
pattern: [
|
173
|
+
/gitlab_migrations/
|
174
|
+
]
|
175
|
+
},
|
154
176
|
'gitlab-rails/git_json.log' => {
|
155
177
|
format: :json,
|
156
178
|
log: true,
|
@@ -379,6 +401,13 @@ module GreenHat
|
|
379
401
|
%r{nginx/gitlab_pages_access.log}
|
380
402
|
]
|
381
403
|
},
|
404
|
+
'nginx/gitlab_pages_error.log' => {
|
405
|
+
format: :raw,
|
406
|
+
log: true,
|
407
|
+
pattern: [
|
408
|
+
%r{nginx/gitlab_pages_error.log}
|
409
|
+
]
|
410
|
+
},
|
382
411
|
'nginx/gitlab_access.log' => {
|
383
412
|
format: :nginx,
|
384
413
|
log: true,
|
@@ -11,9 +11,10 @@ module GreenHat
|
|
11
11
|
result = Oj.load row
|
12
12
|
|
13
13
|
# Parsing Time
|
14
|
-
|
14
|
+
format_time(result)
|
15
15
|
|
16
|
-
flatten_hash(result).sort.to_h
|
16
|
+
# flatten_hash(result).sort.to_h
|
17
|
+
result
|
17
18
|
rescue StandardError => e
|
18
19
|
# TODO: Background Logger?
|
19
20
|
e.message
|
@@ -29,6 +30,7 @@ module GreenHat
|
|
29
30
|
v.is_a?(Hash) ? a.merge(flatten_hash(v, "#{prefix}#{k}.")) : a.merge("#{prefix}#{k}".to_sym => v)
|
30
31
|
end
|
31
32
|
end
|
33
|
+
|
32
34
|
# ==========================================================================
|
33
35
|
end
|
34
36
|
end
|
@@ -4,9 +4,9 @@ module GreenHat
|
|
4
4
|
module Formatters
|
5
5
|
# Formatters for single json blobs in entire file
|
6
6
|
def format_colon_split_strip
|
7
|
-
self.result =
|
7
|
+
self.result = raw_full.to_h do |row|
|
8
8
|
row.split(':', 2).map(&:strip)
|
9
|
-
end
|
9
|
+
end
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -5,7 +5,7 @@ module GreenHat
|
|
5
5
|
# Get Split Memory Table
|
6
6
|
def format_free_m
|
7
7
|
# Headers to Readable Symbol
|
8
|
-
headers =
|
8
|
+
headers = raw_full.first.split.map(&:downcase).map do |x|
|
9
9
|
x.gsub(/\s+/, '_').gsub(/[^0-9A-Za-z_]/, '')
|
10
10
|
end.map(&:to_sym)
|
11
11
|
|
@@ -15,7 +15,7 @@ module GreenHat
|
|
15
15
|
final = []
|
16
16
|
|
17
17
|
# Put fields into a Hash based on Location/Key
|
18
|
-
|
18
|
+
raw_full[1..].map(&:split).each do |row|
|
19
19
|
result = {}
|
20
20
|
row.each_with_index do |detail, i|
|
21
21
|
result[headers[i]] = detail.split(':').first
|
@@ -14,10 +14,10 @@ module GreenHat
|
|
14
14
|
{ message: row }
|
15
15
|
end
|
16
16
|
|
17
|
-
# Parsing Time
|
18
|
-
|
17
|
+
# Parsing Time / Recusrive is really slow
|
18
|
+
format_time(result)
|
19
19
|
|
20
|
-
result
|
20
|
+
result
|
21
21
|
rescue StandardError => e
|
22
22
|
# TODO: Background Logger?
|
23
23
|
e.message
|
@@ -27,11 +27,12 @@ module GreenHat
|
|
27
27
|
|
28
28
|
:ok
|
29
29
|
end
|
30
|
+
|
30
31
|
# ==========================================================================
|
31
32
|
|
32
|
-
# Recursively Navigate
|
33
|
+
# Recursively Navigate -- Recusrive is really slow
|
33
34
|
def format_json_traverse(result)
|
34
|
-
|
35
|
+
format_time(result)
|
35
36
|
|
36
37
|
result.each do |_key, value|
|
37
38
|
next unless value.instance_of? Hash
|
@@ -40,27 +41,50 @@ module GreenHat
|
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
44
|
+
def format_time_fields
|
45
|
+
%i[time timestamp created_at enqueued_at completed_at]
|
46
|
+
end
|
47
|
+
|
48
|
+
# Loop through potential fields and parse as needed
|
49
|
+
def format_time(result)
|
50
|
+
format_time_fields.each do |field|
|
51
|
+
result[field] = format_time_parse(result[field]) if result.key?(field)
|
52
|
+
rescue StandardError => e
|
53
|
+
LogBot.warn('JSON Format Time', e.message)
|
54
|
+
next
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
43
58
|
# Check for Common Fields
|
44
|
-
def format_json_time(result)
|
45
|
-
|
59
|
+
# def format_json_time(result)
|
60
|
+
# if result.key? :time
|
61
|
+
# result.time = format_time_parse(result.time)
|
62
|
+
# elsif result.key?(:timestamp)
|
63
|
+
# result.time = format_time_parse(result.timestamp)
|
64
|
+
# end
|
46
65
|
|
47
|
-
|
48
|
-
|
66
|
+
# result.created_at = format_time_parse(result.created_at) if result.key? :created_at
|
67
|
+
# result.enqueued_at = format_time_parse(result.enqueued_at) if result.key? :enqueued_at
|
68
|
+
# rescue StandardError => e
|
69
|
+
# LogBot.warn("JSON Time Parse", e.message)
|
70
|
+
# true
|
71
|
+
# end
|
49
72
|
|
50
|
-
|
51
|
-
|
52
|
-
rescue StandardError
|
53
|
-
|
54
|
-
|
73
|
+
def format_time_parse(time)
|
74
|
+
Time.parse time
|
75
|
+
rescue StandardError
|
76
|
+
# Handle Epoch Timestamps as well as string timestamps
|
77
|
+
format_time_numeric(time)
|
55
78
|
end
|
56
79
|
|
57
|
-
|
58
|
-
def format_time_parse(time)
|
80
|
+
def format_time_numeric(time)
|
59
81
|
if time.numeric?
|
60
82
|
Time.at time
|
61
83
|
else
|
62
|
-
|
84
|
+
time
|
63
85
|
end
|
86
|
+
rescue StandardError => e
|
87
|
+
LogBot.warn('JSON Time Parse', e.message)
|
64
88
|
end
|
65
89
|
# ---
|
66
90
|
end
|
@@ -14,9 +14,9 @@ module GreenHat
|
|
14
14
|
end
|
15
15
|
|
16
16
|
# Parsing Time
|
17
|
-
|
17
|
+
format_time(result)
|
18
18
|
|
19
|
-
result
|
19
|
+
result
|
20
20
|
rescue StandardError => e
|
21
21
|
LogBot.warn('JSON Parse', e.message)
|
22
22
|
next
|
@@ -36,6 +36,7 @@ module GreenHat
|
|
36
36
|
|
37
37
|
result
|
38
38
|
end
|
39
|
+
|
39
40
|
# ==========================================================================
|
40
41
|
end
|
41
42
|
end
|
@@ -19,9 +19,9 @@ module GreenHat
|
|
19
19
|
end
|
20
20
|
|
21
21
|
# Parsing Time
|
22
|
-
|
22
|
+
format_time(result)
|
23
23
|
|
24
|
-
result
|
24
|
+
result
|
25
25
|
rescue StandardError => e
|
26
26
|
# TODO: Background Logger?
|
27
27
|
e.message
|
@@ -31,6 +31,7 @@ module GreenHat
|
|
31
31
|
|
32
32
|
:ok
|
33
33
|
end
|
34
|
+
|
34
35
|
# =========================================================================
|
35
36
|
end
|
36
37
|
end
|
@@ -6,7 +6,9 @@ module GreenHat
|
|
6
6
|
# Formatters
|
7
7
|
# ==========================================================================
|
8
8
|
def format_nginx
|
9
|
-
|
9
|
+
output = raw.map do |row|
|
10
|
+
next if row.chomp.empty?
|
11
|
+
|
10
12
|
conn_data, rest = row.split(' [', 2)
|
11
13
|
ip, _sym, remote_user = conn_data.split(' ', 3)
|
12
14
|
|
@@ -35,6 +37,8 @@ module GreenHat
|
|
35
37
|
{ msg: row }
|
36
38
|
end
|
37
39
|
|
40
|
+
# Remove Empty Entries
|
41
|
+
self.result = output.compact
|
38
42
|
:ok
|
39
43
|
end
|
40
44
|
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# Top
|
2
|
+
module GreenHat
|
3
|
+
# Log
|
4
|
+
module Formatters
|
5
|
+
# Attempt to make runner logs easier to parse
|
6
|
+
def format_runner_log
|
7
|
+
self.result = raw.map do |row|
|
8
|
+
next if row.empty? || row == "\n"
|
9
|
+
next if row.include? '-- Logs begin at' # Skip Header
|
10
|
+
|
11
|
+
process_runner_log_row(row)
|
12
|
+
end
|
13
|
+
|
14
|
+
result.compact!
|
15
|
+
end
|
16
|
+
|
17
|
+
# Split / Parse Time
|
18
|
+
# TODO: Better sys log parsing? Cannot find ready-made regex/ruby parser
|
19
|
+
def process_runner_log_row(row)
|
20
|
+
month, day, time, device, service, message = row.split(' ', 6)
|
21
|
+
service&.gsub!(':', '')
|
22
|
+
pid = service&.match(/\[(.*?)\]/)&.captures&.first
|
23
|
+
|
24
|
+
entry = {
|
25
|
+
time: format_time_parse("#{month} #{day} #{time}"),
|
26
|
+
device: device,
|
27
|
+
service: service,
|
28
|
+
message: message,
|
29
|
+
pid: pid,
|
30
|
+
row: row # Insert full row for different timestamp formats
|
31
|
+
}
|
32
|
+
|
33
|
+
# Remove Empty Keys
|
34
|
+
entry.compact!
|
35
|
+
|
36
|
+
# Shellwords split - Skip Blank
|
37
|
+
process_runner_row_message(message, entry) unless message.blank?
|
38
|
+
|
39
|
+
entry
|
40
|
+
|
41
|
+
# Return everything incase of error
|
42
|
+
rescue StandardError => e
|
43
|
+
LogBot.warn('Runner Log Parse', e.message)
|
44
|
+
{
|
45
|
+
message: row
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
def process_runner_row_message(message, entry)
|
50
|
+
# Insert Keywords / Format Time if Possible
|
51
|
+
Shellwords.split(message).select { |x| x.include? '=' }.each do |x|
|
52
|
+
key, value = x.split('=', 2)
|
53
|
+
|
54
|
+
# Don't overwrite stuff
|
55
|
+
case key
|
56
|
+
when 'time'
|
57
|
+
entry["#{key}-msg".to_sym] = format_time_parse value
|
58
|
+
when 'message', :message
|
59
|
+
entry["#{key}-msg".to_sym] = value
|
60
|
+
else
|
61
|
+
entry[key.to_sym] = value
|
62
|
+
end
|
63
|
+
end
|
64
|
+
rescue StandardError
|
65
|
+
# LogBot.debug('Runner Log Parse', e.message)
|
66
|
+
nil
|
67
|
+
end
|
68
|
+
# --
|
69
|
+
end
|
70
|
+
end
|
@@ -2,17 +2,31 @@
|
|
2
2
|
module GreenHat
|
3
3
|
# Log
|
4
4
|
module Formatters
|
5
|
-
#
|
5
|
+
# Looks like this may be different per Type
|
6
|
+
def header_count
|
7
|
+
case name
|
8
|
+
when 'df_hT' then 7
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# Table Formatting
|
6
13
|
def format_table
|
14
|
+
# Default to split by space unless specifically needed
|
15
|
+
headers_raw = if header_count
|
16
|
+
raw_full.first.split(' ', header_count)
|
17
|
+
else
|
18
|
+
raw_full.first.split
|
19
|
+
end
|
20
|
+
|
7
21
|
# Headers to Readable Symbol
|
8
|
-
headers =
|
22
|
+
headers = headers_raw.map(&:downcase).map do |x|
|
9
23
|
x.gsub(/\s+/, '_').gsub(/[^0-9A-Za-z_]/, '')
|
10
24
|
end.map(&:to_sym)
|
11
25
|
|
12
26
|
final = []
|
13
27
|
|
14
28
|
# Put fields into a Hash based on Location/Key
|
15
|
-
|
29
|
+
raw_full.map(&:split)[1..].each do |row|
|
16
30
|
result = {}
|
17
31
|
row.each_with_index do |detail, i|
|
18
32
|
result[headers[i]] = detail
|
@@ -10,10 +10,21 @@ module GreenHat
|
|
10
10
|
self.result = raw.map do |row|
|
11
11
|
time, msg = row.split(' ', 2)
|
12
12
|
|
13
|
-
|
13
|
+
# Be mo fault tolerant
|
14
|
+
result = begin
|
15
|
+
Oj.load msg
|
16
|
+
rescue StandardError
|
17
|
+
{ msg: msg }
|
18
|
+
end
|
19
|
+
|
14
20
|
result.time = time
|
15
21
|
|
16
22
|
result
|
23
|
+
rescue StandardError => e
|
24
|
+
# TODO: Background Logger?
|
25
|
+
e.message
|
26
|
+
LogBot.warn('Time JSON Parse', e.message)
|
27
|
+
next
|
17
28
|
end
|
18
29
|
end
|
19
30
|
# ==========================================================================
|
@@ -64,15 +64,15 @@ module GreenHat
|
|
64
64
|
conns, sockets = raw.split { |x| x.include? 'Active' }.reject(&:empty?)
|
65
65
|
|
66
66
|
formatted_conns = conns[1..].map do |entry|
|
67
|
-
entry.split(' ', 7).map(&:strip).each_with_index.
|
67
|
+
entry.split(' ', 7).map(&:strip).each_with_index.to_h do |field, idx|
|
68
68
|
[format_netstat_conn_headers[idx], field]
|
69
|
-
end
|
69
|
+
end
|
70
70
|
end
|
71
71
|
|
72
72
|
formatted_sockets = sockets[1..].map do |entry|
|
73
|
-
entry.split(' ').map(&:strip).reject(&:blank?).each_with_index.
|
73
|
+
entry.split(' ').map(&:strip).reject(&:blank?).each_with_index.to_h do |field, idx|
|
74
74
|
[format_netstat_socket_headers[idx], field]
|
75
|
-
end
|
75
|
+
end
|
76
76
|
end
|
77
77
|
|
78
78
|
{
|
data/lib/greenhat/thing/kind.rb
CHANGED
data/lib/greenhat/thing.rb
CHANGED
@@ -24,8 +24,7 @@ class Thing < Teron
|
|
24
24
|
|
25
25
|
# Preloader Flags
|
26
26
|
field :parsed # Flag for Parsing
|
27
|
-
field :result # Processed Data
|
28
|
-
field :raw_result # Flag for reading raw data
|
27
|
+
field :result, dump: false # Processed Data
|
29
28
|
field :result_fields # All available fields
|
30
29
|
|
31
30
|
def friendly_name
|
@@ -57,10 +56,14 @@ class Thing < Teron
|
|
57
56
|
result_fields
|
58
57
|
end
|
59
58
|
|
59
|
+
# Readlines rather than putting whole thing into memory
|
60
60
|
def raw
|
61
|
-
|
61
|
+
File.foreach(file)
|
62
|
+
end
|
62
63
|
|
63
|
-
|
64
|
+
# Where full read is needed
|
65
|
+
def raw_full
|
66
|
+
File.read(file).split("\n")
|
64
67
|
end
|
65
68
|
|
66
69
|
# Filter / Archive Pattern Matching
|
@@ -73,32 +76,27 @@ class Thing < Teron
|
|
73
76
|
data.blank?
|
74
77
|
end
|
75
78
|
|
76
|
-
def raw_read
|
77
|
-
spin_start("Read #{name.pastel(:blue)} #{size.pastel(:bright_black)}")
|
78
|
-
self.raw_result = File.read(file).split("\n")
|
79
|
-
rescue StandardError => e
|
80
|
-
LogBot.fatal('Raw Read', message: e.message, backtrace: e.backtrace.first)
|
81
|
-
self.raw_result = ''
|
82
|
-
ensure
|
83
|
-
spin_done
|
84
|
-
end
|
85
|
-
|
86
79
|
def output(print_it = true)
|
87
80
|
if print_it
|
88
|
-
puts raw.
|
81
|
+
puts raw.map(&:to_s).map(&:chomp)
|
89
82
|
else
|
90
|
-
raw
|
83
|
+
raw.map(&:to_s).map(&:chomp)
|
91
84
|
end
|
92
85
|
end
|
93
86
|
|
94
|
-
#
|
95
|
-
def
|
96
|
-
|
87
|
+
# Hashed values searching
|
88
|
+
def process?
|
89
|
+
kind != :raw && methods.include?(formatter)
|
97
90
|
end
|
98
91
|
|
99
|
-
#
|
100
|
-
def
|
101
|
-
|
92
|
+
# Things that can be queried (Query Helper)
|
93
|
+
def query?
|
94
|
+
data.instance_of?(Array)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Helper for all things that can be hash/value filtered
|
98
|
+
def self.list
|
99
|
+
all.select.select(&:process?)
|
102
100
|
end
|
103
101
|
|
104
102
|
# Helper Formatter Method
|
@@ -107,9 +105,6 @@ class Thing < Teron
|
|
107
105
|
end
|
108
106
|
|
109
107
|
def process
|
110
|
-
# Read First if Needed (Spinner)
|
111
|
-
raw_read if raw_result.nil?
|
112
|
-
|
113
108
|
if methods.include? formatter
|
114
109
|
spin_start("Parse #{name.pastel(:blue)} #{kind.to_s.pastel(:bright_black)} ")
|
115
110
|
begin
|
@@ -148,6 +143,7 @@ class Thing < Teron
|
|
148
143
|
self.log = true
|
149
144
|
self.parsed = true
|
150
145
|
self.type = 'json'
|
146
|
+
self.kind = :json
|
151
147
|
self.result_fields = field_processing
|
152
148
|
save!
|
153
149
|
end
|
data/lib/greenhat/version.rb
CHANGED
data/lib/greenhat.rb
CHANGED
@@ -24,6 +24,7 @@ require 'tty-table'
|
|
24
24
|
require 'tty-which'
|
25
25
|
require 'warning'
|
26
26
|
require 'ruby_native_statistics'
|
27
|
+
require 'gitlab_chronic_duration'
|
27
28
|
|
28
29
|
# Custom Gem
|
29
30
|
require 'teron'
|
@@ -54,8 +55,12 @@ require 'greenhat/logbot'
|
|
54
55
|
require 'greenhat/settings'
|
55
56
|
require 'greenhat/color'
|
56
57
|
|
58
|
+
# Printer Helpers
|
59
|
+
require 'greenhat/paper/paper_helper'
|
60
|
+
require 'greenhat/paper/flag_helper'
|
61
|
+
require 'greenhat/paper'
|
62
|
+
|
57
63
|
# Formatters - Loads Required Files Automatically
|
58
|
-
require 'greenhat/thing/super_log'
|
59
64
|
require 'greenhat/thing/file_types'
|
60
65
|
require 'greenhat/thing/kind'
|
61
66
|
require 'greenhat/thing/history'
|
@@ -68,14 +73,7 @@ require 'greenhat/thing'
|
|
68
73
|
# Shell - Loads Required Files Automatically
|
69
74
|
require 'greenhat/shell'
|
70
75
|
|
71
|
-
# TODO: Confirm
|
72
|
-
# require 'greenhat/host'
|
73
|
-
# require 'greenhat/web'
|
74
|
-
|
75
|
-
require 'greenhat/pry_helpers'
|
76
|
-
|
77
76
|
## TTY Shims
|
78
|
-
|
79
77
|
require 'greenhat/tty/line'
|
80
78
|
require 'greenhat/tty/reader'
|
81
79
|
require 'greenhat/tty/custom_line'
|