danarchy_sys 0.5.1 → 0.5.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8fddf8294bdd8669276625922a782204745357d0
4
- data.tar.gz: 558b78886117029836d16cb7a8e2f24571cbc508
2
+ SHA256:
3
+ metadata.gz: a5c3ad8faf86550ad951bf1bb6b8f4e25220264628373ba1da95fe0b1fac942f
4
+ data.tar.gz: 78d4d8bebebd00e899aa25840a6ce96b6d70f0bef9e3a8cd0611dddc90e396c1
5
5
  SHA512:
6
- metadata.gz: e8cd0cb4cf1ba0409919a55106fd4fb076ea4ece4395caa75a1b0c18248c7ae70f5fb959a07280da42fb0ad63535d2057dd32e34b47c5643bff1c8d8e3d2ae97
7
- data.tar.gz: 65c92bce502544b45b5c33a73a1aca86623deae3bb735e45097032d83e573dd8f3de1342df80ea720b1824f300b7f6fccdaa5ec3aa8e75f3d0dcb965d643af40
6
+ metadata.gz: 5f8e7e628ac733cf73a28295f73e821541e8f2ce1769351b6151abf2327e4a575809abe0bb1af33b755afc2b72deac7570a2972303e3869b3bda174a9d3ad5f0
7
+ data.tar.gz: 6de2f4c30e92333830e293a5b5e0f08f7602561f9e540c7457c0a4201549b37104bedc1a6c175596f264dc18278ee3e7e0f1cab022d71aa0c1bdbb41223a774b
data/Gemfile CHANGED
@@ -1,2 +1,3 @@
1
1
  source 'https://rubygems.org'
2
- gem 'fog-openstack'
2
+
3
+ gemspec
data/danarchy_sys.gemspec CHANGED
@@ -1,4 +1,4 @@
1
- # coding: utf-8
1
+
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'danarchy_sys/version'
@@ -7,15 +7,13 @@ Gem::Specification.new do |spec|
7
7
  spec.name = "danarchy_sys"
8
8
  spec.version = DanarchySys::VERSION
9
9
  spec.authors = ["Dan James"]
10
- spec.email = ["danheneise@me.com"]
10
+ spec.email = ["dan@danarchy.me"]
11
11
 
12
12
  spec.summary = %q{Facilitates the deployment and management of OpenStack.}
13
13
  spec.description = %q{dAnarchy Sys is intended to be a platform for the management of cloud compute instances from initial setup through to the deployment of end-user software.}
14
14
  spec.homepage = "https://github.com/danarchy85/danarchy_sys"
15
15
  spec.license = "MIT"
16
16
 
17
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
- # to allow pushing to a single host or delete this section to allow pushing to any host.
19
17
  if spec.respond_to?(:metadata)
20
18
  spec.metadata['allowed_push_host'] = "https://rubygems.org"
21
19
  else
@@ -30,7 +28,7 @@ Gem::Specification.new do |spec|
30
28
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
31
29
  spec.require_paths = ["lib"]
32
30
 
33
- spec.add_dependency "fog-openstack", "~> 0.1", ">=0.1.20"
31
+ spec.add_dependency "fog-openstack", "~> 0.1.20"
34
32
 
35
33
  spec.add_development_dependency "bundler", "~> 1.13"
36
34
  spec.add_development_dependency "rake", "~> 10.0"
@@ -1,7 +1,6 @@
1
1
 
2
2
  class Accounts
3
- def self.chooser
4
- danarchysys_config = DanarchySys::ConfigManager::Config.new
3
+ def self.chooser(danarchysys_config)
5
4
  accounts = Helpers.array_to_numhash(danarchysys_config[:accounts].keys)
6
5
  account = 'nil'
7
6
 
@@ -1,12 +1,12 @@
1
1
 
2
2
  # CLI Prompt to create a new instance
3
3
  class PromptsCreateInstance
