ecl 1.2.1 → 3.0.0.pre.alpha1
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 +5 -5
- data/.gitignore +0 -1
- data/Gemfile +1 -0
- data/Gemfile.lock +48 -0
- data/README.md +112 -89
- data/Rakefile +1 -0
- data/eclair.gemspec +7 -4
- data/exe/ecl +62 -4
- data/lib/eclair.rb +21 -18
- data/lib/eclair/color.rb +3 -0
- data/lib/eclair/config.rb +68 -21
- data/lib/eclair/grid.rb +242 -274
- data/lib/eclair/group_item.rb +33 -0
- data/lib/eclair/item.rb +42 -0
- data/lib/eclair/less_viewer.rb +2 -1
- data/lib/eclair/provider.rb +15 -0
- data/lib/eclair/providers/ec2.rb +2 -0
- data/lib/eclair/providers/ec2/ec2_group_item.rb +16 -0
- data/lib/eclair/providers/ec2/ec2_item.rb +136 -0
- data/lib/eclair/providers/ec2/ec2_provider.rb +118 -0
- data/lib/eclair/providers/gce.rb +2 -0
- data/lib/eclair/providers/gce/gce_group_item.rb +15 -0
- data/lib/eclair/providers/gce/gce_item.rb +117 -0
- data/lib/eclair/providers/gce/gce_provider.rb +34 -0
- data/lib/eclair/providers/k8s.rb +2 -0
- data/lib/eclair/providers/k8s/k8s_group_item.rb +15 -0
- data/lib/eclair/providers/k8s/k8s_item.rb +92 -0
- data/lib/eclair/providers/k8s/k8s_provider.rb +34 -0
- data/lib/eclair/version.rb +2 -1
- data/out.gif +0 -0
- data/templates/eclrc.template +81 -35
- metadata +60 -27
- data/bin/console +0 -10
- data/lib/eclair/cell.rb +0 -101
- data/lib/eclair/column.rb +0 -52
- data/lib/eclair/console.rb +0 -56
- data/lib/eclair/group.rb +0 -55
- data/lib/eclair/helpers/aws_helper.rb +0 -157
- data/lib/eclair/helpers/benchmark_helper.rb +0 -19
- data/lib/eclair/helpers/common_helper.rb +0 -24
- data/lib/eclair/instance.rb +0 -165
- data/lib/eclair/matcher.rb +0 -19
data/bin/console
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "eclair"
|
4
|
-
|
5
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
6
|
-
# with your gem easier. You can also use a different console, if you like.
|
7
|
-
|
8
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
9
|
-
require "pry"
|
10
|
-
Pry.start
|
data/lib/eclair/cell.rb
DELETED
@@ -1,101 +0,0 @@
|
|
1
|
-
module Eclair
|
2
|
-
class Cell
|
3
|
-
include CommonHelper
|
4
|
-
|
5
|
-
attr_accessor :column
|
6
|
-
attr_accessor :selected
|
7
|
-
|
8
|
-
def initialize *args
|
9
|
-
@current = false
|
10
|
-
@selected = false
|
11
|
-
end
|
12
|
-
|
13
|
-
def color(*color)
|
14
|
-
if @current
|
15
|
-
color = config.current_color
|
16
|
-
elsif @selected
|
17
|
-
color = config.selected_color
|
18
|
-
end
|
19
|
-
|
20
|
-
if Grid.mode == :search && @current
|
21
|
-
color = config.search_color
|
22
|
-
end
|
23
|
-
|
24
|
-
Color.fetch(*color)
|
25
|
-
end
|
26
|
-
|
27
|
-
def render options = 0
|
28
|
-
drawy = y - column.scroll
|
29
|
-
return if drawy < 0 || drawy >= Grid.maxy
|
30
|
-
w = Grid.cell_width
|
31
|
-
setpos(drawy + Grid::HEADER_ROWS, x * w)
|
32
|
-
str = format.slice(0, w).ljust(w)
|
33
|
-
attron(color) do
|
34
|
-
addstr(str)
|
35
|
-
end
|
36
|
-
Grid.render_header
|
37
|
-
end
|
38
|
-
|
39
|
-
def deselect
|
40
|
-
@selected = false
|
41
|
-
Grid.selected.delete self
|
42
|
-
redraw
|
43
|
-
end
|
44
|
-
|
45
|
-
def select
|
46
|
-
@selected = true
|
47
|
-
Grid.selected << self
|
48
|
-
redraw
|
49
|
-
end
|
50
|
-
|
51
|
-
def toggle_select
|
52
|
-
if respond_to? :each
|
53
|
-
if all?(&:selected)
|
54
|
-
each(&:deselect)
|
55
|
-
else
|
56
|
-
each(&:select)
|
57
|
-
end
|
58
|
-
else
|
59
|
-
if @selected
|
60
|
-
deselect
|
61
|
-
else
|
62
|
-
select
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def current
|
68
|
-
@current = true
|
69
|
-
check_scroll
|
70
|
-
redraw
|
71
|
-
end
|
72
|
-
|
73
|
-
def check_scroll
|
74
|
-
unless column.drawable? y
|
75
|
-
column.rescroll y
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def decurrent
|
80
|
-
@current = false
|
81
|
-
redraw
|
82
|
-
end
|
83
|
-
|
84
|
-
def redraw
|
85
|
-
render
|
86
|
-
refresh
|
87
|
-
end
|
88
|
-
|
89
|
-
def select_indicator
|
90
|
-
if @selected
|
91
|
-
if Grid.mode == :select
|
92
|
-
"*"
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def method_missing name, *args, &blk
|
98
|
-
object.send(name)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
data/lib/eclair/column.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
module Eclair
|
2
|
-
class Column
|
3
|
-
include CommonHelper
|
4
|
-
array_accessor :expand
|
5
|
-
attr_accessor :scroll
|
6
|
-
attr_accessor :items
|
7
|
-
|
8
|
-
def initialize index
|
9
|
-
@index = index
|
10
|
-
@items = []
|
11
|
-
@scroll = 0
|
12
|
-
end
|
13
|
-
|
14
|
-
def << item
|
15
|
-
@items << item
|
16
|
-
end
|
17
|
-
|
18
|
-
def x
|
19
|
-
@index
|
20
|
-
end
|
21
|
-
|
22
|
-
def drawable? y
|
23
|
-
(@scroll...Grid.maxy+@scroll).include? y
|
24
|
-
end
|
25
|
-
|
26
|
-
def rescroll y
|
27
|
-
if y < @scroll
|
28
|
-
@scroll = y
|
29
|
-
elsif y >= Grid.maxy
|
30
|
-
@scroll = y - Grid.maxy + 1
|
31
|
-
end
|
32
|
-
expand.each do |i|
|
33
|
-
i.render
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def expand
|
38
|
-
expanded = []
|
39
|
-
if config.group_by
|
40
|
-
@items.each do |item|
|
41
|
-
expanded << item
|
42
|
-
item.each do |instance|
|
43
|
-
expanded << instance
|
44
|
-
end
|
45
|
-
end
|
46
|
-
expanded
|
47
|
-
else
|
48
|
-
@items
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
data/lib/eclair/console.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
module Eclair
|
2
|
-
module Console
|
3
|
-
include CommonHelper
|
4
|
-
extend self
|
5
|
-
|
6
|
-
def init
|
7
|
-
config
|
8
|
-
ENV['ESCDELAY'] = "0"
|
9
|
-
init_screen
|
10
|
-
stdscr.keypad = true
|
11
|
-
start_color
|
12
|
-
use_default_colors
|
13
|
-
crmode
|
14
|
-
noecho
|
15
|
-
curs_set(0)
|
16
|
-
Grid.start
|
17
|
-
trap("INT") { exit }
|
18
|
-
loop do
|
19
|
-
case k = stdscr.getch
|
20
|
-
when KEY_RESIZE
|
21
|
-
Grid.resize
|
22
|
-
when KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN
|
23
|
-
Grid.move k
|
24
|
-
when " "
|
25
|
-
if Grid.mode == :search
|
26
|
-
Grid.end_search
|
27
|
-
end
|
28
|
-
Grid.select
|
29
|
-
when 10
|
30
|
-
case Grid.mode
|
31
|
-
when :search
|
32
|
-
Grid.end_search
|
33
|
-
else
|
34
|
-
Grid.ssh
|
35
|
-
end
|
36
|
-
when 27
|
37
|
-
if Grid.mode == :search
|
38
|
-
Grid.cancel_search
|
39
|
-
end
|
40
|
-
when ?!
|
41
|
-
Grid.debug
|
42
|
-
when ??
|
43
|
-
Grid.cursor_inspect
|
44
|
-
when KEY_BACKSPACE, 127
|
45
|
-
Grid.search(nil)
|
46
|
-
when String
|
47
|
-
Grid.search(k)
|
48
|
-
else
|
49
|
-
# Aws.reload_instances
|
50
|
-
# Grid.render_all
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
data/lib/eclair/group.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
module Eclair
|
2
|
-
class Group < Cell
|
3
|
-
array_accessor :items
|
4
|
-
|
5
|
-
def initialize group_name, column = nil
|
6
|
-
super
|
7
|
-
@group_name = group_name
|
8
|
-
@items = []
|
9
|
-
@column = column
|
10
|
-
end
|
11
|
-
|
12
|
-
def << instance
|
13
|
-
@items << instance
|
14
|
-
end
|
15
|
-
|
16
|
-
def x
|
17
|
-
column.x
|
18
|
-
end
|
19
|
-
|
20
|
-
def y
|
21
|
-
column.index(self)
|
22
|
-
end
|
23
|
-
|
24
|
-
def color
|
25
|
-
super(*config.group_color)
|
26
|
-
end
|
27
|
-
|
28
|
-
def format
|
29
|
-
" #{@group_name} (#{count(&:connectable?)}) #{select_indicator}"
|
30
|
-
end
|
31
|
-
|
32
|
-
def header
|
33
|
-
["Group #{@group_name}",
|
34
|
-
"#{count} Instances Total",
|
35
|
-
"#{count(&:running?)} Instances Running"]
|
36
|
-
end
|
37
|
-
|
38
|
-
def items
|
39
|
-
@items
|
40
|
-
end
|
41
|
-
|
42
|
-
def name
|
43
|
-
@group_name
|
44
|
-
end
|
45
|
-
|
46
|
-
def object
|
47
|
-
@group_name
|
48
|
-
end
|
49
|
-
|
50
|
-
def info
|
51
|
-
@items.map(&:info)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
@@ -1,157 +0,0 @@
|
|
1
|
-
module Eclair
|
2
|
-
module Aws
|
3
|
-
extend self
|
4
|
-
|
5
|
-
def ec2
|
6
|
-
@ec2 ||= ::Aws::EC2::Client.new
|
7
|
-
end
|
8
|
-
|
9
|
-
def route53
|
10
|
-
@route53 ||= ::Aws::Route53::Client.new
|
11
|
-
end
|
12
|
-
|
13
|
-
def instances
|
14
|
-
fetch_all unless @instances
|
15
|
-
@instances
|
16
|
-
end
|
17
|
-
|
18
|
-
def instance_map
|
19
|
-
@instance_map
|
20
|
-
end
|
21
|
-
|
22
|
-
def images **options
|
23
|
-
if options.delete :force
|
24
|
-
@images_thread.join
|
25
|
-
end
|
26
|
-
@images || []
|
27
|
-
end
|
28
|
-
|
29
|
-
def images?
|
30
|
-
!@images_thread.alive?
|
31
|
-
end
|
32
|
-
|
33
|
-
def dns_records **options
|
34
|
-
if options.delete :force
|
35
|
-
@route53_thread.join
|
36
|
-
end
|
37
|
-
@dns_records || []
|
38
|
-
end
|
39
|
-
|
40
|
-
def dns_records?
|
41
|
-
!@route53_thread.alive?
|
42
|
-
end
|
43
|
-
|
44
|
-
def security_groups **options
|
45
|
-
if options.delete :force
|
46
|
-
@security_groups_thread.join
|
47
|
-
end
|
48
|
-
@security_groups || []
|
49
|
-
end
|
50
|
-
|
51
|
-
def security_groups?
|
52
|
-
!@security_groups_thread.alive?
|
53
|
-
end
|
54
|
-
|
55
|
-
def reload_instances
|
56
|
-
return if @reload_thread && @reload_thread.alive?
|
57
|
-
|
58
|
-
if @reload_thread
|
59
|
-
@instances = @r_instances
|
60
|
-
@instance_map = @r_instances_map
|
61
|
-
@images += @new_images
|
62
|
-
@dns_records = @r_dns_records
|
63
|
-
@security_groups = @r_security_groups
|
64
|
-
Grid.assign
|
65
|
-
@reload_thread = nil
|
66
|
-
end
|
67
|
-
|
68
|
-
return if @last_reloaded && Time.now - @last_reloaded < 5
|
69
|
-
|
70
|
-
@reload_thread = Thread.new do
|
71
|
-
r_instances, r_instances_map = fetch_instances
|
72
|
-
@new_instances = r_instances.map(&:instance_id) - @instances.map(&:instance_id)
|
73
|
-
if new_instances.empty?
|
74
|
-
@new_images = []
|
75
|
-
else
|
76
|
-
image_ids = @new_instances.map(&:image_id)
|
77
|
-
[
|
78
|
-
Thread.new do
|
79
|
-
@new_images = fetch_images(image_ids)
|
80
|
-
end,
|
81
|
-
|
82
|
-
Thread.new do
|
83
|
-
@r_security_groups = fetch_security_groups
|
84
|
-
end
|
85
|
-
].each(&:join)
|
86
|
-
end
|
87
|
-
@last_reloaded = Time.now
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
private
|
92
|
-
|
93
|
-
def fetch_images image_ids
|
94
|
-
ec2.describe_images(image_ids: image_ids).images.flatten
|
95
|
-
end
|
96
|
-
|
97
|
-
def fetch_dns_records
|
98
|
-
hosted_zone_ids = route53.list_hosted_zones.hosted_zones.map(&:id)
|
99
|
-
hosted_zone_ids.map { |hosted_zone_id|
|
100
|
-
route53.list_resource_record_sets(hosted_zone_id: hosted_zone_id).map { |resp|
|
101
|
-
resp.resource_record_sets
|
102
|
-
}
|
103
|
-
}.flatten
|
104
|
-
end
|
105
|
-
|
106
|
-
def fetch_security_groups
|
107
|
-
ec2.describe_security_groups.map{ |resp|
|
108
|
-
resp.security_groups
|
109
|
-
}.flatten
|
110
|
-
end
|
111
|
-
|
112
|
-
def fetch_instances
|
113
|
-
instance_map = {}
|
114
|
-
|
115
|
-
instances = ec2.describe_instances.map{ |resp|
|
116
|
-
resp.data.reservations.map(&:instances)
|
117
|
-
}.flatten
|
118
|
-
|
119
|
-
instances.each do |i|
|
120
|
-
instance_map[i.instance_id] = i
|
121
|
-
end
|
122
|
-
|
123
|
-
[instances, instance_map]
|
124
|
-
end
|
125
|
-
|
126
|
-
|
127
|
-
def fetch_all
|
128
|
-
@instances, @instance_map = fetch_instances
|
129
|
-
|
130
|
-
image_ids = @instances.map(&:image_id)
|
131
|
-
|
132
|
-
if @threads
|
133
|
-
@threads.each{ |t| t.kill }
|
134
|
-
end
|
135
|
-
|
136
|
-
Thread.abort_on_exception = true
|
137
|
-
|
138
|
-
@threads = []
|
139
|
-
|
140
|
-
@threads << @images_thread = Thread.new do
|
141
|
-
@images = fetch_images(image_ids)
|
142
|
-
end
|
143
|
-
|
144
|
-
@threads << @route53_thread = Thread.new do
|
145
|
-
@dns_records = fetch_dns_records
|
146
|
-
end
|
147
|
-
|
148
|
-
@threads << @security_groups_thread = Thread.new do
|
149
|
-
@security_groups = fetch_security_groups
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
def find_username image_id
|
154
|
-
config.ssh_username.call(image_id, @images[image_id].name)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require "benchmark"
|
2
|
-
|
3
|
-
module Eclair
|
4
|
-
module BenchmarkHelper
|
5
|
-
def benchmark(name, &blk)
|
6
|
-
result = nil
|
7
|
-
if ENV['BM']
|
8
|
-
bm = Benchmark.measure do
|
9
|
-
result = blk.call
|
10
|
-
end
|
11
|
-
STDERR.puts "Elasped Time for #{name}:"
|
12
|
-
STDERR.puts bm
|
13
|
-
result
|
14
|
-
else
|
15
|
-
blk.call
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|