bbcloud 0.10.1 → 0.11.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/bbcloud.gemspec +2 -2
- data/lib/bbcloud/api.rb +1 -1
- data/lib/bbcloud/cli.rb +8 -2
- data/lib/bbcloud/commands/servers-activate-cloud.rb +23 -0
- data/lib/bbcloud/commands/types-list.rb +1 -1
- data/lib/bbcloud/config.rb +1 -0
- data/lib/bbcloud/servers.rb +4 -0
- data/lib/bbcloud/types.rb +8 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/brightbox.rb +162 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/account.rb +51 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/cloud_ip.rb +47 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/cloud_ips.rb +34 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/flavor.rb +33 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/flavors.rb +28 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/image.rb +56 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/images.rb +28 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/load_balancer.rb +50 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/load_balancers.rb +28 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/server.rb +108 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/servers.rb +29 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/user.rb +39 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/users.rb +29 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/zone.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/zones.rb +29 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/activate_console_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/add_listeners_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/add_nodes_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_api_client.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_cloud_ip.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_image.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_load_balancer.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_server.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_api_client.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_cloud_ip.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_image.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_account.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_api_client.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_cloud_ip.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_image.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_interface.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_server_type.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_user.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_zone.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_api_clients.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_cloud_ips.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_images.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_load_balancers.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_server_types.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_servers.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_users.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_zones.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/map_cloud_ip.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/remove_listeners_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/remove_nodes_load_balancer.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/reset_ftp_password_account.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/resize_server.rb +19 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/shutdown_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/snapshot_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/start_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/stop_server.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/unmap_cloud_ip.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_account.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_api_client.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_image.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_load_balancer.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_server.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_user.rb +21 -0
- data/lib/bbcloud/vendor/fog/lib/fog/compute.rb +43 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/attributes.rb +178 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/collection.rb +127 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/connection.rb +35 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/credentials.rb +92 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/deprecation.rb +23 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/errors.rb +20 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/hmac.rb +48 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/mock.rb +68 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/model.rb +57 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/parser.rb +99 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/provider.rb +18 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/scp.rb +67 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/service.rb +175 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/ssh.rb +120 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/time.rb +27 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core/wait_for.rb +17 -0
- data/lib/bbcloud/vendor/fog/lib/fog/core.rb +32 -0
- data/lib/bbcloud/vendor/fog/lib/fog/providers/brightbox.rb +9 -0
- data/lib/bbcloud/vendor/fog/lib/fog/providers.rb +9 -0
- data/lib/bbcloud/vendor/fog/lib/fog.rb +14 -0
- data/lib/bbcloud/version.rb +1 -1
- metadata +105 -26
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Parsers
|
5
|
+
class Base < Nokogiri::XML::SAX::Document
|
6
|
+
|
7
|
+
attr_reader :response
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
reset
|
11
|
+
end
|
12
|
+
|
13
|
+
def reset
|
14
|
+
@response = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def characters(string)
|
18
|
+
@value ||= ''
|
19
|
+
@value << string.strip
|
20
|
+
end
|
21
|
+
|
22
|
+
def start_element(name, attrs = [])
|
23
|
+
@value = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def attr_value(name, attrs)
|
27
|
+
(entry = attrs.detect {|a, v| a == name }) && entry.last
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
module Fog
|
35
|
+
class ToHashDocument < Nokogiri::XML::SAX::Document
|
36
|
+
|
37
|
+
def initialize
|
38
|
+
@stack = []
|
39
|
+
end
|
40
|
+
|
41
|
+
def characters(string)
|
42
|
+
@value ||= ''
|
43
|
+
@value << string.strip
|
44
|
+
end
|
45
|
+
|
46
|
+
def end_element(name)
|
47
|
+
last = @stack.pop
|
48
|
+
if last.empty? && @value.empty?
|
49
|
+
@stack.last[name.to_sym] = ''
|
50
|
+
elsif last == {:i_nil=>"true"}
|
51
|
+
@stack.last[name.to_sym] = nil
|
52
|
+
elsif !@value.empty?
|
53
|
+
@stack.last[name.to_sym] = @value
|
54
|
+
end
|
55
|
+
@value = ''
|
56
|
+
end
|
57
|
+
|
58
|
+
def body
|
59
|
+
@stack.first
|
60
|
+
end
|
61
|
+
|
62
|
+
def response
|
63
|
+
body
|
64
|
+
end
|
65
|
+
|
66
|
+
def start_element(name, attributes = [])
|
67
|
+
@value = ''
|
68
|
+
parsed_attributes = {}
|
69
|
+
until attributes.empty?
|
70
|
+
if attributes.first.is_a?(Array)
|
71
|
+
key, value = attributes.shift
|
72
|
+
else
|
73
|
+
key, value = attributes.shift, attributes.shift
|
74
|
+
end
|
75
|
+
parsed_attributes[key.gsub(':','_').to_sym] = value
|
76
|
+
end
|
77
|
+
if @stack.last.is_a?(Array)
|
78
|
+
@stack.last << {name.to_sym => parsed_attributes}
|
79
|
+
else
|
80
|
+
data = if @stack.empty?
|
81
|
+
@stack.push(parsed_attributes)
|
82
|
+
parsed_attributes
|
83
|
+
elsif @stack.last[name.to_sym]
|
84
|
+
unless @stack.last[name.to_sym].is_a?(Array)
|
85
|
+
@stack.last[name.to_sym] = [@stack.last[name.to_sym]]
|
86
|
+
end
|
87
|
+
@stack.last[name.to_sym] << parsed_attributes
|
88
|
+
@stack.last[name.to_sym].last
|
89
|
+
else
|
90
|
+
@stack.last[name.to_sym] = {}
|
91
|
+
@stack.last[name.to_sym].merge!(parsed_attributes)
|
92
|
+
@stack.last[name.to_sym]
|
93
|
+
end
|
94
|
+
@stack.push(data)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Fog
|
2
|
+
module Provider
|
3
|
+
|
4
|
+
def self.extended(base)
|
5
|
+
Fog.providers << base.to_s.split('::').last
|
6
|
+
end
|
7
|
+
|
8
|
+
def service(new_service, path)
|
9
|
+
services << new_service
|
10
|
+
require File.join('fog', path)
|
11
|
+
end
|
12
|
+
|
13
|
+
def services
|
14
|
+
@services ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Fog
|
2
|
+
module SCP
|
3
|
+
|
4
|
+
def self.new(address, username, options = {})
|
5
|
+
if Fog.mocking?
|
6
|
+
Fog::SCP::Mock.new(address, username, options)
|
7
|
+
else
|
8
|
+
Fog::SCP::Real.new(address, username, options)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.reset_data(keys=Mock.data.keys)
|
13
|
+
Mock.reset_data(keys)
|
14
|
+
end
|
15
|
+
|
16
|
+
class Mock
|
17
|
+
|
18
|
+
def self.data
|
19
|
+
@data ||= Hash.new do |hash, key|
|
20
|
+
hash[key] = {}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(address, username, options)
|
25
|
+
@address = address
|
26
|
+
@username = username
|
27
|
+
@options = options
|
28
|
+
end
|
29
|
+
|
30
|
+
def upload(local_path, remote_path)
|
31
|
+
Fog::Mock.not_implemented
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
class Real
|
37
|
+
|
38
|
+
def initialize(address, username, options)
|
39
|
+
require 'net/scp'
|
40
|
+
|
41
|
+
key_manager = Net::SSH::Authentication::KeyManager.new(nil, options)
|
42
|
+
|
43
|
+
unless options[:key_data] || options[:keys] || options[:password] || key_manager.agent
|
44
|
+
raise ArgumentError.new(':key_data, :keys, :password or a loaded ssh-agent is required to initialize SSH')
|
45
|
+
end
|
46
|
+
|
47
|
+
@address = address
|
48
|
+
@username = username
|
49
|
+
@options = { :paranoid => false }.merge(options)
|
50
|
+
end
|
51
|
+
|
52
|
+
def upload(local_path, remote_path)
|
53
|
+
begin
|
54
|
+
Net::SCP.start(@address, @username, @options) do |scp|
|
55
|
+
scp.upload!(local_path, remote_path) do |ch, name, sent, total|
|
56
|
+
# TODO: handle progress display?
|
57
|
+
end
|
58
|
+
end
|
59
|
+
rescue Exception => error
|
60
|
+
raise error
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
module Fog
|
2
|
+
class Service
|
3
|
+
|
4
|
+
class Error < Fog::Errors::Error; end
|
5
|
+
class NotFound < Fog::Errors::NotFound; end
|
6
|
+
|
7
|
+
module Collections
|
8
|
+
|
9
|
+
def collections
|
10
|
+
service.collections
|
11
|
+
end
|
12
|
+
|
13
|
+
def mocked_requests
|
14
|
+
service.mocked_requests
|
15
|
+
end
|
16
|
+
|
17
|
+
def requests
|
18
|
+
service.requests
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
class << self
|
24
|
+
|
25
|
+
def inherited(child)
|
26
|
+
child.class_eval <<-EOS, __FILE__, __LINE__
|
27
|
+
module Collections
|
28
|
+
include Fog::Service::Collections
|
29
|
+
|
30
|
+
def service
|
31
|
+
#{child}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.service
|
36
|
+
#{child}
|
37
|
+
end
|
38
|
+
EOS
|
39
|
+
end
|
40
|
+
|
41
|
+
def new(options={})
|
42
|
+
# attempt to load credentials from config file
|
43
|
+
begin
|
44
|
+
default_credentials = Fog.credentials.reject {|key, value| !(recognized | requirements).include?(key)}
|
45
|
+
options = default_credentials.merge(options)
|
46
|
+
rescue LoadError
|
47
|
+
# if there are no configured credentials, do nothing
|
48
|
+
end
|
49
|
+
|
50
|
+
validate_options(options)
|
51
|
+
setup_requirements
|
52
|
+
|
53
|
+
if Fog.mocking?
|
54
|
+
service::Mock.send(:include, service::Collections)
|
55
|
+
service::Mock.new(options)
|
56
|
+
else
|
57
|
+
service::Real.send(:include, service::Collections)
|
58
|
+
service::Real.new(options)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def setup_requirements
|
63
|
+
if superclass.respond_to?(:setup_requirements)
|
64
|
+
superclass.setup_requirements
|
65
|
+
end
|
66
|
+
|
67
|
+
@required ||= false
|
68
|
+
unless @required
|
69
|
+
for collection in collections
|
70
|
+
require [@model_path, collection].join('/')
|
71
|
+
constant = collection.to_s.split('_').map {|characters| characters[0...1].upcase << characters[1..-1]}.join('')
|
72
|
+
service::Collections.module_eval <<-EOS, __FILE__, __LINE__
|
73
|
+
def #{collection}(attributes = {})
|
74
|
+
#{service}::#{constant}.new({:connection => self}.merge(attributes))
|
75
|
+
end
|
76
|
+
EOS
|
77
|
+
end
|
78
|
+
for model in models
|
79
|
+
require [@model_path, model].join('/')
|
80
|
+
end
|
81
|
+
for request in requests
|
82
|
+
require [@request_path, request].join('/')
|
83
|
+
if service::Mock.method_defined?(request)
|
84
|
+
mocked_requests << request
|
85
|
+
else
|
86
|
+
service::Mock.module_eval <<-EOS, __FILE__, __LINE__
|
87
|
+
def #{request}(*args)
|
88
|
+
Fog::Mock.not_implemented
|
89
|
+
end
|
90
|
+
EOS
|
91
|
+
end
|
92
|
+
end
|
93
|
+
@required = true
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def model_path(new_path)
|
98
|
+
@model_path = new_path
|
99
|
+
end
|
100
|
+
|
101
|
+
def collection(new_collection)
|
102
|
+
collections << new_collection
|
103
|
+
end
|
104
|
+
|
105
|
+
def collections
|
106
|
+
@collections ||= []
|
107
|
+
end
|
108
|
+
|
109
|
+
def mocked_requests
|
110
|
+
@mocked_requests ||= []
|
111
|
+
end
|
112
|
+
|
113
|
+
def model(new_model)
|
114
|
+
models << new_model
|
115
|
+
end
|
116
|
+
|
117
|
+
def models
|
118
|
+
@models ||= []
|
119
|
+
end
|
120
|
+
|
121
|
+
def request_path(new_path)
|
122
|
+
@request_path = new_path
|
123
|
+
end
|
124
|
+
|
125
|
+
def request(new_request)
|
126
|
+
requests << new_request
|
127
|
+
end
|
128
|
+
|
129
|
+
def requests
|
130
|
+
@requests ||= []
|
131
|
+
end
|
132
|
+
|
133
|
+
def requires(*args)
|
134
|
+
requirements.concat(args)
|
135
|
+
end
|
136
|
+
|
137
|
+
def requirements
|
138
|
+
@requirements ||= []
|
139
|
+
end
|
140
|
+
|
141
|
+
def recognizes(*args)
|
142
|
+
recognized.concat(args)
|
143
|
+
end
|
144
|
+
|
145
|
+
def recognized
|
146
|
+
@recognized ||= []
|
147
|
+
end
|
148
|
+
|
149
|
+
def reset_data(keys=Mock.data.keys)
|
150
|
+
Mock.reset_data(keys)
|
151
|
+
end
|
152
|
+
|
153
|
+
def reset_data(keys=Mock.data.keys)
|
154
|
+
Mock.reset_data(keys)
|
155
|
+
end
|
156
|
+
|
157
|
+
def validate_options(options)
|
158
|
+
missing = requirements - options.keys
|
159
|
+
unless missing.empty?
|
160
|
+
raise ArgumentError, "Missing required arguments: #{missing.join(', ')}"
|
161
|
+
end
|
162
|
+
|
163
|
+
unless recognizes.empty?
|
164
|
+
unrecognized = options.keys - requirements - recognized
|
165
|
+
unless unrecognized.empty?
|
166
|
+
raise ArgumentError, "Unrecognized arguments: #{unrecognized.join(', ')}"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module Fog
|
2
|
+
module SSH
|
3
|
+
|
4
|
+
def self.new(address, username, options = {})
|
5
|
+
if Fog.mocking?
|
6
|
+
Fog::SSH::Mock.new(address, username, options)
|
7
|
+
else
|
8
|
+
Fog::SSH::Real.new(address, username, options)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.reset_data(keys=Mock.data.keys)
|
13
|
+
Mock.reset_data(keys)
|
14
|
+
end
|
15
|
+
|
16
|
+
class Mock
|
17
|
+
|
18
|
+
def self.data
|
19
|
+
@data ||= Hash.new do |hash, key|
|
20
|
+
hash[key] = {}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(address, username, options)
|
25
|
+
@address = address
|
26
|
+
@username = username
|
27
|
+
@options = options
|
28
|
+
end
|
29
|
+
|
30
|
+
def run(commands)
|
31
|
+
Fog::Mock.not_implemented
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
class Real
|
37
|
+
|
38
|
+
def initialize(address, username, options)
|
39
|
+
require 'net/ssh'
|
40
|
+
|
41
|
+
key_manager = Net::SSH::Authentication::KeyManager.new(nil, options)
|
42
|
+
|
43
|
+
unless options[:key_data] || options[:keys] || options[:password] || key_manager.agent
|
44
|
+
raise ArgumentError.new(':key_data, :keys, :password or a loaded ssh-agent is required to initialize SSH')
|
45
|
+
end
|
46
|
+
|
47
|
+
@address = address
|
48
|
+
@username = username
|
49
|
+
@options = { :paranoid => false }.merge(options)
|
50
|
+
end
|
51
|
+
|
52
|
+
def run(commands)
|
53
|
+
commands = [*commands]
|
54
|
+
results = []
|
55
|
+
begin
|
56
|
+
Net::SSH.start(@address, @username, @options) do |ssh|
|
57
|
+
commands.each do |command|
|
58
|
+
escaped_command = command.sub(/'/, %{'"'"'})
|
59
|
+
result = Result.new(escaped_command)
|
60
|
+
ssh.open_channel do |ssh_channel|
|
61
|
+
ssh_channel.request_pty
|
62
|
+
ssh_channel.exec(%{bash -lc '#{escaped_command}'}) do |channel, success|
|
63
|
+
unless success
|
64
|
+
raise "Could not execute command: #{command.inspect}"
|
65
|
+
end
|
66
|
+
|
67
|
+
channel.on_data do |ch, data|
|
68
|
+
result.stdout << data
|
69
|
+
end
|
70
|
+
|
71
|
+
channel.on_extended_data do |ch, type, data|
|
72
|
+
next unless type == 1
|
73
|
+
result.stderr << data
|
74
|
+
end
|
75
|
+
|
76
|
+
channel.on_request('exit-status') do |ch, data|
|
77
|
+
result.status = data.read_long
|
78
|
+
end
|
79
|
+
|
80
|
+
channel.on_request('exit-signal') do |ch, data|
|
81
|
+
result.status = 255
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
ssh.loop
|
86
|
+
results << result
|
87
|
+
end
|
88
|
+
end
|
89
|
+
rescue Net::SSH::HostKeyMismatch => exception
|
90
|
+
exception.remember_host!
|
91
|
+
sleep 0.2
|
92
|
+
retry
|
93
|
+
end
|
94
|
+
results
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
class Result
|
100
|
+
|
101
|
+
attr_accessor :command, :stderr, :stdout, :status
|
102
|
+
|
103
|
+
def display_stdout
|
104
|
+
Formatador.display_line(stdout.split("\r\n"))
|
105
|
+
end
|
106
|
+
|
107
|
+
def display_stderr
|
108
|
+
Formatador.display_line(stderr.split("\r\n"))
|
109
|
+
end
|
110
|
+
|
111
|
+
def initialize(command)
|
112
|
+
@command = command
|
113
|
+
@stderr = ''
|
114
|
+
@stdout = ''
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Fog
|
2
|
+
class Time < ::Time
|
3
|
+
|
4
|
+
DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
|
5
|
+
MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
6
|
+
|
7
|
+
def self.now
|
8
|
+
at((::Time.now - offset).to_i)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.now=(new_now)
|
12
|
+
old_now = ::Time.now
|
13
|
+
@offset = old_now - new_now
|
14
|
+
new_now
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.offset
|
18
|
+
@offset ||= 0
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_date_header
|
22
|
+
now = self.class.now.utc
|
23
|
+
now.strftime("#{DAYS[now.wday]}, %d #{MONTHS[now.month - 1]} %Y %H:%M:%S +0000")
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Fog
|
2
|
+
|
3
|
+
def self.wait_for(timeout=600, interval=1, &block)
|
4
|
+
duration = 0
|
5
|
+
start = Time.now
|
6
|
+
until yield || duration > timeout
|
7
|
+
sleep(interval)
|
8
|
+
duration = Time.now - start
|
9
|
+
end
|
10
|
+
if duration > timeout
|
11
|
+
false
|
12
|
+
else
|
13
|
+
{ :duration => duration }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
__LIB_DIR__ = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift __LIB_DIR__ unless
|
4
|
+
$LOAD_PATH.include?(__LIB_DIR__) ||
|
5
|
+
$LOAD_PATH.include?(File.expand_path(__LIB_DIR__))
|
6
|
+
|
7
|
+
# external core dependencies
|
8
|
+
require 'rubygems'
|
9
|
+
require 'base64'
|
10
|
+
require 'cgi'
|
11
|
+
require 'excon'
|
12
|
+
require 'formatador'
|
13
|
+
require 'time'
|
14
|
+
require 'timeout'
|
15
|
+
|
16
|
+
# internal core dependencies
|
17
|
+
require 'fog/core/attributes'
|
18
|
+
require 'fog/core/collection'
|
19
|
+
require 'fog/core/connection'
|
20
|
+
require 'fog/core/credentials'
|
21
|
+
require 'fog/core/deprecation'
|
22
|
+
require 'fog/core/errors'
|
23
|
+
require 'fog/core/hmac'
|
24
|
+
require 'fog/core/model'
|
25
|
+
require 'fog/core/mock'
|
26
|
+
# require 'fog/core/parser'
|
27
|
+
require 'fog/core/provider'
|
28
|
+
require 'fog/core/service'
|
29
|
+
require 'fog/core/ssh'
|
30
|
+
require 'fog/core/scp'
|
31
|
+
require 'fog/core/time'
|
32
|
+
require 'fog/core/wait_for'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'fog', 'core')
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
|
5
|
+
unless const_defined?(:VERSION)
|
6
|
+
VERSION = '0.6.0'
|
7
|
+
end
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
# FIXME: these should go away (force usage of Fog::[Compute, CDN, DNS, Storage] etc)
|
12
|
+
require 'fog/providers'
|
13
|
+
|
14
|
+
require 'fog/compute'
|
data/lib/bbcloud/version.rb
CHANGED