virtualmaster 0.0.7 → 0.1.0
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.
- data/.gitignore +0 -1
- data/Gemfile.lock +40 -0
- data/README.mdown +19 -14
- data/bin/virtualmaster +11 -6
- data/lib/vmaster.rb +1 -6
- data/lib/vmaster/callbacks.rb +92 -0
- data/lib/vmaster/callbacks/demo_callback.rb +16 -0
- data/lib/vmaster/callbacks/ssh_keys_callback.rb +36 -0
- data/lib/vmaster/cli.rb +6 -0
- data/lib/vmaster/server_commands.rb +25 -29
- data/lib/vmaster/version.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/virtualmaster.gemspec +2 -2
- metadata +18 -14
data/.gitignore
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
virtualmaster (0.1.0)
|
5
|
+
commander (~> 4.1.2)
|
6
|
+
deltacloud-client (~> 0.5.0)
|
7
|
+
net-ssh (~> 2.3.0)
|
8
|
+
terminal-table (~> 1.4.4)
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: http://rubygems.org/
|
12
|
+
specs:
|
13
|
+
commander (4.1.2)
|
14
|
+
highline (~> 1.6.11)
|
15
|
+
deltacloud-client (0.5.0)
|
16
|
+
nokogiri (>= 1.4.3)
|
17
|
+
rest-client (>= 1.6.1)
|
18
|
+
diff-lcs (1.1.3)
|
19
|
+
highline (1.6.11)
|
20
|
+
mime-types (1.18)
|
21
|
+
net-ssh (2.3.0)
|
22
|
+
nokogiri (1.5.2)
|
23
|
+
rest-client (1.6.7)
|
24
|
+
mime-types (>= 1.16)
|
25
|
+
rspec (2.9.0)
|
26
|
+
rspec-core (~> 2.9.0)
|
27
|
+
rspec-expectations (~> 2.9.0)
|
28
|
+
rspec-mocks (~> 2.9.0)
|
29
|
+
rspec-core (2.9.0)
|
30
|
+
rspec-expectations (2.9.1)
|
31
|
+
diff-lcs (~> 1.1.3)
|
32
|
+
rspec-mocks (2.9.0)
|
33
|
+
terminal-table (1.4.5)
|
34
|
+
|
35
|
+
PLATFORMS
|
36
|
+
ruby
|
37
|
+
|
38
|
+
DEPENDENCIES
|
39
|
+
rspec (~> 2)
|
40
|
+
virtualmaster!
|
data/README.mdown
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
#
|
1
|
+
# Virtualmaster command line interface
|
2
2
|
|
3
|
-
|
3
|
+
|
4
|
+
Proof of concept of Virtualmaster command line interface
|
4
5
|
|
5
6
|
# virtualmaster config
|
6
7
|
Running virtualmaster for first time.
|
@@ -13,13 +14,18 @@ Proof of concept of VirtualMaster command line interface
|
|
13
14
|
|
14
15
|
Settings stored within ~/.virtualmaster
|
15
16
|
|
16
|
-
# virtualmaster create demo1 --image
|
17
|
-
Using image '
|
18
|
-
Creating 'micro' instance (512 MB memory/
|
19
|
-
Instance launch request accepted
|
20
|
-
|
17
|
+
# virtualmaster create demo1 --image ubuntu_lucid
|
18
|
+
Using image 'ubuntu_lucid' with ID 124
|
19
|
+
Creating 'micro' instance (512 MB memory/10 GB storage)
|
20
|
+
Instance launch request accepted. Instance ID 47135
|
21
|
+
|
21
22
|
Default password 'AdVc:PBi8&7L'.
|
22
23
|
|
24
|
+
Waiting for instance................
|
25
|
+
Instance ready.
|
26
|
+
|
27
|
+
Try to login using `ssh root@80.79.29.246'
|
28
|
+
|
23
29
|
# virtualmaster instances
|
24
30
|
+-------+---------+----------------+
|
25
31
|
| name | state | ip_address |
|
@@ -33,22 +39,21 @@ The current version of `virtualmaster` command line interface should work with R
|
|
33
39
|
|
34
40
|
## Automatically install SSH keys
|
35
41
|
|
36
|
-
|
42
|
+
Virtualmaster CLI can install your SSH keys to a remote machine automatically using `--identity IDENTITY_FILE` command-line option.
|
37
43
|
|
38
|
-
|
39
|
-
virtualmaster create demo1 --image ubuntu_lucid --copy-id
|
44
|
+
virtualmaster create demo1 --image ubuntu_lucid --identity ~/.ssh/id_rsa
|
40
45
|
Using image 'ubuntu_lucid' with ID 124
|
41
46
|
Creating 'micro' instance (512 MB memory/10 GB storage)
|
42
47
|
Instance launch request accepted. Instance ID 45387
|
43
48
|
|
44
49
|
Default password 'vBK7i!kK'
|
50
|
+
|
45
51
|
Waiting for instance............
|
46
|
-
|
52
|
+
Instance ready.
|
53
|
+
|
54
|
+
Loading identity file /Users/virtualmaster/.ssh/id_rsa
|
47
55
|
|
48
|
-
Instance ready!
|
49
56
|
Try to login using `ssh root@195.140.253.130'
|
50
|
-
|
51
|
-
If you want to specify other key (ie. not ~/.ssh/id\_rsa) use option `--identity IDENTITY_FILE`.
|
52
57
|
|
53
58
|
## Instance size
|
54
59
|
|
data/bin/virtualmaster
CHANGED
@@ -12,19 +12,24 @@ end
|
|
12
12
|
|
13
13
|
program :name, "virtualmaster"
|
14
14
|
program :version, VirtualMaster::VERSION
|
15
|
-
program :description, "
|
15
|
+
program :description, "Virtualmaster command line interface"
|
16
16
|
program :help_formatter, :compact
|
17
17
|
|
18
18
|
default_command :help
|
19
19
|
|
20
20
|
VirtualMaster::CLI.run do
|
21
|
-
|
21
|
+
# load callback
|
22
|
+
callback_files = File.join(File.dirname(__FILE__), "../lib/vmaster/callbacks/*.rb")
|
23
|
+
Dir.glob(callback_files).each do |f|
|
24
|
+
VirtualMaster::Callbacks.load_file(f)
|
25
|
+
end
|
22
26
|
|
23
|
-
|
24
|
-
include Commander::UI::AskForClass
|
25
|
-
include Commander::Delegates
|
27
|
+
# TODO find callbacks in other rubygems
|
26
28
|
|
27
|
-
|
29
|
+
# include commands
|
30
|
+
require 'vmaster/config_command'
|
31
|
+
require 'vmaster/server_commands'
|
32
|
+
end
|
28
33
|
|
29
34
|
Commander::Runner.instance.run!
|
30
35
|
|
data/lib/vmaster.rb
CHANGED
@@ -4,6 +4,7 @@ require "vmaster/version"
|
|
4
4
|
require "vmaster/helpers"
|
5
5
|
require "vmaster/cli"
|
6
6
|
require "vmaster/request"
|
7
|
+
require "vmaster/callbacks"
|
7
8
|
|
8
9
|
require 'commander'
|
9
10
|
require 'commander/delegates'
|
@@ -17,9 +18,3 @@ include Commander::UI::AskForClass
|
|
17
18
|
include Commander::Delegates
|
18
19
|
|
19
20
|
$terminal.wrap_at = HighLine::SystemExtensions.terminal_size.first - 5 rescue 80 if $stdin.tty?
|
20
|
-
|
21
|
-
|
22
|
-
# include commands
|
23
|
-
require 'vmaster/config_command'
|
24
|
-
require 'vmaster/server_commands'
|
25
|
-
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
def callback(name, &block)
|
4
|
+
cb = VirtualMaster::Callbacks::Callback.new(name, &block)
|
5
|
+
|
6
|
+
VirtualMaster::CLI.callbacks << cb
|
7
|
+
end
|
8
|
+
|
9
|
+
module VirtualMaster
|
10
|
+
module Callbacks
|
11
|
+
|
12
|
+
class Callback
|
13
|
+
attr_reader :name
|
14
|
+
|
15
|
+
def initialize(name, &block)
|
16
|
+
@name = name
|
17
|
+
@blocks = {}
|
18
|
+
@option = nil
|
19
|
+
|
20
|
+
instance_eval &block
|
21
|
+
end
|
22
|
+
|
23
|
+
def before(event, &block)
|
24
|
+
store_callback(event, :before, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def after(event, &block)
|
28
|
+
store_callback(event, :after, &block)
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# command line options provide configuration
|
33
|
+
#
|
34
|
+
# TODO support for multiple options
|
35
|
+
#
|
36
|
+
def option(name, type, description)
|
37
|
+
@option = {
|
38
|
+
:name => name,
|
39
|
+
:type => type,
|
40
|
+
:description => description
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
def fire(event, phase, options, server)
|
45
|
+
@blocks[event][phase].call(options, server) if includes?(event, phase) && options[@option[:name]]
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_s
|
49
|
+
@blocks.inspect
|
50
|
+
end
|
51
|
+
|
52
|
+
def has_option?
|
53
|
+
not @option.nil?
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_option
|
57
|
+
arguments = []
|
58
|
+
|
59
|
+
option_name = "--#{@option[:name]}"
|
60
|
+
option_name << " VALUE" if @option[:type]
|
61
|
+
|
62
|
+
arguments << option_name
|
63
|
+
arguments << @option[:type] if @option[:type]
|
64
|
+
arguments << @option[:description]
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def includes?(event, phase)
|
70
|
+
@blocks.include?(event) && @blocks[event].include?(phase)
|
71
|
+
end
|
72
|
+
|
73
|
+
def store_callback(event, phase, &block)
|
74
|
+
callbacks = @blocks[event] || {}
|
75
|
+
|
76
|
+
callbacks[phase] = block
|
77
|
+
|
78
|
+
@blocks[event] = callbacks
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.load_file(file)
|
83
|
+
load file
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.trigger_event(event, phase, options, server = {})
|
87
|
+
CLI.callbacks.each do |callback|
|
88
|
+
callback.fire(event, phase, options, server)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#
|
2
|
+
# SSH keys callback
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'net/ssh'
|
6
|
+
require 'base64'
|
7
|
+
require 'openssl'
|
8
|
+
|
9
|
+
callback :ssh_copy_id do
|
10
|
+
option :identity, String, 'Identity file which is going to be copied to target machine'
|
11
|
+
|
12
|
+
before :create do |options|
|
13
|
+
# FIXME requires support for optional values
|
14
|
+
options[:identity] ||= File.join(ENV['HOME'], '.ssh/id_rsa')
|
15
|
+
|
16
|
+
abort "Specified identity file #{options[:identity]} doesn't exist!" unless File.exist?(options[:identity])
|
17
|
+
end
|
18
|
+
|
19
|
+
after :create do |options, server|
|
20
|
+
authorized_key = nil
|
21
|
+
|
22
|
+
say "Loading identity file #{options[:identity]}\n"
|
23
|
+
key = OpenSSL::PKey::RSA.new File.read options[:identity]
|
24
|
+
|
25
|
+
# build authorized key output string
|
26
|
+
authtype = key.class.to_s.split('::').last.downcase
|
27
|
+
b64pub = ::Base64.encode64(key.to_blob).strip.gsub(/[\r\n]/, '')
|
28
|
+
authorized_key = "ssh-%s %s\n" % [authtype, b64pub] # => ssh-rsa AAAAB3NzaC1...=
|
29
|
+
|
30
|
+
Net::SSH.start(server.public_addresses.first[:address], 'root', :password => options[:password]) do |ssh|
|
31
|
+
# TODO exception handling
|
32
|
+
output = ssh.exec!("mkdir ~/.ssh")
|
33
|
+
output = ssh.exec!("echo '#{authorized_key}' >>~/.ssh/authorized_keys")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/vmaster/cli.rb
CHANGED
@@ -5,6 +5,7 @@ module VirtualMaster
|
|
5
5
|
class CLI
|
6
6
|
@@api = nil
|
7
7
|
@@config = nil
|
8
|
+
@@callbacks = []
|
8
9
|
|
9
10
|
def self.run
|
10
11
|
# load config
|
@@ -39,5 +40,10 @@ module VirtualMaster
|
|
39
40
|
def self.config
|
40
41
|
@@config
|
41
42
|
end
|
43
|
+
|
44
|
+
def self.callbacks
|
45
|
+
@@callbacks
|
46
|
+
end
|
42
47
|
end
|
43
48
|
end
|
49
|
+
|
@@ -12,24 +12,32 @@ log.level = Logger::WARN
|
|
12
12
|
|
13
13
|
command :create do |c|
|
14
14
|
c.description = "Launch new server instance"
|
15
|
+
|
15
16
|
c.option '--image TEMPLATE', String, 'instance template to use'
|
16
17
|
c.option '--profile PROFILE', String, 'instance hardware profile'
|
17
|
-
c.option '--copy-id', 'install public key on a machine'
|
18
|
-
c.option '--identity IDENTITY', String, 'SSH identity to use (with --copy-id)'
|
19
18
|
c.option '--zone ZONE', String, 'Availability zone to launch instance i'
|
20
19
|
c.option '--level LEVEL', String, 'Instance level to use (personal, production)'
|
21
|
-
c.option '--
|
20
|
+
c.option '--detached', 'Do not wait for instance to become operational (disables callbacks)'
|
21
|
+
|
22
|
+
# generate options for callbacks
|
23
|
+
VirtualMaster::CLI.callbacks.each do |cb|
|
24
|
+
c.send :option, *(cb.to_option)
|
25
|
+
end
|
26
|
+
|
22
27
|
c.action do |args, options|
|
23
28
|
# default values
|
24
|
-
options.default :identity => File.join(ENV['HOME'], '.ssh/id_rsa')
|
25
29
|
options.default :zone => "prague-l1"
|
26
30
|
options.default :level => "personal"
|
31
|
+
options.default :interactive => true
|
27
32
|
|
28
33
|
name = args.shift || abort('Server name required')
|
29
34
|
|
30
35
|
# verify server name
|
31
36
|
abort("Virtual server with name #{name} already exists!") if VirtualMaster::Helpers.get_instance(name)
|
32
37
|
|
38
|
+
# support for non-interactive mode
|
39
|
+
options.interactive = false if options.detached
|
40
|
+
|
33
41
|
# image
|
34
42
|
image_name = nil
|
35
43
|
image_id = VirtualMaster::CLI.config[:default_image] || VirtualHost::DEFAULT_IMAGE
|
@@ -66,11 +74,14 @@ command :create do |c|
|
|
66
74
|
hwp = VirtualMaster::Helpers.get_hw_profile(profile[:memory], profile[:storage])
|
67
75
|
abort "Internal error: hardware profile not available" unless hwp
|
68
76
|
|
77
|
+
# before :create callbacks
|
78
|
+
VirtualMaster::Callbacks.trigger_event(:create, :before, options.__hash__, nil)
|
79
|
+
|
69
80
|
say "Creating '#{profile_name}' instance (#{profile[:memory]} MB memory/#{profile[:storage]/1024} GB storage)"
|
70
81
|
|
71
82
|
realm = "#{options.zone}-#{options.level}"
|
72
83
|
|
73
|
-
instance = VirtualMaster::Helpers.create_instance(name, image_id, hwp.id, realm)
|
84
|
+
instance = VirtualMaster::Helpers.create_instance(name, image_id, hwp.id, realm) if options.interactive
|
74
85
|
|
75
86
|
# TODO handle exceptions (invalid image/profile, limits, etc.)
|
76
87
|
|
@@ -78,11 +89,14 @@ command :create do |c|
|
|
78
89
|
|
79
90
|
# FIXME authentication is missrepresented within Ruby object
|
80
91
|
password = instance.authentication[:username]
|
81
|
-
|
92
|
+
puts
|
82
93
|
say "Default password '#{password}'"
|
94
|
+
puts
|
95
|
+
|
96
|
+
options.password = password
|
83
97
|
|
84
98
|
# copy-id implies waiting for instance to become operational
|
85
|
-
if options.
|
99
|
+
if options.interactive
|
86
100
|
print 'Waiting for instance'
|
87
101
|
|
88
102
|
while (instance = VirtualMaster::Helpers.get_instance(name)).state != "RUNNING" do
|
@@ -92,30 +106,12 @@ command :create do |c|
|
|
92
106
|
end
|
93
107
|
|
94
108
|
puts
|
109
|
+
puts "Instance ready."
|
110
|
+
|
111
|
+
# TODO consistent naming (instance vs server)
|
112
|
+
VirtualMaster::Callbacks.trigger_event(:create, :after, options.__hash__, instance)
|
95
113
|
|
96
|
-
# copy ssh id
|
97
|
-
if options.copy_id
|
98
|
-
authorized_key = nil
|
99
|
-
|
100
|
-
abort "Specified identity file #{options.identity} doesn't exists!" unless File.exist?(options.identity)
|
101
|
-
|
102
|
-
say "Loading identity file\n"
|
103
|
-
key = OpenSSL::PKey::RSA.new File.read options.identity
|
104
|
-
|
105
|
-
# build authorized key output string
|
106
|
-
authtype = key.class.to_s.split('::').last.downcase
|
107
|
-
b64pub = ::Base64.encode64(key.to_blob).strip.gsub(/[\r\n]/, '')
|
108
|
-
authorized_key = "ssh-%s %s\n" % [authtype, b64pub] # => ssh-rsa AAAAB3NzaC1...=
|
109
|
-
|
110
|
-
Net::SSH.start(instance.public_addresses.first[:address], 'root', :password => password) do |ssh|
|
111
|
-
# TODO exception handling
|
112
|
-
output = ssh.exec!("mkdir ~/.ssh")
|
113
|
-
output = ssh.exec!("echo '#{authorized_key}' >>~/.ssh/authorized_keys")
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
114
|
puts
|
118
|
-
puts "Instance ready!"
|
119
115
|
puts "Try to login using `ssh root@#{instance.public_addresses.first[:address]}'"
|
120
116
|
end
|
121
117
|
end
|
data/lib/vmaster/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -4,7 +4,7 @@ require 'vmaster'
|
|
4
4
|
|
5
5
|
program :name, "virtualmaster"
|
6
6
|
program :version, VirtualMaster::VERSION
|
7
|
-
program :description, "
|
7
|
+
program :description, "Virtualmaster command line interface"
|
8
8
|
program :help_formatter, :compact
|
9
9
|
|
10
10
|
default_command :test
|
data/virtualmaster.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.authors = ["Radim Marek"]
|
9
9
|
s.email = ["radim@laststation.net"]
|
10
10
|
s.homepage = "https://github.com/virtualmaster/virtualmaster-cli"
|
11
|
-
s.summary = %q{Command line interface to
|
12
|
-
s.description = %q{Command line interface to
|
11
|
+
s.summary = %q{Command line interface to Virtualmaster}
|
12
|
+
s.description = %q{Command line interface to Virtualmaster. Control your virtual infrastructure.}
|
13
13
|
|
14
14
|
s.rubyforge_project = "vmaster"
|
15
15
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: virtualmaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04-
|
12
|
+
date: 2012-04-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: commander
|
16
|
-
requirement: &
|
16
|
+
requirement: &70096844415120 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 4.1.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70096844415120
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: deltacloud-client
|
27
|
-
requirement: &
|
27
|
+
requirement: &70096844414580 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.5.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70096844414580
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: terminal-table
|
38
|
-
requirement: &
|
38
|
+
requirement: &70096844414100 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.4.4
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70096844414100
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: net-ssh
|
49
|
-
requirement: &
|
49
|
+
requirement: &70096844413440 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 2.3.0
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70096844413440
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rspec
|
60
|
-
requirement: &
|
60
|
+
requirement: &70096844412820 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,8 +65,8 @@ dependencies:
|
|
65
65
|
version: '2'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
69
|
-
description: Command line interface to
|
68
|
+
version_requirements: *70096844412820
|
69
|
+
description: Command line interface to Virtualmaster. Control your virtual infrastructure.
|
70
70
|
email:
|
71
71
|
- radim@laststation.net
|
72
72
|
executables:
|
@@ -76,10 +76,14 @@ extra_rdoc_files: []
|
|
76
76
|
files:
|
77
77
|
- .gitignore
|
78
78
|
- Gemfile
|
79
|
+
- Gemfile.lock
|
79
80
|
- README.mdown
|
80
81
|
- Rakefile
|
81
82
|
- bin/virtualmaster
|
82
83
|
- lib/vmaster.rb
|
84
|
+
- lib/vmaster/callbacks.rb
|
85
|
+
- lib/vmaster/callbacks/demo_callback.rb
|
86
|
+
- lib/vmaster/callbacks/ssh_keys_callback.rb
|
83
87
|
- lib/vmaster/cli.rb
|
84
88
|
- lib/vmaster/config_command.rb
|
85
89
|
- lib/vmaster/helpers.rb
|
@@ -112,7 +116,7 @@ rubyforge_project: vmaster
|
|
112
116
|
rubygems_version: 1.8.11
|
113
117
|
signing_key:
|
114
118
|
specification_version: 3
|
115
|
-
summary: Command line interface to
|
119
|
+
summary: Command line interface to Virtualmaster
|
116
120
|
test_files:
|
117
121
|
- spec/commands_spec.rb
|
118
122
|
- spec/spec_helper.rb
|