bbcloud 0.10.1 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- 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