diff --git a/app/models/job.rb b/app/models/job.rb index f333e19..723e18a 100644 --- a/app/models/job.rb +++ b/app/models/job.rb @@ -1,124 +1,131 @@ class Job < ActiveRecord::Base belongs_to :domain scope :pending, -> { where(status: 0) } + scope :failed, -> { where(status: 2) } scope :completed, -> { where(status: [1, 2]) } def failed? status == 2 end def done? status == 1 end def pending? status == 0 end def arguments JSON.parse(args) end + def zone + return domain.name if domain + + arguments['zone'] + end + def run_event! args = arguments raise 'Not an event!' unless args['event'] Domain .find_by_name(args['zone']) .fire_state_event(args['event']) self.status = 1 self.save! end class << self def add_domain(domain) ActiveRecord::Base.transaction do jobs_for_domain(domain, :add_domain) trigger_event(domain, :installed) end end def shutdown_domain(domain) ActiveRecord::Base.transaction do job_for_domain(domain, :remove_domain) job_for_domain(domain, :opendnssec_remove) if domain.dnssec? trigger_event(domain, :cleaned_up) end end def dnssec_sign(domain) ActiveRecord::Base.transaction do job_for_domain(domain, :opendnssec_add, policy: domain.dnssec_policy.name) job_for_domain(domain, :bind_convert_to_dnssec) trigger_event(domain, :signed) end end def wait_for_ready(domain) jobs_for_domain(domain, :wait_for_ready_to_push_ds) end def dnssec_push_ds(domain, dss) opts = Hash[:dnssec_parent, domain.dnssec_parent, :dnssec_parent_authority, domain.dnssec_parent_authority, :dss, dss] keytag = dss.map { |ds| ds.split.first }.first # Both records should have the same keytag ActiveRecord::Base.transaction do job_for_domain(domain, :publish_ds, opts) job_for_domain(domain, :wait_for_active, keytag: keytag) trigger_event(domain, :converted) end end def dnssec_rollover_ds(domain, dss) opts = Hash[:dnssec_parent, domain.dnssec_parent, :dnssec_parent_authority, domain.dnssec_parent_authority, :dss, dss] keytag = dss.map { |ds| ds.split.first }.first # Both records should have the same keytag ActiveRecord::Base.transaction do job_for_domain(domain, :publish_ds, opts) job_for_domain(domain, :wait_for_active, keytag: keytag) trigger_event(domain, :complete_rollover) end end def convert_to_plain(domain) ActiveRecord::Base.transaction do jobs_for_domain(domain, :remove_domain, :add_domain, :opendnssec_remove) trigger_event(domain, :converted) end end private def trigger_event(domain, event) job_for_domain(domain, :trigger_event, event: event) end def jobs_for_domain(domain, *job_names) job_names.each { |job_name| job_for_domain(domain, job_name) } end def job_for_domain(domain, job_name, args = {}) args = { zone: domain.name }.merge!(args) create!(domain: domain, job_type: job_name, args: args.to_json) end end end diff --git a/lib/tasks/checks.rake b/lib/tasks/checks.rake new file mode 100644 index 0000000..28889aa --- /dev/null +++ b/lib/tasks/checks.rake @@ -0,0 +1,16 @@ +namespace :check do + desc "Find Failing jobs" + task failed_jobs: :environment do + failed = Job.failed.order('id asc').to_a + + if failed.any? + domains = failed.map { |j| + j.domain ? "#{j.domain_id}:#{j.zone}" : "nodb:#{j.zone}" + } + domains = domains[0,3].join(', ') # Output only the first 3 domains + puts "1 FailedJobs - WARN - #{failed.size} failed jobs on #{domains.size} domains (#{domains}...)" + else + puts "0 FailedJobs - OK - 0 failed jobs" + end + end +end