greenhat 0.1.4

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 (70) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +64 -0
  3. data/bin/greenhat +12 -0
  4. data/lib/greenhat.rb +80 -0
  5. data/lib/greenhat/accessors/disk.rb +27 -0
  6. data/lib/greenhat/accessors/logs/production.rb +41 -0
  7. data/lib/greenhat/accessors/logs/sidekiq.rb +41 -0
  8. data/lib/greenhat/accessors/memory.rb +46 -0
  9. data/lib/greenhat/accessors/network.rb +8 -0
  10. data/lib/greenhat/accessors/process.rb +8 -0
  11. data/lib/greenhat/archive.rb +108 -0
  12. data/lib/greenhat/cli.rb +448 -0
  13. data/lib/greenhat/host.rb +182 -0
  14. data/lib/greenhat/logbot.rb +86 -0
  15. data/lib/greenhat/pry_helpers.rb +51 -0
  16. data/lib/greenhat/settings.rb +51 -0
  17. data/lib/greenhat/shell.rb +92 -0
  18. data/lib/greenhat/shell/cat.rb +125 -0
  19. data/lib/greenhat/shell/disk.rb +68 -0
  20. data/lib/greenhat/shell/faststats.rb +195 -0
  21. data/lib/greenhat/shell/gitlab.rb +45 -0
  22. data/lib/greenhat/shell/help.rb +15 -0
  23. data/lib/greenhat/shell/helper.rb +514 -0
  24. data/lib/greenhat/shell/log.rb +344 -0
  25. data/lib/greenhat/shell/memory.rb +31 -0
  26. data/lib/greenhat/shell/network.rb +12 -0
  27. data/lib/greenhat/shell/process.rb +12 -0
  28. data/lib/greenhat/shell/report.rb +319 -0
  29. data/lib/greenhat/thing.rb +121 -0
  30. data/lib/greenhat/thing/file_types.rb +705 -0
  31. data/lib/greenhat/thing/formatters/api_json.rb +34 -0
  32. data/lib/greenhat/thing/formatters/bracket_log.rb +44 -0
  33. data/lib/greenhat/thing/formatters/clean_raw.rb +23 -0
  34. data/lib/greenhat/thing/formatters/colon_split_strip.rb +12 -0
  35. data/lib/greenhat/thing/formatters/dotenv.rb +10 -0
  36. data/lib/greenhat/thing/formatters/format.rb +12 -0
  37. data/lib/greenhat/thing/formatters/free_m.rb +29 -0
  38. data/lib/greenhat/thing/formatters/gitlab_ctl_tail.rb +51 -0
  39. data/lib/greenhat/thing/formatters/gitlab_status.rb +26 -0
  40. data/lib/greenhat/thing/formatters/json.rb +63 -0
  41. data/lib/greenhat/thing/formatters/json_shellwords.rb +44 -0
  42. data/lib/greenhat/thing/formatters/multiline_json.rb +10 -0
  43. data/lib/greenhat/thing/formatters/raw.rb +18 -0
  44. data/lib/greenhat/thing/formatters/shellwords.rb +23 -0
  45. data/lib/greenhat/thing/formatters/table.rb +26 -0
  46. data/lib/greenhat/thing/formatters/time_json.rb +21 -0
  47. data/lib/greenhat/thing/formatters/time_shellwords.rb +28 -0
  48. data/lib/greenhat/thing/formatters/time_space.rb +36 -0
  49. data/lib/greenhat/thing/helpers.rb +71 -0
  50. data/lib/greenhat/thing/history.rb +51 -0
  51. data/lib/greenhat/thing/info_format.rb +193 -0
  52. data/lib/greenhat/thing/kind.rb +97 -0
  53. data/lib/greenhat/thing/spinner.rb +52 -0
  54. data/lib/greenhat/thing/super_log.rb +102 -0
  55. data/lib/greenhat/tty/custom_line.rb +29 -0
  56. data/lib/greenhat/tty/line.rb +326 -0
  57. data/lib/greenhat/tty/reader.rb +110 -0
  58. data/lib/greenhat/version.rb +3 -0
  59. data/lib/greenhat/views/css.slim +126 -0
  60. data/lib/greenhat/views/disk_free.slim +18 -0
  61. data/lib/greenhat/views/index.slim +51 -0
  62. data/lib/greenhat/views/info.slim +39 -0
  63. data/lib/greenhat/views/manifest.slim +22 -0
  64. data/lib/greenhat/views/memory.slim +18 -0
  65. data/lib/greenhat/views/netstat.slim +20 -0
  66. data/lib/greenhat/views/process.slim +21 -0
  67. data/lib/greenhat/views/systemctl.slim +40 -0
  68. data/lib/greenhat/views/ulimit.slim +15 -0
  69. data/lib/greenhat/web.rb +46 -0
  70. metadata +476 -0
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ # https :/ / github.com / piotrmurach / tty - reader / blob / master / lib / tty / reader.rb
4
+
5
+ # Disabling Since this is a Shim
6
+ # rubocop:disable all
7
+
8
+ module TTY
9
+ # A class responsible for reading character input from STDIN
10
+ #
11
+ # Used internally to provide key and line reading functionality
12
+ #
13
+ # @api public
14
+ class Reader
15
+ attr_accessor :line, :breaker
16
+
17
+ def read_line(prompt = '', value: '', echo: true, raw: true, nonblock: false)
18
+ # Greenhat Shim:: Store Line
19
+ self.breaker = false
20
+ self.line = Line.new(value, prompt: prompt)
21
+ screen_width = TTY::Screen.width
22
+ buffer = ''
23
+
24
+ output.print(line)
25
+
26
+ while (codes = get_codes(echo: echo, raw: raw, nonblock: nonblock)) &&
27
+ (code = codes[0])
28
+ char = codes.pack('U*')
29
+
30
+ # GreenHat Shim / Back Tab Down Submodule
31
+ if [:back_tab, :ctrl_c].include? console.keys[char]
32
+ clear_display(line, screen_width)
33
+ trigger_key_event(char, line: line.to_s)
34
+ break
35
+ end
36
+
37
+ # Greenhat Shim
38
+ if EXIT_KEYS.include?(console.keys[char])
39
+ trigger_key_event(char, line: line.to_s)
40
+ exit
41
+ end
42
+
43
+ clear_display(line, screen_width) if raw && echo
44
+
45
+ if console.keys[char] == :backspace || code == BACKSPACE
46
+ unless line.start?
47
+ line.left
48
+ line.delete
49
+ end
50
+ elsif console.keys[char] == :delete || code == DELETE
51
+ line.delete
52
+ elsif console.keys[char].to_s =~ /ctrl_/
53
+ # skip
54
+ elsif console.keys[char] == :up
55
+ line.replace(history_previous) if history_previous?
56
+ elsif console.keys[char] == :down
57
+ line.replace(history_next? ? history_next : buffer) if track_history?
58
+ elsif console.keys[char] == :left
59
+ line.left
60
+ elsif console.keys[char] == :right
61
+ line.right
62
+ elsif console.keys[char] == :home
63
+ line.move_to_start
64
+ elsif console.keys[char] == :end
65
+ line.move_to_end
66
+ else
67
+ if raw && [CARRIAGE_RETURN, NEWLINE].include?(code)
68
+ char = "\n"
69
+ line.move_to_end
70
+ end
71
+ line.insert(char)
72
+ buffer = line.text
73
+ end
74
+
75
+ if (console.keys[char] == :backspace || code == BACKSPACE) && echo
76
+ if raw
77
+ output.print("\e[1X") unless line.start?
78
+ else
79
+ output.print("\s" + (line.start? ? '' : "\b"))
80
+ end
81
+ end
82
+
83
+ # trigger before line is printed to allow for line changes
84
+ trigger_key_event(char, line: line.to_s)
85
+
86
+ if raw && echo
87
+ output.print(line.to_s)
88
+ if char == "\n"
89
+ line.move_to_start
90
+ elsif !line.end? # readjust cursor position
91
+ output.print(cursor.backward(line.text_size - line.cursor))
92
+ end
93
+ end
94
+
95
+ # Greenhat Shim do things
96
+ next unless [CARRIAGE_RETURN, NEWLINE].include?(code) || breaker
97
+
98
+ buffer = ''
99
+ output.puts unless echo
100
+ break
101
+ end
102
+
103
+ add_to_history(line.text.rstrip) if track_history? && echo
104
+
105
+ line.text
106
+ end
107
+ end
108
+ end
109
+
110
+ # rubocop:enable all
@@ -0,0 +1,3 @@
1
+ module GreenHat
2
+ VERSION = '0.1.4'.freeze
3
+ end
@@ -0,0 +1,126 @@
1
+ css:
2
+ .relative {
3
+ position: relative;
4
+ z-index: 1;
5
+ }
6
+
7
+ .no-padding {
8
+ padding: 0 !important;
9
+ }
10
+
11
+ .padding {
12
+ padding: 10px !important;
13
+ }
14
+
15
+ .line-height {
16
+ line-height: inherit !important;
17
+ }
18
+
19
+ .mid {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ flex-wrap: wrap;
24
+ }
25
+
26
+ .aligner {
27
+ display: flex;
28
+ align-items: center;
29
+ justify-content: center;
30
+ }
31
+
32
+ .striped {
33
+ text-align:center;
34
+ }
35
+
36
+ .striped .entry:nth-child(odd) {
37
+ background-color: white;
38
+ }
39
+
40
+
41
+ .striped .entry:nth-child(even) {
42
+ background-color: #e8f5e9;
43
+ }
44
+
45
+ .bubble {
46
+ margin-right: 5px;
47
+ margin-bottom: 5px;
48
+ color: rgb(236, 236, 236);
49
+ font-weight: 300;
50
+ /* font-size: 0.8rem; */
51
+ }
52
+
53
+ .bubble-left {
54
+ padding: 2px 15px 2px 15px;
55
+ border-top-left-radius: 5px;
56
+ border-bottom-left-radius: 5px;
57
+ }
58
+
59
+ .bubble-right {
60
+ padding: 2px 15px 2px 15px;
61
+ border-top-right-radius: 5px;
62
+ border-bottom-right-radius: 5px;
63
+ }
64
+
65
+ .header {
66
+ margin: 0 !important;
67
+ text-align: center;
68
+ background-color:#42A5F5;
69
+ color: white;
70
+ }
71
+
72
+ .col7 {
73
+ width: 14.28%;
74
+ }
75
+
76
+ .col11 {
77
+ width: 8.9%;
78
+ }
79
+
80
+
81
+ .progress-bar {
82
+ position: absolute;
83
+ top:0;
84
+ left: 0px;
85
+ height: 100%;
86
+ opacity: 0.7;
87
+ z-index: -1;
88
+ }
89
+
90
+
91
+ div.dataTables_wrapper div.dataTables_filter {
92
+ text-align: right;
93
+ }
94
+ div.dataTables_wrapper div.dataTables_filter label {
95
+ font-weight: normal;
96
+ white-space: nowrap;
97
+ text-align: left;
98
+ }
99
+
100
+ div.dataTables_wrapper div.dataTables_filter input {
101
+ margin-left: 0.5em;
102
+ display: inline-block;
103
+ width: auto;
104
+ }
105
+
106
+ div.dataTables_wrapper div.dataTables_filter input {
107
+ margin-bottom: 0px
108
+ }
109
+
110
+ .table-header {
111
+ position: absolute;
112
+ padding-bottom: 15px;
113
+ width: 100%;
114
+ text-align: center;
115
+ background-color: #f1f8e9;
116
+ border-bottom: solid 1px grey;
117
+ /* font-size: 2em; */
118
+ }
119
+
120
+
121
+ .aligner-wrap {
122
+ display: flex;
123
+ align-items: center;
124
+ justify-content: left;
125
+ flex-wrap: wrap;
126
+ }
@@ -0,0 +1,18 @@
1
+ - if df_h
2
+ .row.card
3
+ .col.s12.no-padding
4
+ .header
5
+ .flow-text Disk
6
+ .col.s12.padding
7
+ - df_h.header.each do |header|
8
+ .col.s2
9
+ b = header
10
+ .col.s12.striped.no-padding
11
+ - df_h.rows.each do |entry|
12
+ .col.s12.entry.relative
13
+ - entry.each do |value|
14
+ small.col.s2 style='z-index:1' = value
15
+ .progress-bar.green style='width: #{entry[4]}'
16
+
17
+
18
+
@@ -0,0 +1,51 @@
1
+ doctype html
2
+ html
3
+ head
4
+ title SOS Display
5
+ meta content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height" name="viewport"
6
+
7
+ // Materialize
8
+ link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css" rel="stylesheet"
9
+ script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"
10
+
11
+ script src="https://code.jquery.com/jquery-2.2.4.min.js"
12
+
13
+ link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.10.2/css/all.min.css" rel="stylesheet"
14
+
15
+ // Data tables
16
+ script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"
17
+ link href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css" rel="stylesheet"
18
+
19
+ body
20
+ == slim :css
21
+
22
+ nav.green
23
+ .nav-wrapper
24
+ a.brand-logo.center href="/" Greenhat
25
+ ul.left.white-text
26
+ li
27
+ a href ='http://localhost:5601/app/kibana' target="_blank"
28
+ .btn-flat.white-text
29
+ i.fa.fa-chart-pie.left.line-height
30
+ | Kibana
31
+
32
+
33
+ .container
34
+ br
35
+ - hosts.each do |host|
36
+ // Host Container
37
+ .row.blue.white-text.mid.card
38
+ i.fab.fa-lg.left.line-height class=host.icon
39
+ .flow-text = host.archive_name
40
+
41
+ // Host Info
42
+ == slim :info, host
43
+
44
+ // Other Templates
45
+ == slim :memory, host
46
+ == slim :disk_free, host
47
+ == slim :netstat, host
48
+ == slim :manifest, host
49
+ == slim :process, host
50
+ == slim :ulimit, host
51
+ == slim :systemctl, host
@@ -0,0 +1,39 @@
1
+ .row.striped.card
2
+ - if manifest
3
+ .col.s12.entry.flow-text
4
+ .col.s4 Gitlab Version
5
+ .col.s8
6
+ = manifest.build_version
7
+
8
+ - if uptime
9
+ .col.s12.entry
10
+ .col.s4.aligner style='height:50px;' Uptime
11
+ .col.s8.aligner
12
+ - uptime.each do |data|
13
+ - if data.include? 'load average'
14
+ - data.split(':').each do |line|
15
+ .col.s4 = line
16
+ - else
17
+ = data
18
+
19
+ .col.s12.entry.aligner.padding
20
+ - if cpuinfo
21
+ .bubble
22
+ span.green.bubble-left CPU Count
23
+ span.blue.bubble-right = cpuinfo.count
24
+
25
+ - if total_memory
26
+ .bubble
27
+ span.green.bubble-left Total Memory
28
+ span.blue.bubble-right = total_memory
29
+
30
+ - if cpu_speed
31
+ .bubble
32
+ span.green.bubble-left = cpu_speed.first
33
+ span.blue.bubble-right = cpu_speed.last.to_i
34
+
35
+
36
+
37
+ - if uname
38
+ .col.s12.entry
39
+ small = uname
@@ -0,0 +1,22 @@
1
+ - if manifest
2
+ .row
3
+ .col.s12.no-padding.card
4
+ .table-header.flow-text Manifest
5
+ table.display id='manifest#{uuid}'
6
+ thead
7
+ tr
8
+ th Software
9
+ th Version
10
+ tbody
11
+ - manifest.software.each do |key,value|
12
+ tr
13
+ td.center = key
14
+ td.center = value.described_version
15
+
16
+ javascript:
17
+ $('#manifest#{uuid}').DataTable({
18
+ "columnDefs": [
19
+ { "width": "50%", "targets": [0,1] }
20
+ ]
21
+ });
22
+
@@ -0,0 +1,18 @@
1
+ - if free_m
2
+ .row.card
3
+ .col.s12.no-padding
4
+ .header
5
+ .flow-text Memory
6
+ .col.s12.padding.grey.lighten-1.center
7
+ // Bump Right One col
8
+ .col.col7
9
+ - free_m.first.each do |header|
10
+ .col.col7
11
+ b = header
12
+ .col.s12.striped.no-padding.center
13
+ - free_m[1..-1].each do |entry|
14
+ .col.s12.entry.relative.padding
15
+ - entry.each do |value|
16
+ .col.col7 style='z-index:1' = value
17
+ .progress-bar.green style='width: #{percent(entry[2],entry[1])}%'
18
+
@@ -0,0 +1,20 @@
1
+ - if netstat
2
+ .row
3
+ .card.col.s12.no-padding
4
+ .table-header.flow-text Netstat
5
+ table.display id='netstat#{uuid}'
6
+ thead
7
+ tr
8
+ - netstat.headers.each do |header|
9
+ th = header
10
+ tbody
11
+ - netstat.rows.each do |row|
12
+ tr
13
+ - row.each do |value|
14
+ td = value
15
+
16
+ javascript:
17
+ $('#netstat#{uuid}').DataTable({
18
+ "lengthChange": false,
19
+ });
20
+
@@ -0,0 +1,21 @@
1
+ - if processes
2
+ .row
3
+ .col.s12.no-padding.card
4
+ .table-header.flow-text Process
5
+ table.display id='process#{uuid}'
6
+ thead
7
+ tr
8
+ - processes.headers.each do |header|
9
+ th = header
10
+ tbody
11
+ - processes.list.each do |row|
12
+ tr
13
+ - row.values.each do |value|
14
+ td = value
15
+
16
+ javascript:
17
+ $('#process#{uuid}').DataTable({
18
+ "lengthChange": false,
19
+ "order": [[ 3, "desc" ]]
20
+ });
21
+
@@ -0,0 +1,40 @@
1
+ - if systemctl_unit_files
2
+ .row
3
+ .col.s12.no-padding.card
4
+ .table-header.flow-text
5
+ | Systemctl
6
+ table.display id='systemctl#{uuid}'
7
+ thead
8
+ tr
9
+ th Unit
10
+ th State
11
+ tbody
12
+ - systemctl_unit_files.each do |entry|
13
+ tr
14
+ td = entry.unit
15
+ td.center.white-text class="#{systemctl_color(entry)}"
16
+ = entry.status
17
+ .col.s12.grey.lighten-3
18
+ small
19
+ ul
20
+ li Static: the service is missing the [Install] section in its init script, so you cannot enable or disable it
21
+ li Generated: unit files are not automatically activated by systemd. There's nothing special about them as far as systemd is concerned
22
+ li Masked: systemd also has the ability to mark a unit as completely unstartable. Blocks Startup
23
+ javascript:
24
+ $('#systemctl#{uuid}').DataTable();
25
+
26
+
27
+ // Full Display
28
+ .row
29
+ .card.col.s12.no-padding
30
+ .header
31
+ .flow-text Systemctl Status
32
+ .col.s12.padding
33
+ - systemctl_unit_files.group_by(&:status).each do |key,group|
34
+ - next unless key == 'disabled' || key == 'enabled'
35
+ .row
36
+ .col.s12.center.blue.white-text style='margin-bottom: 5px' = key
37
+ .col.s12.aligner-wrap
38
+ - group.each do |entry|
39
+ .bubble
40
+ span.green.bubble-left.bubble-right = entry.unit