4
- def self.create_instance(os_compute, instance_name)
5
- comp_inst = os_compute.instances
6
- comp_imgs = os_compute.images
7
- comp_flvs = os_compute.flavors
8
- comp_keys = os_compute.keypairs
4
+ def initialize(os_compute, settings)
5
+ @os_compute = os_compute
6
+ @settings = settings
7
+ end
9
8
 
9
+ def create_instance(instance_name)
10
10
  # Prompt for and check that instance_name is unused
11
11
  if instance_name == nil
12
12
  print "\nWhat should we name the instance?: "
@@ -14,7 +14,7 @@ class PromptsCreateInstance
14
14
  end
15
15
 
16
16
  # Make sure instance_name isn't already in use
17
- until comp_inst.check_instance(instance_name) == false
17
+ until @os_compute.instances.check_instance(instance_name) == false
18
18
  print "\n#{instance_name} already exists! Try another name: "
19
19
  instance_name = gets.chomp
20
20
  end
@@ -23,46 +23,56 @@ class PromptsCreateInstance
23
23
 
24
24
  # Prompt for image
25
25
  puts "\nSelect an image (operating system) for #{instance_name}"
26
- image = PromptsCreateInstance.image(comp_imgs)
26
+ image = self.image
27
27
 
28
28
  # Prompt for flavor
29
29
  puts "\nSelect a flavor (instance size) for #{instance_name}"
30
- flavor = PromptsCreateInstance.flavor(comp_flvs)
30
+ flavor = self.flavor
31
31
 
32
32
  # Prompt for keypair
33
33
  puts "\nSelect a keypair (SSH key) for #{instance_name}"
34
- keypair = PromptsCreateInstance.keypair(comp_keys)
34
+ keypair = self.keypair
35
+
36
+ # Prompt for userdata
37
+ print "\nEnter a path to userdata for #{instance_name} or leave blank for no userdata: "
38
+ file, userdata = self.userdata
35
39
 
36
40
  # Print summary and prompt to continue
41
+ puts "\n================= Instance Summary ==================="
37
42
  puts "\nInstance Name: #{instance_name}"
38
43
  puts " Linux: #{image.name}"
39
44
  puts "Instance Size: #{flavor.name}"
40
45
  puts " Keypair: #{keypair.name}"
41
-
46
+ puts " UserData: #{file}"
47
+ puts "\n --- UserData --- \n#{userdata}\n --- End UserData ---\n" if userdata
48
+ puts "\n=============== End Instance Summary ================="
42
49
  print 'Should we continue with creating the instance? (Y/N): '
43
50
  instance = nil
44
51
  continue = gets.chomp
45
52
 
46
53
  if continue =~ /^y(es)?$/i
47
54
  puts "Creating instance: #{instance_name}"
48
- instance = comp_inst.create_instance(instance_name, image.id, flavor.id, keypair.name)
55
+ instance = @os_compute.instances.create_instance(instance_name, image.id, flavor.id, keypair.name, userdata)
49
56
  else
50
- puts "Abandoning creation of #{instance_name}"
51
- return false
57
+ puts "Abandoning creation of #{instance_name}! Returning to chooser."
58
+ instance = nil
52
59
  end
53
60
 
54
- instance_check = comp_inst.check_instance(instance_name)
55
-
56
- if instance_check == true
61
+ instance_check = instance ? @os_compute.instances.check_instance(instance_name) : false
62
+ if !instance
63
+ return false
64
+ elsif instance_check == true
57
65
  puts "Instance #{instance.name} is ready!"
58
66
  return instance
59
- else
60
- raise "Error: Could not create instance: #{instance_name}" if instance_check == false
67
+ elsif instance_check == false
68
+ puts "Error: Could not create instance: #{instance_name}"
61
69
  end
70
+
71
+ instance
62
72
  end
63
73
 
64
- def self.image(comp_imgs)
65
- images_numbered = Helpers.array_to_numhash(comp_imgs.all_images)
74
+ def image
75
+ images_numbered = Helpers.array_to_numhash(@os_compute.images.all_images)
66
76
 
67
77
  # List available images in a numbered hash.
68
78
  puts "\nAvailable Images:"
