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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/bin/greenhat +1 -2
  3. data/lib/greenhat/accessors/disk.rb +1 -1
  4. data/lib/greenhat/accessors/gitlab.rb +4 -2
  5. data/lib/greenhat/archive.rb +7 -1
  6. data/lib/greenhat/cli.rb +24 -11
  7. data/lib/greenhat/entrypoint.rb +37 -34
  8. data/lib/greenhat/host.rb +1 -1
  9. data/lib/greenhat/logbot.rb +1 -1
  10. data/lib/greenhat/paper/flag_helper.rb +18 -0
  11. data/lib/greenhat/paper/paper_helper.rb +118 -0
  12. data/lib/greenhat/paper.rb +34 -0
  13. data/lib/greenhat/reports/builder.rb +98 -0
  14. data/lib/greenhat/reports/helpers.rb +101 -0
  15. data/lib/greenhat/reports/internal_methods.rb +156 -0
  16. data/lib/greenhat/reports/reports/errors.rb +49 -0
  17. data/lib/greenhat/reports/reports/faststats.rb +42 -0
  18. data/lib/greenhat/reports/reports/full.rb +143 -0
  19. data/lib/greenhat/reports/runner.rb +58 -0
  20. data/lib/greenhat/reports/shared.rb +37 -0
  21. data/lib/greenhat/reports/shell_helper.rb +34 -0
  22. data/lib/greenhat/reports.rb +79 -0
  23. data/lib/greenhat/settings.rb +35 -8
  24. data/lib/greenhat/shell/args.rb +9 -9
  25. data/lib/greenhat/shell/color_string.rb +1 -1
  26. data/lib/greenhat/shell/faststats.rb +24 -5
  27. data/lib/greenhat/shell/field_helper.rb +1 -1
  28. data/lib/greenhat/shell/filter_help.rb +65 -185
  29. data/lib/greenhat/shell/gitlab.rb +1 -0
  30. data/lib/greenhat/shell/log.rb +24 -30
  31. data/lib/greenhat/shell/markdown.rb +355 -352
  32. data/lib/greenhat/shell/process.rb +11 -5
  33. data/lib/greenhat/shell/query.rb +534 -0
  34. data/lib/greenhat/shell/report.rb +415 -410
  35. data/lib/greenhat/shell/reports.rb +41 -0
  36. data/lib/greenhat/shell/shell_helper.rb +95 -387
  37. data/lib/greenhat/shell.rb +22 -3
  38. data/lib/greenhat/thing/file_types.rb +30 -1
  39. data/lib/greenhat/thing/formatters/api_json.rb +4 -2
  40. data/lib/greenhat/thing/formatters/bracket_log.rb +1 -1
  41. data/lib/greenhat/thing/formatters/clean_raw.rb +1 -1
  42. data/lib/greenhat/thing/formatters/colon_split_strip.rb +2 -2
  43. data/lib/greenhat/thing/formatters/dotenv.rb +1 -1
  44. data/lib/greenhat/thing/formatters/format.rb +0 -11
  45. data/lib/greenhat/thing/formatters/free_m.rb +2 -2
  46. data/lib/greenhat/thing/formatters/json.rb +41 -17
  47. data/lib/greenhat/thing/formatters/json_shellwords.rb +3 -2
  48. data/lib/greenhat/thing/formatters/kube_json.rb +3 -2
  49. data/lib/greenhat/thing/formatters/multiline_json.rb +1 -1
  50. data/lib/greenhat/thing/formatters/nginx.rb +5 -1
  51. data/lib/greenhat/thing/formatters/runner_log.rb +70 -0
  52. data/lib/greenhat/thing/formatters/table.rb +17 -3
  53. data/lib/greenhat/thing/formatters/time_json.rb +12 -1
  54. data/lib/greenhat/thing/helpers.rb +0 -11
  55. data/lib/greenhat/thing/info_format.rb +4 -4
  56. data/lib/greenhat/thing/kind.rb +1 -1
  57. data/lib/greenhat/thing.rb +21 -25
  58. data/lib/greenhat/version.rb +1 -1
  59. data/lib/greenhat.rb +6 -8
  60. metadata +32 -4
  61. data/lib/greenhat/pry_helpers.rb +0 -51
  62. 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
- format_json_traverse result
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
@@ -25,7 +25,7 @@ module GreenHat
25
25
  result
26
26
  rescue StandardError => e
27
27
  # TODO: Background logger
28
- LogBot.fatal('dmesg', "Unable to Parse, #{row}:#{e.message}")
28
+ LogBot.warn('dmesg', "Unable to Parse, #{row}:#{e.message}")
29
29
  end
30
30
 
31
31
  self.result.compact!
@@ -4,7 +4,7 @@ module GreenHat
4
4
  module Formatters
