From 93d765dea2b415af0fe13bbf7a7dce4d76e31e5b Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Thu, 11 Feb 2016 11:48:19 +0200 Subject: [PATCH 1/4] Story#113066359 - all whois generation of domain and reserved/blocked domain is async + domain destroy removes whois async --- app/jobs/update_whois_record_job.rb | 48 +++++++++++++++++++++++++---- app/models/blocked_domain.rb | 24 ++++++--------- app/models/domain.rb | 7 +++-- app/models/reserved_domain.rb | 28 +++++------------ lib/tasks/whois.rake | 6 ++-- 5 files changed, 66 insertions(+), 47 deletions(-) diff --git a/app/jobs/update_whois_record_job.rb b/app/jobs/update_whois_record_job.rb index b7edb1fdd..71f2b7e19 100644 --- a/app/jobs/update_whois_record_job.rb +++ b/app/jobs/update_whois_record_job.rb @@ -1,16 +1,52 @@ class UpdateWhoisRecordJob < Que::Job - def run(ids, type) + def run(names, type) klass = case type when 'reserved'then ReservedDomain when 'blocked' then BlockedDomain - else Domain + when 'domain' then Domain end - ids.each do |id| - record = klass.find_by(id: id) - next unless record - record.update_whois_record + Array(names).each do |name| + record = klass.find_by(name: name) + if record + send "update_#{type}", record + else + send "delete_#{type}", name + end end end + + + + def update_domain(domain) + domain.whois_record ? domain.whois_record.save : domain.create_whois_record + end + + def update_reserved(record) + record.generate_data + end + + def update_blocked(record) + update_reserved(record) + end + + + # 1. deleting own + # 2. trying to regenerate reserved in order domain is still in the list + def delete_domain(name) + WhoisRecord.where(name: name).destroy_all + + BlockedDomain.find_by(name: name).try(:generate_data) + ReservedDomain.find_by(name: name).try(:generate_data) + end + + def delete_reserved(name) + Domain.where(name: name).any? + Whois::Record.where(name: name).delete_all + end + + def delete_blocked(name) + delete_reserved(name) + end end \ No newline at end of file diff --git a/app/models/blocked_domain.rb b/app/models/blocked_domain.rb index 252539e17..2e337dce4 100644 --- a/app/models/blocked_domain.rb +++ b/app/models/blocked_domain.rb @@ -1,8 +1,9 @@ class BlockedDomain < ActiveRecord::Base include Versions - before_save :generate_data - before_destroy :remove_data -validates :name, domain_name: true, uniqueness: true + before_save :generate_data + after_destroy :remove_data + + validates :name, domain_name: true, uniqueness: true class << self @@ -22,19 +23,14 @@ validates :name, domain_name: true, uniqueness: true def generate_data return if Domain.where(name: name).any? - @json = generate_json - @body = generate_body - update_whois_server + wr = Whois::Record.find_or_initialize_by(name: name) + wr.json = @json = generate_json # we need @json to bind to class + wr.body = generate_body + wr.save end alias_method :update_whois_record, :generate_data - def update_whois_server - wr = Whois::Record.find_or_initialize_by(name: name) - wr.body = @body - wr.json = @json - wr.save - end def generate_body template = Rails.root.join("app/views/for_models/whois_other.erb".freeze) @@ -49,8 +45,6 @@ validates :name, domain_name: true, uniqueness: true end def remove_data - return if Domain.where(name: name).any? - - Whois::Record.where(name: name).delete_all + UpdateWhoisRecordJob.enqueue name, 'blocked' end end diff --git a/app/models/domain.rb b/app/models/domain.rb index 9da57e27a..7ca30caf9 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -43,7 +43,7 @@ class Domain < ActiveRecord::Base has_many :dnskeys, dependent: :destroy has_many :keyrelays - has_one :whois_record, dependent: :destroy + has_one :whois_record # destroyment will be done in after_commit accepts_nested_attributes_for :dnskeys, allow_destroy: true @@ -87,7 +87,7 @@ class Domain < ActiveRecord::Base true end - after_save :update_whois_record + after_commit :update_whois_record after_create :update_reserved_domains def update_reserved_domains @@ -826,7 +826,8 @@ class Domain < ActiveRecord::Base end def update_whois_record - whois_record.blank? ? create_whois_record : whois_record.save + p "run by transaction" + UpdateWhoisRecordJob.enqueue name, 'domain' end def status_notes_array=(notes) diff --git a/app/models/reserved_domain.rb b/app/models/reserved_domain.rb index 8b2cb49e6..ebc7d70a9 100644 --- a/app/models/reserved_domain.rb +++ b/app/models/reserved_domain.rb @@ -2,7 +2,8 @@ class ReservedDomain < ActiveRecord::Base include Versions # version/reserved_domain_version.rb before_save :fill_empty_passwords before_save :generate_data - before_destroy :remove_data + after_destroy :remove_data + validates :name, domain_name: true, uniqueness: true @@ -25,12 +26,7 @@ class ReservedDomain < ActiveRecord::Base def fill_empty_passwords - - if self.password.empty? - - self.password = SecureRandom.hex - - end + self.password = SecureRandom.hex if self.password.blank? end def name= val @@ -40,19 +36,13 @@ class ReservedDomain < ActiveRecord::Base def generate_data return if Domain.where(name: name).any? - @json = generate_json - @body = generate_body - update_whois_server - end - - alias_method :update_whois_record, :generate_data - - def update_whois_server wr = Whois::Record.find_or_initialize_by(name: name) - wr.body = @body - wr.json = @json + wr.json = @json = generate_json # we need @json to bind to class + wr.body = generate_body wr.save end + alias_method :update_whois_record, :generate_data + def generate_body template = Rails.root.join("app/views/for_models/whois_other.erb".freeze) @@ -67,9 +57,7 @@ class ReservedDomain < ActiveRecord::Base end def remove_data - return if Domain.where(name: name).any? - - Whois::Record.where(name: name).delete_all + UpdateWhoisRecordJob.enqueue name, 'reserved' end end diff --git a/lib/tasks/whois.rake b/lib/tasks/whois.rake index c8c3ba2a1..af1e33941 100644 --- a/lib/tasks/whois.rake +++ b/lib/tasks/whois.rake @@ -8,17 +8,17 @@ namespace :whois do print "\n-----> Update domains whois_records" Domain.find_in_batches.each do |group| - UpdateWhoisRecordJob.enqueue group.map(&:id), 'domain' + UpdateWhoisRecordJob.enqueue group.map(&:name), 'domain' end print "\n-----> Update blocked domains whois_records" BlockedDomain.find_in_batches.each do |group| - UpdateWhoisRecordJob.enqueue group.map(&:id), 'blocked' + UpdateWhoisRecordJob.enqueue group.map(&:name), 'blocked' end print "\n-----> Update reserved domains whois_records" ReservedDomain.find_in_batches.each do |group| - UpdateWhoisRecordJob.enqueue group.map(&:id), 'reserved' + UpdateWhoisRecordJob.enqueue group.map(&:name), 'reserved' end end From 77da9ccd2bf930e8bcc3eb2cf37cd5bb0f44affe Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Thu, 11 Feb 2016 12:04:16 +0200 Subject: [PATCH 2/4] Story#113066359 - all whois generation of domain and reserved/blocked domain is async + domain destroy removes whois async --- app/models/domain.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index 7ca30caf9..ef871667d 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -826,7 +826,6 @@ class Domain < ActiveRecord::Base end def update_whois_record - p "run by transaction" UpdateWhoisRecordJob.enqueue name, 'domain' end From 78ffe33dfa65a5d317b590e856323755b5ae472a Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Thu, 11 Feb 2016 12:17:11 +0200 Subject: [PATCH 3/4] Story#113066359 - extract reserved domains regen password from domain to reserved domain --- app/models/domain.rb | 7 ++----- app/models/reserved_domain.rb | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index ef871667d..837077bbb 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -91,10 +91,7 @@ class Domain < ActiveRecord::Base after_create :update_reserved_domains def update_reserved_domains - return unless in_reserved_list? - rd = ReservedDomain.by_domain(name).first - rd.password = SecureRandom.hex - rd.save + ReservedDomain.new_password_for(name) if in_reserved_list? end validates :name_dirty, domain_name: true, uniqueness: true @@ -370,7 +367,7 @@ class Domain < ActiveRecord::Base end def in_reserved_list? - ReservedDomain.pw_for(name).present? + @in_reserved_list ||= ReservedDomain.by_domain(name).any? end def pending_transfer diff --git a/app/models/reserved_domain.rb b/app/models/reserved_domain.rb index ebc7d70a9..9f36fcebc 100644 --- a/app/models/reserved_domain.rb +++ b/app/models/reserved_domain.rb @@ -22,17 +22,30 @@ class ReservedDomain < ActiveRecord::Base def any_of_domains names where(name: names) end + + def new_password_for name + record = by_domain(name).first + return unless record + + record.regenerate_password + record.save + end end - def fill_empty_passwords - self.password = SecureRandom.hex if self.password.blank? - end def name= val super SimpleIDN.to_unicode(val) end + def fill_empty_passwords + regenerate_password if self.password.blank? + end + + def regenerate_password + self.password = SecureRandom.hex + end + def generate_data return if Domain.where(name: name).any? From 3b3708e4ea1f4c79b9eecb4bb10d87c5c572834c Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Thu, 11 Feb 2016 12:23:10 +0200 Subject: [PATCH 4/4] Story#113066359 - remove obsolete job class --- app/jobs/regenerate_registrar_whoises_job.rb | 4 ++-- app/jobs/regenerate_whois_record_job.rb | 10 ---------- 2 files changed, 2 insertions(+), 12 deletions(-) delete mode 100644 app/jobs/regenerate_whois_record_job.rb diff --git a/app/jobs/regenerate_registrar_whoises_job.rb b/app/jobs/regenerate_registrar_whoises_job.rb index 10e13a038..c5db82378 100644 --- a/app/jobs/regenerate_registrar_whoises_job.rb +++ b/app/jobs/regenerate_registrar_whoises_job.rb @@ -3,8 +3,8 @@ class RegenerateRegistrarWhoisesJob < Que::Job # no return as we want restart job if fails registrar = Registrar.find(registrar_id) - registrar.whois_records.select(:id).find_in_batches(batch_size: 20) do |group| - RegenerateWhoisRecordJob.enqueue group.map(&:id) + registrar.whois_records.select(:name).find_in_batches(batch_size: 20) do |group| + UpdateWhoisRecordJob.enqueue group.map(&:name), 'domain' end end end \ No newline at end of file diff --git a/app/jobs/regenerate_whois_record_job.rb b/app/jobs/regenerate_whois_record_job.rb deleted file mode 100644 index 6d79e2ea5..000000000 --- a/app/jobs/regenerate_whois_record_job.rb +++ /dev/null @@ -1,10 +0,0 @@ -class RegenerateWhoisRecordJob < Que::Job - def run(ids) - ids.each do |id| - record = WhoisRecord.find_by(id: id) - return unless record - - record.save - end - end -end \ No newline at end of file