@@ -74,11 +84,11 @@ class PromptsCreateInstance
74
84
 
75
85
  image_name = item_chooser(images_numbered, 'image')
76
86
  print "Image Name: #{image_name}\n"
77
- comp_imgs.get_image_by_name(image_name)
87
+ @os_compute.images.get_image_by_name(image_name)
78
88
  end
79
89
 
80
- def self.flavor(comp_flvs)
81
- flavors_numbered = Helpers.array_to_numhash(comp_flvs.all_flavors.sort_by(&:ram))
90
+ def flavor
91
+ flavors_numbered = Helpers.array_to_numhash(@os_compute.flavors.all_flavors.sort_by(&:ram))
82
92
 
83
93
  puts "\nAvailable Instance Flavors:"
84
94
  puts sprintf("%0s %-15s %-10s %-10s %0s", 'Id', 'Name', 'RAM', 'VCPUs', 'Disk')
@@ -89,11 +99,11 @@ class PromptsCreateInstance
89
99
 
90
100
  flavor_name = item_chooser(flavors_numbered, 'flavor')
91
101
  print "Flavor Name: #{flavor_name.split('.')[1]}\n"
92
- comp_flvs.get_flavor_by_name(flavor_name)
102
+ @os_compute.flavors.get_flavor_by_name(flavor_name)
93
103
  end
94
104
 
95
- def self.keypair(comp_keys)
96
- keypairs = Helpers.objects_to_numhash(comp_keys.all_keypairs)
105
+ def keypair
106
+ keypairs = Helpers.objects_to_numhash(@os_compute.keypairs.all_keypairs)
97
107
  keypair_name = nil
98
108
 
99
109
  # List available keypairs
@@ -130,18 +140,40 @@ Should we create a new keypair named #{keypair_name}? (Y/N): "
130
140
 
131
141
  if gets.chomp =~ /^y(es)?$/i
132
142
  puts "Creating keypair: #{keypair_name}!"
133
- return comp_keys.create_keypair(keypair_name)
143
+ return @os_compute.keypairs.create_keypair(keypair_name)
134
144
  else
135
145
  print 'Please enter an option from above: '
136
146
  end
137
147
  end
138
148
  end
139
149
 
140
- comp_keys.get_keypair(keypair_name)
150
+ @os_compute.keypairs.get_keypair(keypair_name)
151
+ end
152
+
153
+ def userdata
154
+ userdata = nil
155
+ file = gets.chomp
156
+
157
+ return ['-- no userdata --', nil] if file.empty?
158
+ file = File.expand_path(file)
159
+ userdata = File.exist?(file) ? File.read(file) : ''
160
+ if userdata.empty?
161
+ print 'File is empty!'
162
+ userdata = editor(file)
163
+ else
164
+ puts userdata + "\n\n"
165
+ print "Do any changes need to be made to '#{file}'? (Y/N): "
166
+
167
+ if gets.chomp =~ /^y(es)?$/i
168
+ userdata = editor(file)
169
+ end
170
+ end
171
+
172
+ return [file, userdata]
141
173
  end
142
174
 
143
175
  private
144
- def self.item_chooser(items_numbered, item)
176
+ def item_chooser(items_numbered, item)
145
177
  # Loop input until existing object is selected
146
178
  item_name = nil
147
179
  print "Which #{item} should we use for this instance?: "
@@ -163,4 +195,15 @@ Should we create a new keypair named #{keypair_name}? (Y/N): "
163
195
  end
164
196
  item_name
165
197
  end
198
+
199
+ def editor(file)
200
+ require 'fileutils'
201
+ FileUtils.cp(file, "#{file}.bkp")
202
+ editor = ENV['EDITOR'] || '/bin/nano'
203
+ puts "Opening #{file} in #{File.basename(editor)}"
204
+ sleep(2)
205
+ system("#{editor} #{file}")
206
+ puts "Backed up #{file} to #{file}.bkp"
207
+ File.read(file)
208
+ end
166
209
  end