5
5
  # Remove Comments / Empty Lines
6
6
  def format_clean_raw
7
- staging = raw.clone
7
+ staging = raw_full.clone
8
8
 
9
9
  # Empty
10
10
  staging.reject!(&:empty?)
@@ -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 = raw.map do |row|
7
+ self.result = raw_full.to_h do |row|
8
8
  row.split(':', 2).map(&:strip)
9
- end.to_h
9
+ end
10
10
  end
11
11
  end
12
12
  end
@@ -4,7 +4,7 @@ module GreenHat
4
4
  module Formatters
5
5
  # Formatters for Dmesg
6
6
  def format_dotenv
7
- self.result = Dotenv::Parser.new(raw.join("\n")).call
7
+ self.result = Dotenv::Parser.new(raw_full.join("\n")).call
8
8
  end
9
9
  end
10
10
  end
@@ -1,12 +1 @@
1
- module GreenHat
2
- # Formatter
3
- module Formatters
4
- def log_format
5
- self.result = send(SuperLog.type?(path)) if log_type
6
- end
7
1
 
8
- def log_type
9
- SuperLog.type?(path)
10
- end
11
- end
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 = raw.first.split(' ', 6).map(&:downcase).map do |x|
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
- raw[1..].map(&:split).each do |row|
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
- format_json_traverse result
17
+ # Parsing Time / Recusrive is really slow
18
+ format_time(result)
19
19
 
20
- result.sort.to_h
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
- format_json_time(result)
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
- result.time = format_time_parse(result.time) if result.key? :time
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
- # If timestamp exists but time doesn't, add time
48
- result.time = format_time_parse(result.timestamp) if result.key?(:timestamp) && !result.key?(:time)
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
- result.created_at = format_time_parse(result.created_at) if result.key? :created_at
51
- result.enqueued_at = format_time_parse(result.enqueued_at) if result.key? :enqueued_at
52
- rescue StandardError => e
53
- LogBot.warn('JSON Time Parse', e.message)
54
- true
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
- # Handle Epoch Timestamps as well as string timestamps
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
- Time.parse time
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
- format_json_traverse result
17
+ format_time(result)
18
18
 
19
- result.sort.to_h
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
- format_json_traverse result
22
+ format_time(result)
23
23
 
24
- result.sort.to_h
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
@@ -4,7 +4,7 @@ module GreenHat
4
4
  module Formatters
5
5
  # Formatters for single json blobs in entire file
6
6
  def format_multiline_json
7
- self.result = Oj.load raw.join
7
+ self.result = Oj.load raw_full.join
8
8
  end
9
9
  end
10
10
  end
@@ -6,7 +6,9 @@ module GreenHat
6
6
  # Formatters
7
7
  # ==========================================================================
8
8
  def format_nginx
9
- self.result = raw.map do |row|
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
- # Formatters for Dmesg
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 = raw.first.split(' ', 6).map(&:downcase).map do |x|
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
- raw[1..].map(&:split).each do |row|
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
- result = Oj.load msg
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
  # ==========================================================================
@@ -25,17 +25,6 @@ module GreenHat
25
25
  tmp_path.split('/').last(2).join(divider)
26
26
  end
27
27
  end
28
-
29
- # Check what kind of file we have
30
- def type_check
31
- if info?
32
- :info
33
- elsif SuperLog.type?(path)
34
- :log
35
- else
36
- :raw
37
- end
38
- end
39
28
  end
40
29
  end
41
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.map do |field, idx|
67
+ entry.split(' ', 7).map(&:strip).each_with_index.to_h do |field, idx|
68
68
  [format_netstat_conn_headers[idx], field]
69
- end.to_h
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.map do |field, idx|
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.to_h
75
+ end
76
76
  end
77
77
 
78
78
  {
@@ -84,7 +84,7 @@ module GreenHat
84
84
  option = prompt.select('Wat is this?', prompt_list.keys.sort_by(&:length), filter: true)
85
85
 
86
86
  # Store for later
87
- ThingHistory.add(name, option)
87
+ ThingHistory.add(name.to_sym, option)
88
88
 
89
89
  self.type = option
90
90
  end
@@ -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
- raw_read if raw_result.nil?
61
+ File.foreach(file)
62
+ end
62
63
 
63
- raw_result
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.join("\n")
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
- # Log Identifier Helper
95
- def log?
96
- GreenHat::SuperLog.log? kind
87
+ # Hashed values searching
88
+ def process?
89
+ kind != :raw && methods.include?(formatter)
97
90
  end
98
91
 
99
- # Hashed values searching
100
- def processed?
101
- kind != :raw
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
@@ -1,3 +1,3 @@
1
1
  module GreenHat
2
- VERSION = '0.4.0'.freeze
2
+ VERSION = '0.6.1'.freeze
3
3
  end
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'