diff --git a/.gitignore b/.gitignore index be5d34fee..03e78243a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ capybara-*.html config/initializers/secret_token.rb config/secrets.yml config/database.yml +/export ## Environment normalisation: /.bundle diff --git a/Gemfile b/Gemfile index 7c6b00c15..390c31efb 100644 --- a/Gemfile +++ b/Gemfile @@ -75,6 +75,9 @@ gem 'delayed_job_active_record', '~> 4.0.2' # to process delayed jobs gem 'daemons' +# cron +gem 'whenever', '~> 0.9.4', require: false + group :development, :test do # for inserting dummy data gem 'activerecord-import', '~> 0.6.0' diff --git a/Gemfile.lock b/Gemfile.lock index 2cff883d3..be6b6cf58 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -69,6 +69,7 @@ GEM xpath (~> 2.0) celluloid (0.16.0) timers (~> 4.0.0) + chronic (0.10.2) cliver (0.3.2) coderay (1.1.0) coercible (1.0.0) @@ -353,6 +354,8 @@ GEM railties (~> 4.0) sprockets-rails (>= 2.0, < 4.0) websocket-driver (0.3.5) + whenever (0.9.4) + chronic (>= 0.6.3) xpath (2.0.0) nokogiri (~> 1.3) @@ -412,3 +415,4 @@ DEPENDENCIES unicorn uuidtools (~> 2.1.4) web-console (~> 2.0.0.beta4) + whenever (~> 0.9.4) diff --git a/app/models/zonefile_setting.rb b/app/models/zonefile_setting.rb index d6e334a36..1a9117e09 100644 --- a/app/models/zonefile_setting.rb +++ b/app/models/zonefile_setting.rb @@ -1,6 +1,22 @@ class ZonefileSetting < ActiveRecord::Base validates :origin, :ttl, :refresh, :retry, :expire, :minimum_ttl, :email, presence: true validates :ttl, :refresh, :retry, :expire, :minimum_ttl, numericality: { only_integer: true } + + def self.generate_zonefiles + pluck(:origin).each do |origin| + generate_zonefile(origin) + end + end + + def self.generate_zonefile(origin) + zf = ActiveRecord::Base.connection.execute( + "select generate_zonefile('#{origin}')" + )[0]['generate_zonefile'] + + filename = "#{origin}.zone" + File.open("#{APP_CONFIG['zonefile_export_dir']}/#{filename}", 'w') { |f| f.write(zf) } + end + def to_s origin end diff --git a/config/application.yml b/config/application.yml index e961a0d29..520531002 100644 --- a/config/application.yml +++ b/config/application.yml @@ -1,5 +1,6 @@ defaults: &defaults app_name: .EE Registry + zonefile_export_dir: 'export/zonefiles' development: <<: *defaults diff --git a/config/deploy.rb b/config/deploy.rb index adc61258d..f311d073a 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -1,6 +1,7 @@ require 'mina/bundler' require 'mina/rails' require 'mina/git' +require 'mina/whenever' # require 'mina/rbenv' # for rbenv support. (http://rbenv.org) # require 'mina/rvm' # for rvm support. (http://rvm.io) @@ -31,7 +32,8 @@ set :shared_paths, [ 'config/database.yml', 'config/secrets.yml', 'log', - 'public/system' + 'public/system', + 'export/zonefiles' ] # Optional settings: @@ -68,6 +70,9 @@ task setup: :environment do queue! %(mkdir -p "#{deploy_to}/shared/public/system") queue! %(chmod g+rx,u+rwx "#{deploy_to}/shared/public/system") + queue! %(mkdir -p "#{deploy_to}/shared/export/zonefiles") + queue! %(chmod g+rx,u+rwx "#{deploy_to}/shared/export/zonefiles") + queue! %(touch "#{deploy_to}/shared/config/database.yml") queue %(echo '-----> Be sure to edit 'shared/config/database.yml'.') end @@ -82,6 +87,7 @@ task deploy: :environment do invoke :'bundle:install' invoke :'rails:db_migrate' invoke :'rails:assets_precompile' + invoke :'whenever:update' to :launch do queue "mkdir -p #{deploy_to}/current/tmp; touch #{deploy_to}/current/tmp/restart.txt" diff --git a/config/schedule.rb b/config/schedule.rb new file mode 100644 index 000000000..75b6e0e97 --- /dev/null +++ b/config/schedule.rb @@ -0,0 +1,24 @@ +# Use this file to easily define all of your cron jobs. +# +# It's helpful, but not entirely necessary to understand cron before proceeding. +# http://en.wikipedia.org/wiki/Cron + +# Example: +# +# set :output, "/path/to/my/cron_log.log" +# +# every 2.hours do +# command "/usr/bin/some_great_command" +# runner "MyModel.some_method" +# rake "some:great:rake:task" +# end +# +# every 4.days do +# runner "AnotherModel.prune_old_records" +# end + +every 10.minutes do + runner 'ZonefileSetting.generate_zonefiles' +end + +# Learn more: http://github.com/javan/whenever