@@ -2,15 +2,18 @@ require_relative 'instance_manager/prompts_create_instance'
2
2
  require_relative 'instance_manager/instance_status'
3
3
 
4
4
  class InstanceManager
5
- def self.manager(os_compute)
6
- comp_inst = os_compute.instances
5
+ def self.manager(os_compute, settings)
6
+ @os_compute = os_compute
7
+ @settings = settings
8
+ @prompts_create_instance = PromptsCreateInstance.new(@os_compute, @settings)
7
9
  puts 'Instance Manager: enter \'help\' to view available commands or \'main\' for the main menu.'
8
10
  menu = Menus.numbered_menu('instance')
9
11
  instance = false
10
12
 
11
13
  loop do
14
+ trap('SIGINT') { print "\nEnter an instance to manage or enter a name for a new instance: " }
12
15
  while instance == false
13
- instance = chooser(os_compute)
16
+ instance = chooser
14
17
  return Menus.print_menu('main') if instance == 'main'
15
18
  end
16
19
 
@@ -29,20 +32,20 @@ class InstanceManager
29
32
  elsif cmd == 'main'
30
33
  return Menus.print_menu('main')
31
34
  elsif cmd == 'chooser'
32
- instance = chooser(os_compute)
35
+ instance = chooser
33
36
  elsif cmd == 'create'
34
- PromptsCreateInstance.create_instance(os_compute, 'nil')
35
- instance = chooser(os_compute)
37
+ instance = @prompts_create_instance.create_instance(nil)
36
38
  elsif cmd == 'delete'
37
39
  print "Are you sure you wish to delete instance: #{instance.name}? (this is permanent!) (Y/N): "
38
- delete = comp_inst.delete_instance(instance.name) if gets.chomp =~ /^y(es)?$/i
40
+ delete = @os_compute.instances.delete_instance(instance.name) if gets.chomp =~ /^y(es)?$/i
39
41
  if delete == true
40
42
  puts "#{instance.name} has been deleted! Returning to the instance chooser."
41
- instance = chooser(os_compute)
43
+ instance = chooser
42
44
  else
43
45
  puts "#{instance.name} was not deleted!"
44
46
  end
45
47
  elsif cmd == 'status'
48
+ instance = @os_compute.instances.get_instance(instance.name)
46
49
  printf("%#{instance.name.size}s %0s %0s\n", instance.name, ' => ', instance.state)
47
50
  elsif %w(pause unpause suspend resume start stop).include?(cmd.to_s)
48
51
  status = instance.state
@@ -53,32 +56,33 @@ class InstanceManager
53
56
  print "#{cmd}ing #{instance.name} ."
54
57
  end
55
58
 
56
- response = comp_inst.send(cmd.to_s, instance.name.to_s)
59
+ response = @os_compute.instances.send(cmd.to_s, instance.name.to_s)
57
60
  if response == false
58
61
  puts "\nInvalid action for #{instance.name}'s current status!"
59
62
  next
60
63
  end
61
64
 
62
65
  until status != instance.state
63
- instance = os_compute.instances.get_instance(instance.name)
66
+ instance = @os_compute.instances.get_instance(instance.name)
64
67
  sleep(3)
65
68
  print ' .'
66
69
  end
67
70
 
68
71
  printf("\n%#{instance.name.size}s %0s %0s\n", instance.name, ' => ', instance.state)
69
72
  elsif cmd == 'rebuild'
70
- image = PromptsCreateInstance.image(os_compute.images)
73
+ image = @prompts_create_instance.image
71
74
  print "Should we rebuild #{instance.name} with image: #{image.name}? (Y/N): "
72
75
  if gets.chomp =~ /^y(es)?$/i
73
76
  puts "Rebuilding #{instance.name} with #{image.name}"
74
- instance = os_compute.instances.rebuild_instance(instance, image)
75
- puts "\nRebuild successful!"
77
+ @os_compute.instances.rebuild_instance(instance, image)
78
+ instance = @os_compute.instances.get_instance(instance.name)
79
+ puts "\nRebuild in progress!"
76
80
  else
