foreman_leapp 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +619 -0
  3. data/README.md +50 -0
  4. data/Rakefile +49 -0
  5. data/app/controllers/api/v2/preupgrade_reports_controller.rb +19 -0
  6. data/app/controllers/preupgrade_reports_controller.rb +7 -0
  7. data/app/helpers/concerns/foreman_leapp/hosts_helper_extensions.rb +17 -0
  8. data/app/helpers/concerns/foreman_leapp/remote_execution_helper_extension.rb +15 -0
  9. data/app/helpers/foreman_leapp/template_helper.rb +15 -0
  10. data/app/lib/actions/preupgrade_job.rb +35 -0
  11. data/app/lib/helpers/job_helper.rb +14 -0
  12. data/app/models/concerns/foreman_leapp/job_invocation_extensions.rb +11 -0
  13. data/app/models/preupgrade_report.rb +32 -0
  14. data/app/models/preupgrade_report_entry.rb +15 -0
  15. data/app/views/api/v2/preupgrade_report_entries/base.json.rabl +4 -0
  16. data/app/views/api/v2/preupgrade_reports/base.json.rabl +3 -0
  17. data/app/views/api/v2/preupgrade_reports/index.json.rabl +3 -0
  18. data/app/views/api/v2/preupgrade_reports/show.json.rabl +7 -0
  19. data/app/views/foreman_leapp/job_templates/preupgrade.erb +14 -0
  20. data/app/views/foreman_leapp/job_templates/remediation.erb +17 -0
  21. data/app/views/foreman_leapp/job_templates/upgrade.erb +16 -0
  22. data/app/views/job_invocations/_leapp_preupgrade_report.html.erb +10 -0
  23. data/app/views/preupgrade_report_entries/base.json.rabl +4 -0
  24. data/app/views/preupgrade_reports/index.json.rabl +3 -0
  25. data/app/views/preupgrade_reports/show.json.rabl +7 -0
  26. data/config/routes.rb +11 -0
  27. data/db/migrate/20200320104040_preupgrade_report_entries.rb +25 -0
  28. data/db/migrate/20200326142259_add_job_id_to_report.rb +6 -0
  29. data/db/migrate/20200327091009_add_host_to_report.rb +6 -0
  30. data/db/seeds.d/10_leapp_preupgrade.rb +19 -0
  31. data/lib/foreman_leapp/engine.rb +95 -0
  32. data/lib/foreman_leapp/version.rb +5 -0
  33. data/lib/foreman_leapp.rb +7 -0
  34. data/lib/tasks/foreman_leapp_tasks.rake +49 -0
  35. data/locale/Makefile +60 -0
  36. data/locale/en/foreman_leapp.po +19 -0
  37. data/locale/foreman_leapp.pot +19 -0
  38. data/locale/gemspec.rb +4 -0
  39. data/test/factories/foreman_leapp_factories.rb +27 -0
  40. data/test/functional/api/v2/preupgrade_reports_controller_test.rb +30 -0
  41. data/test/functional/preupgrade_reports_controller_test.rb +16 -0
  42. data/test/helpers/template_helper_test.rb +31 -0
  43. data/test/models/preupgrade_report_entry_test.rb +36 -0
  44. data/test/models/preupgrade_report_test.rb +46 -0
  45. data/test/test_plugin_helper.rb +11 -0
  46. data/test/unit/actions/preupgrade_job_test.rb +43 -0
  47. data/test/unit/helpers/job_helper_test.rb +37 -0
  48. metadata +141 -0
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env rake
2
+ # frozen_string_literal: true
3
+
4
+ begin
5
+ require 'bundler/setup'
6
+ rescue LoadError
7
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
8
+ end
9
+ begin
10
+ require 'rdoc/task'
11
+ rescue LoadError
12
+ require 'rdoc/rdoc'
13
+ require 'rake/rdoctask'
14
+ RDoc::Task = Rake::RDocTask
15
+ end
16
+
17
+ RDoc::Task.new(:rdoc) do |rdoc|
18
+ rdoc.rdoc_dir = 'rdoc'
19
+ rdoc.title = 'ForemanLeapp'
20
+ rdoc.options << '--line-numbers'
21
+ rdoc.rdoc_files.include('README.rdoc')
22
+ rdoc.rdoc_files.include('lib/**/*.rb')
23
+ end
24
+
25
+ APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)
26
+
27
+ Bundler::GemHelper.install_tasks
28
+
29
+ require 'rake/testtask'
30
+
31
+ Rake::TestTask.new(:test) do |t|
32
+ t.libs << 'lib'
33
+ t.libs << 'test'
34
+ t.pattern = 'test/**/*_test.rb'
35
+ t.verbose = false
36
+ end
37
+
38
+ task default: :test
39
+
40
+ begin
41
+ require 'rubocop/rake_task'
42
+ RuboCop::RakeTask.new
43
+ rescue StandardError => _e
44
+ puts 'Rubocop not loaded.'
45
+ end
46
+
47
+ task :default do
48
+ Rake::Task['rubocop'].execute
49
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Api
4
+ module V2
5
+ class PreupgradeReportsController < ::Api::V2::BaseController
6
+ before_action :find_resource, only: %i[show]
7
+
8
+ api :GET, '/preupgrade_reports/', N_('List Preupgrade reports')
9
+ param_group :search_and_pagination, ::Api::V2::BaseController
10
+ def index
11
+ @preupgrade_reports = resource_scope_for_index
12
+ end
13
+
14
+ api :GET, '/preupgrade_reports/:id', N_('Show Preupgrade report')
15
+ param :id, :identifier, required: true
16
+ def show; end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PreupgradeReportsController < ::Api::V2::BaseController
4
+ def index
5
+ @preupgrade_reports = resource_scope.search_for(*search_options)
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanLeapp
4
+ module HostsHelperExtensions
5
+ def multiple_actions
6
+ super + [[_('Preupgrade check with Leapp'), new_job_invocation_path(feature: 'leapp_preupgrade'), false],
7
+ [_('Upgrade with Leapp'), new_job_invocation_path(feature: 'leapp_upgrade'), false]]
8
+ end
9
+
10
+ def rex_host_features(*args)
11
+ super + [link_to(_('Preupgrade check with Leapp'),
12
+ new_job_invocation_path(host_ids: [args.first.id], feature: 'leapp_preupgrade')),
13
+ link_to(_('Upgrade with Leapp'),
14
+ new_job_invocation_path(host_ids: [args.first.id], feature: 'leapp_upgrade'))]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanLeapp
4
+ module RemoteExecutionHelperExtension
5
+ def job_invocation_task_buttons(task)
6
+ return super unless ::Helpers::JobHelper.correct_feature?(@job_invocation, 'leapp_remediation_plan')
7
+
8
+ super.insert(2, link_to(_('Rerun preupgrade check'),
9
+ new_job_invocation_path(host_ids: @resource_base.map(&:id), feature: 'leapp_preupgrade'),
10
+ class: 'btn btn-default',
11
+ title: _('Run Leapp Preupgrade check again'),
12
+ method: :get))
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanLeapp
4
+ module TemplateHelper
5
+ def build_remediation_plan(remediation_ids, host)
6
+ PreupgradeReportEntry.remediation_details(remediation_ids, host)
7
+ .map { |e| e['remediations'] }
8
+ .flatten
9
+ .compact
10
+ .select { |r| r['type'] == 'command' }
11
+ .map { |r| "#{r['context'].join(' ')}\n" }
12
+ .join
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Actions
4
+ module ForemanLeapp
5
+ class PreupgradeJob < Actions::EntryAction
6
+ def self.subscribe
7
+ Actions::RemoteExecution::RunHostJob
8
+ end
9
+
10
+ def plan(job_invocation, host, *_args)
11
+ return unless ::Helpers::JobHelper.correct_feature?(job_invocation, 'leapp_preupgrade')
12
+
13
+ plan_self(host_id: host.id, job_invocation_id: job_invocation.id)
14
+ end
15
+
16
+ def finalize(*_args)
17
+ host = Host.find(input[:host_id])
18
+ leapp_report = format_output(task.main_action.continuous_output.humanize)
19
+
20
+ PreupgradeReport.create_report(host, leapp_report, input[:job_invocation_id])
21
+ end
22
+
23
+ private
24
+
25
+ def format_output(job_output)
26
+ output = job_output.each_line(chomp: true)
27
+ .drop_while { |l| !l.start_with? '===leap_upgrade_report_start===' }.drop(1)
28
+ .take_while { |l| !l.start_with? 'Exit status:' }
29
+ .reject(&:empty?)
30
+ .join('')
31
+ JSON.parse(output)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Helpers
4
+ module JobHelper
5
+ class << self
6
+ def correct_feature?(job_invocation, feature)
7
+ job_invocation.job_category == ::ForemanLeapp::JOB_CATEGORY &&
8
+ RemoteExecutionFeature.find_by(job_template_id: job_invocation.pattern_template_invocations
9
+ .pluck(:template_id)
10
+ .first)&.label == feature
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanLeapp
4
+ module JobInvocationExtensions
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ has_many :preupgrade_reports, dependent: :destroy
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PreupgradeReport < ::Report
4
+ belongs_to :job_invocation
5
+ has_many :preupgrade_report_entries, dependent: :destroy
6
+
7
+ scoped_search on: :job_invocation_id, only_explicit: true
8
+
9
+ def self.create_report(host, data, job_invocation_id)
10
+ report = PreupgradeReport.create(host: host, status: 0,
11
+ job_invocation_id: job_invocation_id,
12
+ reported_at: DateTime.now.utc)
13
+
14
+ data['entries']&.each do |entry|
15
+ PreupgradeReportEntry.create! entry_params(report, entry, host, data)
16
+ end
17
+ end
18
+
19
+ def self.entry_params(report, entry, host, data)
20
+ { preupgrade_report: report,
21
+ host_id: host.id,
22
+ hostname: host.name,
23
+ title: entry['title'],
24
+ actor: entry['actor'],
25
+ audience: entry['audience'],
26
+ severity: entry['severity'],
27
+ leapp_run_id: data['leapp_run_id'],
28
+ summary: entry['summary'],
29
+ tags: entry['tags'],
30
+ detail: entry['detail'] }
31
+ end
32
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PreupgradeReportEntry < ApplicationRecord
4
+ belongs_to :preupgrade_report
5
+ belongs_to_host
6
+
7
+ serialize :tags, Array
8
+ serialize :detail, JSON
9
+
10
+ validates :preupgrade_report, :host, :hostname, :title, :actor, :audience, :severity, :leapp_run_id, presence: true
11
+
12
+ def self.remediation_details(remediation_ids, host)
13
+ where(id: remediation_ids, host: host).where.not(detail: nil).pluck(:detail)
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ object @preupgrade_report_entry
2
+
3
+ attributes :id, :preupgrade_report_id, :host_id, :hostname, :title, :actor, :audience,
4
+ :severity, :leapp_run_id, :summary, :tags, :created_at, :updated_at
@@ -0,0 +1,3 @@
1
+ object @preupgrade_report
2
+
3
+ attributes :id, :host_id, :reported_at, :status, :metrics, :type, :origin, :job_invocation_id
@@ -0,0 +1,3 @@
1
+ collection @preupgrade_reports
2
+
3
+ extends 'api/v2/preupgrade_reports/base'
@@ -0,0 +1,7 @@
1
+ object @preupgrade_report
2
+
3
+ extends 'api/v2/preupgrade_reports/base'
4
+
5
+ child :preupgrade_report_entries do
6
+ extends 'api/v2/preupgrade_report_entries/base'
7
+ end
@@ -0,0 +1,14 @@
1
+ <%#
2
+ kind: job_template
3
+ name: Run preupgrade via Leapp
4
+ job_category: Leapp
5
+ description_format: 'Upgradeability check for RHEL 7 host'
6
+ provider_type: SSH
7
+ feature: leapp_preupgrade
8
+ %>
9
+
10
+ leapp preupgrade
11
+ [ $? -eq 0 ] || exit 1
12
+
13
+ echo "===leap_upgrade_report_start==="
14
+ cat /var/log/leapp/leapp-report.json
@@ -0,0 +1,17 @@
1
+ <%#
2
+ kind: job_template
3
+ name: Remediation plan
4
+ job_category: Leapp
5
+ description_format: 'Run Remediation plan with Leapp'
6
+ provider_type: SSH
7
+ feature: leapp_remediation_plan
8
+ template_inputs:
9
+ - name: remediation_ids
10
+ required: true
11
+ advanced: true
12
+ input_type: user
13
+ value_type: plain
14
+ description: List of remediation ids
15
+ %>
16
+
17
+ <%= build_remediation_plan(input('remediation_ids').split(','), @host) %>
@@ -0,0 +1,16 @@
1
+ <%#
2
+ kind: job_template
3
+ name: Run upgrade via Leapp
4
+ job_category: Leapp
5
+ description_format: 'Upgrade RHEL 7 host'
6
+ provider_type: SSH
7
+ feature: leapp_upgrade
8
+ template_inputs:
9
+ - name: reboot
10
+ description: reboot the vm automaticaly to continue with the upgrade
11
+ input_type: user
12
+ required: false
13
+ options: "false\ntrue"
14
+ %>
15
+
16
+ leapp upgrade <%= "--reboot" if input('reboot') == "true" %>
@@ -0,0 +1,10 @@
1
+ <% content_for(:javascripts) do %>
2
+ <%= webpacked_plugins_js_for :foreman_leapp %>
3
+ <% end %>
4
+ <% content_for(:stylesheets) do %>
5
+ <%= webpacked_plugins_css_for :foreman_leapp %>
6
+ <% end %>
7
+
8
+ <%= react_component('PreupgradeReports', {
9
+ :url => preupgrade_reports_path(:search => "job_invocation_id = #{@job_invocation.id}")
10
+ }) %>
@@ -0,0 +1,4 @@
1
+ object @preupgrade_report_entry
2
+
3
+ extends "api/v2/preupgrade_report_entries/base"
4
+ attribute :detail
@@ -0,0 +1,3 @@
1
+ collection @preupgrade_reports
2
+
3
+ extends 'preupgrade_reports/show'
@@ -0,0 +1,7 @@
1
+ object @preupgrade_report
2
+
3
+ extends "api/v2/preupgrade_reports/base"
4
+
5
+ child :preupgrade_report_entries => :entries do
6
+ extends "preupgrade_report_entries/base"
7
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ resources :preupgrade_reports, :only => %i[index]
5
+
6
+ namespace :api, defaults: { format: 'json' } do
7
+ scope '(:apiv)', module: :v2, defaults: { apiv: 'v2'}, apiv: /v2/, constraints: ApiConstraints.new( version: 2, default: true) do
8
+ resources :preupgrade_reports, only: %i[index show]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ class PreupgradeReportEntries < ActiveRecord::Migration[5.2]
2
+ def up
3
+ create_table :preupgrade_report_entries do |t|
4
+ t.integer :preupgrade_report_id, null: false
5
+ t.string :hostname, null: false
6
+ t.string :title, null: false
7
+ t.string :actor, null: false
8
+ t.string :audience, null: false
9
+ t.string :severity, null: false
10
+ t.string :leapp_run_id, null: false
11
+ t.text :summary
12
+ t.text :tags
13
+ t.text :detail
14
+
15
+ t.timestamps
16
+ end
17
+
18
+ add_index :preupgrade_report_entries, :preupgrade_report_id
19
+ end
20
+
21
+ def down
22
+ remove_index :preupgrade_report_entries, :preupgrade_report_id
23
+ drop_table :preupgrade_report_entries
24
+ end
25
+ end
@@ -0,0 +1,6 @@
1
+ class AddJobIdToReport < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :reports, :job_invocation_id, :integer
4
+ add_index :reports, :job_invocation_id
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ class AddHostToReport < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :preupgrade_report_entries, :host_id, :integer, null: false
4
+ add_index :preupgrade_report_entries, :host_id
5
+ end
6
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ organizations = Organization.unscoped.all
4
+ locations = Location.unscoped.all
5
+ User.as_anonymous_admin do
6
+ RemoteExecutionFeature.without_auditing do
7
+ JobTemplate.without_auditing do
8
+ Dir[File.join("#{ForemanLeapp::Engine.root}/app/views/foreman_leapp/"\
9
+ 'job_templates/**/*.erb')].each do |template|
10
+ template = JobTemplate.import_raw!(File.read(template),
11
+ :default => true,
12
+ :locked => true,
13
+ :update => true)
14
+ template.organizations = organizations if template.present?
15
+ template.locations = locations if template.present?
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanLeapp
4
+ JOB_CATEGORY = 'Leapp'
5
+
6
+ class Engine < ::Rails::Engine
7
+ engine_name 'foreman_leapp'
8
+
9
+ config.autoload_paths += Dir["#{config.root}/app/controllers/concerns"]
10
+ config.autoload_paths += Dir["#{config.root}/app/controllers/api/v2/concerns"]
11
+ config.autoload_paths += Dir["#{config.root}/app/helpers/concerns"]
12
+ config.autoload_paths += Dir["#{config.root}/app/models/concerns"]
13
+ config.autoload_paths += Dir["#{config.root}/app/overrides"]
14
+ config.autoload_paths += Dir["#{config.root}/app/lib/helpers"]
15
+ config.autoload_paths += Dir["#{config.root}/test/"]
16
+
17
+ # Add any db migrations
18
+ initializer 'foreman_leapp.load_app_instance_data' do |app|
19
+ ForemanLeapp::Engine.paths['db/migrate'].existent.each do |path|
20
+ app.config.paths['db/migrate'] << path
21
+ end
22
+ end
23
+
24
+ initializer 'foreman_leapp.register_plugin', before: :finisher_hook do |_app|
25
+ Foreman::Plugin.register :foreman_leapp do
26
+ requires_foreman '>= 1.16'
27
+
28
+ extend_template_helpers ForemanLeapp::TemplateHelper
29
+
30
+ extend_page 'job_invocations/show' do |cx|
31
+ cx.add_pagelet :main_tabs,
32
+ partial: 'job_invocations/leapp_preupgrade_report',
33
+ name: _('Leapp preupgrade report'),
34
+ id: 'leapp_preupgrade_report',
35
+ onlyif: proc { |subject| ::Helpers::JobHelper.correct_feature?(subject, 'leapp_preupgrade') }
36
+ end
37
+ end
38
+ end
39
+
40
+ # Include concerns in this config.to_prepare block
41
+ config.to_prepare do
42
+ begin
43
+ HostsHelper.prepend ForemanLeapp::HostsHelperExtensions
44
+ Host::JobInvocation.include ForemanLeapp::JobInvocationExtensions
45
+ rescue StandardError => e
46
+ Rails.logger.warn "ForemanLeapp: skipping engine hook (#{e})"
47
+ end
48
+
49
+ RemoteExecutionFeature.register(
50
+ :leapp_preupgrade,
51
+ N_('Preupgrade check with Leapp'),
52
+ description: N_('Upgradeability check for RHEL 7 host'),
53
+ host_action_button: false
54
+ )
55
+
56
+ RemoteExecutionFeature.register(
57
+ :leapp_upgrade,
58
+ N_('Upgrade with Leapp'),
59
+ description: N_('Run Leapp upgrade job for RHEL 7 host'),
60
+ host_action_button: false
61
+ )
62
+
63
+ RemoteExecutionFeature.register(
64
+ :leapp_remediation_plan,
65
+ N_('Remediation plan'),
66
+ description: N_('Run Remediation plan with Leapp'),
67
+ host_action_button: false
68
+ )
69
+ end
70
+
71
+ rake_tasks do
72
+ Rake::Task['db:seed'].enhance do
73
+ ForemanLeapp::Engine.load_seed
74
+ end
75
+ end
76
+
77
+ initializer 'foreman_leapp.register_gettext', after: :load_config_initializers do |_app|
78
+ locale_dir = File.join(File.expand_path('../..', __dir__), 'locale')
79
+ locale_domain = 'foreman_leapp'
80
+ Foreman::Gettext::Support.add_text_domain locale_domain, locale_dir
81
+ end
82
+
83
+ initializer 'foreman_leapp.require_dynflow',
84
+ before: 'foreman_tasks.initialize_dynflow',
85
+ after: 'foreman_remote_execution.require_dynflow' do |_app|
86
+ ForemanTasks.dynflow.require!
87
+ ForemanTasks.dynflow.config.eager_load_paths << File.join(ForemanLeapp::Engine.root, 'app/lib/actions')
88
+ end
89
+
90
+ initializer('foreman_leapp.extend_remote_execution',
91
+ after: 'foreman_leapp.require_foreman_remote_execution') do |_app|
92
+ RemoteExecutionHelper.prepend ForemanLeapp::RemoteExecutionHelperExtension
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanLeapp
4
+ VERSION = '0.0.2'
5
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'foreman_remote_execution'
4
+ require 'foreman_leapp/engine'
5
+
6
+ module ForemanLeapp
7
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rake/testtask'
4
+
5
+ # Tasks
6
+ namespace :foreman_leapp do
7
+ namespace :example do
8
+ desc 'Example Task'
9
+ task task: :environment do
10
+ # Task goes here
11
+ end
12
+ end
13
+ end
14
+
15
+ # Tests
16
+ namespace :test do
17
+ desc 'Test ForemanLeapp'
18
+ Rake::TestTask.new(:foreman_leapp) do |t|
19
+ test_dir = File.join(File.dirname(__FILE__), '../..', 'test')
20
+ t.libs << ['test', test_dir]
21
+ t.pattern = "#{test_dir}/**/*_test.rb"
22
+ t.verbose = true
23
+ t.warning = false
24
+ end
25
+ end
26
+
27
+ namespace :foreman_leapp do
28
+ task :rubocop do
29
+ begin
30
+ require 'rubocop/rake_task'
31
+ RuboCop::RakeTask.new(:rubocop_foreman_leapp) do |task|
32
+ task.patterns = ["#{ForemanLeapp::Engine.root}/app/**/*.rb",
33
+ "#{ForemanLeapp::Engine.root}/lib/**/*.rb",
34
+ "#{ForemanLeapp::Engine.root}/test/**/*.rb"]
35
+ end
36
+ rescue StandardError
37
+ puts 'Rubocop not loaded.'
38
+ end
39
+
40
+ Rake::Task['rubocop_foreman_leapp'].invoke
41
+ end
42
+ end
43
+
44
+ Rake::Task[:test].enhance ['test:foreman_leapp']
45
+
46
+ load 'tasks/jenkins.rake'
47
+ if Rake::Task.task_defined?(:'jenkins:unit')
48
+ Rake::Task['jenkins:unit'].enhance ['test:foreman_leapp', 'foreman_leapp:rubocop']
49
+ end
data/locale/Makefile ADDED
@@ -0,0 +1,60 @@
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_leapp
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 '$(DOMAIN).po')
14
+ MOFILES = $(patsubst %.po,%.mo,$(POFILES))
15
+ POXFILES = $(patsubst %.po,%.pox,$(POFILES))
16
+ EDITFILES = $(patsubst %.po,%.edit.po,$(POFILES))
17
+
18
+ %.mo: %.po
19
+ mkdir -p $(shell dirname $@)/LC_MESSAGES
20
+ msgfmt -o $(shell dirname $@)/LC_MESSAGES/$(MOFILE) $<
21
+
22
+ # Generate MO files from PO files
23
+ all-mo: $(MOFILES)
24
+
25
+ # Check for malformed strings
26
+ %.pox: %.po
27
+ msgfmt -c $<
28
+ pofilter --nofuzzy -t variables -t blank -t urls -t emails -t long -t newlines \
29
+ -t endwhitespace -t endpunc -t puncspacing -t options -t printf -t validchars --gnome $< > $@
30
+ cat $@
31
+ ! grep -q msgid $@
32
+
33
+ %.edit.po:
34
+ touch $@
35
+
36
+ check: $(POXFILES)
37
+
38
+ # Unify duplicate translations
39
+ uniq-po:
40
+ for f in $(shell find ./ -name "*.po") ; do \
41
+ msguniq $$f -o $$f ; \
42
+ done
43
+
44
+ tx-pull: $(EDITFILES)
45
+ tx pull -f
46
+ for f in $(EDITFILES) ; do \
47
+ sed -i 's/^\("Project-Id-Version: \).*$$/\1$(DOMAIN) $(VERSION)\\n"/' $$f; \
48
+ done
49
+
50
+ tx-update: tx-pull
51
+ @echo
52
+ @echo Run rake plugin:gettext[$(DOMAIN)] from the Foreman installation, then make -C locale mo-files to finish
53
+ @echo
54
+
55
+ mo-files: $(MOFILES)
56
+ git add $(POFILES) $(POTFILE) ../locale/*/LC_MESSAGES
57
+ git commit -m "i18n - pulling from tx"
58
+ @echo
59
+ @echo Changes commited!
60
+ @echo
@@ -0,0 +1,19 @@
1
+ # foreman_leapp
2
+ #
3
+ # This file is distributed under the same license as foreman_leapp.
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
+