foreman_monitoring 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +619 -0
- data/README.md +31 -0
- data/Rakefile +47 -0
- data/app/controllers/api/v2/monitoring_results_controller.rb +29 -0
- data/app/helpers/concerns/foreman_monitoring/hosts_helper_ext.rb +46 -0
- data/app/lib/proxy_api/monitoring.rb +14 -0
- data/app/models/concerns/foreman_monitoring/host_extensions.rb +42 -0
- data/app/models/host_status/monitoring_status.rb +72 -0
- data/app/models/monitoring_result.rb +74 -0
- data/app/models/setting/monitoring.rb +16 -0
- data/app/overrides/add_host_monitoring_result_tab.rb +11 -0
- data/app/services/monitoring.rb +13 -0
- data/app/views/monitoring_results/_host_tab.html.erb +1 -0
- data/app/views/monitoring_results/_host_tab_pane.html.erb +25 -0
- data/config/routes.rb +10 -0
- data/db/migrate/20160817135723_create_monitoring_results.rb +12 -0
- data/db/seeds.d/60-monitoring_proxy_feature.rb +2 -0
- data/lib/foreman_monitoring/engine.rb +51 -0
- data/lib/foreman_monitoring/version.rb +3 -0
- data/lib/foreman_monitoring.rb +4 -0
- data/lib/tasks/foreman_monitoring_tasks.rake +35 -0
- data/locale/Makefile +62 -0
- data/locale/en/foreman_monitoring.po +19 -0
- data/locale/foreman_monitoring.pot +19 -0
- data/locale/gemspec.rb +2 -0
- data/test/factories/feature.rb +7 -0
- data/test/factories/host.rb +14 -0
- data/test/factories/monitoring_results.rb +30 -0
- data/test/factories/smart_proxy.rb +7 -0
- data/test/lib/proxy_api/monitoring_test.rb +22 -0
- data/test/test_plugin_helper.rb +24 -0
- data/test/unit/host_status/monitoring_status_test.rb +91 -0
- data/test/unit/host_test.rb +26 -0
- data/test/unit/monitoring_test.rb +17 -0
- metadata +115 -0
data/Rakefile
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'ForemanMonitoring'
|
18
|
+
rdoc.options << '--line-numbers'
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
|
24
|
+
|
25
|
+
Bundler::GemHelper.install_tasks
|
26
|
+
|
27
|
+
require 'rake/testtask'
|
28
|
+
|
29
|
+
Rake::TestTask.new(:test) do |t|
|
30
|
+
t.libs << 'lib'
|
31
|
+
t.libs << 'test'
|
32
|
+
t.pattern = 'test/**/*_test.rb'
|
33
|
+
t.verbose = false
|
34
|
+
end
|
35
|
+
|
36
|
+
task default: :test
|
37
|
+
|
38
|
+
begin
|
39
|
+
require 'rubocop/rake_task'
|
40
|
+
RuboCop::RakeTask.new
|
41
|
+
rescue => _
|
42
|
+
puts 'Rubocop not loaded.'
|
43
|
+
end
|
44
|
+
|
45
|
+
task :default do
|
46
|
+
Rake::Task['rubocop'].execute
|
47
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Api
|
2
|
+
module V2
|
3
|
+
class MonitoringResultsController < V2::BaseController
|
4
|
+
include Api::Version2
|
5
|
+
include Foreman::Controller::SmartProxyAuth
|
6
|
+
|
7
|
+
add_smart_proxy_filters :create, :features => 'Monitoring'
|
8
|
+
|
9
|
+
def create
|
10
|
+
begin
|
11
|
+
MonitoringResult.import(monitoring_result_params.with_indifferent_access)
|
12
|
+
rescue => e
|
13
|
+
logger.error "Failed to import monitoring result: #{e.message}"
|
14
|
+
logger.debug e.backtrace.join("\n")
|
15
|
+
render :json => { 'message' => e.message }, :status => :unprocessable_entity
|
16
|
+
return
|
17
|
+
end
|
18
|
+
|
19
|
+
render :json => { 'message' => 'OK' }
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def monitoring_result_params
|
25
|
+
params.permit(:host, :result, :service, :acknowledged, :downtime, :timestamp, :initial)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module ForemanMonitoring
|
2
|
+
module HostsHelperExt
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
# included do
|
6
|
+
# alias_method_chain :host_title_actions, :monitoring
|
7
|
+
# end
|
8
|
+
|
9
|
+
# def host_title_actions_with_monitoring(host)
|
10
|
+
# title_actions(
|
11
|
+
# button_group(
|
12
|
+
# link_to(_('Monitoring'), monitoring_show_host_path(host), :target => '_blank', :class => 'btn btn-default')
|
13
|
+
# )
|
14
|
+
# )
|
15
|
+
# host_title_actions_without_monitoring(host)
|
16
|
+
# end
|
17
|
+
|
18
|
+
def host_monitoring_result_icon_class(result)
|
19
|
+
icon_class = case result
|
20
|
+
when :ok
|
21
|
+
'pficon-ok'
|
22
|
+
when :warning
|
23
|
+
'pficon-info'
|
24
|
+
when :critical
|
25
|
+
'pficon-error-circle-o'
|
26
|
+
else
|
27
|
+
'pficon-help'
|
28
|
+
end
|
29
|
+
|
30
|
+
"host-status #{icon_class} #{host_monitoring_result_class(result)}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def host_monitoring_result_class(result)
|
34
|
+
case result
|
35
|
+
when :ok
|
36
|
+
'status-ok'
|
37
|
+
when :warning
|
38
|
+
'status-warn'
|
39
|
+
when :critical
|
40
|
+
'status-error'
|
41
|
+
else
|
42
|
+
'status-question'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module ProxyAPI
|
2
|
+
class Monitoring < ProxyAPI::Resource
|
3
|
+
def initialize(args)
|
4
|
+
@url = args[:url] + '/monitoring'
|
5
|
+
super args
|
6
|
+
end
|
7
|
+
|
8
|
+
def create_host_downtime(host, args = {})
|
9
|
+
parse(post(args, "downtime/host/#{host}"))
|
10
|
+
rescue => e
|
11
|
+
raise ProxyException.new(url, e, N_('Unable to set downtime for %s') % host)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module ForemanMonitoring
|
2
|
+
module HostExtensions
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
included do
|
5
|
+
before_destroy :downtime_host_destroy
|
6
|
+
after_build :downtime_host_build
|
7
|
+
|
8
|
+
has_many :monitoring_results, :foreign_key => 'host_id'
|
9
|
+
end
|
10
|
+
|
11
|
+
def monitoring_status(options = {})
|
12
|
+
@monitoring_status ||= get_status(HostStatus::MonitoringStatus).to_status(options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def monitoring_status_label(options = {})
|
16
|
+
@monitoring_status_label ||= get_status(HostStatus::MonitoringStatus).to_label(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def refresh_monitoring_status
|
20
|
+
get_status(HostStatus::MonitoringStatus).refresh
|
21
|
+
end
|
22
|
+
|
23
|
+
def downtime_host_build
|
24
|
+
downtime_host(:comment => _('Host rebuilt in Foreman'))
|
25
|
+
end
|
26
|
+
|
27
|
+
def downtime_host_destroy
|
28
|
+
downtime_host(:comment => _('Host deleted in Foreman'))
|
29
|
+
end
|
30
|
+
|
31
|
+
def downtime_host(options)
|
32
|
+
return unless monitoring_results.any?
|
33
|
+
begin
|
34
|
+
monitoring = Monitoring.new
|
35
|
+
monitoring.set_downtime_host(self, options)
|
36
|
+
rescue ProxyAPI::ProxyException => e
|
37
|
+
errors.add(:base, _("Error setting downtime: '%s'") % e.message)
|
38
|
+
end
|
39
|
+
errors.empty?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module HostStatus
|
2
|
+
class MonitoringStatus < HostStatus::Status
|
3
|
+
OK = 0
|
4
|
+
WARNING = 1
|
5
|
+
CRITICAL = 2
|
6
|
+
UNKNOWN = 3
|
7
|
+
|
8
|
+
def relevant?(_options = {})
|
9
|
+
host_not_in_build? && host_known_in_monitoring?
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_status(_options = {})
|
13
|
+
state = OK
|
14
|
+
grouped_results.each do |resultset, _count|
|
15
|
+
result, downtime, acknowledged = resultset
|
16
|
+
next if downtime
|
17
|
+
result = WARNING if acknowledged || result == UNKNOWN
|
18
|
+
state = result if result > state
|
19
|
+
end
|
20
|
+
state
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_global(_options = {})
|
24
|
+
return HostStatus::Global::OK unless should_affect_global_status?
|
25
|
+
case status
|
26
|
+
when OK
|
27
|
+
HostStatus::Global::OK
|
28
|
+
when WARNING
|
29
|
+
HostStatus::Global::WARN
|
30
|
+
when CRITICAL
|
31
|
+
HostStatus::Global::ERROR
|
32
|
+
else
|
33
|
+
HostStatus::Global::WARN
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.status_name
|
38
|
+
N_('Monitoring Status')
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_label(_options = {})
|
42
|
+
case status
|
43
|
+
when OK
|
44
|
+
N_('OK')
|
45
|
+
when WARNING
|
46
|
+
N_('Warning')
|
47
|
+
when CRITICAL
|
48
|
+
N_('Critical')
|
49
|
+
else
|
50
|
+
N_('Unknown')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def host_not_in_build?
|
55
|
+
host && !host.build
|
56
|
+
end
|
57
|
+
|
58
|
+
def host_known_in_monitoring?
|
59
|
+
host.monitoring_results.any?
|
60
|
+
end
|
61
|
+
|
62
|
+
def should_affect_global_status?
|
63
|
+
Setting[:monitoring_affect_global_status]
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def grouped_results
|
69
|
+
host.monitoring_results.group([:result, :downtime, :acknowledged]).count
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
class MonitoringResult < ActiveRecord::Base
|
2
|
+
enum :result => [:ok, :warning, :critical, :unknown]
|
3
|
+
|
4
|
+
belongs_to_host
|
5
|
+
|
6
|
+
def self.import(result)
|
7
|
+
host = Host.find_by_name(result[:host])
|
8
|
+
|
9
|
+
if host.nil?
|
10
|
+
logger.error "Unable to find host #{result[:host]}"
|
11
|
+
return false
|
12
|
+
end
|
13
|
+
|
14
|
+
start_time = Time.now.utc
|
15
|
+
logger.info "Processing monitoring result for #{host}"
|
16
|
+
|
17
|
+
updates = {
|
18
|
+
:result => result[:result],
|
19
|
+
:acknowledged => result[:acknowledged],
|
20
|
+
:downtime => result[:downtime],
|
21
|
+
:timestamp => (Time.at(result[:timestamp]).utc rescue nil)
|
22
|
+
}.compact
|
23
|
+
|
24
|
+
if result[:initial] && result[:service] == 'Host Check'
|
25
|
+
logger.info "Removing all monitoring results for #{host} on initial import"
|
26
|
+
MonitoringResult.where(:host => host).destroy_all
|
27
|
+
end
|
28
|
+
|
29
|
+
created = MonitoringResult.where(:host => host, :service => result[:service]).first_or_create
|
30
|
+
if created.timestamp.blank? || updates[:timestamp].blank? || created.timestamp < updates[:timestamp]
|
31
|
+
created.update_attributes(updates)
|
32
|
+
|
33
|
+
if created.persisted?
|
34
|
+
logger.info("Imported monitoring result for #{host} in #{(Time.now.utc - start_time).round(2)} seconds")
|
35
|
+
host.refresh_statuses
|
36
|
+
end
|
37
|
+
else
|
38
|
+
logger.debug "Skipping monitoring result import for #{host} as it is older than what we have."
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def status
|
43
|
+
return :ok if downtime
|
44
|
+
return :warning if acknowledged
|
45
|
+
result.to_sym
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_label
|
49
|
+
label_mapper(status)
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_full_label
|
53
|
+
options = []
|
54
|
+
options << _('acknowledged') if acknowledged
|
55
|
+
options << _('in downtime') if downtime
|
56
|
+
suffix = options.any? ? " (#{options.join(', ')})" : ''
|
57
|
+
"#{label_mapper(result.to_sym)}#{suffix}"
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def label_mapper(value)
|
63
|
+
case value
|
64
|
+
when :ok
|
65
|
+
_('OK')
|
66
|
+
when :warning
|
67
|
+
_('Warning')
|
68
|
+
when :critical
|
69
|
+
_('Critical')
|
70
|
+
else
|
71
|
+
_('Unknown')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Setting
|
2
|
+
class Monitoring < ::Setting
|
3
|
+
def self.load_defaults
|
4
|
+
# Check the table exists
|
5
|
+
return unless super
|
6
|
+
|
7
|
+
Setting.transaction do
|
8
|
+
[
|
9
|
+
set('monitoring_affect_global_status',
|
10
|
+
_("Monitoring status will affect a host's global status when enabled"),
|
11
|
+
true, N_('Monitoring status should affect global status'))
|
12
|
+
].compact.each { |s| create! s.update(:category => 'Setting::Monitoring') }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => 'hosts/show',
|
2
|
+
:name => 'add_monitoring_result_tab',
|
3
|
+
:insert_bottom => 'ul.nav-tabs',
|
4
|
+
:partial => 'monitoring_results/host_tab'
|
5
|
+
)
|
6
|
+
|
7
|
+
Deface::Override.new(:virtual_path => 'hosts/show',
|
8
|
+
:name => 'add_monitoring_result_tab_pane',
|
9
|
+
:insert_bottom => 'div.tab-content',
|
10
|
+
:partial => 'monitoring_results/host_tab_pane'
|
11
|
+
)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Monitoring
|
2
|
+
delegate :logger, :to => :Rails
|
3
|
+
attr_reader :proxy, :proxy_api
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@proxy = SmartProxy.with_features('Monitoring').first
|
7
|
+
@proxy_api = ProxyAPI::Monitoring.new(:url => proxy.url)
|
8
|
+
end
|
9
|
+
|
10
|
+
def set_downtime_host(host, options = {})
|
11
|
+
proxy_api.create_host_downtime(host.fqdn, { :author => 'Foreman', :comment => 'triggered by Foreman' }.merge(options))
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<li><a href="#monitoring" data-toggle="tab"><%= _("Monitoring") %></a></li>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<div class="tab-pane" id="monitoring">
|
2
|
+
<% if @host.monitoring_results.any? %>
|
3
|
+
<table class="table table-bordered table-striped">
|
4
|
+
<thead
|
5
|
+
<tr>
|
6
|
+
<th colspan="2">Monitoring</th>
|
7
|
+
</tr>
|
8
|
+
</thead>
|
9
|
+
<tbody>
|
10
|
+
<% @host.monitoring_results.order(:service).each do |result| %>
|
11
|
+
<tr>
|
12
|
+
<td>
|
13
|
+
<%= result.service %>
|
14
|
+
</td>
|
15
|
+
<td>
|
16
|
+
<span class="<%= host_monitoring_result_icon_class(result.status) %>" title="<%= result.to_label %>"></span> <%= result.to_full_label %>
|
17
|
+
</td>
|
18
|
+
</tr>
|
19
|
+
<% end %>
|
20
|
+
</tbody>
|
21
|
+
</table>
|
22
|
+
<% else %>
|
23
|
+
<div class="alert alert-success"> <%= _('No monitoring results for this host') %> </div>
|
24
|
+
<% end %>
|
25
|
+
</div>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
namespace :api, :defaults => { :format => 'json' } do
|
3
|
+
scope '(:apiv)', :module => :v2,
|
4
|
+
:defaults => { :apiv => 'v2' },
|
5
|
+
:apiv => /v1|v2/,
|
6
|
+
:constraints => ApiConstraints.new(:version => 2) do
|
7
|
+
resources :monitoring_results, :only => [:create]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateMonitoringResults < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :monitoring_results do |t|
|
4
|
+
t.references :host, :null => false
|
5
|
+
t.string :service, :null => false
|
6
|
+
t.integer :result, :default => 0, :null => false
|
7
|
+
t.boolean :downtime, :default => false, :null => false
|
8
|
+
t.boolean :acknowledged, :default => false, :null => false
|
9
|
+
t.datetime :timestamp
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module ForemanMonitoring
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
engine_name 'foreman_monitoring'
|
4
|
+
|
5
|
+
config.autoload_paths += Dir["#{config.root}/app/controllers/concerns"]
|
6
|
+
config.autoload_paths += Dir["#{config.root}/app/helpers/concerns"]
|
7
|
+
config.autoload_paths += Dir["#{config.root}/app/models/concerns"]
|
8
|
+
config.autoload_paths += Dir["#{config.root}/app/overrides"]
|
9
|
+
config.autoload_paths += Dir["#{config.root}/app/services"]
|
10
|
+
|
11
|
+
# Add any db migrations
|
12
|
+
initializer 'foreman_monitoring.load_app_instance_data' do |app|
|
13
|
+
ForemanMonitoring::Engine.paths['db/migrate'].existent.each do |path|
|
14
|
+
app.config.paths['db/migrate'] << path
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
initializer 'foreman_monitoring.load_default_settings',
|
19
|
+
:before => :load_config_initializers do |_app|
|
20
|
+
if begin
|
21
|
+
Setting.table_exists?
|
22
|
+
rescue
|
23
|
+
false
|
24
|
+
end
|
25
|
+
require_dependency File.expand_path('../../../app/models/setting/monitoring.rb', __FILE__)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
initializer 'foreman_monitoring.register_plugin', :before => :finisher_hook do |_app|
|
30
|
+
Foreman::Plugin.register :foreman_monitoring do
|
31
|
+
requires_foreman '>= 1.11'
|
32
|
+
register_custom_status HostStatus::MonitoringStatus
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
config.to_prepare do
|
37
|
+
begin
|
38
|
+
Host::Managed.send :include, ForemanMonitoring::HostExtensions
|
39
|
+
HostsHelper.send(:include, ForemanMonitoring::HostsHelperExt)
|
40
|
+
rescue => e
|
41
|
+
Rails.logger.warn "ForemanMonitoring: skipping engine hook (#{e})"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
initializer 'foreman_monitoring.register_gettext', after: :load_config_initializers do |_app|
|
46
|
+
locale_dir = File.join(File.expand_path('../../..', __FILE__), 'locale')
|
47
|
+
locale_domain = 'foreman_monitoring'
|
48
|
+
Foreman::Gettext::Support.add_text_domain locale_domain, locale_dir
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Tests
|
2
|
+
namespace :test do
|
3
|
+
desc 'Test ForemanMonitoring'
|
4
|
+
Rake::TestTask.new(:foreman_monitoring) do |t|
|
5
|
+
test_dir = File.join(File.dirname(__FILE__), '../..', 'test')
|
6
|
+
t.libs << ['test', test_dir]
|
7
|
+
t.pattern = "#{test_dir}/**/*_test.rb"
|
8
|
+
t.verbose = true
|
9
|
+
t.warning = false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
namespace :foreman_monitoring do
|
14
|
+
task :rubocop do
|
15
|
+
begin
|
16
|
+
require 'rubocop/rake_task'
|
17
|
+
RuboCop::RakeTask.new(:rubocop_foreman_monitoring) do |task|
|
18
|
+
task.patterns = ["#{ForemanMonitoring::Engine.root}/app/**/*.rb",
|
19
|
+
"#{ForemanMonitoring::Engine.root}/lib/**/*.rb",
|
20
|
+
"#{ForemanMonitoring::Engine.root}/test/**/*.rb"]
|
21
|
+
end
|
22
|
+
rescue
|
23
|
+
puts 'Rubocop not loaded.'
|
24
|
+
end
|
25
|
+
|
26
|
+
Rake::Task['rubocop_foreman_monitoring'].invoke
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Rake::Task[:test].enhance ['test:foreman_monitoring']
|
31
|
+
|
32
|
+
load 'tasks/jenkins.rake'
|
33
|
+
if Rake::Task.task_defined?(:'jenkins:unit')
|
34
|
+
Rake::Task['jenkins:unit'].enhance ['test:foreman_monitoring', 'foreman_monitoring:rubocop']
|
35
|
+
end
|
data/locale/Makefile
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
#
|
2
|
+
# Makefile for PO merging and MO generation. More info in the README.
|
3
|
+
#
|
4
|
+
# make all-mo (default) - generate MO files
|
5
|
+
# make check - check translations using translate-tool
|
6
|
+
# make tx-update - download and merge translations from Transifex
|
7
|
+
# make clean - clean everything
|
8
|
+
#
|
9
|
+
DOMAIN = foreman_monitoring
|
10
|
+
VERSION = $(shell ruby -e 'require "rubygems";spec = Gem::Specification::load(Dir.glob("../*.gemspec")[0]);puts spec.version')
|
11
|
+
POTFILE = $(DOMAIN).pot
|
12
|
+
MOFILE = $(DOMAIN).mo
|
13
|
+
POFILES = $(shell find . -name '*.po')
|
14
|
+
MOFILES = $(patsubst %.po,%.mo,$(POFILES))
|
15
|
+
POXFILES = $(patsubst %.po,%.pox,$(POFILES))
|
16
|
+
|
17
|
+
%.mo: %.po
|
18
|
+
mkdir -p $(shell dirname $@)/LC_MESSAGES
|
19
|
+
msgfmt -o $(shell dirname $@)/LC_MESSAGES/$(MOFILE) $<
|
20
|
+
|
21
|
+
# Generate MO files from PO files
|
22
|
+
all-mo: $(MOFILES)
|
23
|
+
|
24
|
+
# Check for malformed strings
|
25
|
+
%.pox: %.po
|
26
|
+
msgfmt -c $<
|
27
|
+
pofilter --nofuzzy -t variables -t blank -t urls -t emails -t long -t newlines \
|
28
|
+
-t endwhitespace -t endpunc -t puncspacing -t options -t printf -t validchars --gnome $< > $@
|
29
|
+
cat $@
|
30
|
+
! grep -q msgid $@
|
31
|
+
|
32
|
+
check: $(POXFILES)
|
33
|
+
msgfmt -c ${POTFILE}
|
34
|
+
|
35
|
+
# Merge PO files
|
36
|
+
update-po:
|
37
|
+
for f in $(shell find ./ -name "*.po") ; do \
|
38
|
+
msgmerge -N --backup=none -U $$f ${POTFILE} ; \
|
39
|
+
done
|
40
|
+
|
41
|
+
# Unify duplicate translations
|
42
|
+
uniq-po:
|
43
|
+
for f in $(shell find ./ -name "*.po") ; do \
|
44
|
+
msguniq $$f -o $$f ; \
|
45
|
+
done
|
46
|
+
|
47
|
+
tx-pull:
|
48
|
+
tx pull -f
|
49
|
+
for f in $(POFILES) ; do \
|
50
|
+
sed -i 's/^\("Project-Id-Version: \).*$$/\1$(DOMAIN) $(VERSION)\\n"/' $$f; \
|
51
|
+
done
|
52
|
+
-git commit -a -m "i18n - pulling from tx"
|
53
|
+
|
54
|
+
reset-po:
|
55
|
+
# merging po files is unnecessary when using transifex.com
|
56
|
+
git checkout -- ../locale/*/*po
|
57
|
+
|
58
|
+
tx-update: tx-pull reset-po $(MOFILES)
|
59
|
+
# amend mo files
|
60
|
+
git add ../locale/*/LC_MESSAGES
|
61
|
+
git commit -a --amend -m "i18n - pulling from tx"
|
62
|
+
-echo Changes commited!
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# foreman_monitoring
|
2
|
+
#
|
3
|
+
# This file is distributed under the same license as foreman_monitoring.
|
4
|
+
#
|
5
|
+
#, fuzzy
|
6
|
+
msgid ""
|
7
|
+
msgstr ""
|
8
|
+
"Project-Id-Version: version 0.0.1\n"
|
9
|
+
"Report-Msgid-Bugs-To: \n"
|
10
|
+
"POT-Creation-Date: 2014-08-20 08:46+0100\n"
|
11
|
+
"PO-Revision-Date: 2014-08-20 08:54+0100\n"
|
12
|
+
"Last-Translator: Foreman Team <foreman-dev@googlegroups.com>\n"
|
13
|
+
"Language-Team: Foreman Team <foreman-dev@googlegroups.com>\n"
|
14
|
+
"Language: \n"
|
15
|
+
"MIME-Version: 1.0\n"
|
16
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
17
|
+
"Content-Transfer-Encoding: 8bit\n"
|
18
|
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
19
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# foreman_monitoring
|
2
|
+
#
|
3
|
+
# This file is distributed under the same license as foreman_monitoring.
|
4
|
+
#
|
5
|
+
#, fuzzy
|
6
|
+
msgid ""
|
7
|
+
msgstr ""
|
8
|
+
"Project-Id-Version: version 0.0.1\n"
|
9
|
+
"Report-Msgid-Bugs-To: \n"
|
10
|
+
"POT-Creation-Date: 2014-08-20 08:46+0100\n"
|
11
|
+
"PO-Revision-Date: 2014-08-20 08:46+0100\n"
|
12
|
+
"Last-Translator: Foreman Team <foreman-dev@googlegroups.com>\n"
|
13
|
+
"Language-Team: Foreman Team <foreman-dev@googlegroups.com>\n"
|
14
|
+
"Language: \n"
|
15
|
+
"MIME-Version: 1.0\n"
|
16
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
17
|
+
"Content-Transfer-Encoding: 8bit\n"
|
18
|
+
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
|
19
|
+
|
data/locale/gemspec.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
FactoryGirl.modify do
|
2
|
+
factory :host do
|
3
|
+
trait :with_monitoring_results do
|
4
|
+
transient do
|
5
|
+
monitoring_result_count 20
|
6
|
+
end
|
7
|
+
after(:create) do |host, evaluator|
|
8
|
+
evaluator.monitoring_result_count.times do
|
9
|
+
FactoryGirl.create(:monitoring_result, :host => host)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|