foreman_discovery 1.1.1 → 1.2.0.rc1
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 +13 -5
- data/README.md +19 -71
- data/Rakefile +15 -16
- data/app/controllers/discovers_controller.rb +10 -11
- data/app/helpers/discovers_helper.rb +9 -9
- data/app/models/host/discovered.rb +6 -5
- data/app/models/host/managed_extensions.rb +2 -2
- data/app/models/setting/discovered.rb +8 -2
- data/app/overrides/add_dashboard_table.rb +9 -4
- data/app/views/discovers/_discovers_list.html.erb +14 -14
- data/app/views/discovers/_selected_hosts.html.erb +8 -4
- data/app/views/discovers/multiple_destroy.html.erb +2 -1
- data/app/views/discovers/select_multiple_location.html.erb +2 -2
- data/app/views/discovers/select_multiple_organization.html.erb +2 -2
- data/app/views/discovers/show.html.erb +4 -4
- data/config/initializers/discovery_setup.rb +0 -17
- data/extra/ovirt-node-plugin-foreman/COPYING +340 -0
- data/extra/ovirt-node-plugin-foreman/Makefile.am +60 -0
- data/extra/ovirt-node-plugin-foreman/README.md +217 -0
- data/extra/ovirt-node-plugin-foreman/autogen.sh +66 -0
- data/extra/ovirt-node-plugin-foreman/conf/Makefile.am +29 -0
- data/extra/ovirt-node-plugin-foreman/conf/foreman-plugin.firewall.in +4 -0
- data/extra/ovirt-node-plugin-foreman/conf/foreman-plugin.logs +2 -0
- data/extra/ovirt-node-plugin-foreman/configure.ac +62 -0
- data/extra/ovirt-node-plugin-foreman/ovirt-node-plugin-foreman.spec.in +145 -0
- data/extra/ovirt-node-plugin-foreman/recipe/Makefile.am +33 -0
- data/extra/ovirt-node-plugin-foreman/recipe/foreman-plugin-iso.ks +5 -0
- data/extra/ovirt-node-plugin-foreman/recipe/foreman-plugin-minimizer.ks +160 -0
- data/extra/ovirt-node-plugin-foreman/src/Makefile.am +32 -0
- data/extra/ovirt-node-plugin-foreman/src/discover-host.rb.in +186 -0
- data/extra/ovirt-node-plugin-foreman/src/discover-host.service +14 -0
- data/extra/ovirt-node-plugin-foreman/src/discovery-version-fact.rb.in +25 -0
- data/extra/ovirt-node-plugin-foreman/src/find-missing-libs +35 -0
- data/lib/{tasks.rake → discovery.rake} +22 -0
- data/lib/foreman_discovery/engine.rb +39 -7
- data/lib/foreman_discovery/version.rb +1 -1
- data/test/functional/discovers_controller_test.rb +3 -16
- data/test/test_helper.rb +2 -2
- data/test/test_plugin_helper.rb +6 -0
- data/test/unit/facts.json +92 -0
- data/test/unit/host_discovered_test.rb +20 -2
- metadata +55 -37
- data/lib/discovery_home_helper_patch.rb +0 -18
- data/test/unit/facts.yml +0 -91
checksums.yaml
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
N2Q3YTViNGViOWY1MjE4NTQ3MzE2NDE2MGExYTQyYmNlOGIzMWY0YQ==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
YmM5OTJjNDAwNmZhNTcyZTRhMzkwYjlhY2FkNzY3ZGFiNzUzYjc1ZA==
|
|
5
7
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
MWZjMGJjYTNkMjYyZTY3YzhjMGQ1ZTAzYTg3YjIxMTQ2ZmI3NmY4MmIzMTgx
|
|
10
|
+
MGVlOGM5MjY3YzViZDZiZTFkYzVhZDMyNzNiMmI2MjYyOTk3NDdlMDVmM2U4
|
|
11
|
+
MDBkYWRlYWE3OGZkNzIxMWYzZWZjOTBhZjUxOWJhNzY4YjBkOGM=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
ZjNmOTFkMzk3ZWQwNzIxODRjZGYwNjQyMjM5ODE4YTdkNGRhMDgxYjgyZWYw
|
|
14
|
+
MjU5YTFlYzE1NTk3ODg1OTk3YjY0Y2U5MWVjNGE2ZjVkMDEyNzYzYmEyNWE4
|
|
15
|
+
MzNjYTNlMTI0ODg5NDExYTJmY2MzODI5MDdkMWJlZWQ3OTgxODY=
|
data/README.md
CHANGED
|
@@ -4,15 +4,21 @@ This plugin enables MaaS hardware discovery in Foreman.
|
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
Please see the Foreman wiki for appropriate instructions:
|
|
8
|
+
|
|
9
|
+
* [Foreman: How to Install a Plugin](http://projects.theforeman.org/projects/foreman/wiki/How_to_Install_a_Plugin)
|
|
10
|
+
|
|
11
|
+
The gem name is "foreman_discovery".
|
|
12
|
+
|
|
13
|
+
RPM users can install the "ruby193-rubygem-foreman_discovery" or
|
|
14
|
+
"rubygem-foreman_discovery" packages.
|
|
9
15
|
|
|
10
16
|
## Compatibility
|
|
11
17
|
|
|
12
|
-
| Foreman Version | Plugin Version |
|
|
13
|
-
| --------------- | --------------:|
|
|
14
|
-
| <= 1.2 | 1.0.2 |
|
|
15
|
-
| >= 1.3 | 1.1.0 |
|
|
18
|
+
| Foreman Version | Plugin Version | oVirt Image Version |
|
|
19
|
+
| --------------- | --------------:| -------------------:|
|
|
20
|
+
| <= 1.2 | 1.0.2 | N/A |
|
|
21
|
+
| >= 1.3 | 1.1.0 | 0.1.0 |
|
|
16
22
|
|
|
17
23
|
## Latest code
|
|
18
24
|
|
|
@@ -20,77 +26,18 @@ You can get the develop branch of the plugin by specifying your Gemfile in this
|
|
|
20
26
|
|
|
21
27
|
gem 'foreman_discovery', :git => "https://github.com/theforeman/foreman_discovery.git"
|
|
22
28
|
|
|
23
|
-
# Building
|
|
29
|
+
# Building or downloading an image
|
|
24
30
|
|
|
25
|
-
There
|
|
26
|
-
appropriately detect and use ruby1.8 even if the system default is 1.9. If you
|
|
27
|
-
have trouble building it, try a ruby1.8-only system.
|
|
31
|
+
There are two options at the moment:
|
|
28
32
|
|
|
29
|
-
|
|
33
|
+
* [Build or download Tiny Core Linux based image](README.tcl_image.md)
|
|
34
|
+
* [Build or download oVirt Node based image](README.ovirt_image.md)
|
|
30
35
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
You image will be in ./discovery\_image. Run the rake task as root, or with passwordless
|
|
34
|
-
sudo, as the password prompts may get lost in the ruby->bash forking process.
|
|
36
|
+
The TCL image has the same version as the Foreman Discovery plugin, the oVirt
|
|
37
|
+
Node image has different versioning scheme.
|
|
35
38
|
|
|
36
39
|
# Configuration
|
|
37
40
|
|
|
38
|
-
## Image configuration
|
|
39
|
-
|
|
40
|
-
The PXE image has two configuration options during build:
|
|
41
|
-
|
|
42
|
-
* By default it will have an automatic login to the 'tc' user and start ssh so you can
|
|
43
|
-
ssh to `tc@<ip>` with password test1234. By specifying `mode=prod` on the rake task,
|
|
44
|
-
you can disable both of these - the image will have no accounts that can be logged in
|
|
45
|
-
* If you need to add additional files to the image, put them in `./additional_build_files/` -
|
|
46
|
-
these will be copied to `/additional_build_files/` in the image
|
|
47
|
-
|
|
48
|
-
Also, it will attempt todownload `/discovery_init.sh` from your Foreman server and run
|
|
49
|
-
it. This is entirely optional - if the server cannot be reached or the file cannot be
|
|
50
|
-
found, the image has a fallback script built in.
|
|
51
|
-
|
|
52
|
-
You can find an example script [here](extra/discovery_init.sh.example) - place your
|
|
53
|
-
modified version in the `public/` directory on your Foreman server.
|
|
54
|
-
|
|
55
|
-
## PXE config
|
|
56
|
-
|
|
57
|
-
Configure the PXE default to boot the Discovery Image built above, eg:
|
|
58
|
-
|
|
59
|
-
DEFAULT menu
|
|
60
|
-
PROMPT 0
|
|
61
|
-
MENU TITLE PXE Menu
|
|
62
|
-
TIMEOUT 200
|
|
63
|
-
TOTALTIMEOUT 6000
|
|
64
|
-
ONTIMEOUT discovery
|
|
65
|
-
|
|
66
|
-
LABEL discovery
|
|
67
|
-
MENU LABEL Boot Discovery
|
|
68
|
-
TEXT HELP
|
|
69
|
-
Boot the Foreman Discovery Image
|
|
70
|
-
Use TAB to edit options for specific needs.
|
|
71
|
-
ENDTEXT
|
|
72
|
-
KERNEL /boot/TinyCore-vmlinuz
|
|
73
|
-
APPEND initrd=/boot/TinyCore-initrd.gz foreman.ip=192.168.122.1:3000
|
|
74
|
-
|
|
75
|
-
Be sure to alter the foreman.ip appropriately. You can also use foreman.server to
|
|
76
|
-
specify a DNS record (`foreman.server=myforemanhost`) but in this case the port will
|
|
77
|
-
be assumed to be http (80). If all else fails (say, USB boot where we can't provide
|
|
78
|
-
options) it will look for a DNS record of `foreman`
|
|
79
|
-
|
|
80
|
-
### Known Issues with the image
|
|
81
|
-
|
|
82
|
-
On some multi-core systems the TinyCore kernel may segfault on boot with an error message similar to :
|
|
83
|
-
|
|
84
|
-
"Fixing recursive fault but reboot is needed!"
|
|
85
|
-
|
|
86
|
-
If this happens, it can be fixed by changing the KERNEL line in the PXE config above to read :
|
|
87
|
-
|
|
88
|
-
KERNEL /boot/TinyCore-vmlinuz maxcpus=1
|
|
89
|
-
|
|
90
|
-
More information on the maxcpus kernel parameter can be found at <https://www.kernel.org/doc/Documentation/kernel-parameters.txt>
|
|
91
|
-
|
|
92
|
-
A currently unavoidable side effect of this setting is that the initial facts gathered during discovery will only show a single processor, since that is all that is visible to the kernel.
|
|
93
|
-
|
|
94
41
|
## UI config
|
|
95
42
|
|
|
96
43
|
No configuration of the Foreman UI is required. If you are using Locations and/or Organisations,
|
|
@@ -128,6 +75,7 @@ assign the `:perform_discovery` permission to an existing Role.
|
|
|
128
75
|
|
|
129
76
|
# TODO
|
|
130
77
|
|
|
78
|
+
* Support for downloading shell script for oVirt Node image
|
|
131
79
|
* Add more Tests
|
|
132
80
|
* Add API
|
|
133
81
|
* Add proper Location/Organization handling (via a Wizard maybe?)
|
data/Rakefile
CHANGED
|
@@ -6,11 +6,15 @@ require 'fileutils'
|
|
|
6
6
|
|
|
7
7
|
task :default => :test
|
|
8
8
|
|
|
9
|
+
PLUGIN_NAME = "discovery"
|
|
9
10
|
ENGINE_DIR = File.expand_path('..', __FILE__)
|
|
10
|
-
FOREMAN_DIR = '
|
|
11
|
+
FOREMAN_DIR = '.foreman_app'
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
ENV['TEXTDOMAIN'] = PLUGIN_NAME
|
|
14
|
+
import "#{FOREMAN_DIR}/Rakefile" if File.exists? "#{FOREMAN_DIR}/Rakefile"
|
|
15
|
+
|
|
16
|
+
namespace :setup do
|
|
17
|
+
desc "Download latest foreman core devel source and install dependencies"
|
|
14
18
|
task :foreman_prepare do
|
|
15
19
|
foreman_repo = 'https://github.com/theforeman/foreman.git'
|
|
16
20
|
foreman_gemfile = File.join(FOREMAN_DIR, "Gemfile")
|
|
@@ -19,20 +23,12 @@ namespace :test do
|
|
|
19
23
|
puts "Downloading latest Foreman development branch into #{FOREMAN_DIR}..."
|
|
20
24
|
FileUtils.mkdir_p(FOREMAN_DIR)
|
|
21
25
|
|
|
22
|
-
unless system("git clone #{foreman_repo} #{FOREMAN_DIR}")
|
|
26
|
+
unless system("git clone --depth 1 #{foreman_repo} #{FOREMAN_DIR}")
|
|
23
27
|
puts "Error while getting latest Foreman code from #{foreman_repo} into #{FOREMAN_DIR}"
|
|
24
28
|
fail
|
|
25
29
|
end
|
|
26
30
|
end
|
|
27
31
|
|
|
28
|
-
gemfile_content = File.read(foreman_gemfile)
|
|
29
|
-
unless gemfile_content.include?('FOREMAN_GEMFILE')
|
|
30
|
-
puts 'Preparing Gemfile'
|
|
31
|
-
gemfile_content.gsub!('__FILE__', 'FOREMAN_GEMFILE')
|
|
32
|
-
gemfile_content.insert(0, "FOREMAN_GEMFILE = __FILE__ unless defined? FOREMAN_GEMFILE\n")
|
|
33
|
-
File.open(foreman_gemfile, 'w') { |f| f << gemfile_content }
|
|
34
|
-
end
|
|
35
|
-
|
|
36
32
|
settings_file = "#{FOREMAN_DIR}/config/settings.yaml"
|
|
37
33
|
unless File.exists?(settings_file)
|
|
38
34
|
puts 'Preparing settings file'
|
|
@@ -79,7 +75,7 @@ GEMFILE
|
|
|
79
75
|
puts <<MESSAGE
|
|
80
76
|
Foreman source code not prepared. Run
|
|
81
77
|
|
|
82
|
-
rake
|
|
78
|
+
rake setup:foreman_prepare
|
|
83
79
|
|
|
84
80
|
to download foreman source and its dependencies
|
|
85
81
|
MESSAGE
|
|
@@ -96,16 +92,19 @@ MESSAGE
|
|
|
96
92
|
FileUtils.cd(pwd)
|
|
97
93
|
end
|
|
98
94
|
|
|
95
|
+
task :all => [:foreman_prepare, :db_prepare]
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
namespace :test do
|
|
99
99
|
task :set_loadpath do
|
|
100
100
|
%w[lib test].each do |dir|
|
|
101
101
|
$:.unshift(File.expand_path(dir, ENGINE_DIR))
|
|
102
102
|
end
|
|
103
103
|
end
|
|
104
104
|
|
|
105
|
-
task :all => [:db_prepare, :set_loadpath] do
|
|
106
|
-
Dir.glob('test/**/*_test.rb') { |f| require f.sub('test/','')
|
|
105
|
+
task :all => ['setup:db_prepare', 'test:set_loadpath'] do
|
|
106
|
+
Dir.glob('test/**/*_test.rb') { |f| require f.sub('test/','') unless f.include? '.foreman_app/' }
|
|
107
107
|
end
|
|
108
|
-
|
|
109
108
|
end
|
|
110
109
|
|
|
111
110
|
task :test => 'test:all'
|
|
@@ -82,9 +82,9 @@ class DiscoversController < ::ApplicationController
|
|
|
82
82
|
|
|
83
83
|
def refresh_facts
|
|
84
84
|
if @host.is_a?(::Host::Discovered) and @host.refresh_facts
|
|
85
|
-
process_success :success_msg =>
|
|
85
|
+
process_success :success_msg => _("Facts refreshed for %s") % @host.name, :success_redirect => :back
|
|
86
86
|
else
|
|
87
|
-
process_error :error_msg => "Failed to refresh facts for
|
|
87
|
+
process_error :error_msg => _("Failed to refresh facts for %s") % @host.name, :redirect => :back
|
|
88
88
|
end
|
|
89
89
|
end
|
|
90
90
|
|
|
@@ -97,9 +97,9 @@ class DiscoversController < ::ApplicationController
|
|
|
97
97
|
|
|
98
98
|
missed_hosts = @hosts.map(&:name).join('<br/>')
|
|
99
99
|
if @hosts.empty?
|
|
100
|
-
notice "Destroyed selected hosts"
|
|
100
|
+
notice _("Destroyed selected hosts")
|
|
101
101
|
else
|
|
102
|
-
error "The following hosts were not deleted:
|
|
102
|
+
error _("The following hosts were not deleted: %s") % missed_hosts
|
|
103
103
|
end
|
|
104
104
|
redirect_to(discovers_path)
|
|
105
105
|
end
|
|
@@ -154,16 +154,16 @@ class DiscoversController < ::ApplicationController
|
|
|
154
154
|
if params[:host_names].present? or params[:host_ids].present?
|
|
155
155
|
@hosts = Host::Discovered.where("id IN (?) or name IN (?)", params[:host_ids], params[:host_names] )
|
|
156
156
|
if @hosts.empty?
|
|
157
|
-
error 'No hosts were found with that id or name'
|
|
157
|
+
error _('No hosts were found with that id or name')
|
|
158
158
|
redirect_to(discovers_path) and return false
|
|
159
159
|
end
|
|
160
160
|
else
|
|
161
|
-
error 'No
|
|
161
|
+
error _('No hosts selected')
|
|
162
162
|
redirect_to(discovers_path) and return false
|
|
163
163
|
end
|
|
164
164
|
|
|
165
165
|
rescue => e
|
|
166
|
-
error "Something went wrong while selecting hosts -
|
|
166
|
+
error _("Something went wrong while selecting hosts - %s") % e
|
|
167
167
|
redirect_to discovers_path
|
|
168
168
|
end
|
|
169
169
|
|
|
@@ -177,15 +177,14 @@ class DiscoversController < ::ApplicationController
|
|
|
177
177
|
# Check for explicit parameter override
|
|
178
178
|
ip = params.delete('ip') if params.include?('ip')
|
|
179
179
|
|
|
180
|
-
Rails.logger.info ip.inspect
|
|
181
180
|
# in case we got back multiple ips (see #1619)
|
|
182
181
|
ip = ip.split(',').first
|
|
183
182
|
end
|
|
184
183
|
|
|
185
184
|
def taxonomy_scope
|
|
186
|
-
if
|
|
187
|
-
@organization =
|
|
188
|
-
@location =
|
|
185
|
+
if @host
|
|
186
|
+
@organization = @host.organization
|
|
187
|
+
@location = @host.location
|
|
189
188
|
end
|
|
190
189
|
|
|
191
190
|
if SETTINGS[:organizations_enabled]
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
module DiscoversHelper
|
|
2
2
|
|
|
3
3
|
def disc_report_column(record)
|
|
4
|
-
|
|
4
|
+
record.last_report? ? (_("%s ago") % time_ago_in_words(record.last_report.getlocal)) : ""
|
|
5
5
|
end
|
|
6
6
|
|
|
7
7
|
def discovers_title_actions(host)
|
|
8
8
|
title_actions(
|
|
9
9
|
button_group(
|
|
10
|
-
link_to("Provision", hash_for_edit_discover_path(:id => host), :class => 'btn-primary')
|
|
10
|
+
link_to(_("Provision"), hash_for_edit_discover_path(:id => host), :class => 'btn-primary')
|
|
11
11
|
),
|
|
12
12
|
button_group(
|
|
13
|
-
link_to("Refresh
|
|
13
|
+
link_to(_("Refresh facts"), hash_for_refresh_facts_discover_path(:id => host))
|
|
14
14
|
),
|
|
15
15
|
button_group(
|
|
16
|
-
link_to("Delete", hash_for_discover_path(:id => host),
|
|
17
|
-
:class => "btn btn-danger", :confirm => 'Are you sure?', :method => :delete)
|
|
16
|
+
link_to(_("Delete"), hash_for_discover_path(:id => host),
|
|
17
|
+
:class => "btn btn-danger", :confirm => _('Are you sure?'), :method => :delete)
|
|
18
18
|
)
|
|
19
19
|
)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def multiple_discovers_actions_select
|
|
23
|
-
actions = [['Delete
|
|
24
|
-
actions << ['Assign Organization', select_multiple_organization_discovers_path, 'tags'] if SETTINGS[:organizations_enabled]
|
|
25
|
-
actions << ['Assign Location', select_multiple_location_discovers_path, 'map-marker'] if SETTINGS[:locations_enabled]
|
|
23
|
+
actions = [[_('Delete hosts'), multiple_destroy_discovers_path, 'trash']]
|
|
24
|
+
actions << [_('Assign Organization'), select_multiple_organization_discovers_path, 'tags'] if SETTINGS[:organizations_enabled]
|
|
25
|
+
actions << [_('Assign Location'), select_multiple_location_discovers_path, 'map-marker'] if SETTINGS[:locations_enabled]
|
|
26
26
|
|
|
27
27
|
content_tag :span, :id => 'submit_multiple' do
|
|
28
|
-
select_action_button( _("Select
|
|
28
|
+
select_action_button( _("Select action"), actions.map do |action|
|
|
29
29
|
link_to(icon_text(action[2], action[0]) , action[1], :class=>'btn', :title => _("%s - The following hosts are about to be changed") % action[0])
|
|
30
30
|
end.flatten)
|
|
31
31
|
end
|
|
@@ -23,16 +23,17 @@ class Host::Discovered < ::Host::Base
|
|
|
23
23
|
|
|
24
24
|
def self.importHostAndFacts facts
|
|
25
25
|
raise(::Foreman::Exception.new("Invalid Facts, must be a Hash")) unless facts.is_a?(Hash)
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
fact_name = Setting[:discovery_fact] || 'macaddress'
|
|
27
|
+
hostname = facts[fact_name].try(:downcase).try(:gsub,/:/,'')
|
|
28
|
+
raise(::Foreman::Exception.new("Invalid facts: hash does not contain the required fact '#{fact_name}'")) unless hostname
|
|
28
29
|
|
|
29
30
|
# filter facts
|
|
30
|
-
facts.reject!{|k,v| k =~ /kernel|operatingsystem|osfamily|ruby|path|time|swap|free|filesystem
|
|
31
|
+
facts.reject!{|k,v| k =~ /kernel|operatingsystem|osfamily|ruby|path|time|swap|free|filesystem/i }
|
|
31
32
|
|
|
32
33
|
h = ::Host::Discovered.find_by_name hostname
|
|
33
34
|
h ||= Host.new :name => hostname, :type => "Host::Discovered"
|
|
34
35
|
h.type = "Host::Discovered"
|
|
35
|
-
h.mac = facts[
|
|
36
|
+
h.mac = facts[fact_name].try(:downcase)
|
|
36
37
|
|
|
37
38
|
if SETTINGS[:locations_enabled]
|
|
38
39
|
begin
|
|
@@ -77,7 +78,7 @@ class Host::Discovered < ::Host::Base
|
|
|
77
78
|
logger.debug "retrieving facts from proxy on ip: #{self.ip}"
|
|
78
79
|
facts = ForemanDiscovery::Facts.new(:url => "http://#{self.ip}:8443").facts
|
|
79
80
|
rescue Exception => e
|
|
80
|
-
raise "Could not get facts from
|
|
81
|
+
raise _("Could not get facts from proxy: %s") % e
|
|
81
82
|
end
|
|
82
83
|
|
|
83
84
|
return self.class.importHostAndFacts facts
|
|
@@ -9,7 +9,7 @@ module Host::ManagedExtensions
|
|
|
9
9
|
def queue_reboot
|
|
10
10
|
return if new_record? # Discovered Hosts already exist, and new_records will break `find`
|
|
11
11
|
return unless type_changed? and ::Host::Base.find(self.id).type == "Host::Discovered"
|
|
12
|
-
post_queue.create(:name => "Rebooting
|
|
12
|
+
post_queue.create(:name => _("Rebooting %s") % self, :priority => 10000,
|
|
13
13
|
:action => [self, :setReboot])
|
|
14
14
|
end
|
|
15
15
|
|
|
@@ -21,7 +21,7 @@ module Host::ManagedExtensions
|
|
|
21
21
|
logger.info "ForemanDiscovery: reboot result: failed"
|
|
22
22
|
end
|
|
23
23
|
rescue => e
|
|
24
|
-
failure "Failed to reboot:
|
|
24
|
+
failure _("Failed to reboot: %s") % proxy_error(e)
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def delReboot
|
|
@@ -6,17 +6,23 @@ class Setting::Discovered < ::Setting
|
|
|
6
6
|
# Check the table exists
|
|
7
7
|
return unless super
|
|
8
8
|
|
|
9
|
+
Setting.transaction do
|
|
10
|
+
[
|
|
11
|
+
self.set('discovery_fact', _("The default fact name to use for the MAC of the system"), "macaddress"),
|
|
12
|
+
].compact.each { |s| self.create s.update(:category => "Setting::Discovered")}
|
|
13
|
+
end
|
|
14
|
+
|
|
9
15
|
if SETTINGS[:locations_enabled]
|
|
10
16
|
Setting.transaction do
|
|
11
17
|
[
|
|
12
|
-
self.set('discovery_location', "The default
|
|
18
|
+
self.set('discovery_location', _("The default location to place discovered hosts in"), ""),
|
|
13
19
|
].compact.each { |s| self.create s.update(:category => "Setting::Discovered")}
|
|
14
20
|
end
|
|
15
21
|
end
|
|
16
22
|
if SETTINGS[:organizations_enabled]
|
|
17
23
|
Setting.transaction do
|
|
18
24
|
[
|
|
19
|
-
self.set('discovery_organization', "The default
|
|
25
|
+
self.set('discovery_organization', _("The default organization to place discovered hosts in"), "" ),
|
|
20
26
|
].compact.each { |s| self.create s.update(:category => "Setting::Discovered")}
|
|
21
27
|
end
|
|
22
28
|
end
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
Deface::Override.new(:virtual_path => "dashboard/_status_table",
|
|
2
2
|
:name => "add_dashboard_table",
|
|
3
3
|
:insert_after => "ul:last",
|
|
4
|
-
:text =>
|
|
5
|
-
<h4 class=
|
|
4
|
+
:text => ("
|
|
5
|
+
<h4 class='header'><%= _('Host Pool') %></h4>
|
|
6
6
|
<ul>
|
|
7
7
|
<li>
|
|
8
|
-
<%= link_to(
|
|
8
|
+
<%= link_to(_('Unassigned hosts'), discovers_path, :class=>'dashboard-links' ) %>
|
|
9
9
|
<h4><%= Host::Discovered.count %></h4>
|
|
10
10
|
</li>
|
|
11
|
-
</ul>
|
|
11
|
+
</ul>"))
|
|
12
|
+
|
|
13
|
+
# strings used above, for the purposes of extraction only, as they're not
|
|
14
|
+
# detected within the full override template string above
|
|
15
|
+
N_('Host Pool')
|
|
16
|
+
N_('Unassigned hosts')
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
<%= javascript "jquery.cookie", "host_checkbox" %>
|
|
2
|
-
<% title 'Discovered
|
|
2
|
+
<% title _('Discovered hosts') %>
|
|
3
3
|
<table class="table table-bordered table-striped table-condensed" >
|
|
4
4
|
<tr>
|
|
5
5
|
<th class="ca"><%= check_box_tag "check_all", "", false, { :onclick => "toggleCheck()", :'check-title' => _("Select all items in this page"), :'uncheck-title'=> _("items selected. Uncheck to Clear") } %></th>
|
|
6
|
-
<th class=''><%= sort :name %></th>
|
|
7
|
-
<th class="hidden-tablet hidden-phone"><%= sort :model %></th>
|
|
6
|
+
<th class=''><%= sort :name, :as => _('Name') %></th>
|
|
7
|
+
<th class="hidden-tablet hidden-phone"><%= sort :model, :as => _('Model') %></th>
|
|
8
8
|
<% if SETTINGS[:locations_enabled] -%>
|
|
9
|
-
<th class="hidden-tablet hidden-phone"><%= sort :location %></th>
|
|
9
|
+
<th class="hidden-tablet hidden-phone"><%= sort :location, :as => _('Location') %></th>
|
|
10
10
|
<% end -%>
|
|
11
11
|
<% if SETTINGS[:organizations_enabled] -%>
|
|
12
|
-
<th class="hidden-tablet hidden-phone"><%= sort :organization %></th>
|
|
12
|
+
<th class="hidden-tablet hidden-phone"><%= sort :organization, :as => _('Organization') %></th>
|
|
13
13
|
<% end -%>
|
|
14
|
-
<th class="hidden-tablet hidden-phone"><%= sort :subnet, :as => "Subnet" %></th>
|
|
15
|
-
<th class="hidden-tablet hidden-phone"><%= sort :last_report, :as => "
|
|
14
|
+
<th class="hidden-tablet hidden-phone"><%= sort :subnet, :as => _("Subnet") %></th>
|
|
15
|
+
<th class="hidden-tablet hidden-phone"><%= sort :last_report, :as => _("Last facts upload") %></th>
|
|
16
16
|
<th></th>
|
|
17
17
|
</tr>
|
|
18
18
|
<% @hosts.each do |host| -%>
|
|
@@ -32,9 +32,9 @@
|
|
|
32
32
|
<td class="hidden-tablet hidden-phone"><%= disc_report_column(host) %></td>
|
|
33
33
|
<td>
|
|
34
34
|
<%= action_buttons(
|
|
35
|
-
link_to("Provision", hash_for_edit_discover_path(:id => host)),
|
|
36
|
-
link_to("Refresh
|
|
37
|
-
display_delete_if_authorized(hash_for_discover_path(:id => host), :confirm => "Delete
|
|
35
|
+
link_to(_("Provision"), hash_for_edit_discover_path(:id => host)),
|
|
36
|
+
link_to(_("Refresh facts"), hash_for_refresh_facts_discover_path(:id => host)),
|
|
37
|
+
display_delete_if_authorized(hash_for_discover_path(:id => host), :confirm => _("Delete %s?") % host.name, :action => :destroy))%>
|
|
38
38
|
</td>
|
|
39
39
|
</tr>
|
|
40
40
|
<% end -%>
|
|
@@ -43,14 +43,14 @@
|
|
|
43
43
|
<div id="confirmation-modal" class="modal hide fade">
|
|
44
44
|
<div class="modal-header">
|
|
45
45
|
<a href="#" class="close" data-dismiss="modal">×</a>
|
|
46
|
-
<h3
|
|
46
|
+
<h3><%= _('Please Confirm') %></h3>
|
|
47
47
|
</div>
|
|
48
48
|
<div class="modal-body"></div>
|
|
49
49
|
<div class="modal-footer">
|
|
50
|
-
<a href="#" class="btn btn-primary"
|
|
51
|
-
<a href="#" class="btn secondary"
|
|
50
|
+
<a href="#" class="btn btn-primary"><%= _('Submit') %></a>
|
|
51
|
+
<a href="#" class="btn secondary"><%= _('Cancel') %></a>
|
|
52
52
|
</div>
|
|
53
53
|
</div>
|
|
54
54
|
|
|
55
|
-
<%= page_entries_info @hosts
|
|
55
|
+
<%= page_entries_info @hosts %>
|
|
56
56
|
<%= will_paginate @hosts %>
|
|
@@ -4,10 +4,14 @@
|
|
|
4
4
|
<table class="table table-bordered table-striped">
|
|
5
5
|
<thead>
|
|
6
6
|
<tr>
|
|
7
|
-
<th
|
|
8
|
-
<th
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
<th><%= _('Name') %></th>
|
|
8
|
+
<th><%= _('Model') %></th>
|
|
9
|
+
<% if SETTINGS[:locations_enabled] %>
|
|
10
|
+
<th><%= _('Location') %></th>
|
|
11
|
+
<% end %>
|
|
12
|
+
<% if SETTINGS[:organizations_enabled] %>
|
|
13
|
+
<th><%= _('Organization') %></th>
|
|
14
|
+
<% end %>
|
|
11
15
|
</tr>
|
|
12
16
|
</thead>
|
|
13
17
|
<tbody>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<%= render 'selected_hosts', :hosts => @hosts %>
|
|
2
2
|
|
|
3
3
|
<%= form_tag submit_multiple_destroy_hosts_path(:host_ids => params[:host_ids]), :onsubmit => "resetSelection()" do -%>
|
|
4
|
-
<span class="label label-warning"
|
|
4
|
+
<span class="label label-warning"><%= _('Warning') -%></span>
|
|
5
|
+
<%= _('This might take a while, as all hosts, facts and reports will be destroyed as well') %>
|
|
5
6
|
<% end %>
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
<div class="row">
|
|
3
3
|
<div class="span8">
|
|
4
4
|
<%= form_for :location, :url => update_multiple_location_hosts_path(:host_ids => params[:host_ids]) do |f| %>
|
|
5
|
-
<%= f.select :id, Location.all.map{|e| [e.name, e.id]},{:include_blank => "Select
|
|
5
|
+
<%= f.select :id, Location.all.map{|e| [e.name, e.id]},{:include_blank => _("Select location")},
|
|
6
6
|
:onchange => "toggle_multiple_ok_button(this)" %>
|
|
7
7
|
<%= f.hidden_field :optimistic_import, :value => "yes" %>
|
|
8
8
|
<% end %>
|
|
9
9
|
</div>
|
|
10
|
-
</div>
|
|
10
|
+
</div>
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
<div class="row">
|
|
3
3
|
<div class="span8">
|
|
4
4
|
<%= form_for :organization, :url => update_multiple_organization_hosts_path(:host_ids => params[:host_ids]) do |f| %>
|
|
5
|
-
<%= f.select :id, Organization.all.map{|e| [e.name, e.id]},{:include_blank => "Select
|
|
5
|
+
<%= f.select :id, Organization.all.map{|e| [e.name, e.id]},{:include_blank => _("Select organization")},
|
|
6
6
|
:onchange => "toggle_multiple_ok_button(this)" %>
|
|
7
7
|
<%= f.hidden_field :optimistic_import, :value => "yes" %>
|
|
8
8
|
<% end %>
|
|
9
9
|
</div>
|
|
10
|
-
</div>
|
|
10
|
+
</div>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
<% title
|
|
1
|
+
<% title(_("Discovered host: %s") % @host.to_label) %>
|
|
2
2
|
|
|
3
3
|
<%= discovers_title_actions(@host) %>
|
|
4
4
|
|
|
5
|
-
<h3
|
|
5
|
+
<h3><%= _('Facts discovered on this host') -%></h3>
|
|
6
6
|
<table class="table table-bordered table-striped table-condensed">
|
|
7
7
|
<tr>
|
|
8
|
-
<th
|
|
9
|
-
<th
|
|
8
|
+
<th><%= _('Fact') -%></th>
|
|
9
|
+
<th><%= _('Value') -%></th>
|
|
10
10
|
<% @host.facts_hash.sort.each do |fact| -%>
|
|
11
11
|
<tr>
|
|
12
12
|
<td><%= fact[0] %></td>
|
|
@@ -1,18 +1 @@
|
|
|
1
|
-
# Add permissions
|
|
2
|
-
Foreman::AccessControl.map do |map|
|
|
3
|
-
map.security_block :discovery do |map|
|
|
4
|
-
map.permission :perform_discovery, {:discovers => [:index, :show, :update, :new,
|
|
5
|
-
:edit, :destroy, :create, :auto_complete_search, :select_multiple_organization,
|
|
6
|
-
:update_multiple_organization, :select_multiple_location, :refresh_facts,
|
|
7
|
-
:update_multiple_location, :submit_multiple_destroy, :multiple_destroy]}
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
1
|
|
|
11
|
-
begin
|
|
12
|
-
# Add a new role called 'Discovery' if it doesn't exist
|
|
13
|
-
Role.transaction do
|
|
14
|
-
role = Role.find_or_create_by_name("Discovery")
|
|
15
|
-
role.update_attribute :permissions, [:perform_discovery] if role.permissions.empty?
|
|
16
|
-
end
|
|
17
|
-
rescue
|
|
18
|
-
end
|