vagrant-registration 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/Gemfile +5 -5
- data/README.md +140 -13
- data/lib/vagrant-registration.rb +1 -1
- data/lib/vagrant-registration/action/register.rb +15 -10
- data/lib/vagrant-registration/action/unregister_on_halt.rb +2 -2
- data/lib/vagrant-registration/config.rb +5 -3
- data/lib/vagrant-registration/plugin.rb +22 -2
- data/lib/vagrant-registration/version.rb +1 -1
- data/plugins/guests/redhat/cap/registration.rb +14 -13
- data/plugins/guests/redhat/cap/rhn_register.rb +139 -0
- data/plugins/guests/redhat/cap/subscription_manager.rb +36 -22
- data/plugins/guests/redhat/plugin.rb +36 -1
- data/resources/rhn_unregister.py +43 -0
- data/vagrant-registration.gemspec +3 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3faa5f60610d751ab605780b28956d11a6af323
|
4
|
+
data.tar.gz: 0bef59c99cefb7dc5156b4d80ca841e0a82fe696
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a39cf4efff1c4af5a311439120d816034d649d9fba5e77f1fd28a5ab736627ed149e86b60f635c0425514f5ecd02cdbdfda88d3ef84ef7cbc6b75f32c3f0256
|
7
|
+
data.tar.gz: 6c65312f483594fc0bffa7e540c91b5a1ad0e84acbf375cb70c30397f0c45e4fd717a32624f63377a09c566a89ee739008233a378126816e68e8dc36b3f7be0e
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.1.0
|
4
|
+
|
5
|
+
- Print warning if specifically selected manager is not available
|
6
|
+
- Support running alongside vagrant-vbguest, issue #40
|
7
|
+
- Support rhn_register manager
|
8
|
+
- Fix: Handle various types of configuration option values, issue #48
|
9
|
+
- Fix: Hide password on registration failure, issue #47
|
10
|
+
|
11
|
+
## 1.0.1
|
12
|
+
|
13
|
+
- Fix: Set repo_ca_cert option in /etc/rhsm/rhsm.conf after uploading a certificate
|
14
|
+
|
3
15
|
## 1.0.0
|
4
16
|
|
5
17
|
- Support providing a CA certificate via `config.registration.ca_cert` option
|
data/Gemfile
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
5
|
group :development do
|
6
|
-
gem
|
7
|
-
gem
|
8
|
-
gem
|
6
|
+
gem 'vagrant', git: 'https://github.com/mitchellh/vagrant.git'
|
7
|
+
gem 'gem-compare'
|
8
|
+
gem 'rake'
|
9
9
|
end
|
10
10
|
|
11
11
|
group :plugins do
|
12
|
-
gem
|
12
|
+
gem 'vagrant-registration', path: '.'
|
13
13
|
end
|
data/README.md
CHANGED
@@ -23,7 +23,7 @@ If you are on Fedora, you can install the packaged version of the plugin by runn
|
|
23
23
|
|
24
24
|
The plugin is designed in an registration-manager-agnostic way which means that plugin itself does not depend on any OS nor way of registration. vagrant-registration only calls registration capabilities for given guest, passes the configuration options to them and handles interactive registration.
|
25
25
|
|
26
|
-
That being said, this plugin currently ships only with registration capability files for RHEL's Subscription Manager
|
26
|
+
That being said, this plugin currently ships only with registration capability files for RHEL's Subscription Manager and `rhn_register`. Feel free to submit others.
|
27
27
|
|
28
28
|
To configure the plugin, always include the configuration options mentioned in this file within the following configuration block in your Vagrantfile.
|
29
29
|
|
@@ -47,12 +47,13 @@ end
|
|
47
47
|
config.registration.unregister_on_halt = false
|
48
48
|
```
|
49
49
|
|
50
|
-
|
50
|
+
- **manager** selects the registration manager provider. By default the plugin will use the `subscription_manager` manager, you can however change that by setting the option to a different manager:
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
52
|
+
```ruby
|
53
|
+
config.registration.manager = 'subscription_manager'
|
54
|
+
```
|
55
|
+
|
56
|
+
### Credentials Configuration
|
56
57
|
|
57
58
|
Setting up the credentials can be done as follows:
|
58
59
|
|
@@ -63,7 +64,7 @@ Vagrant.configure('2') do |config|
|
|
63
64
|
config.registration.username = 'foo'
|
64
65
|
config.registration.password = 'bar'
|
65
66
|
end
|
66
|
-
|
67
|
+
|
67
68
|
# Alternatively
|
68
69
|
if Vagrant.has_plugin?('vagrant-registration')
|
69
70
|
config.registration.org = 'foo'
|
@@ -92,8 +93,30 @@ end
|
|
92
93
|
|
93
94
|
If you do not provide credentials, you will be prompted for them in the "up process."
|
94
95
|
|
95
|
-
Please note the the interactive mode asks you for the preferred registration pair only
|
96
|
-
|
96
|
+
Please note the the interactive mode asks you for the preferred registration pair only
|
97
|
+
of the configured manager.
|
98
|
+
|
99
|
+
### subscription-manager Configuration
|
100
|
+
|
101
|
+
vagrant-registration will use the `subscription_manager` manager by default or can be explicitly configured by setting the `manager` option to `subscription_manager`:
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
Vagrant.configure('2') do |config|
|
105
|
+
...
|
106
|
+
if Vagrant.has_plugin?('vagrant-registration')
|
107
|
+
config.registration.manager = 'subscription_manager'
|
108
|
+
end
|
109
|
+
...
|
110
|
+
end
|
111
|
+
```
|
112
|
+
|
113
|
+
In case of `subscription_manager` manager for the preferred registration pair,
|
114
|
+
you would be ask on your username/password combination.
|
115
|
+
|
116
|
+
vagrant-registration supports all the options of subscription-manager's register command.
|
117
|
+
You can set any option easily by setting `config.registration.OPTION_NAME = 'OPTION_VALUE'`
|
118
|
+
in your Vagrantfile (please see the subscription-manager's documentation for option
|
119
|
+
description).
|
97
120
|
|
98
121
|
#### subscription-manager Default Options
|
99
122
|
|
@@ -102,10 +125,10 @@ In case of a subscription-manager, you would be ask on your username/password co
|
|
102
125
|
```ruby
|
103
126
|
config.registration.force = false
|
104
127
|
```
|
128
|
+
|
105
129
|
- **--auto-attach**: Vagrant would fail to install packages on registered RHEL system if the subscription is not attached, therefore vagrant-registration appends the
|
106
130
|
`--auto-attach` flag automatically when subscribing. To disable this option, set `auto_attach` option to `false`:
|
107
131
|
|
108
|
-
|
109
132
|
```ruby
|
110
133
|
config.registration.auto_attach = false
|
111
134
|
```
|
@@ -168,21 +191,125 @@ Note that the `auto_attach` option is set to false when using org/activationkey
|
|
168
191
|
config.registration.skip
|
169
192
|
```
|
170
193
|
|
194
|
+
### rhn-register Configuration
|
195
|
+
|
196
|
+
vagrant-registration will use the `rhn_register` manager only if explicitly configured by setting the `manager` option to `rhn_register`:
|
197
|
+
|
198
|
+
```ruby
|
199
|
+
Vagrant.configure('2') do |config|
|
200
|
+
...
|
201
|
+
if Vagrant.has_plugin?('vagrant-registration')
|
202
|
+
config.registration.manager = 'rhn_register'
|
203
|
+
end
|
204
|
+
...
|
205
|
+
end
|
206
|
+
```
|
207
|
+
|
208
|
+
In case of a `rhn_register` manager, the preferred registration pair is the username/password/serverurl combination.
|
209
|
+
|
210
|
+
vagrant-registration supports most of the options of rhnreg_ks's command. You can set any option easily by setting `config.registration.OPTION_NAME = 'OPTION_VALUE'` in your Vagrantfile (please see the `rhnreg_ks`'s documentation for option description).
|
211
|
+
|
212
|
+
`rhn_register` manager reuses the naming of `subscription-manager`'s command options where possible.
|
213
|
+
|
214
|
+
#### rhn-register Default Options
|
215
|
+
|
216
|
+
- **--force**: `rhnreg_ks` command will fail if you attempt to register an already registered machine (see the man page for explanation), therefore vagrant-registration appends the `--force` flag automatically when subscribing. If you would like to disable this feature, set `force` option to `false`:
|
217
|
+
|
218
|
+
```ruby
|
219
|
+
config.registration.force = false
|
220
|
+
```
|
221
|
+
|
222
|
+
#### rhn-register Options Reference
|
223
|
+
|
224
|
+
```ruby
|
225
|
+
# The username to register the system with under Spacewalk Server, Red Hat Satellite or
|
226
|
+
# Red Hat Network Classic. This can be an existing Spacewalk, Red Hat Satellite or
|
227
|
+
# Red Hat Network Classic username, or a new user‐name.
|
228
|
+
config.registration.username
|
229
|
+
|
230
|
+
# The password associated with the username specified with the `--username` option.
|
231
|
+
# This is an unencrypted password.
|
232
|
+
config.registration.password
|
233
|
+
|
234
|
+
# Give the URL of the subscription service to use (required for registering a
|
235
|
+
# system with the "Spacewalk Server", "Red Hat Satellite" or "Red Hat Network Classic").
|
236
|
+
# The configuration name is mapped to the `--serverUrl` option of rhnreg_ks command.
|
237
|
+
#
|
238
|
+
# The serverurl is mandatory and if you do not provide a value,
|
239
|
+
# you will be prompted for them in the "up process."
|
240
|
+
config.registration.serverurl
|
241
|
+
|
242
|
+
# A path to a CA certificate file (optional)
|
243
|
+
# The configuration name is mapped to the `--sslCACert` option of rhnreg_ks command.
|
244
|
+
#
|
245
|
+
# The CA certificate file is be uploaded to /usr/share/rhn/<ca_file_name> in guest
|
246
|
+
# and the configuration in `/etc/sysconfig/rhn/up2date` is updated to:
|
247
|
+
# `sslCACert=/usr/share/rhn/<ca_file_name>`
|
248
|
+
#
|
249
|
+
# As default only the configuration in `/etc/sysconfig/rhn/up2date` is updated
|
250
|
+
# to point to the CA certificate file that is present on Fedora, CentOS and RHEL:
|
251
|
+
# `sslCACert=/usr/share/rhn/RHNS-CA-CERT`
|
252
|
+
config.registration.ca_cert
|
253
|
+
|
254
|
+
# Give the organization to which to join the system (required, except for
|
255
|
+
# hosted environments)
|
256
|
+
# The configuration name is mapped to the `--systemorgid` option of rhnreg_ks command.
|
257
|
+
config.registration.org
|
258
|
+
|
259
|
+
# Name of the subscribed system (optional, defaults to hostname if unset)
|
260
|
+
# The configuration name is mapped to the `--profilename` option of rhnreg_ks command.
|
261
|
+
config.registration.name
|
262
|
+
|
263
|
+
# Attach existing subscriptions as part of the registration process (optional)
|
264
|
+
config.registration.activationkey
|
265
|
+
|
266
|
+
# Subscribe this system to the EUS channel tied to the system's redhat-release (optional)
|
267
|
+
config.registration.use_eus_channel
|
268
|
+
|
269
|
+
# Do not probe or upload any hardware info (optional)
|
270
|
+
config.registration.nohardware
|
271
|
+
|
272
|
+
# Do not profile or upload any package info (optional)
|
273
|
+
config.registration.nopackages
|
274
|
+
|
275
|
+
# Do not upload any virtualization info (optional)
|
276
|
+
config.registration.novirtinfo
|
277
|
+
|
278
|
+
# Do not start rhnsd after completion (optional)
|
279
|
+
config.registration.norhnsd
|
280
|
+
|
281
|
+
# Force the registration (optional, force if true, defaults to true)
|
282
|
+
config.registration.force
|
283
|
+
|
284
|
+
# Skip the registration (optional, skip if true, defaults to false)
|
285
|
+
config.registration.skip
|
286
|
+
```
|
287
|
+
|
171
288
|
## Tests
|
172
289
|
|
173
|
-
Tests currently test the plugin with `subscription-manager` on RHEL 7.1 guest
|
174
|
-
and Fedora host. You need an imported RHEL 7.1 Vagrant box named `rhel-7.1`.
|
290
|
+
Tests currently test the plugin with `subscription-manager` and `rhn_register` on RHEL 7.1 guest and Fedora host. You need an imported RHEL 7.1 Vagrant box named `rhel-7.1`.
|
175
291
|
|
176
292
|
To run them:
|
177
293
|
|
178
294
|
```
|
295
|
+
export VAGRANT_REGISTRATION_MANAGER=
|
179
296
|
export VAGRANT_REGISTRATION_USERNAME=
|
180
297
|
export VAGRANT_REGISTRATION_PASSWORD=
|
181
298
|
export VAGRANT_REGISTRATION_ORG=
|
182
299
|
export VAGRANT_REGISTRATION_ACTIVATIONKEY=
|
300
|
+
export VAGRANT_REGISTRATION_SERVERURL=
|
301
|
+
export VAGRANT_REGISTRATION_CA_CERT=
|
183
302
|
./tests/run.sh
|
303
|
+
./tests/run_rhn_register.sh
|
304
|
+
```
|
305
|
+
|
306
|
+
To show the Vagrant output on the console during the tests run, set the `DEBUG`
|
307
|
+
environment variable on `1` before executing the test script:
|
308
|
+
|
309
|
+
```
|
310
|
+
export DEBUG=1
|
184
311
|
```
|
185
312
|
|
186
313
|
## Acknowledgements
|
187
314
|
|
188
|
-
The project would like to make sure we thank [purpleidea](https://github.com/purpleidea/), [humaton](https://github.com/humaton/), [strzibny](https://github.com/strzibny), [scollier](https://github.com/scollier/), [puzzle](https://github.com/puzzle), [voxik](https://github.com/voxik), [lukaszachy](https://github.com/lukaszachy)
|
315
|
+
The project would like to make sure we thank [purpleidea](https://github.com/purpleidea/), [humaton](https://github.com/humaton/), [strzibny](https://github.com/strzibny), [scollier](https://github.com/scollier/), [puzzle](https://github.com/puzzle), [voxik](https://github.com/voxik), [lukaszachy](https://github.com/lukaszachy), [goern](https://github.com/goern), [iconoeugen](https://github.com/iconoeugen) and [pvalena](https://github.com/pvalena) (in no particular order) for their contributions of ideas, code and testing for this project.
|
data/lib/vagrant-registration.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'log4r'
|
2
2
|
|
3
3
|
module VagrantPlugins
|
4
4
|
module Registration
|
@@ -11,14 +11,17 @@ module VagrantPlugins
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def call(env)
|
14
|
-
|
14
|
+
# Vbguest plugin (if present) is called next. Therefore registration
|
15
|
+
# needs to be done first. This does not work with the default
|
16
|
+
# 'action_register' hook.
|
17
|
+
@app.call(env) unless Plugin.vbguest_plugin?
|
15
18
|
|
16
19
|
# Configuration from Vagrantfile
|
17
20
|
config = env[:machine].config.registration
|
18
21
|
machine = env[:machine]
|
19
22
|
guest = env[:machine].guest
|
20
23
|
|
21
|
-
if should_register?(machine)
|
24
|
+
if should_register?(machine, env[:ui])
|
22
25
|
env[:ui].info('Registering box with vagrant-registration...')
|
23
26
|
check_configuration_options(machine, env[:ui])
|
24
27
|
|
@@ -38,15 +41,17 @@ module VagrantPlugins
|
|
38
41
|
end
|
39
42
|
|
40
43
|
@logger.debug('Registration is skipped due to the configuration') if config.skip
|
44
|
+
|
45
|
+
@app.call(env) if Plugin.vbguest_plugin?
|
41
46
|
end
|
42
47
|
|
43
48
|
private
|
44
49
|
|
45
50
|
# Shall we register the box?
|
46
|
-
def should_register?(machine)
|
51
|
+
def should_register?(machine, ui)
|
47
52
|
!machine.config.registration.skip &&
|
48
53
|
capabilities_provided?(machine.guest) &&
|
49
|
-
manager_installed?(machine.guest) &&
|
54
|
+
manager_installed?(machine.guest, ui) &&
|
50
55
|
!machine.guest.capability(:registration_registered?)
|
51
56
|
end
|
52
57
|
|
@@ -58,8 +63,8 @@ module VagrantPlugins
|
|
58
63
|
options = machine.config.registration.conf.each_pair.map { |pair| pair[0] }
|
59
64
|
|
60
65
|
if unsupported_options_provided?(manager, available_options, options, ui)
|
61
|
-
ui.warn("WARNING: #{manager} supports only the following options:"
|
62
|
-
"\nWARNING:
|
66
|
+
ui.warn("WARNING: #{manager} supports only the following options:" \
|
67
|
+
"\nWARNING: #{available_options.join(', ')}")
|
63
68
|
end
|
64
69
|
end
|
65
70
|
|
@@ -68,7 +73,7 @@ module VagrantPlugins
|
|
68
73
|
warned = false
|
69
74
|
options.each do |option|
|
70
75
|
unless available_options.include? option
|
71
|
-
ui.warn("WARNING: #{option} option is not supported for "
|
76
|
+
ui.warn("WARNING: #{option} option is not supported for #{manager}")
|
72
77
|
warned = true
|
73
78
|
end
|
74
79
|
end
|
@@ -88,8 +93,8 @@ module VagrantPlugins
|
|
88
93
|
end
|
89
94
|
|
90
95
|
# Check if selected registration manager is installed
|
91
|
-
def manager_installed?(guest)
|
92
|
-
if guest.capability(:registration_manager_installed)
|
96
|
+
def manager_installed?(guest, ui)
|
97
|
+
if guest.capability(:registration_manager_installed, ui)
|
93
98
|
true
|
94
99
|
else
|
95
100
|
@logger.debug('Registration manager not found on guest')
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'log4r'
|
2
2
|
|
3
3
|
module VagrantPlugins
|
4
4
|
module Registration
|
@@ -20,7 +20,7 @@ module VagrantPlugins
|
|
20
20
|
end
|
21
21
|
|
22
22
|
@logger.debug('Unregistration is skipped due to the configuration') if config.skip
|
23
|
-
@logger.debug('Unregistration is skipped on halt due to the configuration')
|
23
|
+
@logger.debug('Unregistration is skipped on halt due to the configuration') unless config.unregister_on_halt
|
24
24
|
@app.call(env)
|
25
25
|
|
26
26
|
# Guest might not be available after halting, so log the exception and continue
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'vagrant'
|
2
|
+
require 'ostruct'
|
3
3
|
|
4
4
|
module VagrantPlugins
|
5
5
|
module Registration
|
@@ -34,9 +34,11 @@ module VagrantPlugins
|
|
34
34
|
@conf = OpenStruct.new if @conf == UNSET_VALUE
|
35
35
|
end
|
36
36
|
|
37
|
+
# Serialize strings, nil and boolean values, symbols, arrays and hashes
|
38
|
+
# to be used within eval()
|
37
39
|
def adjust_arguments(args)
|
38
40
|
return '' if args.size < 1
|
39
|
-
args.
|
41
|
+
args.inspect[1..-2]
|
40
42
|
end
|
41
43
|
end
|
42
44
|
end
|
@@ -14,10 +14,22 @@ module VagrantPlugins
|
|
14
14
|
module Registration
|
15
15
|
class Plugin < Vagrant.plugin('2')
|
16
16
|
class << self
|
17
|
+
|
18
|
+
# Vbguest plugin updates GuestAdditions for VirtualBox before
|
19
|
+
# '::Vagrant::Action::Builtin::SyncedFolders' and therefore needs
|
20
|
+
# to be registered. Prepending Vbguest hook ensures that, but this
|
21
|
+
# is done only with Vbguest plugin and VirtualBox provider. In other
|
22
|
+
# cases the behavior is unchanged.
|
17
23
|
def register(hook)
|
18
24
|
setup_logging
|
19
|
-
|
20
|
-
|
25
|
+
|
26
|
+
if vbguest_plugin?
|
27
|
+
hook.before(::VagrantVbguest::Middleware,
|
28
|
+
VagrantPlugins::Registration::Action.action_register)
|
29
|
+
else
|
30
|
+
hook.after(::Vagrant::Action::Builtin::SyncedFolders,
|
31
|
+
VagrantPlugins::Registration::Action.action_register)
|
32
|
+
end
|
21
33
|
end
|
22
34
|
|
23
35
|
def unregister_on_halt(hook)
|
@@ -74,6 +86,14 @@ module VagrantPlugins
|
|
74
86
|
logger = nil
|
75
87
|
end
|
76
88
|
end
|
89
|
+
|
90
|
+
# Determines if both VirtualBox provider and Vbguest plugin are present.
|
91
|
+
def self.vbguest_plugin?
|
92
|
+
@@vbguest_plugin ||= (
|
93
|
+
defined?(VagrantPlugins::ProviderVirtualBox::Provider) &&
|
94
|
+
defined?(VagrantVbguest::Middleware)
|
95
|
+
)
|
96
|
+
end
|
77
97
|
end
|
78
98
|
end
|
79
99
|
end
|
@@ -2,7 +2,7 @@ module VagrantPlugins
|
|
2
2
|
module GuestRedHat
|
3
3
|
module Cap
|
4
4
|
# Common configuration options for all managers
|
5
|
-
DEFAULT_CONFIGURATION_OPTIONS = [:skip, :unregister_on_halt]
|
5
|
+
DEFAULT_CONFIGURATION_OPTIONS = [:manager, :skip, :unregister_on_halt]
|
6
6
|
|
7
7
|
# This provides registration capabilities for vagrant-registration
|
8
8
|
#
|
@@ -12,7 +12,7 @@ module VagrantPlugins
|
|
12
12
|
class Registration
|
13
13
|
# Is the machine already registered?
|
14
14
|
def self.registration_registered?(machine)
|
15
|
-
cap = "#{
|
15
|
+
cap = "#{registration_manager(machine)}_registered?".to_sym
|
16
16
|
if machine.guest.capability?(cap)
|
17
17
|
machine.guest.capability(cap)
|
18
18
|
else
|
@@ -22,7 +22,7 @@ module VagrantPlugins
|
|
22
22
|
|
23
23
|
# Register the given machine
|
24
24
|
def self.registration_register(machine, ui)
|
25
|
-
cap = "#{
|
25
|
+
cap = "#{registration_manager(machine)}_register".to_sym
|
26
26
|
if machine.guest.capability?(cap)
|
27
27
|
machine.guest.capability(cap, ui)
|
28
28
|
else
|
@@ -32,7 +32,7 @@ module VagrantPlugins
|
|
32
32
|
|
33
33
|
# Unregister the given machine
|
34
34
|
def self.registration_unregister(machine)
|
35
|
-
cap = "#{
|
35
|
+
cap = "#{registration_manager(machine)}_unregister".to_sym
|
36
36
|
if machine.guest.capability?(cap)
|
37
37
|
machine.guest.capability(cap)
|
38
38
|
else
|
@@ -41,13 +41,14 @@ module VagrantPlugins
|
|
41
41
|
end
|
42
42
|
|
43
43
|
# Check that the machine has the selected registration manager installed
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
44
|
+
# and warn if the user specifically selected a manager that is not available
|
45
|
+
def self.registration_manager_installed(machine, ui)
|
46
|
+
cap = "#{registration_manager(machine)}".to_sym
|
47
|
+
return machine.guest.capability(cap) if machine.guest.capability?(cap)
|
48
|
+
if machine.config.registration.manager != ''
|
49
|
+
ui.error("WARNING: Selected registration manager #{machine.config.registration.manager} is not available, skipping.")
|
50
50
|
end
|
51
|
+
false
|
51
52
|
end
|
52
53
|
|
53
54
|
# Required configuration options of the registration manager
|
@@ -57,7 +58,7 @@ module VagrantPlugins
|
|
57
58
|
#
|
58
59
|
# e.g. [[:username, :password]]
|
59
60
|
def self.registration_credentials(machine)
|
60
|
-
cap = "#{
|
61
|
+
cap = "#{registration_manager(machine)}_credentials".to_sym
|
61
62
|
if machine.guest.capability?(cap)
|
62
63
|
machine.guest.capability(cap)
|
63
64
|
else
|
@@ -68,7 +69,7 @@ module VagrantPlugins
|
|
68
69
|
# Return all available options for a given registration manager together
|
69
70
|
# with general options available to any.
|
70
71
|
def self.registration_options(machine)
|
71
|
-
cap = "#{
|
72
|
+
cap = "#{registration_manager(machine)}_options".to_sym
|
72
73
|
if machine.guest.capability?(cap)
|
73
74
|
DEFAULT_CONFIGURATION_OPTIONS + machine.guest.capability(cap)
|
74
75
|
else
|
@@ -78,7 +79,7 @@ module VagrantPlugins
|
|
78
79
|
|
79
80
|
# Return secret options for the registration manager
|
80
81
|
def self.registration_secrets(machine)
|
81
|
-
cap = "#{
|
82
|
+
cap = "#{registration_manager(machine)}_secrets".to_sym
|
82
83
|
if machine.guest.capability?(cap)
|
83
84
|
machine.guest.capability(cap)
|
84
85
|
else
|
@@ -0,0 +1,139 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module GuestRedHat
|
3
|
+
module Cap
|
4
|
+
class RhnRegister
|
5
|
+
# Test that the machine is already registered
|
6
|
+
def self.rhn_register_registered?(machine)
|
7
|
+
true if machine.communicate.execute('/usr/sbin/rhn_check', sudo: true)
|
8
|
+
rescue
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
12
|
+
# Test that we have rhn installed
|
13
|
+
def self.rhn_register(machine)
|
14
|
+
machine.communicate.test('/usr/sbin/rhn_check --version', sudo: true) &&
|
15
|
+
machine.communicate.test('/usr/sbin/rhnreg_ks --version', sudo: true)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Register the machine using 'rhnreg_ks' command, config is (Open)Struct
|
19
|
+
def self.rhn_register_register(machine, ui)
|
20
|
+
rhn_register_upload_certificate(machine, ui)
|
21
|
+
rhn_register_server_url(machine, ui) if machine.config.registration.serverurl
|
22
|
+
command = "rhnreg_ks #{configuration_to_options(machine.config.registration)}"
|
23
|
+
|
24
|
+
# Handle exception to avoid displaying password
|
25
|
+
begin
|
26
|
+
error = String.new
|
27
|
+
machine.communicate.sudo(registration_command(command)) do |type, data|
|
28
|
+
error += "#{data}" if type == :stderr
|
29
|
+
end
|
30
|
+
rescue Vagrant::Errors::VagrantError
|
31
|
+
raise Vagrant::Errors::VagrantError.new, error.strip
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Unregister the machine using 'rhn_unregister.py' resource script
|
36
|
+
def self.rhn_register_unregister(machine)
|
37
|
+
machine.communicate.tap do |comm|
|
38
|
+
tmp = '/tmp/rhn_unregister'
|
39
|
+
system_id = '/etc/sysconfig/rhn/systemid'
|
40
|
+
server_url = machine.config.registration.serverurl
|
41
|
+
# Generate the API URL
|
42
|
+
server_url = server_url.sub(/XMLRPC$/, 'rpc/api')
|
43
|
+
comm.sudo("rm -f #{tmp}", error_check: false)
|
44
|
+
comm.upload(resource('rhn_unregister.py'), tmp)
|
45
|
+
comm.sudo("python #{tmp} -s #{server_url} -f #{system_id}")
|
46
|
+
comm.sudo("rm -f #{tmp}")
|
47
|
+
# Guest still thinks it is a part of RHN network until systemdid file is removed
|
48
|
+
comm.sudo("rm -f #{system_id}")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Return required configuration options for rhn register
|
53
|
+
#
|
54
|
+
# For rhn_register the Server URL is mandatory and must be always
|
55
|
+
# provided together with the credentials
|
56
|
+
def self.rhn_register_credentials(machine)
|
57
|
+
[[:username, :password, :serverurl], [:org, :activationkey, :serverurl]]
|
58
|
+
end
|
59
|
+
|
60
|
+
# Return all available options for rhn register
|
61
|
+
def self.rhn_register_options(machine)
|
62
|
+
[:name, :username, :password, :org, :serverurl, :ca_cert,
|
63
|
+
:activationkey, :use_eus_channel, :nohardware, :nopackages,
|
64
|
+
:novirtinfo, :norhnsd, :force]
|
65
|
+
end
|
66
|
+
|
67
|
+
# Return secret options for rhreg_ks
|
68
|
+
def self.rhn_register_secrets(manager)
|
69
|
+
[:password]
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
# Upload provided SSL CA cert to the standard /usr/share/rhn/ path on the guest
|
75
|
+
# and configure the correct path in `up2date` system configuration
|
76
|
+
def self.rhn_register_upload_certificate(machine, ui)
|
77
|
+
# Set as the default CA certificate file that is present on Fedora, CentOS and RHEL
|
78
|
+
cert_file_name = 'RHNS-CA-CERT'
|
79
|
+
if machine.config.registration.ca_cert
|
80
|
+
ui.info("Uploading CA certificate from #{machine.config.registration.ca_cert}...")
|
81
|
+
if File.exist?(machine.config.registration.ca_cert)
|
82
|
+
# Make sure the provided CA certificate file will be configured
|
83
|
+
cert_file_name = File.basename(machine.config.registration.ca_cert)
|
84
|
+
cert_file_content = File.read(machine.config.registration.ca_cert, tmp)
|
85
|
+
machine.communicate.execute("echo '#{cert_file_content}' > /usr/share/rhn/#{cert_file_name}", sudo: true)
|
86
|
+
else
|
87
|
+
ui.warn("WARNING: Provided CA certificate file #{machine.config.registration.ca_cert} does not exist, skipping")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
# Make sure the correct CA certificate file is always configured
|
91
|
+
ui.info("Updating CA certificate to /usr/share/rhn/#{cert_file_name}`...")
|
92
|
+
machine.communicate.execute("sed -i 's|^sslCACert\s*=.*$|sslCACert=/usr/share/rhn/#{cert_file_name}|g' /etc/sysconfig/rhn/up2date", sudo: true)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Build registration command that skips registration if the system is registered
|
96
|
+
def self.registration_command(command)
|
97
|
+
"cmd=$(#{command}); if [ \"$?\" != \"0\" ]; then echo $cmd | grep 'This system is already registered' || (echo $cmd 1>&2 && exit 1) ; fi"
|
98
|
+
end
|
99
|
+
|
100
|
+
# Update configuration file '/etc/sysconfig/rhn/up2date' with
|
101
|
+
# provided server URL
|
102
|
+
def self.rhn_register_server_url(machine, ui)
|
103
|
+
ui.info("Update server URL to #{machine.config.registration.serverurl}...")
|
104
|
+
machine.communicate.execute("sed -i 's|^serverURL=.*$|serverURL=/usr/share/rhn/#{machine.config.registration.serverurl}|' /etc/sysconfig/rhn/up2date", sudo: true)
|
105
|
+
end
|
106
|
+
|
107
|
+
# The absolute path to the resource file
|
108
|
+
def self.resource(name)
|
109
|
+
File.join(resource_root, name)
|
110
|
+
end
|
111
|
+
|
112
|
+
# The absolute path to the resource directory
|
113
|
+
def self.resource_root
|
114
|
+
File.expand_path('../../../../../resources', __FILE__)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Build additional rhreg_ks options based on the plugin configuration
|
118
|
+
def self.configuration_to_options(config)
|
119
|
+
config.force = true unless config.force
|
120
|
+
|
121
|
+
options = []
|
122
|
+
options << "--profilename='#{config.name}'" if config.name
|
123
|
+
options << "--username='#{config.username}'" if config.username
|
124
|
+
options << "--password='#{config.password}'" if config.password
|
125
|
+
options << "--systemorgid='#{config.org}'" if config.org
|
126
|
+
options << "--serverUrl='#{config.serverurl}'" if config.serverurl
|
127
|
+
options << "--activationkey='#{config.activationkey}'" if config.activationkey
|
128
|
+
options << '--use-eus-channel' if config.use_eus_channel
|
129
|
+
options << '--nohardware' if config.nohardware
|
130
|
+
options << '--nopackages' if config.nopackages
|
131
|
+
options << '--novirtinfo' if config.novirtinfo
|
132
|
+
options << '--norhnsd' if config.norhnsd
|
133
|
+
options << '--force' if config.force
|
134
|
+
options.join(' ')
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -11,37 +11,28 @@ module VagrantPlugins
|
|
11
11
|
|
12
12
|
# Test that we have subscription-manager installed
|
13
13
|
def self.subscription_manager(machine)
|
14
|
-
machine.communicate.test(
|
14
|
+
machine.communicate.test('/usr/sbin/subscription-manager', sudo: true)
|
15
15
|
end
|
16
16
|
|
17
17
|
# Register the machine using 'register' option, config is (Open)Struct
|
18
18
|
def self.subscription_manager_register(machine, ui)
|
19
19
|
subscription_manager_upload_certificate(machine, ui) if machine.config.registration.ca_cert
|
20
20
|
command = "subscription-manager register #{configuration_to_options(machine.config.registration)}"
|
21
|
-
machine.communicate.execute("cmd=$(#{command}); if [ \"$?\" != \"0\" ]; then echo $cmd | grep 'This system is already registered' || (echo $cmd 1>&2 && exit 1) ; fi", sudo: true)
|
22
|
-
end
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
cert_file_name = File.basename(machine.config.registration.ca_cert)
|
33
|
-
cert_file_name = "#{cert_file_name}.pem" unless cert_file_name.end_with? '.pem'
|
34
|
-
machine.communicate.execute("echo '#{cert_file_content}' > /etc/rhsm/ca/#{cert_file_name}", sudo: true)
|
35
|
-
ui.info('Setting repo_ca_cert option in /etc/rhsm/rhsm.conf...')
|
36
|
-
machine.communicate.execute("sed -i 's|^repo_ca_cert\s*=.*|repo_ca_cert = /etc/rhsm/ca/#{cert_file_name}|g' /etc/rhsm/rhsm.conf", sudo: true)
|
37
|
-
else
|
38
|
-
ui.warn("WARNING: Provided CA certificate file #{machine.config.registration.ca_cert} does not exist, skipping")
|
22
|
+
# Handle exception to avoid displaying password
|
23
|
+
begin
|
24
|
+
error = String.new
|
25
|
+
machine.communicate.sudo(registration_command(command)) do |type, data|
|
26
|
+
error += "#{data}" if type == :stderr
|
27
|
+
end
|
28
|
+
rescue Vagrant::Errors::VagrantError
|
29
|
+
raise Vagrant::Errors::VagrantError.new, error.strip
|
39
30
|
end
|
40
|
-
|
31
|
+
end
|
41
32
|
|
42
33
|
# Unregister the machine using 'unregister' option
|
43
34
|
def self.subscription_manager_unregister(machine)
|
44
|
-
machine.communicate.execute(
|
35
|
+
machine.communicate.execute('subscription-manager unregister || :', sudo: true)
|
45
36
|
end
|
46
37
|
|
47
38
|
# Return required configuration options for subscription-manager
|
@@ -66,6 +57,29 @@ module VagrantPlugins
|
|
66
57
|
|
67
58
|
private
|
68
59
|
|
60
|
+
# Upload provided CA cert to the standard /etc/rhsm/ca path on the guest
|
61
|
+
#
|
62
|
+
# Since subscription-manager recognizes only .pem files, we rename those
|
63
|
+
# files not ending with '.pem' extension.
|
64
|
+
def self.subscription_manager_upload_certificate(machine, ui)
|
65
|
+
ui.info("Uploading CA certificate from #{machine.config.registration.ca_cert}...")
|
66
|
+
if File.exist?(machine.config.registration.ca_cert)
|
67
|
+
cert_file_content = File.read(machine.config.registration.ca_cert)
|
68
|
+
cert_file_name = File.basename(machine.config.registration.ca_cert)
|
69
|
+
cert_file_name = "#{cert_file_name}.pem" unless cert_file_name.end_with? '.pem'
|
70
|
+
machine.communicate.execute("echo '#{cert_file_content}' > /etc/rhsm/ca/#{cert_file_name}", sudo: true)
|
71
|
+
ui.info('Setting repo_ca_cert option in /etc/rhsm/rhsm.conf...')
|
72
|
+
machine.communicate.execute("sed -i 's|^repo_ca_cert\s*=.*|repo_ca_cert = /etc/rhsm/ca/#{cert_file_name}|g' /etc/rhsm/rhsm.conf", sudo: true)
|
73
|
+
else
|
74
|
+
ui.warn("WARNING: Provided CA certificate file #{machine.config.registration.ca_cert} does not exist, skipping")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Build registration command that skips registration if the system is registered
|
79
|
+
def self.registration_command(command)
|
80
|
+
"cmd=$(#{command}); if [ \"$?\" != \"0\" ]; then echo $cmd | grep 'This system is already registered' || (echo $cmd 1>&2 && exit 1) ; fi"
|
81
|
+
end
|
82
|
+
|
69
83
|
# Build additional subscription-manager options based on plugin configuration
|
70
84
|
def self.configuration_to_options(config)
|
71
85
|
config.force = true unless config.force
|
@@ -85,11 +99,11 @@ module VagrantPlugins
|
|
85
99
|
options << "--org='#{config.org}'" if config.org
|
86
100
|
options << "--environment='#{config.environment}'" if config.environment
|
87
101
|
options << "--name='#{config.name}'" if config.name
|
88
|
-
options <<
|
102
|
+
options << '--auto-attach' if config.auto_attach
|
89
103
|
options << "--activationkey='#{config.activationkey}'" if config.activationkey
|
90
104
|
options << "--servicelevel='#{config.servicelevel}'" if config.servicelevel
|
91
105
|
options << "--release='#{config.release}'" if config.release
|
92
|
-
options <<
|
106
|
+
options << '--force' if config.force
|
93
107
|
options << "--type='#{config.type}'" if config.type
|
94
108
|
options.join(' ')
|
95
109
|
end
|
@@ -59,7 +59,7 @@ module VagrantPlugins
|
|
59
59
|
end
|
60
60
|
|
61
61
|
guest_capability('redhat', 'subscription_manager_upload_certificate') do
|
62
|
-
require_relative
|
62
|
+
require_relative 'cap/subscription_manager'
|
63
63
|
Cap::SubscriptionManager
|
64
64
|
end
|
65
65
|
|
@@ -82,6 +82,41 @@ module VagrantPlugins
|
|
82
82
|
require_relative 'cap/subscription_manager'
|
83
83
|
Cap::SubscriptionManager
|
84
84
|
end
|
85
|
+
|
86
|
+
guest_capability('redhat', 'rhn_register') do
|
87
|
+
require_relative 'cap/rhn_register'
|
88
|
+
Cap::RhnRegister
|
89
|
+
end
|
90
|
+
|
91
|
+
guest_capability('redhat', 'rhn_register_registered?') do
|
92
|
+
require_relative 'cap/rhn_register'
|
93
|
+
Cap::RhnRegister
|
94
|
+
end
|
95
|
+
|
96
|
+
guest_capability('redhat', 'rhn_register_register') do
|
97
|
+
require_relative 'cap/rhn_register'
|
98
|
+
Cap::RhnRegister
|
99
|
+
end
|
100
|
+
|
101
|
+
guest_capability('redhat', 'rhn_register_unregister') do
|
102
|
+
require_relative 'cap/rhn_register'
|
103
|
+
Cap::RhnRegister
|
104
|
+
end
|
105
|
+
|
106
|
+
guest_capability('redhat', 'rhn_register_credentials') do
|
107
|
+
require_relative 'cap/rhn_register'
|
108
|
+
Cap::RhnRegister
|
109
|
+
end
|
110
|
+
|
111
|
+
guest_capability('redhat', 'rhn_register_options') do
|
112
|
+
require_relative 'cap/rhn_register'
|
113
|
+
Cap::RhnRegister
|
114
|
+
end
|
115
|
+
|
116
|
+
guest_capability('redhat', 'rhn_register_secrets') do
|
117
|
+
require_relative 'cap/rhn_register'
|
118
|
+
Cap::RhnRegister
|
119
|
+
end
|
85
120
|
end
|
86
121
|
end
|
87
122
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/python
|
2
|
+
import argparse
|
3
|
+
import xmlrpclib
|
4
|
+
import os.path
|
5
|
+
import sys
|
6
|
+
|
7
|
+
def main():
|
8
|
+
parser = argparse.ArgumentParser(description="Unregister the system from Spacewalk Server, Red Hat Satellite or Red Hat Network Classic.")
|
9
|
+
parser.add_argument("-s", "--serverurl", dest="server_url", type=str, required=True,
|
10
|
+
help="Specify a URL to as the server.")
|
11
|
+
parser.add_argument("-f", "--file", dest="system_id", type=str, default='/etc/sysconfig/rhn/systemid',
|
12
|
+
help="Specify a path to the RHN systemid file.")
|
13
|
+
|
14
|
+
args = parser.parse_args()
|
15
|
+
|
16
|
+
try:
|
17
|
+
if not os.path.exists(args.system_id):
|
18
|
+
print "System is not registered to RHN"
|
19
|
+
return 1
|
20
|
+
client = xmlrpclib.Server(args.server_url)
|
21
|
+
client.system.delete_system(open(args.system_id).read())
|
22
|
+
except xmlrpclib.ProtocolError as err:
|
23
|
+
print "A fault occurred"
|
24
|
+
print "Fault string: %s" % err
|
25
|
+
return 1
|
26
|
+
except xmlrpclib.Fault as err:
|
27
|
+
print "A fault occurred"
|
28
|
+
print "Fault code: %d" % err.faultCode
|
29
|
+
print "Fault string: %s" % err.faultString
|
30
|
+
return 1
|
31
|
+
except IOError as err:
|
32
|
+
print "A fault occurred"
|
33
|
+
print "Fault string: %s" % err
|
34
|
+
return 1
|
35
|
+
except Exception as e:
|
36
|
+
print "A fault occurred"
|
37
|
+
print "Fault: %s" % e
|
38
|
+
return 1
|
39
|
+
print "Unregister successful"
|
40
|
+
return 0
|
41
|
+
|
42
|
+
if __name__ == "__main__":
|
43
|
+
sys.exit(main())
|
@@ -16,11 +16,12 @@ Gem::Specification.new do |s|
|
|
16
16
|
# Note that the entire gitignore(5) syntax is not supported, specifically
|
17
17
|
# the '!' syntax, but it should mostly work correctly.
|
18
18
|
root_path = File.dirname(__FILE__)
|
19
|
-
all_files = Dir.chdir(root_path)
|
19
|
+
all_files = Dir.chdir(root_path) do
|
20
20
|
Dir.glob('lib/**/{*,.*}') +
|
21
21
|
Dir.glob('plugins/**/{*,.*}') +
|
22
|
+
Dir.glob('resources/**/{*,.*}') +
|
22
23
|
['Rakefile', 'Gemfile', 'README.md', 'CHANGELOG.md', 'LICENSE.md', 'vagrant-registration.gemspec']
|
23
|
-
|
24
|
+
end
|
24
25
|
all_files.reject! { |file| ['.', '..'].include?(File.basename(file)) }
|
25
26
|
gitignore_path = File.join(root_path, '.gitignore')
|
26
27
|
gitignore = File.readlines(gitignore_path)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-registration
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Langdon White
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-12-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: yard
|
@@ -49,8 +49,10 @@ files:
|
|
49
49
|
- lib/vagrant-registration/plugin.rb
|
50
50
|
- lib/vagrant-registration/version.rb
|
51
51
|
- plugins/guests/redhat/cap/registration.rb
|
52
|
+
- plugins/guests/redhat/cap/rhn_register.rb
|
52
53
|
- plugins/guests/redhat/cap/subscription_manager.rb
|
53
54
|
- plugins/guests/redhat/plugin.rb
|
55
|
+
- resources/rhn_unregister.py
|
54
56
|
- vagrant-registration.gemspec
|
55
57
|
homepage: https://github.com/projectatomic/adb-vagrant-registration
|
56
58
|
licenses:
|