77
81
  puts "Not rebuilding #{instance.name} at this time."
78
82
  end
79
83
  elsif cmd == 'connect'
80
84
  if instance.state == 'ACTIVE'
81
- os_compute.ssh(instance.name)
85
+ @os_compute.ssh(instance.name)
82
86
  else
83
87
  puts "Unable to connect: #{instance.name} is not running!"
84
88
  end
@@ -91,8 +95,8 @@ class InstanceManager
91
95
  end
92
96
  end
93
97
 
94
- def self.chooser(os_compute)
95
- instances_numhash = Helpers.objects_to_numhash(os_compute.instances.all_instances)
98
+ def self.chooser
99
+ instances_numhash = Helpers.objects_to_numhash(@os_compute.instances.all_instances)
96
100
  instance_name = nil
97
101
  instance = nil
98
102
 
@@ -100,19 +104,19 @@ class InstanceManager
100
104
  if instances_numhash.empty?
101
105
  print 'No existing instances were found. Should we create a new one? (Y/N): '
102
106
  abort('Exiting!') unless gets.chomp =~ /^y(es)?$/i
103
- instance = PromptsCreateInstance.create_instance(os_compute, 'nil')
107
+ instance = @prompts_create_instance.create_instance(nil)
104
108
  puts "Working with: #{instance.name}\tStatus: #{instance.state}"
105
109
  return instance
106
110
  end
107
111
 
108
112
  puts 'Available instances:'
109
- istatus = InstanceStatus.new(os_compute)
113
+ istatus = InstanceStatus.new(@os_compute)
110
114
  istatus.all_instances(instances_numhash)
111
115
 
112
116
  # Loop input until an existing instance is selected
113
117
  print 'Enter an instance to manage or enter a name for a new instance: '
114
118
 
115
- until instances_numhash.values.collect{|i| i[:name]}.include?(instance_name) # os_compute.instances.check_instance(instance_name) == true
119
+ until instances_numhash.values.collect{|i| i[:name]}.include?(instance_name)
116
120
  instance_name = gets.chomp
117
121
 
118
122
  until instance_name.empty? == false
@@ -133,12 +137,12 @@ class InstanceManager
133
137
  instance_name = instances_numhash[instance_name.to_i][:name].to_s
134
138
  end
135
139
 
136
- unless instances_numhash.values.collect{|i| i[:name]}.include?(instance_name) # os_compute.instances.check_instance(instance_name) == true
140
+ unless instances_numhash.values.collect{|i| i[:name]}.include?(instance_name)
137
141
  print "#{instance_name} is not a valid instance.
138
142
  Should we create a new instance named #{instance_name}? (Y/N): "
139
143
 
140
144
  if gets.chomp =~ /^y(es)?$/i
141
- instance = PromptsCreateInstance.create_instance(os_compute, instance_name)
145
+ instance = @prompts_create_instance.create_instance(instance_name)
142
146
  return instance
143
147
  else
144
148
  puts "Not creating new instance: #{instance_name}."
@@ -147,7 +151,7 @@ Should we create a new instance named #{instance_name}? (Y/N): "
147
151
  end
148
152
  end
149
153
 
150
- instance = os_compute.instances.get_instance(instance_name)
154
+ instance = @os_compute.instances.get_instance(instance_name)
151
155
  Menus.print_menu('instance')
152
156
  puts "Managing instance: #{instance_name}\tStatus: #{instance.state}"
153
157
  instance
@@ -1,6 +1,4 @@
1
1
 
2
- require 'optparse'
3
- require 'fog/openstack'
4
2
  require_relative '../danarchy_sys'
5
3
 
6
4
  module DanarchySys
@@ -11,26 +9,15 @@ module DanarchySys
11
9
  require_relative 'cli/instance_manager'
12
10
  require_relative 'cli/keypair_manager'
13
11
 
14
- account = Accounts.chooser
12
+ danarchysys_config = DanarchySys::ConfigManager::Config.new
13
+ account = Accounts.chooser(danarchysys_config)
14
+ connection = danarchysys_config[:accounts][account]
15
15
  puts "OpenStack -> #{account}"
