elecksee 1.0.10 → 1.0.12
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +4 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +7 -3
- data/elecksee-1.0.10.gem +0 -0
- data/lib/elecksee/ephemeral.rb +11 -6
- data/lib/elecksee/helpers/base.rb +105 -7
- data/lib/elecksee/knife/config.rb +37 -0
- data/lib/elecksee/lxc.rb +28 -17
- data/lib/elecksee/lxc_file_config.rb +33 -9
- data/lib/elecksee/version.rb +1 -1
- metadata +47 -40
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,18 +1,22 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
elecksee (1.0.
|
4
|
+
elecksee (1.0.11)
|
5
5
|
mixlib-shellout
|
6
6
|
net-ssh
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
|
12
|
-
|
11
|
+
childprocess (0.3.9)
|
12
|
+
ffi (~> 1.0, >= 1.0.11)
|
13
|
+
ffi (1.9.3)
|
14
|
+
mixlib-shellout (1.2.0)
|
15
|
+
net-ssh (2.7.0)
|
13
16
|
|
14
17
|
PLATFORMS
|
15
18
|
ruby
|
16
19
|
|
17
20
|
DEPENDENCIES
|
21
|
+
childprocess
|
18
22
|
elecksee!
|
data/elecksee-1.0.10.gem
ADDED
Binary file
|
data/lib/elecksee/ephemeral.rb
CHANGED
@@ -53,10 +53,10 @@ class Lxc
|
|
53
53
|
@ephemeral_binds = []
|
54
54
|
@lxc = nil
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
def register_traps
|
58
58
|
%w(TERM INT QUIT).each do |sig|
|
59
|
-
Signal.trap(sig){ cleanup }
|
59
|
+
Signal.trap(sig){ cleanup && raise }
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
@@ -71,6 +71,7 @@ class Lxc
|
|
71
71
|
begin
|
72
72
|
lxc.start
|
73
73
|
if(ephemeral_command)
|
74
|
+
lxc.wait_for_state(:running)
|
74
75
|
lxc.container_command(ephemeral_command)
|
75
76
|
else
|
76
77
|
cli_output
|
@@ -81,7 +82,11 @@ class Lxc
|
|
81
82
|
end
|
82
83
|
true
|
83
84
|
end
|
84
|
-
|
85
|
+
|
86
|
+
def create!
|
87
|
+
setup
|
88
|
+
end
|
89
|
+
|
85
90
|
def start!(*args)
|
86
91
|
register_traps
|
87
92
|
setup
|
@@ -114,7 +119,7 @@ class Lxc
|
|
114
119
|
end
|
115
120
|
|
116
121
|
private
|
117
|
-
|
122
|
+
|
118
123
|
def setup
|
119
124
|
create
|
120
125
|
build_overlay
|
@@ -138,14 +143,14 @@ class Lxc
|
|
138
143
|
)
|
139
144
|
@ephemeral_overlay.mount
|
140
145
|
end
|
141
|
-
|
146
|
+
|
142
147
|
def create
|
143
148
|
Dir.glob(File.join(lxc_dir, original, '*')).each do |o_path|
|
144
149
|
next unless File.file?(o_path)
|
145
150
|
command("cp #{o_path} #{File.join(path, File.basename(o_path))}", :sudo => true)
|
146
151
|
end
|
147
152
|
@lxc = Lxc.new(name)
|
148
|
-
command("mkdir -p
|
153
|
+
command("mkdir -p #{lxc.path.join('rootfs')}", :sudo => true)
|
149
154
|
update_net_hwaddr
|
150
155
|
end
|
151
156
|
|
@@ -1,19 +1,117 @@
|
|
1
1
|
class Lxc
|
2
2
|
class CommandFailed < StandardError
|
3
|
+
attr_accessor :original, :result
|
4
|
+
def initialize(orig, result=nil)
|
5
|
+
@original = orig
|
6
|
+
@result = result
|
7
|
+
super(orig.to_s)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Timeout < CommandFailed
|
12
|
+
end
|
13
|
+
|
14
|
+
class CommandResult
|
15
|
+
attr_reader :original, :stdout, :stderr
|
16
|
+
def initialize(result)
|
17
|
+
@original = result
|
18
|
+
if(result.class.ancestors.map(&:to_s).include?('ChildProcess::AbstractProcess'))
|
19
|
+
extract_childprocess
|
20
|
+
elsif(result.class.to_s == 'Mixlib::ShellOut')
|
21
|
+
extract_shellout
|
22
|
+
else
|
23
|
+
raise TypeError.new("Unknown process result type received: #{result.class}")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def extract_childprocess
|
28
|
+
original.io.stdout.rewind
|
29
|
+
original.io.stderr.rewind
|
30
|
+
@stdout = original.io.stdout.read
|
31
|
+
@stderr = original.io.stderr.read
|
32
|
+
original.io.stdout.delete
|
33
|
+
original.io.stderr.delete
|
34
|
+
end
|
35
|
+
|
36
|
+
def extract_shellout
|
37
|
+
@stdout = original.stdout
|
38
|
+
@stderr = original.stderr
|
39
|
+
end
|
3
40
|
end
|
4
41
|
|
5
42
|
module Helpers
|
6
|
-
|
43
|
+
|
7
44
|
def sudo
|
8
45
|
Lxc.sudo
|
9
46
|
end
|
10
|
-
|
47
|
+
|
11
48
|
# Simple helper to shell out
|
12
49
|
def run_command(cmd, args={})
|
50
|
+
cmd_type = Lxc.shellout_helper
|
51
|
+
unless(cmd_type)
|
52
|
+
if(defined?(ChildProcess))
|
53
|
+
cmd_type = :childprocess
|
54
|
+
else
|
55
|
+
cmd_type = :mixlib_shellout
|
56
|
+
end
|
57
|
+
end
|
58
|
+
case cmd_type
|
59
|
+
when :childprocess
|
60
|
+
require 'tempfile'
|
61
|
+
result = child_process_command(cmd, args)
|
62
|
+
when :mixlib_shellout
|
63
|
+
require 'mixlib/shellout'
|
64
|
+
result = mixlib_shellout_command(cmd, args)
|
65
|
+
else
|
66
|
+
raise ArgumentError.new("Unknown shellout helper provided: #{cmd_type}")
|
67
|
+
end
|
68
|
+
CommandResult.new(result)
|
69
|
+
end
|
70
|
+
|
71
|
+
def child_process_command(cmd, args)
|
13
72
|
retries = args[:allow_failure_retry].to_i
|
14
73
|
cmd = [sudo, cmd].join(' ') if args[:sudo]
|
15
74
|
begin
|
16
|
-
|
75
|
+
s_out = Tempfile.new('stdout')
|
76
|
+
s_err = Tempfile.new('stderr')
|
77
|
+
s_out.sync
|
78
|
+
s_err.sync
|
79
|
+
cmd_parts = cmd.split(' ')
|
80
|
+
cmd_parts.delete_if(&:empty?)
|
81
|
+
c_proc = ChildProcess.build(*cmd_parts)
|
82
|
+
c_proc.environment.merge('HOME' => detect_home)
|
83
|
+
c_proc.io.stdout = s_out
|
84
|
+
c_proc.io.stderr = s_err
|
85
|
+
c_proc.start
|
86
|
+
begin
|
87
|
+
c_proc.poll_for_exit(args[:timeout] || 1200)
|
88
|
+
rescue ChildProcess::TimeoutError
|
89
|
+
c_proc.stop
|
90
|
+
ensure
|
91
|
+
raise CommandFailed.new("Command failed: #{cmd}", CommandResult.new(c_proc)) if c_proc.crashed?
|
92
|
+
end
|
93
|
+
c_proc
|
94
|
+
rescue CommandFailed
|
95
|
+
if(retries > 0)
|
96
|
+
log.warn "LXC run command failed: #{cmd}"
|
97
|
+
log.warn "Retrying command. #{args[:allow_failure_retry].to_i - retries} of #{args[:allow_failure_retry].to_i} retries remain"
|
98
|
+
sleep(0.3)
|
99
|
+
retries -= 1
|
100
|
+
retry
|
101
|
+
elsif(args[:allow_failure])
|
102
|
+
false
|
103
|
+
else
|
104
|
+
raise
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def mixlib_shellout_command(cmd, args)
|
110
|
+
retries = args[:allow_failure_retry].to_i
|
111
|
+
cmd = [sudo, cmd].join(' ') if args[:sudo]
|
112
|
+
shlout = nil
|
113
|
+
begin
|
114
|
+
shlout = Mixlib::ShellOut.new(cmd,
|
17
115
|
:logger => defined?(Chef) && defined?(Chef::Log) ? Chef::Log.logger : log,
|
18
116
|
:live_stream => args[:livestream] ? STDOUT : nil,
|
19
117
|
:timeout => args[:timeout] || 1200,
|
@@ -22,7 +120,7 @@ class Lxc
|
|
22
120
|
shlout.run_command
|
23
121
|
shlout.error!
|
24
122
|
shlout
|
25
|
-
rescue Mixlib::ShellOut::ShellCommandFailed, CommandFailed, Mixlib::ShellOut::CommandTimeout
|
123
|
+
rescue Mixlib::ShellOut::ShellCommandFailed, CommandFailed, Mixlib::ShellOut::CommandTimeout => e
|
26
124
|
if(retries > 0)
|
27
125
|
log.warn "LXC run command failed: #{cmd}"
|
28
126
|
log.warn "Retrying command. #{args[:allow_failure_retry].to_i - retries} of #{args[:allow_failure_retry].to_i} retries remain"
|
@@ -32,7 +130,7 @@ class Lxc
|
|
32
130
|
elsif(args[:allow_failure])
|
33
131
|
false
|
34
132
|
else
|
35
|
-
raise
|
133
|
+
raise CommandFailed.new(e, CommandResult.new(shlout))
|
36
134
|
end
|
37
135
|
end
|
38
136
|
end
|
@@ -40,7 +138,7 @@ class Lxc
|
|
40
138
|
def command(*args)
|
41
139
|
run_command(*args)
|
42
140
|
end
|
43
|
-
|
141
|
+
|
44
142
|
def log
|
45
143
|
if(defined?(Chef))
|
46
144
|
Chef::Log
|
@@ -52,7 +150,7 @@ class Lxc
|
|
52
150
|
@logger
|
53
151
|
end
|
54
152
|
end
|
55
|
-
|
153
|
+
|
56
154
|
# Detect HOME environment variable. If not an acceptable
|
57
155
|
# value, set to /root or /tmp
|
58
156
|
def detect_home(set_if_missing=false)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'chef/mash'
|
2
|
+
require 'chef/json_compat'
|
3
|
+
|
4
|
+
class Lxc
|
5
|
+
class Knife
|
6
|
+
class Config
|
7
|
+
|
8
|
+
attr_reader :base_path
|
9
|
+
attr_reader :store
|
10
|
+
|
11
|
+
def initialize(args={})
|
12
|
+
|
13
|
+
|
14
|
+
def initialize(path='/etc/knife-lxc/config.json')
|
15
|
+
if(File.exists?(path))
|
16
|
+
@base_path = path
|
17
|
+
@store = Chef::JSONCompat.from_json(File.read(path))
|
18
|
+
else
|
19
|
+
raise ArgumentError.new("Provided path is not valid: #{path}")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def [](k)
|
24
|
+
@store[k]
|
25
|
+
end
|
26
|
+
|
27
|
+
def
|
28
|
+
|
29
|
+
def used_addresses
|
30
|
+
end
|
31
|
+
|
32
|
+
def available_addresses
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/elecksee/lxc.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
require 'elecksee/helpers/base'
|
2
|
-
require 'mixlib/shellout'
|
3
2
|
require 'pathname'
|
4
3
|
require 'tmpdir'
|
5
4
|
|
6
5
|
class Lxc
|
7
|
-
|
6
|
+
|
8
7
|
# Pathname#join does not act like File#join when joining paths that
|
9
8
|
# begin with '/', and that's dumb. So we'll make our own Pathname,
|
10
9
|
# with a #join that uses File
|
@@ -13,7 +12,7 @@ class Lxc
|
|
13
12
|
self.class.new(::File.join(self.to_path, *args))
|
14
13
|
end
|
15
14
|
end
|
16
|
-
|
15
|
+
|
17
16
|
include Helpers
|
18
17
|
|
19
18
|
attr_reader :name, :base_path, :lease_file, :preferred_device
|
@@ -21,9 +20,10 @@ class Lxc
|
|
21
20
|
class << self
|
22
21
|
|
23
22
|
include Helpers
|
24
|
-
|
23
|
+
|
25
24
|
attr_accessor :use_sudo
|
26
25
|
attr_accessor :base_path
|
26
|
+
attr_accessor :shellout_helper
|
27
27
|
|
28
28
|
def sudo
|
29
29
|
case use_sudo
|
@@ -33,11 +33,11 @@ class Lxc
|
|
33
33
|
"#{use_sudo} "
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def base_path
|
38
38
|
@base_path || '/var/lib/lxc'
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
# List running containers
|
42
42
|
def running
|
43
43
|
full_list[:running]
|
@@ -67,7 +67,7 @@ class Lxc
|
|
67
67
|
end
|
68
68
|
end.compact
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
# name:: Name of container
|
72
72
|
# Returns information about given container
|
73
73
|
def info(name)
|
@@ -82,6 +82,7 @@ class Lxc
|
|
82
82
|
else
|
83
83
|
res[:state] = :unknown
|
84
84
|
res[:pid] = -1
|
85
|
+
res
|
85
86
|
end
|
86
87
|
end
|
87
88
|
|
@@ -130,7 +131,7 @@ class Lxc
|
|
130
131
|
def stopped?
|
131
132
|
self.class.info(name)[:state] == :stopped
|
132
133
|
end
|
133
|
-
|
134
|
+
|
134
135
|
# Returns if container is frozen
|
135
136
|
def frozen?
|
136
137
|
self.class.info(name)[:state] == :frozen
|
@@ -281,7 +282,7 @@ class Lxc
|
|
281
282
|
run_command("#{sudo}lxc-stop -n #{name}", :allow_failure_retry => 3)
|
282
283
|
wait_for_state(:stopped)
|
283
284
|
end
|
284
|
-
|
285
|
+
|
285
286
|
# Freeze the container
|
286
287
|
def freeze
|
287
288
|
run_command("#{sudo}lxc-freeze -n #{name}")
|
@@ -309,15 +310,22 @@ class Lxc
|
|
309
310
|
end
|
310
311
|
end
|
311
312
|
|
313
|
+
# Destroy the container
|
314
|
+
def destroy
|
315
|
+
unless stopped?
|
316
|
+
stop
|
317
|
+
end
|
318
|
+
run_command("#{sudo}lxc-destroy -n #{name}")
|
319
|
+
end
|
320
|
+
|
312
321
|
def direct_container_command(command, args={})
|
313
|
-
com = "#{sudo}ssh root@#{args[:ip] || container_ip} -i /opt/hw-lxc-config/id_rsa -oStrictHostKeyChecking=no '#{command}'"
|
314
322
|
begin
|
315
|
-
|
316
|
-
|
317
|
-
:
|
323
|
+
run_command(
|
324
|
+
"ssh root@#{args[:ip] || container_ip} -i /opt/hw-lxc-config/id_rsa -oStrictHostKeyChecking=no '#{command}'",
|
325
|
+
:sudo => true,
|
326
|
+
:timeout => args[:timeout],
|
327
|
+
:live_stream => args[:live_stream]
|
318
328
|
)
|
319
|
-
cmd.run_command
|
320
|
-
cmd.error!
|
321
329
|
true
|
322
330
|
rescue
|
323
331
|
raise if args[:raise_on_failure]
|
@@ -330,7 +338,7 @@ class Lxc
|
|
330
338
|
def run_command(cmd, args={})
|
331
339
|
retries = args[:allow_failure_retry].to_i
|
332
340
|
begin
|
333
|
-
shlout = Mixlib::ShellOut.new(cmd,
|
341
|
+
shlout = Mixlib::ShellOut.new(cmd,
|
334
342
|
:logger => defined?(Chef) ? Chef::Log.logger : log,
|
335
343
|
:live_stream => args[:livestream] ? nil : STDOUT,
|
336
344
|
:timeout => args[:timeout] || 1200,
|
@@ -354,6 +362,7 @@ class Lxc
|
|
354
362
|
end
|
355
363
|
end
|
356
364
|
|
365
|
+
>>>>>>> [ephemeral] lxc.destroy()
|
357
366
|
def wait_for_state(desired_state, args={})
|
358
367
|
args[:sleep_interval] ||= 1.0
|
359
368
|
wait_total = 0.0
|
@@ -376,7 +385,7 @@ class Lxc
|
|
376
385
|
home
|
377
386
|
end
|
378
387
|
end
|
379
|
-
|
388
|
+
|
380
389
|
# cmd:: Shell command string
|
381
390
|
# retries:: Number of retry attempts (1 second sleep interval)
|
382
391
|
# Runs command in container via ssh
|
@@ -414,3 +423,5 @@ class Lxc
|
|
414
423
|
end
|
415
424
|
|
416
425
|
end
|
426
|
+
|
427
|
+
Lxc.shellout_helper = :mixlib_shellout
|
@@ -5,13 +5,37 @@ class Lxc
|
|
5
5
|
attr_reader :base
|
6
6
|
|
7
7
|
class << self
|
8
|
+
|
9
|
+
def convert_to_hash(thing)
|
10
|
+
unless(thing.is_a?(Hash))
|
11
|
+
result = defined?(Mash) ? Mash.new : {}
|
12
|
+
thing.each do |k,v|
|
13
|
+
result[k] = v.respond_to?(:keys) && v.respond_to?(:values) ? convert_to_hash(v) : v
|
14
|
+
end
|
15
|
+
end
|
16
|
+
result || thing
|
17
|
+
end
|
18
|
+
|
19
|
+
def symbolize_hash(thing)
|
20
|
+
if(defined?(Mash))
|
21
|
+
Mash.new(thing)
|
22
|
+
else
|
23
|
+
result = {}
|
24
|
+
thing.each do |k,v|
|
25
|
+
result[k.to_sym] = v.is_a?(Hash) ? symbolize_hash(v) : v
|
26
|
+
end
|
27
|
+
result
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
8
31
|
def generate_config(resource)
|
32
|
+
resource = symbolize_hash(convert_to_hash(resource))
|
9
33
|
config = []
|
10
|
-
config << "lxc.utsname = #{resource
|
11
|
-
if(resource
|
12
|
-
config << "lxc.aa_profile = #{resource
|
34
|
+
config << "lxc.utsname = #{resource[:utsname]}"
|
35
|
+
if(resource[:aa_profile])
|
36
|
+
config << "lxc.aa_profile = #{resource[:aa_profile]}"
|
13
37
|
end
|
14
|
-
[resource.network].flatten.each do |net_hash|
|
38
|
+
[resource.[:network]].flatten.each do |net_hash|
|
15
39
|
nhsh = Mash.new(net_hash)
|
16
40
|
flags = nhsh.delete(:flags)
|
17
41
|
%w(type link).each do |k|
|
@@ -24,14 +48,14 @@ class Lxc
|
|
24
48
|
config << "lxc.network.flags = #{flags}"
|
25
49
|
end
|
26
50
|
end
|
27
|
-
if(resource
|
28
|
-
config << "lxc.cap.drop = #{Array(resource
|
51
|
+
if(resource[:cap_drop])
|
52
|
+
config << "lxc.cap.drop = #{Array(resource[:cap_drop]).join(' ')}"
|
29
53
|
end
|
30
54
|
%w(pts tty arch devttydir mount mount_entry rootfs rootfs_mount pivotdir).each do |k|
|
31
|
-
config << "lxc.#{k.sub('_', '.')} = #{resource.
|
55
|
+
config << "lxc.#{k.sub('_', '.')} = #{resource[k.to_sym]}" if resource[k.to_sym]
|
32
56
|
end
|
33
57
|
prefix = 'lxc.cgroup'
|
34
|
-
resource
|
58
|
+
resource[:cgroup].each_pair do |key, value|
|
35
59
|
if(value.is_a?(Array))
|
36
60
|
value.each do |val|
|
37
61
|
config << "#{prefix}.#{key} = #{val}"
|
@@ -49,7 +73,7 @@ class Lxc
|
|
49
73
|
raise 'LXC config file not found' unless File.exists?(path)
|
50
74
|
@path = path
|
51
75
|
@network = []
|
52
|
-
@base = Mash.new
|
76
|
+
@base = defined?(Mash) ? Mash.new : {}
|
53
77
|
parse!
|
54
78
|
end
|
55
79
|
|
data/lib/elecksee/version.rb
CHANGED
metadata
CHANGED
@@ -1,48 +1,52 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elecksee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.12
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Chris Roberts
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mixlib-shellout
|
16
|
-
|
17
|
-
none: false
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
18
17
|
requirements:
|
19
|
-
- -
|
18
|
+
- - ">="
|
20
19
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
22
|
-
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
version: !binary |-
|
21
|
+
MA==
|
25
22
|
none: false
|
23
|
+
requirement: !ruby/object:Gem::Requirement
|
26
24
|
requirements:
|
27
|
-
- -
|
25
|
+
- - ">="
|
28
26
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
27
|
+
version: !binary |-
|
28
|
+
MA==
|
29
|
+
none: false
|
30
|
+
prerelease: false
|
31
|
+
type: :runtime
|
30
32
|
- !ruby/object:Gem::Dependency
|
31
33
|
name: net-ssh
|
32
|
-
|
33
|
-
none: false
|
34
|
+
version_requirements: !ruby/object:Gem::Requirement
|
34
35
|
requirements:
|
35
|
-
- -
|
36
|
+
- - ">="
|
36
37
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
38
|
-
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
version: !binary |-
|
39
|
+
MA==
|
41
40
|
none: false
|
41
|
+
requirement: !ruby/object:Gem::Requirement
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ">="
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
45
|
+
version: !binary |-
|
46
|
+
MA==
|
47
|
+
none: false
|
48
|
+
prerelease: false
|
49
|
+
type: :runtime
|
46
50
|
description: LXC helpers
|
47
51
|
email: chrisroberts.code@gmail.com
|
48
52
|
executables:
|
@@ -51,47 +55,50 @@ extensions: []
|
|
51
55
|
extra_rdoc_files: []
|
52
56
|
files:
|
53
57
|
- elecksee.gemspec
|
58
|
+
- Gemfile
|
59
|
+
- README.md
|
60
|
+
- elecksee-1.0.10.gem
|
61
|
+
- LICENSE
|
62
|
+
- CHANGELOG.md
|
63
|
+
- Gemfile.lock
|
64
|
+
- lib/elecksee.rb
|
54
65
|
- lib/elecksee/clone.rb
|
55
66
|
- lib/elecksee/version.rb
|
56
67
|
- lib/elecksee/lxc_file_config.rb
|
68
|
+
- lib/elecksee/ephemeral.rb
|
69
|
+
- lib/elecksee/lxc.rb
|
57
70
|
- lib/elecksee/helpers/copies.rb
|
58
71
|
- lib/elecksee/helpers/options.rb
|
59
72
|
- lib/elecksee/helpers/base.rb
|
73
|
+
- lib/elecksee/knife/config.rb
|
60
74
|
- lib/elecksee/storage/overlay_mount.rb
|
61
75
|
- lib/elecksee/storage/virtual_device.rb
|
62
76
|
- lib/elecksee/storage/overlay_directory.rb
|
63
|
-
- lib/elecksee/ephemeral.rb
|
64
|
-
- lib/elecksee/lxc.rb
|
65
|
-
- lib/elecksee.rb
|
66
|
-
- Gemfile
|
67
|
-
- README.md
|
68
|
-
- LICENSE
|
69
77
|
- bin/lxc-awesome-ephemeral
|
70
|
-
- CHANGELOG.md
|
71
|
-
- Gemfile.lock
|
72
78
|
homepage: http://github.com/chrisroberts/elecksee
|
73
79
|
licenses: []
|
74
|
-
post_install_message:
|
80
|
+
post_install_message:
|
75
81
|
rdoc_options: []
|
76
82
|
require_paths:
|
77
83
|
- lib
|
78
84
|
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
-
none: false
|
80
85
|
requirements:
|
81
|
-
- -
|
86
|
+
- - ">="
|
82
87
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
84
|
-
|
88
|
+
version: !binary |-
|
89
|
+
MA==
|
85
90
|
none: false
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
92
|
requirements:
|
87
|
-
- -
|
93
|
+
- - ">="
|
88
94
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
95
|
+
version: !binary |-
|
96
|
+
MA==
|
97
|
+
none: false
|
90
98
|
requirements: []
|
91
|
-
rubyforge_project:
|
99
|
+
rubyforge_project:
|
92
100
|
rubygems_version: 1.8.24
|
93
|
-
signing_key:
|
101
|
+
signing_key:
|
94
102
|
specification_version: 3
|
95
103
|
summary: LXC helpers
|
96
104
|
test_files: []
|
97
|
-
has_rdoc:
|