corl 0.5.16 → 0.5.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +2 -0
- data/VERSION +1 -1
- data/bootstrap/os/ubuntu/01_git.sh +11 -1
- data/bootstrap/os/ubuntu/06_puppet.sh +1 -1
- data/corl.gemspec +10 -3
- data/lib/CORL/machine/physical.rb +43 -43
- data/lib/CORL/machine/raspberrypi.rb +155 -0
- data/lib/CORL/node/raspberrypi.rb +29 -0
- data/lib/CORL/node/vagrant.rb +0 -13
- data/lib/CORL/provisioner/puppetnode.rb +3 -3
- data/lib/core/facade.rb +3 -0
- data/lib/core/mixin/action/keypair.rb +24 -24
- data/lib/core/mixin/machine/ssh.rb +2 -1
- data/lib/core/plugin/cloud_action.rb +4 -0
- data/lib/core/plugin/configuration.rb +2 -1
- data/lib/core/plugin/fog_node.rb +0 -10
- data/lib/core/plugin/network.rb +14 -0
- data/lib/core/plugin/node.rb +33 -8
- data/lib/facter/raspberry_pi.rb +14 -0
- data/lib/nucleon/action/node/authorize.rb +21 -19
- data/lib/nucleon/action/node/devkey.rb +87 -0
- data/lib/nucleon/action/node/download.rb +1 -1
- data/locales/en.yml +11 -0
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0987aea3e56e4c6c391769f7a397327470928975
|
4
|
+
data.tar.gz: f6ae921e7cfa279434d37dc835a9e49a4f633820
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77bf6dc4495017957515547cf549783c35727342f1f3046f10bb118cdf4f716802c1e5312fb5f670844171bfd8c2adb79ad05286752e4c8d97b9dcf7ce82bb90
|
7
|
+
data.tar.gz: 6f1005482750cd2f3f1e328165e16a24b3f31a9101e20adb84b4f481ac6c39af2250cc2862ca1c51929c61b4c2d23e774c2336556cbdaa903cc81830f01ea9e4
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -132,6 +132,7 @@ GEM
|
|
132
132
|
multi_json (1.10.1)
|
133
133
|
multi_xml (0.5.5)
|
134
134
|
multipart-post (2.0.0)
|
135
|
+
net-ping (1.7.7)
|
135
136
|
net-scp (1.2.1)
|
136
137
|
net-ssh (>= 2.6.5)
|
137
138
|
net-ssh (2.9.1)
|
@@ -198,6 +199,7 @@ DEPENDENCIES
|
|
198
199
|
github-markup (~> 1.3)
|
199
200
|
hiera (~> 1.3)
|
200
201
|
jeweler (~> 2.0)
|
202
|
+
net-ping (~> 1.7)
|
201
203
|
nucleon (~> 0.2, >= 0.2.2)!
|
202
204
|
puppet (~> 3.7)
|
203
205
|
rdoc (~> 3.12)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.17
|
@@ -12,4 +12,14 @@ mkdir -p "/root/.ssh" || exit 11
|
|
12
12
|
touch "/root/.ssh/known_hosts" || exit 12
|
13
13
|
|
14
14
|
ssh-keygen -R github.com >/dev/null 2>&1 || exit 13 # No duplicates
|
15
|
-
ssh-keyscan -H github.com >> "/root/.ssh/known_hosts" 2>/dev/null || exit 14
|
15
|
+
ssh-keyscan -H github.com >> "/root/.ssh/known_hosts" 2>/dev/null || exit 14
|
16
|
+
|
17
|
+
echo "3. Adding default Git configurations"
|
18
|
+
if [ -z "`git config --global user.name`" ]
|
19
|
+
then
|
20
|
+
git config --global user.name "CoralNexus Machine"
|
21
|
+
fi
|
22
|
+
if [ -z "`git config --global user.email`" ]
|
23
|
+
then
|
24
|
+
git config --global user.email "admin@coralnexus.com"
|
25
|
+
fi
|
data/corl.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: corl 0.5.
|
5
|
+
# stub: corl 0.5.17 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "corl"
|
9
|
-
s.version = "0.5.
|
9
|
+
s.version = "0.5.17"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Adrian Webb"]
|
14
|
-
s.date = "2015-
|
14
|
+
s.date = "2015-04-29"
|
15
15
|
s.description = "Framework that provides a simple foundation for growing organically in the cloud"
|
16
16
|
s.email = "adrian.webb@coralnexus.com"
|
17
17
|
s.executables = ["corl"]
|
@@ -58,11 +58,13 @@ Gem::Specification.new do |s|
|
|
58
58
|
"lib/CORL/machine/AWS.rb",
|
59
59
|
"lib/CORL/machine/physical.rb",
|
60
60
|
"lib/CORL/machine/rackspace.rb",
|
61
|
+
"lib/CORL/machine/raspberrypi.rb",
|
61
62
|
"lib/CORL/machine/vagrant.rb",
|
62
63
|
"lib/CORL/network/CORL.rb",
|
63
64
|
"lib/CORL/node/AWS.rb",
|
64
65
|
"lib/CORL/node/local.rb",
|
65
66
|
"lib/CORL/node/rackspace.rb",
|
67
|
+
"lib/CORL/node/raspberrypi.rb",
|
66
68
|
"lib/CORL/node/vagrant.rb",
|
67
69
|
"lib/CORL/provisioner/puppetnode.rb",
|
68
70
|
"lib/core/build.rb",
|
@@ -106,6 +108,7 @@ Gem::Specification.new do |s|
|
|
106
108
|
"lib/facter/corl_config_ready.rb",
|
107
109
|
"lib/facter/corl_network.rb",
|
108
110
|
"lib/facter/custom_facts.rb",
|
111
|
+
"lib/facter/raspberry_pi.rb",
|
109
112
|
"lib/facter/vagrant_exists.rb",
|
110
113
|
"lib/hiera/corl_logger.rb",
|
111
114
|
"lib/nucleon/action/agent/manager.rb",
|
@@ -128,6 +131,7 @@ Gem::Specification.new do |s|
|
|
128
131
|
"lib/nucleon/action/node/build.rb",
|
129
132
|
"lib/nucleon/action/node/cache.rb",
|
130
133
|
"lib/nucleon/action/node/destroy.rb",
|
134
|
+
"lib/nucleon/action/node/devkey.rb",
|
131
135
|
"lib/nucleon/action/node/download.rb",
|
132
136
|
"lib/nucleon/action/node/exec.rb",
|
133
137
|
"lib/nucleon/action/node/fact.rb",
|
@@ -193,6 +197,7 @@ Gem::Specification.new do |s|
|
|
193
197
|
|
194
198
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
195
199
|
s.add_runtime_dependency(%q<nucleon>, [">= 0.2.2", "~> 0.2"])
|
200
|
+
s.add_runtime_dependency(%q<net-ping>, ["~> 1.7"])
|
196
201
|
s.add_runtime_dependency(%q<fog>, ["~> 1.23"])
|
197
202
|
s.add_runtime_dependency(%q<unf>, ["~> 0.1"])
|
198
203
|
s.add_runtime_dependency(%q<facter>, ["~> 2.3"])
|
@@ -205,6 +210,7 @@ Gem::Specification.new do |s|
|
|
205
210
|
s.add_development_dependency(%q<github-markup>, ["~> 1.3"])
|
206
211
|
else
|
207
212
|
s.add_dependency(%q<nucleon>, [">= 0.2.2", "~> 0.2"])
|
213
|
+
s.add_dependency(%q<net-ping>, ["~> 1.7"])
|
208
214
|
s.add_dependency(%q<fog>, ["~> 1.23"])
|
209
215
|
s.add_dependency(%q<unf>, ["~> 0.1"])
|
210
216
|
s.add_dependency(%q<facter>, ["~> 2.3"])
|
@@ -218,6 +224,7 @@ Gem::Specification.new do |s|
|
|
218
224
|
end
|
219
225
|
else
|
220
226
|
s.add_dependency(%q<nucleon>, [">= 0.2.2", "~> 0.2"])
|
227
|
+
s.add_dependency(%q<net-ping>, ["~> 1.7"])
|
221
228
|
s.add_dependency(%q<fog>, ["~> 1.23"])
|
222
229
|
s.add_dependency(%q<unf>, ["~> 0.1"])
|
223
230
|
s.add_dependency(%q<facter>, ["~> 2.3"])
|
@@ -2,146 +2,146 @@
|
|
2
2
|
module CORL
|
3
3
|
module Machine
|
4
4
|
class Physical < Nucleon.plugin_class(:CORL, :machine)
|
5
|
-
|
5
|
+
|
6
6
|
#-----------------------------------------------------------------------------
|
7
7
|
# Machine plugin interface
|
8
|
-
|
8
|
+
|
9
9
|
def normalize(reload)
|
10
10
|
super
|
11
11
|
myself.plugin_name = hostname
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
#-----------------------------------------------------------------------------
|
15
15
|
# Checks
|
16
|
-
|
16
|
+
|
17
17
|
def created?
|
18
18
|
true
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
#---
|
22
|
-
|
22
|
+
|
23
23
|
def running?
|
24
24
|
true
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
#-----------------------------------------------------------------------------
|
28
28
|
# Property accessors / modifiers
|
29
|
-
|
29
|
+
|
30
30
|
def state
|
31
31
|
translate_state('RUNNING')
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
#---
|
35
|
-
|
35
|
+
|
36
36
|
def hostname
|
37
37
|
fact(:fqdn)
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
#---
|
41
|
-
|
41
|
+
|
42
42
|
def public_ip
|
43
|
-
CORL.public_ip
|
43
|
+
CORL.public_ip
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
#---
|
47
|
-
|
47
|
+
|
48
48
|
def private_ip
|
49
49
|
nil
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
#---
|
53
|
-
|
53
|
+
|
54
54
|
def machine_type
|
55
55
|
'physical'
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
#---
|
59
|
-
|
59
|
+
|
60
60
|
def image
|
61
61
|
nil
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
#-----------------------------------------------------------------------------
|
65
65
|
# Management
|
66
66
|
|
67
67
|
def load
|
68
68
|
super do
|
69
69
|
true
|
70
|
-
end
|
70
|
+
end
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
#---
|
74
|
-
|
74
|
+
|
75
75
|
def create(options = {})
|
76
76
|
super do
|
77
77
|
logger.warn("Damn! We can't create new instances of physical machines")
|
78
78
|
true
|
79
79
|
end
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
82
|
#---
|
83
|
-
|
83
|
+
|
84
84
|
def download(remote_path, local_path, options = {})
|
85
85
|
super do |config, success|
|
86
86
|
logger.debug("Executing SCP downloads not yet supported on physical machines")
|
87
87
|
true
|
88
88
|
end
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
#---
|
92
|
-
|
92
|
+
|
93
93
|
def upload(local_path, remote_path, options = {})
|
94
94
|
super do |config, success|
|
95
95
|
logger.debug("Executing SCP uploads not yet supported on physical machines")
|
96
96
|
true
|
97
97
|
end
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
#---
|
101
|
-
|
101
|
+
|
102
102
|
def exec(commands, options = {}, &code)
|
103
103
|
super do |config, results|
|
104
104
|
logger.debug("Executing shell commands ( #{commands.inspect} ) on machine #{plugin_name}")
|
105
|
-
|
105
|
+
|
106
106
|
commands.each do |command|
|
107
107
|
result = CORL.cli_run(command, config) do |op, command_str, data|
|
108
108
|
code ? code.call(op, command_str, data) : true
|
109
|
-
end
|
109
|
+
end
|
110
110
|
results << result
|
111
111
|
end
|
112
112
|
results
|
113
113
|
end
|
114
114
|
end
|
115
|
-
|
115
|
+
|
116
116
|
#---
|
117
|
-
|
117
|
+
|
118
118
|
def terminal(user, options = {})
|
119
119
|
super do |config|
|
120
120
|
logger.debug("Launching terminals on the local machine is not currently supported")
|
121
121
|
1
|
122
122
|
end
|
123
123
|
end
|
124
|
-
|
124
|
+
|
125
125
|
#---
|
126
|
-
|
126
|
+
|
127
127
|
def start(options = {})
|
128
128
|
super do
|
129
129
|
logger.warn("This machine is already running so can not be started")
|
130
130
|
true
|
131
131
|
end
|
132
132
|
end
|
133
|
-
|
133
|
+
|
134
134
|
#---
|
135
|
-
|
135
|
+
|
136
136
|
def reload(options = {})
|
137
|
-
|
137
|
+
super do
|
138
138
|
logger.warn("Reloading not currently supported on physical machines")
|
139
139
|
true
|
140
140
|
end
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
#---
|
144
|
-
|
144
|
+
|
145
145
|
def create_image(name, options = {})
|
146
146
|
super do
|
147
147
|
logger.warn("Creating images of local machines not supported yet")
|
@@ -149,20 +149,20 @@ class Physical < Nucleon.plugin_class(:CORL, :machine)
|
|
149
149
|
end
|
150
150
|
end
|
151
151
|
#---
|
152
|
-
|
152
|
+
|
153
153
|
def stop(options = {})
|
154
154
|
super do
|
155
155
|
logger.warn("Stopping the machine we are operating is not supported right now")
|
156
156
|
true
|
157
157
|
end
|
158
158
|
end
|
159
|
-
|
159
|
+
|
160
160
|
#---
|
161
161
|
|
162
162
|
def destroy(options = {})
|
163
163
|
super do
|
164
164
|
logger.warn("If you want to destroy your physical machine, grab a hammer")
|
165
|
-
true
|
165
|
+
true
|
166
166
|
end
|
167
167
|
end
|
168
168
|
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
|
2
|
+
module CORL
|
3
|
+
module Machine
|
4
|
+
class Raspberrypi < Nucleon.plugin_class(:CORL, :machine)
|
5
|
+
|
6
|
+
include Mixin::Machine::SSH
|
7
|
+
|
8
|
+
#-----------------------------------------------------------------------------
|
9
|
+
# Machine plugin interface
|
10
|
+
|
11
|
+
def normalize(reload)
|
12
|
+
require 'net/ping'
|
13
|
+
|
14
|
+
super
|
15
|
+
myself.plugin_name = node.plugin_name if node
|
16
|
+
end
|
17
|
+
|
18
|
+
#-----------------------------------------------------------------------------
|
19
|
+
# Checks
|
20
|
+
|
21
|
+
def created?
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
#---
|
26
|
+
|
27
|
+
def running?
|
28
|
+
Net::Ping::TCP.new(public_ip, node.ssh_port).ping?
|
29
|
+
end
|
30
|
+
|
31
|
+
#-----------------------------------------------------------------------------
|
32
|
+
# Property accessors / modifiers
|
33
|
+
|
34
|
+
def public_ip
|
35
|
+
node[:public_ip]
|
36
|
+
end
|
37
|
+
|
38
|
+
#---
|
39
|
+
|
40
|
+
def state
|
41
|
+
running? ? :running : :not_running
|
42
|
+
end
|
43
|
+
|
44
|
+
#---
|
45
|
+
|
46
|
+
def machine_type
|
47
|
+
'raspberrypi'
|
48
|
+
end
|
49
|
+
|
50
|
+
#---
|
51
|
+
|
52
|
+
def image
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
|
56
|
+
#-----------------------------------------------------------------------------
|
57
|
+
# Management
|
58
|
+
|
59
|
+
def load
|
60
|
+
super do
|
61
|
+
true
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
#---
|
66
|
+
|
67
|
+
def create(options = {})
|
68
|
+
super do
|
69
|
+
logger.warn("Damn! We can't create new instances of Raspberry Pi machines")
|
70
|
+
true
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
#---
|
75
|
+
|
76
|
+
def download(remote_path, local_path, options = {}, &code)
|
77
|
+
super do |config, success|
|
78
|
+
ssh_download(remote_path, local_path, config, &code)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
#---
|
83
|
+
|
84
|
+
def upload(local_path, remote_path, options = {}, &code)
|
85
|
+
super do |config, success|
|
86
|
+
ssh_upload(local_path, remote_path, config, &code)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
#---
|
91
|
+
|
92
|
+
def exec(commands, options = {}, &code)
|
93
|
+
super do |config|
|
94
|
+
ssh_exec(commands, config, &code)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
#---
|
99
|
+
|
100
|
+
def terminal(user, options = {})
|
101
|
+
super do |config|
|
102
|
+
ssh_terminal(user, config)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
#---
|
107
|
+
|
108
|
+
def reload(options = {})
|
109
|
+
super do
|
110
|
+
node.command('reboot', { :as_admin => true })
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
#---
|
115
|
+
|
116
|
+
def create_image(options = {})
|
117
|
+
super do
|
118
|
+
logger.warn("Creating images of Raspberry Pi machines not supported yet")
|
119
|
+
true
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
#---
|
124
|
+
|
125
|
+
def stop(options = {})
|
126
|
+
super do
|
127
|
+
logger.warn("Stopping a Raspberry Pi machine is not supported right now")
|
128
|
+
true
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
#---
|
133
|
+
|
134
|
+
def start(options = {})
|
135
|
+
super do
|
136
|
+
logger.warn("Starting a Raspberry Pi machine is not supported right now")
|
137
|
+
true
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
#---
|
142
|
+
|
143
|
+
def destroy(options = {})
|
144
|
+
super do
|
145
|
+
logger.warn("If you want to destroy your Raspberry Pi machine, grab a hammer")
|
146
|
+
true
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
#-----------------------------------------------------------------------------
|
151
|
+
# Utilities
|
152
|
+
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
module CORL
|
3
|
+
module Node
|
4
|
+
class Raspberrypi < Nucleon.plugin_class(:CORL, :node)
|
5
|
+
|
6
|
+
#-----------------------------------------------------------------------------
|
7
|
+
# Node plugin interface
|
8
|
+
|
9
|
+
def normalize(reload)
|
10
|
+
super
|
11
|
+
myself.machine = create_machine(:machine, :raspberrypi, machine_config)
|
12
|
+
end
|
13
|
+
|
14
|
+
#-----------------------------------------------------------------------------
|
15
|
+
# Checks
|
16
|
+
|
17
|
+
def local?
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
#-----------------------------------------------------------------------------
|
22
|
+
# Property accessors / modifiers
|
23
|
+
|
24
|
+
#-----------------------------------------------------------------------------
|
25
|
+
# Utilities
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/CORL/node/vagrant.rb
CHANGED
@@ -243,19 +243,6 @@ class Vagrant < Nucleon.plugin_class(:CORL, :node)
|
|
243
243
|
end
|
244
244
|
end
|
245
245
|
|
246
|
-
#---
|
247
|
-
|
248
|
-
def filter_output(type, data)
|
249
|
-
data = super
|
250
|
-
|
251
|
-
if type == :error
|
252
|
-
if data.include?('stdin: is not a tty') || data.include?('unable to re-open stdin')
|
253
|
-
data = ''
|
254
|
-
end
|
255
|
-
end
|
256
|
-
data
|
257
|
-
end
|
258
|
-
|
259
246
|
#-----------------------------------------------------------------------------
|
260
247
|
# Machine type utilities
|
261
248
|
|
@@ -28,6 +28,9 @@ class Puppetnode < Nucleon.plugin_class(:CORL, :provisioner)
|
|
28
28
|
|
29
29
|
def normalize(reload)
|
30
30
|
super do
|
31
|
+
require 'puppet'
|
32
|
+
require 'puppet/configurer'
|
33
|
+
|
31
34
|
if [ :debug, :info, :warn ].include? CORL.log_level
|
32
35
|
Puppet.debug = true
|
33
36
|
end
|
@@ -86,9 +89,6 @@ class Puppetnode < Nucleon.plugin_class(:CORL, :provisioner)
|
|
86
89
|
# Puppet initialization
|
87
90
|
|
88
91
|
def init_puppet(node, profiles)
|
89
|
-
require 'puppet'
|
90
|
-
require 'puppet/configurer'
|
91
|
-
|
92
92
|
Puppet.initialize_settings
|
93
93
|
|
94
94
|
apply_environment = nil
|
data/lib/core/facade.rb
CHANGED
@@ -44,6 +44,9 @@ module Facade
|
|
44
44
|
ip_address = Config.fact(:ipaddress_eth1)
|
45
45
|
ip_address = Config.fact(:ipaddress_eth0) unless ip_address
|
46
46
|
ip_address
|
47
|
+
elsif Config.fact(:raspberry_pi)
|
48
|
+
ip_address = Config.fact(:ipaddress_eth0)
|
49
|
+
ip_address
|
47
50
|
else
|
48
51
|
CORL.ip_address
|
49
52
|
end
|
@@ -3,10 +3,10 @@ module CORL
|
|
3
3
|
module Mixin
|
4
4
|
module Action
|
5
5
|
module Keypair
|
6
|
-
|
6
|
+
|
7
7
|
#-----------------------------------------------------------------------------
|
8
8
|
# Options
|
9
|
-
|
9
|
+
|
10
10
|
def keypair_config
|
11
11
|
register_str :private_key, nil, 'corl.core.mixin.action.keypair.options.private_key' do |value|
|
12
12
|
success = true
|
@@ -19,53 +19,53 @@ module Keypair
|
|
19
19
|
end
|
20
20
|
else
|
21
21
|
warn('corl.core.mixin.action.keypair.errors.private_key_not_found', { :value => file })
|
22
|
-
success = false
|
22
|
+
success = false
|
23
23
|
end
|
24
24
|
end
|
25
|
-
success
|
25
|
+
success
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
register_bool :require_password, false, 'corl.core.mixin.action.keypair.options.require_password'
|
29
|
-
|
29
|
+
|
30
30
|
register_str :key_type, 'RSA', 'corl.core.mixin.action.keypair.options.key_type' do |value|
|
31
31
|
key_type_choices = [ 'RSA', 'DSA' ]
|
32
32
|
unless key_type_choices.include?(value.to_s.upcase)
|
33
33
|
warn('corl.core.mixin.action.keypair.errors.key_type', { :value => value, :choices => key_type_choices })
|
34
|
-
next false
|
34
|
+
next false
|
35
35
|
end
|
36
36
|
true
|
37
37
|
end
|
38
38
|
register_int :key_bits, 2048, 'corl.core.mixin.action.keypair.options.key_bits' do |value|
|
39
39
|
unless value >= 2048
|
40
40
|
warn('corl.core.mixin.action.keypair.errors.key_bits', { :value => value, :required => 2048 })
|
41
|
-
next false
|
41
|
+
next false
|
42
42
|
end
|
43
|
-
true
|
43
|
+
true
|
44
44
|
end
|
45
45
|
register_str :key_comment, '', 'corl.core.mixin.action.keypair.options.key_comment'
|
46
|
-
|
46
|
+
|
47
47
|
config_subset(keypair_ignore)
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
#---
|
51
|
-
|
51
|
+
|
52
52
|
def keypair_ignore
|
53
53
|
[ :require_password, :key_type, :key_bits, :key_comment ]
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
#---
|
57
|
-
|
57
|
+
|
58
58
|
def keypair_clean
|
59
|
-
remove(keypair_ignore)
|
59
|
+
remove(keypair_ignore)
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
#-----------------------------------------------------------------------------
|
63
63
|
# Properties
|
64
|
-
|
64
|
+
|
65
65
|
@keypair = nil
|
66
|
-
|
66
|
+
|
67
67
|
#---
|
68
|
-
|
68
|
+
|
69
69
|
def keypair=options
|
70
70
|
config = Config.ensure(options).defaults({
|
71
71
|
:type => settings[:key_type].to_s.upcase,
|
@@ -75,13 +75,13 @@ module Keypair
|
|
75
75
|
@keypair = Util::SSH.generate(config)
|
76
76
|
settings.import({ :keypair => @keypair })
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
#---
|
80
|
-
|
81
|
-
def keypair(reset = false)
|
80
|
+
|
81
|
+
def keypair(reset = false, warn = true)
|
82
82
|
if reset || ! @keypair
|
83
83
|
if settings[:private_key]
|
84
|
-
key_options = { :private_key => private_key }
|
84
|
+
key_options = { :private_key => private_key }
|
85
85
|
else
|
86
86
|
key_options = {}
|
87
87
|
if settings[:require_password]
|
@@ -89,7 +89,7 @@ module Keypair
|
|
89
89
|
if key_password
|
90
90
|
key_options[:passphrase] = key_password
|
91
91
|
else
|
92
|
-
warn('no_password')
|
92
|
+
warn('no_password') if warn
|
93
93
|
return nil
|
94
94
|
end
|
95
95
|
end
|
@@ -70,6 +70,8 @@ class CloudAction < Nucleon.plugin_class(:nucleon, :action)
|
|
70
70
|
# Settings
|
71
71
|
|
72
72
|
def node_config
|
73
|
+
register_str :user_password, nil, 'corl.core.action.options.user_password'
|
74
|
+
|
73
75
|
register_str :net_remote, :edit, 'corl.core.action.options.net_remote'
|
74
76
|
register_network_provider :net_provider, :corl, [ 'corl.core.action.options.net_provider', 'corl.core.action.errors.network_provider' ]
|
75
77
|
|
@@ -114,6 +116,8 @@ class CloudAction < Nucleon.plugin_class(:nucleon, :action)
|
|
114
116
|
def node_exec
|
115
117
|
init_network(settings[:net_provider]) unless network && settings[:net_provider].to_sym == network.plugin_provider
|
116
118
|
|
119
|
+
network.node_password = settings[:user_password] if network && settings[:user_password]
|
120
|
+
|
117
121
|
#
|
118
122
|
# A fork in the road...
|
119
123
|
#
|
@@ -28,7 +28,8 @@ class Configuration < Nucleon.plugin_class(:nucleon, :base)
|
|
28
28
|
:revision => _delete(:revision),
|
29
29
|
:create => _delete(:create, false),
|
30
30
|
:pull => true,
|
31
|
-
:
|
31
|
+
:external_ip => _delete(:external_ip, nil),
|
32
|
+
:internal_ip => _delete(:internal_ip, CORL.public_ip), # Needed for seeding Vagrant VMs
|
32
33
|
:manage_ignore => _delete(:manage_ignore, true),
|
33
34
|
:new => true
|
34
35
|
}), _delete(:project_provider, nil)) unless reload
|
data/lib/core/plugin/fog_node.rb
CHANGED
@@ -220,16 +220,6 @@ class FogBase < Nucleon.plugin_class(:CORL, :node)
|
|
220
220
|
#-----------------------------------------------------------------------------
|
221
221
|
# Utilities
|
222
222
|
|
223
|
-
def filter_output(type, data)
|
224
|
-
data = super
|
225
|
-
|
226
|
-
if type == :error
|
227
|
-
if data.include?('stdin: is not a tty') || data.include?('unable to re-open stdin')
|
228
|
-
data = ''
|
229
|
-
end
|
230
|
-
end
|
231
|
-
data
|
232
|
-
end
|
233
223
|
end
|
234
224
|
end
|
235
225
|
end
|
data/lib/core/plugin/network.rb
CHANGED
@@ -131,6 +131,16 @@ class Network < Nucleon.plugin_class(:nucleon, :base)
|
|
131
131
|
|
132
132
|
#---
|
133
133
|
|
134
|
+
def node_password=password
|
135
|
+
@node_password = password
|
136
|
+
end
|
137
|
+
|
138
|
+
def node_password
|
139
|
+
@node_password
|
140
|
+
end
|
141
|
+
|
142
|
+
#---
|
143
|
+
|
134
144
|
def node_groups
|
135
145
|
groups = {}
|
136
146
|
|
@@ -229,6 +239,8 @@ class Network < Nucleon.plugin_class(:nucleon, :base)
|
|
229
239
|
local_node.normalize(true)
|
230
240
|
local_node.localize
|
231
241
|
end
|
242
|
+
|
243
|
+
local_node.password = node_password
|
232
244
|
local_node
|
233
245
|
end
|
234
246
|
|
@@ -480,6 +492,7 @@ class Network < Nucleon.plugin_class(:nucleon, :base)
|
|
480
492
|
if CORL.parallel? && parallel
|
481
493
|
values = []
|
482
494
|
nodes.each do |node|
|
495
|
+
node.password = node_password
|
483
496
|
if ! running || node.running?
|
484
497
|
values << Celluloid::Future.new(node, &code)
|
485
498
|
end
|
@@ -488,6 +501,7 @@ class Network < Nucleon.plugin_class(:nucleon, :base)
|
|
488
501
|
success = false if values.include?(false)
|
489
502
|
else
|
490
503
|
nodes.each do |node|
|
504
|
+
node.password = node_password
|
491
505
|
if ! running || node.running?
|
492
506
|
proc_success = code.call(node)
|
493
507
|
if proc_success == false
|
data/lib/core/plugin/node.rb
CHANGED
@@ -174,6 +174,16 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
174
174
|
|
175
175
|
#---
|
176
176
|
|
177
|
+
def password=password
|
178
|
+
@password = password
|
179
|
+
end
|
180
|
+
|
181
|
+
def password
|
182
|
+
@password
|
183
|
+
end
|
184
|
+
|
185
|
+
#---
|
186
|
+
|
177
187
|
def ssh_port=ssh_port
|
178
188
|
myself[:ssh_port] = ssh_port
|
179
189
|
machine.init_ssh(ssh_port) if machine
|
@@ -643,9 +653,10 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
643
653
|
:message => "Updating SSH keys for node #{plugin_provider} (#{plugin_name})"
|
644
654
|
}
|
645
655
|
|
646
|
-
active
|
647
|
-
|
648
|
-
|
656
|
+
active = machine && machine.running?
|
657
|
+
ssh_user = user ? user : 'root'
|
658
|
+
result = run.node_authorize({ :public_key => keypair.ssh_key, :ssh_user => ssh_user }) if active
|
659
|
+
success = false
|
649
660
|
|
650
661
|
if ! active || result.status == code.success
|
651
662
|
private_key = network.attach_data(:keys, "#{base_name}-id_#{keypair.type}", keypair.encrypted_key)
|
@@ -944,7 +955,10 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
944
955
|
|
945
956
|
admin_command = ''
|
946
957
|
if as_admin
|
947
|
-
|
958
|
+
admin_options = config.delete(:admin_options, '-i')
|
959
|
+
default_admin_command = password ? "echo '#{password}' | sudo -S #{admin_options}" : "sudo #{admin_options}"
|
960
|
+
|
961
|
+
admin_command = config.delete(:admin_command, default_admin_command)
|
948
962
|
admin_command = extension_set(:admin_command, admin_command, config)
|
949
963
|
else
|
950
964
|
config.delete(:admin_command)
|
@@ -988,7 +1002,13 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
988
1002
|
command_base = "NUCLEON_NO_PARALLEL=1 #{command_base}" unless parallel
|
989
1003
|
command_base = "NUCLEON_NO_COLOR=1 #{command_base}" if action_agent
|
990
1004
|
|
991
|
-
result = command(command_base, {
|
1005
|
+
result = command(command_base, Util::Data.clean({
|
1006
|
+
:subcommand => action_config,
|
1007
|
+
:as_admin => true,
|
1008
|
+
:admin_options => config.get(:admin_options, nil),
|
1009
|
+
:admin_command => config.get(:admin_command, nil),
|
1010
|
+
:quiet => quiet
|
1011
|
+
})) do |op, data|
|
992
1012
|
yield(op, data) if block_given?
|
993
1013
|
end
|
994
1014
|
|
@@ -1024,6 +1044,8 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
1024
1044
|
active_machine = machine
|
1025
1045
|
end
|
1026
1046
|
|
1047
|
+
config[:key_dir] = network.key_cache_directory
|
1048
|
+
config[:key_name] = plugin_name
|
1027
1049
|
config[:private_keys] = private_key
|
1028
1050
|
config[:port] = ssh_port
|
1029
1051
|
|
@@ -1087,7 +1109,7 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
1087
1109
|
auth_files = package_files.collect { |path| "'#{path}'"}
|
1088
1110
|
root_home_path = config.get(:root_home, '/root')
|
1089
1111
|
|
1090
|
-
result = command("cp #{auth_files.join(' ')} #{root_home_path}", { :as_admin => true, :
|
1112
|
+
result = command("cp #{auth_files.join(' ')} #{root_home_path}", { :as_admin => true, :admin_options => '' })
|
1091
1113
|
myself.status = code.root_auth_copy_failure unless result.status == code.success
|
1092
1114
|
end
|
1093
1115
|
|
@@ -1448,8 +1470,11 @@ class Node < Nucleon.plugin_class(:nucleon, :base)
|
|
1448
1470
|
data = ''
|
1449
1471
|
end
|
1450
1472
|
elsif type == :error
|
1451
|
-
|
1452
|
-
|
1473
|
+
if data.include?('stdin: is not a tty') ||
|
1474
|
+
data.include?('unable to re-open stdin') ||
|
1475
|
+
data.include?('[sudo] password for') ||
|
1476
|
+
data.include?('sudo: unable to resolve host') ||
|
1477
|
+
data == 'WARNING: $SAFE is not supported on Rubinius.'
|
1453
1478
|
data = ''
|
1454
1479
|
end
|
1455
1480
|
end
|
@@ -3,53 +3,55 @@ module Nucleon
|
|
3
3
|
module Action
|
4
4
|
module Node
|
5
5
|
class Authorize < Nucleon.plugin_class(:nucleon, :cloud_action)
|
6
|
-
|
6
|
+
|
7
7
|
#-----------------------------------------------------------------------------
|
8
8
|
# Info
|
9
|
-
|
9
|
+
|
10
10
|
def self.describe
|
11
11
|
super(:node, :authorize, 555)
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
#-----------------------------------------------------------------------------
|
15
15
|
# Settings
|
16
|
-
|
16
|
+
|
17
17
|
def configure
|
18
18
|
super do
|
19
19
|
codes :key_store_failure
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
|
21
|
+
register_bool :reset, false
|
22
|
+
register_str :public_key, nil
|
23
|
+
register_str :ssh_user, ''
|
23
24
|
end
|
24
25
|
end
|
25
|
-
|
26
|
+
|
26
27
|
#---
|
27
|
-
|
28
|
+
|
28
29
|
def arguments
|
29
|
-
[ :public_key ]
|
30
|
+
[ :public_key, :ssh_user ]
|
30
31
|
end
|
31
32
|
|
32
33
|
#-----------------------------------------------------------------------------
|
33
34
|
# Operations
|
34
|
-
|
35
|
+
|
35
36
|
def execute
|
36
37
|
super do |node|
|
37
|
-
info('
|
38
|
-
|
38
|
+
info('start', { :public_key => settings[:public_key] })
|
39
|
+
|
39
40
|
ensure_node(node) do
|
40
|
-
|
41
|
-
|
41
|
+
ssh_user = settings[:ssh_user].empty? ? nil : settings[:ssh_user]
|
42
|
+
ssh_path = Util::SSH.key_path(ssh_user)
|
43
|
+
authorized_keys = File.join(ssh_path, 'authorized_keys')
|
42
44
|
public_key = settings[:public_key].strip
|
43
45
|
key_found = false
|
44
|
-
|
46
|
+
|
45
47
|
File.delete(authorized_keys) if settings[:reset]
|
46
|
-
|
48
|
+
|
47
49
|
if File.exists?(authorized_keys)
|
48
50
|
Util::Disk.read(authorized_keys).split("\n").each do |line|
|
49
51
|
if line.strip.include?(public_key)
|
50
52
|
key_found = true
|
51
|
-
break
|
52
|
-
end
|
53
|
+
break
|
54
|
+
end
|
53
55
|
end
|
54
56
|
end
|
55
57
|
unless key_found
|
@@ -0,0 +1,87 @@
|
|
1
|
+
|
2
|
+
module Nucleon
|
3
|
+
module Action
|
4
|
+
module Node
|
5
|
+
class Devkey < Nucleon.plugin_class(:nucleon, :cloud_action)
|
6
|
+
|
7
|
+
include Mixin::Action::Keypair
|
8
|
+
|
9
|
+
#-----------------------------------------------------------------------------
|
10
|
+
# Info
|
11
|
+
|
12
|
+
def self.describe
|
13
|
+
super(:node, :devkey, 530)
|
14
|
+
end
|
15
|
+
|
16
|
+
#-----------------------------------------------------------------------------
|
17
|
+
# Settings
|
18
|
+
|
19
|
+
def configure
|
20
|
+
super do
|
21
|
+
codes :no_password_given
|
22
|
+
|
23
|
+
keypair_config
|
24
|
+
config[:require_password].default = true
|
25
|
+
|
26
|
+
register_array :key_nodes, nil do |values|
|
27
|
+
if values.nil?
|
28
|
+
warn('key_nodes_empty')
|
29
|
+
next false
|
30
|
+
end
|
31
|
+
|
32
|
+
node_plugins = CORL.loaded_plugins(:CORL, :node)
|
33
|
+
success = true
|
34
|
+
|
35
|
+
values.each do |value|
|
36
|
+
if info = CORL.plugin_class(:CORL, :node).translate_reference(value)
|
37
|
+
if ! node_plugins.keys.include?(info[:provider].to_sym) || info[:name].empty?
|
38
|
+
warn('key_nodes', { :value => value, :node_provider => info[:provider], :name => info[:name] })
|
39
|
+
success = false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
success
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
#---
|
49
|
+
|
50
|
+
def ignore
|
51
|
+
[ :nodes, :parallel ]
|
52
|
+
end
|
53
|
+
|
54
|
+
def arguments
|
55
|
+
[ :key_nodes ]
|
56
|
+
end
|
57
|
+
|
58
|
+
#-----------------------------------------------------------------------------
|
59
|
+
# Operations
|
60
|
+
|
61
|
+
def execute
|
62
|
+
super do |local_node|
|
63
|
+
ensure_network do
|
64
|
+
keypair = keypair(true, false)
|
65
|
+
|
66
|
+
if keypair.nil?
|
67
|
+
myself.status = code.no_password_given
|
68
|
+
else
|
69
|
+
batch_success = network.batch(settings[:key_nodes], settings[:node_provider], false) do |node|
|
70
|
+
render_options = { :id => node.id, :hostname => node.hostname }
|
71
|
+
|
72
|
+
info('start', render_options)
|
73
|
+
node.attach_keys(keypair)
|
74
|
+
end
|
75
|
+
if batch_success
|
76
|
+
network.save({ :push => true, :remote => :edit })
|
77
|
+
else
|
78
|
+
myself.status = code.batch_error
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -50,7 +50,7 @@ class Download < Nucleon.plugin_class(:nucleon, :cloud_action)
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def arguments
|
53
|
-
[ :remote_path, :local_path, :
|
53
|
+
[ :remote_path, :local_path, :download_nodes ]
|
54
54
|
end
|
55
55
|
|
56
56
|
#-----------------------------------------------------------------------------
|
data/locales/en.yml
CHANGED
@@ -16,6 +16,8 @@ en:
|
|
16
16
|
Default to using a specific node provider but individual node references can override (default %{default_value})
|
17
17
|
nodes: |-
|
18
18
|
Optional nodes on which to execute this action
|
19
|
+
user_password: |-
|
20
|
+
Optional user password for SSH login and password required sudo operations
|
19
21
|
errors:
|
20
22
|
network_provider: |-
|
21
23
|
Network plugin provider %{value} is not loaded >> Pick from the following: %{choices}
|
@@ -712,9 +714,18 @@ en:
|
|
712
714
|
authorize:
|
713
715
|
description: |-
|
714
716
|
Authorize a public key for node access
|
717
|
+
info:
|
718
|
+
start: |-
|
719
|
+
Authorizing public SSH key: %{public_key}
|
715
720
|
revoke:
|
716
721
|
description: |-
|
717
722
|
Revoke a public keys access to nodes
|
723
|
+
devkey:
|
724
|
+
description: |-
|
725
|
+
Generate a new development SSH keypair and authorize on servers
|
726
|
+
info:
|
727
|
+
start: |-
|
728
|
+
Generating and authorizing keypair for machine %{hostname} (%{id})
|
718
729
|
keypair:
|
719
730
|
description: |-
|
720
731
|
Generate a new SSH keypair
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: corl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrian Webb
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nucleon
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - "~>"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '0.2'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: net-ping
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.7'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.7'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: fog
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -218,11 +232,13 @@ files:
|
|
218
232
|
- lib/CORL/machine/AWS.rb
|
219
233
|
- lib/CORL/machine/physical.rb
|
220
234
|
- lib/CORL/machine/rackspace.rb
|
235
|
+
- lib/CORL/machine/raspberrypi.rb
|
221
236
|
- lib/CORL/machine/vagrant.rb
|
222
237
|
- lib/CORL/network/CORL.rb
|
223
238
|
- lib/CORL/node/AWS.rb
|
224
239
|
- lib/CORL/node/local.rb
|
225
240
|
- lib/CORL/node/rackspace.rb
|
241
|
+
- lib/CORL/node/raspberrypi.rb
|
226
242
|
- lib/CORL/node/vagrant.rb
|
227
243
|
- lib/CORL/provisioner/puppetnode.rb
|
228
244
|
- lib/core/build.rb
|
@@ -266,6 +282,7 @@ files:
|
|
266
282
|
- lib/facter/corl_config_ready.rb
|
267
283
|
- lib/facter/corl_network.rb
|
268
284
|
- lib/facter/custom_facts.rb
|
285
|
+
- lib/facter/raspberry_pi.rb
|
269
286
|
- lib/facter/vagrant_exists.rb
|
270
287
|
- lib/hiera/corl_logger.rb
|
271
288
|
- lib/nucleon/action/agent/manager.rb
|
@@ -288,6 +305,7 @@ files:
|
|
288
305
|
- lib/nucleon/action/node/build.rb
|
289
306
|
- lib/nucleon/action/node/cache.rb
|
290
307
|
- lib/nucleon/action/node/destroy.rb
|
308
|
+
- lib/nucleon/action/node/devkey.rb
|
291
309
|
- lib/nucleon/action/node/download.rb
|
292
310
|
- lib/nucleon/action/node/exec.rb
|
293
311
|
- lib/nucleon/action/node/fact.rb
|