16
- @os_compute = DanarchySys::OpenStack::Compute.new account
16
+ @settings = danarchysys_config[:global_settings]
17
+ @os_compute = DanarchySys::OpenStack::Compute.new(connection, @settings)
17
18
  console
18
19
  end
19
20
 
20
- def instance_chooser
21
- inst_mgr = InstanceManager.new(@os_compute)
22
- instance = inst_mgr.chooser(@os_compute)
23
-
24
- until instance != false
25
- puts "\nReturning to Instance Chooser"
26
- instance = inst_mgr.chooser(@os_compute)
27
- end
28
-
29
- menus('main')
30
- puts "\nWorking with: #{instance.name}\tStatus: #{instance.state}"
31
- console(instance.name)
32
- end
33
-
34
21
  def console
35
22
  menu = Menus.numbered_menu('main')
36
23
  Menus.print_menu('main')
@@ -45,7 +32,7 @@ module DanarchySys
45
32
  end
46
33
 
47
34
  if cmd == 'instance'
48
- InstanceManager.manager(@os_compute)
35
+ InstanceManager.manager(@os_compute, @settings)
49
36
  elsif cmd == 'keypair'
50
37
  KeypairManager.manager(@os_compute)
51
38
  elsif cmd == 'help'
@@ -1,13 +1,13 @@
1
+ require_relative 'config_manager/openstack'
1
2
  require 'fileutils'
2
3
  require 'json'
3
- require_relative 'config_manager/openstack'
4
4
 
5
5
  # dAnarchy_sys config management
6
6
  module DanarchySys
7
7
  module ConfigManager
8
8
  class Config
9
9
  def self.new
10
- danarchysys_cfg_path = File.join(File.realpath(ENV['HOME']), '.danarchy_sys')
10
+ danarchysys_cfg_path = File.join(File.realpath(ENV['HOME']), '.danarchy', 'danarchy_sys')
11
11
  config_json = File.join(danarchysys_cfg_path, 'danarchy_sys.json')
12
12
 
13
13
  if File.exists?(config_json)
@@ -19,7 +19,7 @@ module DanarchySys
19
19
  end
20
20
 
21
21
  def self.providers
22
- ['openstack'] # , 'aws']
22
+ ['openstack', 'danarchy'] # , 'aws']
23
23
  end
24
24
 
25
25
  def self.config_template
@@ -91,8 +91,8 @@ class ComputeInstances
91
91
  instance.stop
92
92
  end
93
93
 
94
- def create_instance(instance_name, image_id, flavor_id, keypair_name, *user_data)
95
- user_data = nil if user_data.empty?
94
+ def create_instance(instance_name, image_id, flavor_id, keypair_name, *userdata)
95
+ user_data = userdata ? userdata.first : nil
96
96
 
97
97
  instance = @compute.servers.create(name: instance_name,
98
98
  image_ref: image_id,
@@ -116,9 +116,9 @@ class ComputeInstances
116
116
  instance.rebuild(image.id, instance.name)
117
117
  addrs = [get_public_addresses(instance),
118
118
  get_private_addresses(instance)].flatten.compact!
119
- addrs.each { |addr| system("ssh-keygen -R #{addr}") }
119
+ addrs.each { |addr| system("ssh-keygen -R #{addr} &>/dev/null") }
120
120
 
121
- instance.wait_for { ready? }
121
+ # instance.wait_for { ready? }
122
122
  instance
123
123
  end
124
124
 
@@ -138,7 +138,7 @@ class ComputeInstances
138
138
 
139
139
  addrs = [get_public_addresses(instance),
140
140
  get_private_addresses(instance)].flatten.compact!
141
- addrs.each { |addr| system("ssh-keygen -R #{addr}") }
141
+ addrs.each { |addr| system("ssh-keygen -R #{addr} &>/dev/null") }
142
142
 
143
143
  return true
144
144
  end
@@ -6,10 +6,8 @@ require_relative 'compute/flavors'
6
6
  module DanarchySys
7
7
  module OpenStack
8
8
  class Compute
9
- def initialize(account)
10
- danarchysys_config = DanarchySys::ConfigManager::Config.new
11
- connection = danarchysys_config[:accounts][account.to_sym]
12
- @settings = danarchysys_config[:global_settings]
9
+ def initialize(connection, settings)
10
+ @settings = settings
13
11
  @compute = Fog::Compute::OpenStack.new(connection)
14
12
  @instances = @compute.servers
15
13
  @images = @compute.images(filters: {'status' => ['ACTIVE']})
@@ -53,6 +51,7 @@ module DanarchySys
53
51
  ssh, user = nil
54
52
  if image == nil
55
53
  puts "Image not found for #{instance.name}! This instance needs to be rebuild with a current image."
54
+ puts "Attempting to determine the correct username and log in..."
56
55
  ssh, user = fallback_ssh(ipv4, pemfile)
57
56
  else
58
57
  user = 'ubuntu' if image.name =~ /ubuntu/i
@@ -64,25 +63,26 @@ module DanarchySys
64
63
 
65
64
  return if !user
66
65
 
67
- puts "Connecting as user: #{user} @ #{ipv4}"
68
- connect = "/usr/bin/ssh -i '#{pemfile}' #{user}@#{ipv4}"
66
+ print "Connecting as user: #{user} @ #{ipv4} " + cmd + "\n"
67
+ connect = "/usr/bin/ssh -o ConnectTimeout=15 -o StrictHostKeyChecking=no -o PasswordAuthentication=no -i '#{pemfile}' #{user}@#{ipv4}"
69
68
  system(connect)
70
69
  end
71
70
 
72
71
  def fallback_ssh(ipv4, pemfile)
73
- users = %w[centos ubuntu debian fedora core]
72
+ users = %w[debian ubuntu centos fedora core]
74
73
  ssh, user = nil
75
74
 
76
75
  users.each do |username|
77
76
  print "Attempting connection as user: #{username} @ #{ipv4} => "
78
- connect = "/usr/bin/ssh -i '#{pemfile}' #{username}@#{ipv4}"
77
+ connect = "/usr/bin/ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -o PasswordAuthentication=no -i '#{pemfile}' #{username}@#{ipv4}"
79
78
  ssh = system("#{connect} 'uptime' &>/dev/null")
80
- puts 'failed' if ssh ==false
81
79
 
82
80
  if ssh == true
83
81
  puts 'success'
84
82
  user = username
85
83
  break
84
+ else
85
+ puts 'failed'
86
86
  end
87
87
  end
88
88
 
@@ -1,3 +1,3 @@
1
1
  module DanarchySys
2
- VERSION = '0.5.1'
2
+ VERSION = '0.5.2'
3
3
  end
metadata CHANGED
@@ -1,23 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danarchy_sys
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan James
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-14 00:00:00.000000000 Z
11
+ date: 2018-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fog-openstack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '0.1'
20
- - - ">="
21
18
  - !ruby/object:Gem::Version
22
19
  version: 0.1.20
23
20
  type: :runtime
@@ -25,9 +22,6 @@ dependencies:
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: '0.1'
30
- - - ">="
31
25
  - !ruby/object:Gem::Version
32
26
  version: 0.1.20
33
27
  - !ruby/object:Gem::Dependency
@@ -75,7 +69,7 @@ dependencies:
75
69
  description: dAnarchy Sys is intended to be a platform for the management of cloud
76
70
  compute instances from initial setup through to the deployment of end-user software.
77
71
  email:
78
- - danheneise@me.com
72
+ - dan@danarchy.me
79
73
  executables:
80
74
  - console
81
75
  - danarchy_sys
@@ -142,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
136
  version: '0'
143
137
  requirements: []
144
138
  rubyforge_project:
145
- rubygems_version: 2.6.14
139
+ rubygems_version: 2.7.6
146
140
  signing_key:
147
141
  specification_version: 4
148
142
  summary: Facilitates the deployment and management of OpenStack.