From 0a9ad1dfb635bf0c5d29819facecbbc40aaee9e7 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Fri, 13 Apr 2012 12:10:47 +0800 Subject: [PATCH 01/16] starting Resque --- Gemfile | 2 ++ Gemfile.lock | 18 ++++++++++++++ app/jobs/fetch_time.rb | 11 +++++++++ app/mailer/cron_mail.rb | 8 ++++++ config/environments/development.rb | 22 ++++++++--------- config/initializers/resque.rb | 15 ++++++++++++ config/resque.yml | 2 ++ config/resque_schedule.yml | 6 +++++ config/routes.rb | 1 + lib/tasks/anc_tasks.rake | 1 + lib/tasks/resque.rake | 39 ++++++++++++++++++++++++++++++ 11 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 app/jobs/fetch_time.rb create mode 100644 app/mailer/cron_mail.rb create mode 100644 config/initializers/resque.rb create mode 100644 config/resque.yml create mode 100644 config/resque_schedule.yml create mode 100644 lib/tasks/resque.rake diff --git a/Gemfile b/Gemfile index d1afdb8cc..a6b96ff23 100644 --- a/Gemfile +++ b/Gemfile @@ -19,6 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' +gem 'resque-scheduler', :require => 'resque_scheduler' +gem 'resque', :require => "resque/server" gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 71742974a..80ce363c4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -153,6 +153,18 @@ GEM rake (0.9.2.2) rdoc (3.12) json (~> 1.4) + redis (2.2.2) + redis-namespace (1.0.3) + redis (< 3.0.0) + resque (1.20.0) + multi_json (~> 1.0) + redis-namespace (~> 1.0.2) + sinatra (>= 0.9.2) + vegas (~> 0.1.2) + resque-scheduler (1.9.9) + redis (>= 2.0.1) + resque (>= 1.8.0) + rufus-scheduler rspec (2.8.0) rspec-core (~> 2.8.0) rspec-expectations (~> 2.8.0) @@ -182,6 +194,8 @@ GEM ruby_parser (2.3.1) sexp_processor (~> 3.0) rubyzip (0.9.6.1) + rufus-scheduler (2.0.16) + tzinfo (>= 0.3.23) ruport (1.6.3) fastercsv pdf-writer (= 1.1.8) @@ -222,6 +236,8 @@ GEM uglifier (1.2.3) execjs (>= 0.3.0) multi_json (>= 1.0.2) + vegas (0.1.11) + rack (>= 1.0.0) warden (1.1.1) rack (>= 1.0) watchr (0.7) @@ -259,6 +275,8 @@ DEPENDENCIES radius rails (>= 3.1.0, < 3.2.0) rake + resque + resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) ruby-debug19 diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb new file mode 100644 index 000000000..70e58b2b2 --- /dev/null +++ b/app/jobs/fetch_time.rb @@ -0,0 +1,11 @@ +require 'open-uri' +require 'nokogiri' +module FetchTime + @queue = :fetch_time + + def self.perform() + sleep 10 + doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + CronMail.time_check(doc.at('#ct').children.first.text).deliver + end +end diff --git a/app/mailer/cron_mail.rb b/app/mailer/cron_mail.rb new file mode 100644 index 000000000..8a4c97009 --- /dev/null +++ b/app/mailer/cron_mail.rb @@ -0,0 +1,8 @@ +class CronMail < ActionMailer::Base + default :from => "orbit_test@rulingcom.com" + + def time_check(msg) + #attachments["rails.png"] = File.read("#{Rails.root}/public/images/rails.png") + mail(:to => "Matt ", :subject => msg) + end +end \ No newline at end of file diff --git a/config/environments/development.rb b/config/environments/development.rb index 1dbff0320..20f4519b4 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -29,16 +29,16 @@ Orbit::Application.configure do # :sender_address => %{"notifier" }, # :exception_recipients => %w{chris@rulingcom.com} - # config.action_mailer.delivery_method = :smtp - # config.action_mailer.smtp_settings = { - # :tls => true, - # :enable_starttls_auto => true, - # :address => "smtp.gmail.com", - # :port => '587', - # :domain => "smtp.gmail.com", - # :authentication => "plain", - # :user_name => "redmine@rulingcom.com", - # :password => "rulingredmine" } - + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + :tls => true, + :enable_starttls_auto => true, + :address => "smtp.gmail.com", + :port => '587', + :domain => "smtp.gmail.com", + :authentication => "plain", + :user_name => "redmine@rulingcom.com", + :password => "rulingredmine" } + end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb new file mode 100644 index 000000000..69eabc9cf --- /dev/null +++ b/config/initializers/resque.rb @@ -0,0 +1,15 @@ +require 'resque_scheduler' +require 'resque_scheduler/server' +require 'yaml' + +rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' +rails_env = ENV['RAILS_ENV'] || 'development' + +resque_config = YAML.load_file(rails_root + '/config/resque.yml') +Resque.redis = resque_config[rails_env] + +Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") +Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } + +# current_path = Rails.root.to_s.gsub(/\s/,'\ ') +# queues = [:test] diff --git a/config/resque.yml b/config/resque.yml new file mode 100644 index 000000000..f874633c8 --- /dev/null +++ b/config/resque.yml @@ -0,0 +1,2 @@ +development: localhost:6379 +production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml new file mode 100644 index 000000000..08b1b7ea0 --- /dev/null +++ b/config/resque_schedule.yml @@ -0,0 +1,6 @@ +time_to_talk_a_rest: + cron: "*/5 * * * *" + class: FetchTime + queue: daemons + rails_env: development + description: Send Email for Remind Time diff --git a/config/routes.rb b/config/routes.rb index 99860bb65..510449708 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,7 @@ Orbit::Application.routes.draw do # routes for admin namespace :admin do + mount Resque::Server.new, :at => "/resque" resources :assets resources :app_auths resources :object_auths do diff --git a/lib/tasks/anc_tasks.rake b/lib/tasks/anc_tasks.rake index cd534b939..a97e1830e 100644 --- a/lib/tasks/anc_tasks.rake +++ b/lib/tasks/anc_tasks.rake @@ -1,3 +1,4 @@ +require 'resque_scheduler/tasks' # encoding: utf-8 namespace :anc do diff --git a/lib/tasks/resque.rake b/lib/tasks/resque.rake new file mode 100644 index 000000000..66841c724 --- /dev/null +++ b/lib/tasks/resque.rake @@ -0,0 +1,39 @@ +# require "resque/tasks" +# require 'resque/scheduler' +# require 'resque/scheduler' + +# +# task "resque:setup" => :environment +# Resque tasks +require 'resque/tasks' +require 'resque_scheduler/tasks' + +namespace :resque do + task :setup => :environment do + require 'resque' + require 'resque_scheduler' + require 'resque/scheduler' + + # you probably already have this somewhere + Resque.redis = 'localhost:6379' + + # If you want to be able to dynamically change the schedule, + # uncomment this line. A dynamic schedule can be updated via the + # Resque::Scheduler.set_schedule (and remove_schedule) methods. + # When dynamic is set to true, the scheduler process looks for + # schedule changes and applies them on the fly. + # Note: This feature is only available in >=2.0.0. + #Resque::Scheduler.dynamic = true + + # The schedule doesn't need to be stored in a YAML, it just needs to + # be a hash. YAML is usually the easiest. + Resque.schedule = YAML.load_file('config/resque_schedule.yml') + + # If your schedule already has +queue+ set for each job, you don't + # need to require your jobs. This can be an advantage since it's + # less code that resque-scheduler needs to know about. But in a small + # project, it's usually easier to just include you job classes here. + # So, someting like this: + #require 'jobs' + end +end \ No newline at end of file From a2277d7ea58cdf797edee9205add92bdaf7db4ca Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Mon, 7 May 2012 10:23:16 +0800 Subject: [PATCH 02/16] now jobs is working --- Gemfile | 4 ++-- app/jobs/fetch_time.rb | 14 ++++++++------ config/initializers/resque.rb | 23 ++++++++++++++--------- config/resque.yml | 2 -- config/resque_schedule.yml | 9 ++++----- config/routes.rb | 2 +- 6 files changed, 29 insertions(+), 25 deletions(-) delete mode 100644 config/resque.yml diff --git a/Gemfile b/Gemfile index a6b96ff23..6e6bc39c7 100644 --- a/Gemfile +++ b/Gemfile @@ -19,8 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' -gem 'resque-scheduler', :require => 'resque_scheduler' -gem 'resque', :require => "resque/server" +gem 'resque' # background jobs +gem 'resque-scheduler' # job scheduling gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 70e58b2b2..7758cacee 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,11 +1,13 @@ -require 'open-uri' -require 'nokogiri' +# require 'open-uri' +# require 'nokogiri' module FetchTime - @queue = :fetch_time + @queue = :my_job_queue def self.perform() - sleep 10 - doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - CronMail.time_check(doc.at('#ct').children.first.text).deliver +# sleep 10 + # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + # CronMail.time_check(doc.at('#ct').children.first.text).deliver + # puts "Mail Sent" + # true end end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 69eabc9cf..69a535f36 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -1,15 +1,20 @@ require 'resque_scheduler' -require 'resque_scheduler/server' -require 'yaml' +# require 'resque_scheduler/server' +# require 'yaml' -rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' -rails_env = ENV['RAILS_ENV'] || 'development' +Resque.redis = 'localhost:6379' +Resque.redis.namespace = "resque:SchedulerExample" -resque_config = YAML.load_file(rails_root + '/config/resque.yml') -Resque.redis = resque_config[rails_env] +# If you want to be able to dynamically change the schedule, +# uncomment this line. A dynamic schedule can be updated via the +# Resque::Scheduler.set_schedule (and remove_schedule) methods. +# When dynamic is set to true, the scheduler process looks for +# schedule changes and applies them on the fly. +# Note: This feature is only available in >=2.0.0. +#Resque::Scheduler.dynamic = true -Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } -# current_path = Rails.root.to_s.gsub(/\s/,'\ ') -# queues = [:test] +# The schedule doesn't need to be stored in a YAML, it just needs to +# be a hash. YAML is usually the easiest. +Resque.schedule = YAML.load_file(Rails.root.join('config', 'resque_schedule.yml')) \ No newline at end of file diff --git a/config/resque.yml b/config/resque.yml deleted file mode 100644 index f874633c8..000000000 --- a/config/resque.yml +++ /dev/null @@ -1,2 +0,0 @@ -development: localhost:6379 -production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 08b1b7ea0..6c960ede9 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,6 +1,5 @@ -time_to_talk_a_rest: - cron: "*/5 * * * *" +do_my_job: + every: 30s class: FetchTime - queue: daemons - rails_env: development - description: Send Email for Remind Time + args: + description: Runs the perform method in MyJob diff --git a/config/routes.rb b/config/routes.rb index 510449708..f84063da1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Orbit::Application.routes.draw do - + mount Resque::Server, :at => "/admin/resque" devise_for :users # routes for sinatra app From 8ff36ee76c03b976f78a93d15200907dc4c3f903 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Tue, 8 May 2012 11:31:35 +0800 Subject: [PATCH 03/16] God , Resque, Resque-schedule, is working,but buggy. Need to combine with LDAP and also implement XML calendar sync. --- Gemfile | 1 + Gemfile.lock | 3 ++ Rakefile | 2 ++ app/jobs/fetch_time.rb | 14 +++++---- app/jobs/nccu_calendar.rb | 8 +++++ app/jobs/sync_db.rb | 9 ++++++ config/application.rb | 2 ++ config/initializers/resque.rb | 2 +- config/resque.god | 55 ++++++++++++++++++++++++++++++++++ config/resque_schedule.yml | 18 +++++++++-- dump.rdb | Bin 0 -> 899 bytes 11 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 app/jobs/nccu_calendar.rb create mode 100644 app/jobs/sync_db.rb create mode 100644 config/resque.god create mode 100644 dump.rdb diff --git a/Gemfile b/Gemfile index 6e6bc39c7..d61290921 100644 --- a/Gemfile +++ b/Gemfile @@ -21,6 +21,7 @@ gem 'radius' gem 'rake' gem 'resque' # background jobs gem 'resque-scheduler' # job scheduling +gem 'resque-restriction' gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 80ce363c4..16acce214 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -161,6 +161,8 @@ GEM redis-namespace (~> 1.0.2) sinatra (>= 0.9.2) vegas (~> 0.1.2) + resque-restriction (0.3.0) + resque (>= 1.7.0) resque-scheduler (1.9.9) redis (>= 2.0.1) resque (>= 1.8.0) @@ -276,6 +278,7 @@ DEPENDENCIES rails (>= 3.1.0, < 3.2.0) rake resque + resque-restriction resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) diff --git a/Rakefile b/Rakefile index 9a495de7b..e0dc9c5b8 100644 --- a/Rakefile +++ b/Rakefile @@ -1,7 +1,9 @@ +# /usr/bin/ruby -Ku # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require File.expand_path('../config/application', __FILE__) +require 'resque/tasks' require 'rake/dsl_definition' require 'rake' diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 7758cacee..5fce3036c 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,13 +1,15 @@ # require 'open-uri' # require 'nokogiri' -module FetchTime - @queue = :my_job_queue +class FetchTime < Resque::Plugins::RestrictionJob + restrict :per_300 => 10 + + @queue = :low def self.perform() # sleep 10 - # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - # CronMail.time_check(doc.at('#ct').children.first.text).deliver - # puts "Mail Sent" - # true + doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + CronMail.time_check(doc.at('#ct').children.first.text).deliver + puts "Mail Sent" + true end end diff --git a/app/jobs/nccu_calendar.rb b/app/jobs/nccu_calendar.rb new file mode 100644 index 000000000..724804d4f --- /dev/null +++ b/app/jobs/nccu_calendar.rb @@ -0,0 +1,8 @@ +class NccuCalendar + @queue = :high + + def self.perform() +# sleep 10 + puts "NccuCalendar Sync" + end +end diff --git a/app/jobs/sync_db.rb b/app/jobs/sync_db.rb new file mode 100644 index 000000000..f6458204f --- /dev/null +++ b/app/jobs/sync_db.rb @@ -0,0 +1,9 @@ +class SyncDb + + @queue = :high + + def self.perform() +# sleep 10 + puts "DB Sync" + end +end diff --git a/config/application.rb b/config/application.rb index cef8c446c..8460d1365 100644 --- a/config/application.rb +++ b/config/application.rb @@ -62,6 +62,8 @@ module Orbit # Enable the asset pipeline config.assets.enabled = true + #config.time_zone = 'Taipei' + ENV['TZ'] = 'Asia/Taipei' end end Orbit_Apps = [] diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 69a535f36..f6f084061 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -3,7 +3,7 @@ require 'resque_scheduler' # require 'yaml' Resque.redis = 'localhost:6379' -Resque.redis.namespace = "resque:SchedulerExample" +#Resque.redis.namespace = "resque:SchedulerExample" # If you want to be able to dynamically change the schedule, # uncomment this line. A dynamic schedule can be updated via the diff --git a/config/resque.god b/config/resque.god new file mode 100644 index 000000000..6c4e4bded --- /dev/null +++ b/config/resque.god @@ -0,0 +1,55 @@ +rails_env = 'development' #ENV['RAILS_ENV'] || "production" +rails_root = ENV['RAILS_ROOT'] || "/Users/kaito/Documents/MyWorkspeace/orbit/orbit" +num_workers = rails_env == 'production' ? 5 : 2 + +num_workers.times do |num| + God.watch do |w| + w.dir = "#{rails_root}" + w.name = "resque-#{num}" + w.group = 'resque' + w.interval = 30.seconds + p "/usr/bin/rake -f #{rails_root}/Rakefile resque:work QUEUE=* RAILS_ENV=#{rails_env}" +# w.env = {"QUEUE"=>"critical,high,low", "RAILS_ENV"=>rails_env} + w.start = "rake -f #{rails_root}/Rakefile resque:work QUEUE=* RAILS_ENV=#{rails_env}" + + w.uid = 'kaito' + w.gid = 'staff' + + # restart if memory gets too high + w.transition(:up, :restart) do |on| + on.condition(:memory_usage) do |c| + c.above = 350.megabytes + c.times = 2 + end + end + + # determine the state on startup + w.transition(:init, { true => :up, false => :start }) do |on| + on.condition(:process_running) do |c| + c.running = true + end + end + + # determine when process has finished starting + w.transition([:start, :restart], :up) do |on| + on.condition(:process_running) do |c| + c.running = true + c.interval = 5.seconds + end + + # failsafe + on.condition(:tries) do |c| + c.times = 5 + c.transition = :start + c.interval = 5.seconds + end + end + + # start if process is not running + w.transition(:up, :start) do |on| + on.condition(:process_running) do |c| + c.running = false + end + end + end +end \ No newline at end of file diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 6c960ede9..10f97f5f4 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,5 +1,17 @@ -do_my_job: - every: 30s +do_mail_matt: + every: 10s class: FetchTime args: - description: Runs the perform method in MyJob + description: Runs the perform method in FetchTime + +nccu_daily_ldap_sync: + cron: 30 * * * * * + class: SyncDb + args: + description: Runs the perform method in SnycDB + +nccu_claender_sync: + every: 1m + class: NccuCalendar + args: + description: Runs the perform method in NccuCalendar \ No newline at end of file diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..e5b34fe1d130ce07b54b42b5af7c97f58de85954 GIT binary patch literal 899 zcmaizPfNov7{;@@t0JPHAWn1eFde+<+N{gfP4MEuc@qyYjcc*{W70B3{BHG&shJel z35mDzKK(t<19{(@;oxcn0OS*STT1HZLbAn7JxQg#?FrBG4o?*e{XUIYdu`AI)<&mm z2>S~#opY7T_`nC^cOdLQbWDJSl$nn+hyWTVmBUCRGA=TyhA(_F&m=QVOqXo7Xtdt2 z$hg*+;Y*o|1^w??sl5mNeqxLMs=6U87x> zCv|w*HA;F8&aP1sSvgAjC2C;jd$Hw~czCs2*FqE*Jd@LytNMB!u6`N4PQ~D%F1jvY Kc_IH_z}Gj{Qy>=r literal 0 HcmV?d00001 From 7339d1ee4ad11086d94ce58974ffca92440e09e1 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Fri, 13 Apr 2012 12:10:47 +0800 Subject: [PATCH 04/16] starting Resque --- Gemfile | 2 ++ Gemfile.lock | 18 ++++++++++++++ app/jobs/fetch_time.rb | 11 +++++++++ app/mailer/cron_mail.rb | 8 ++++++ config/environments/development.rb | 22 ++++++++--------- config/initializers/resque.rb | 15 ++++++++++++ config/resque.yml | 2 ++ config/resque_schedule.yml | 6 +++++ config/routes.rb | 1 + lib/tasks/anc_tasks.rake | 1 + lib/tasks/resque.rake | 39 ++++++++++++++++++++++++++++++ 11 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 app/jobs/fetch_time.rb create mode 100644 app/mailer/cron_mail.rb create mode 100644 config/initializers/resque.rb create mode 100644 config/resque.yml create mode 100644 config/resque_schedule.yml create mode 100644 lib/tasks/resque.rake diff --git a/Gemfile b/Gemfile index d1afdb8cc..a6b96ff23 100644 --- a/Gemfile +++ b/Gemfile @@ -19,6 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' +gem 'resque-scheduler', :require => 'resque_scheduler' +gem 'resque', :require => "resque/server" gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 71742974a..80ce363c4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -153,6 +153,18 @@ GEM rake (0.9.2.2) rdoc (3.12) json (~> 1.4) + redis (2.2.2) + redis-namespace (1.0.3) + redis (< 3.0.0) + resque (1.20.0) + multi_json (~> 1.0) + redis-namespace (~> 1.0.2) + sinatra (>= 0.9.2) + vegas (~> 0.1.2) + resque-scheduler (1.9.9) + redis (>= 2.0.1) + resque (>= 1.8.0) + rufus-scheduler rspec (2.8.0) rspec-core (~> 2.8.0) rspec-expectations (~> 2.8.0) @@ -182,6 +194,8 @@ GEM ruby_parser (2.3.1) sexp_processor (~> 3.0) rubyzip (0.9.6.1) + rufus-scheduler (2.0.16) + tzinfo (>= 0.3.23) ruport (1.6.3) fastercsv pdf-writer (= 1.1.8) @@ -222,6 +236,8 @@ GEM uglifier (1.2.3) execjs (>= 0.3.0) multi_json (>= 1.0.2) + vegas (0.1.11) + rack (>= 1.0.0) warden (1.1.1) rack (>= 1.0) watchr (0.7) @@ -259,6 +275,8 @@ DEPENDENCIES radius rails (>= 3.1.0, < 3.2.0) rake + resque + resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) ruby-debug19 diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb new file mode 100644 index 000000000..70e58b2b2 --- /dev/null +++ b/app/jobs/fetch_time.rb @@ -0,0 +1,11 @@ +require 'open-uri' +require 'nokogiri' +module FetchTime + @queue = :fetch_time + + def self.perform() + sleep 10 + doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + CronMail.time_check(doc.at('#ct').children.first.text).deliver + end +end diff --git a/app/mailer/cron_mail.rb b/app/mailer/cron_mail.rb new file mode 100644 index 000000000..8a4c97009 --- /dev/null +++ b/app/mailer/cron_mail.rb @@ -0,0 +1,8 @@ +class CronMail < ActionMailer::Base + default :from => "orbit_test@rulingcom.com" + + def time_check(msg) + #attachments["rails.png"] = File.read("#{Rails.root}/public/images/rails.png") + mail(:to => "Matt ", :subject => msg) + end +end \ No newline at end of file diff --git a/config/environments/development.rb b/config/environments/development.rb index 1dbff0320..20f4519b4 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -29,16 +29,16 @@ Orbit::Application.configure do # :sender_address => %{"notifier" }, # :exception_recipients => %w{chris@rulingcom.com} - # config.action_mailer.delivery_method = :smtp - # config.action_mailer.smtp_settings = { - # :tls => true, - # :enable_starttls_auto => true, - # :address => "smtp.gmail.com", - # :port => '587', - # :domain => "smtp.gmail.com", - # :authentication => "plain", - # :user_name => "redmine@rulingcom.com", - # :password => "rulingredmine" } - + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + :tls => true, + :enable_starttls_auto => true, + :address => "smtp.gmail.com", + :port => '587', + :domain => "smtp.gmail.com", + :authentication => "plain", + :user_name => "redmine@rulingcom.com", + :password => "rulingredmine" } + end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb new file mode 100644 index 000000000..69eabc9cf --- /dev/null +++ b/config/initializers/resque.rb @@ -0,0 +1,15 @@ +require 'resque_scheduler' +require 'resque_scheduler/server' +require 'yaml' + +rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' +rails_env = ENV['RAILS_ENV'] || 'development' + +resque_config = YAML.load_file(rails_root + '/config/resque.yml') +Resque.redis = resque_config[rails_env] + +Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") +Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } + +# current_path = Rails.root.to_s.gsub(/\s/,'\ ') +# queues = [:test] diff --git a/config/resque.yml b/config/resque.yml new file mode 100644 index 000000000..f874633c8 --- /dev/null +++ b/config/resque.yml @@ -0,0 +1,2 @@ +development: localhost:6379 +production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml new file mode 100644 index 000000000..08b1b7ea0 --- /dev/null +++ b/config/resque_schedule.yml @@ -0,0 +1,6 @@ +time_to_talk_a_rest: + cron: "*/5 * * * *" + class: FetchTime + queue: daemons + rails_env: development + description: Send Email for Remind Time diff --git a/config/routes.rb b/config/routes.rb index 1b98bcc25..627738d33 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,7 @@ Orbit::Application.routes.draw do # routes for admin namespace :admin do + mount Resque::Server.new, :at => "/resque" resources :assets resources :app_auths resources :object_auths do diff --git a/lib/tasks/anc_tasks.rake b/lib/tasks/anc_tasks.rake index cd534b939..a97e1830e 100644 --- a/lib/tasks/anc_tasks.rake +++ b/lib/tasks/anc_tasks.rake @@ -1,3 +1,4 @@ +require 'resque_scheduler/tasks' # encoding: utf-8 namespace :anc do diff --git a/lib/tasks/resque.rake b/lib/tasks/resque.rake new file mode 100644 index 000000000..66841c724 --- /dev/null +++ b/lib/tasks/resque.rake @@ -0,0 +1,39 @@ +# require "resque/tasks" +# require 'resque/scheduler' +# require 'resque/scheduler' + +# +# task "resque:setup" => :environment +# Resque tasks +require 'resque/tasks' +require 'resque_scheduler/tasks' + +namespace :resque do + task :setup => :environment do + require 'resque' + require 'resque_scheduler' + require 'resque/scheduler' + + # you probably already have this somewhere + Resque.redis = 'localhost:6379' + + # If you want to be able to dynamically change the schedule, + # uncomment this line. A dynamic schedule can be updated via the + # Resque::Scheduler.set_schedule (and remove_schedule) methods. + # When dynamic is set to true, the scheduler process looks for + # schedule changes and applies them on the fly. + # Note: This feature is only available in >=2.0.0. + #Resque::Scheduler.dynamic = true + + # The schedule doesn't need to be stored in a YAML, it just needs to + # be a hash. YAML is usually the easiest. + Resque.schedule = YAML.load_file('config/resque_schedule.yml') + + # If your schedule already has +queue+ set for each job, you don't + # need to require your jobs. This can be an advantage since it's + # less code that resque-scheduler needs to know about. But in a small + # project, it's usually easier to just include you job classes here. + # So, someting like this: + #require 'jobs' + end +end \ No newline at end of file From 5b604037f80b447908438baeaba43062602423e1 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Mon, 7 May 2012 10:23:16 +0800 Subject: [PATCH 05/16] now jobs is working --- Gemfile | 4 ++-- app/jobs/fetch_time.rb | 14 ++++++++------ config/initializers/resque.rb | 23 ++++++++++++++--------- config/resque.yml | 2 -- config/resque_schedule.yml | 9 ++++----- config/routes.rb | 2 +- 6 files changed, 29 insertions(+), 25 deletions(-) delete mode 100644 config/resque.yml diff --git a/Gemfile b/Gemfile index a6b96ff23..6e6bc39c7 100644 --- a/Gemfile +++ b/Gemfile @@ -19,8 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' -gem 'resque-scheduler', :require => 'resque_scheduler' -gem 'resque', :require => "resque/server" +gem 'resque' # background jobs +gem 'resque-scheduler' # job scheduling gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 70e58b2b2..7758cacee 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,11 +1,13 @@ -require 'open-uri' -require 'nokogiri' +# require 'open-uri' +# require 'nokogiri' module FetchTime - @queue = :fetch_time + @queue = :my_job_queue def self.perform() - sleep 10 - doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - CronMail.time_check(doc.at('#ct').children.first.text).deliver +# sleep 10 + # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + # CronMail.time_check(doc.at('#ct').children.first.text).deliver + # puts "Mail Sent" + # true end end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 69eabc9cf..69a535f36 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -1,15 +1,20 @@ require 'resque_scheduler' -require 'resque_scheduler/server' -require 'yaml' +# require 'resque_scheduler/server' +# require 'yaml' -rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' -rails_env = ENV['RAILS_ENV'] || 'development' +Resque.redis = 'localhost:6379' +Resque.redis.namespace = "resque:SchedulerExample" -resque_config = YAML.load_file(rails_root + '/config/resque.yml') -Resque.redis = resque_config[rails_env] +# If you want to be able to dynamically change the schedule, +# uncomment this line. A dynamic schedule can be updated via the +# Resque::Scheduler.set_schedule (and remove_schedule) methods. +# When dynamic is set to true, the scheduler process looks for +# schedule changes and applies them on the fly. +# Note: This feature is only available in >=2.0.0. +#Resque::Scheduler.dynamic = true -Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } -# current_path = Rails.root.to_s.gsub(/\s/,'\ ') -# queues = [:test] +# The schedule doesn't need to be stored in a YAML, it just needs to +# be a hash. YAML is usually the easiest. +Resque.schedule = YAML.load_file(Rails.root.join('config', 'resque_schedule.yml')) \ No newline at end of file diff --git a/config/resque.yml b/config/resque.yml deleted file mode 100644 index f874633c8..000000000 --- a/config/resque.yml +++ /dev/null @@ -1,2 +0,0 @@ -development: localhost:6379 -production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 08b1b7ea0..6c960ede9 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,6 +1,5 @@ -time_to_talk_a_rest: - cron: "*/5 * * * *" +do_my_job: + every: 30s class: FetchTime - queue: daemons - rails_env: development - description: Send Email for Remind Time + args: + description: Runs the perform method in MyJob diff --git a/config/routes.rb b/config/routes.rb index 627738d33..50600063a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Orbit::Application.routes.draw do - + mount Resque::Server, :at => "/admin/resque" devise_for :users # routes for sinatra app From d7194dc8053a63f68d06e6033c2013818a151cc3 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Tue, 8 May 2012 11:31:35 +0800 Subject: [PATCH 06/16] God , Resque, Resque-schedule, is working,but buggy. Need to combine with LDAP and also implement XML calendar sync. --- Gemfile | 1 + Gemfile.lock | 3 ++ Rakefile | 2 ++ app/jobs/fetch_time.rb | 14 +++++---- app/jobs/nccu_calendar.rb | 8 +++++ app/jobs/sync_db.rb | 9 ++++++ config/application.rb | 2 ++ config/initializers/resque.rb | 2 +- config/resque.god | 55 ++++++++++++++++++++++++++++++++++ config/resque_schedule.yml | 18 +++++++++-- dump.rdb | Bin 0 -> 899 bytes 11 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 app/jobs/nccu_calendar.rb create mode 100644 app/jobs/sync_db.rb create mode 100644 config/resque.god create mode 100644 dump.rdb diff --git a/Gemfile b/Gemfile index 6e6bc39c7..d61290921 100644 --- a/Gemfile +++ b/Gemfile @@ -21,6 +21,7 @@ gem 'radius' gem 'rake' gem 'resque' # background jobs gem 'resque-scheduler' # job scheduling +gem 'resque-restriction' gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 80ce363c4..16acce214 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -161,6 +161,8 @@ GEM redis-namespace (~> 1.0.2) sinatra (>= 0.9.2) vegas (~> 0.1.2) + resque-restriction (0.3.0) + resque (>= 1.7.0) resque-scheduler (1.9.9) redis (>= 2.0.1) resque (>= 1.8.0) @@ -276,6 +278,7 @@ DEPENDENCIES rails (>= 3.1.0, < 3.2.0) rake resque + resque-restriction resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) diff --git a/Rakefile b/Rakefile index 9a495de7b..e0dc9c5b8 100644 --- a/Rakefile +++ b/Rakefile @@ -1,7 +1,9 @@ +# /usr/bin/ruby -Ku # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require File.expand_path('../config/application', __FILE__) +require 'resque/tasks' require 'rake/dsl_definition' require 'rake' diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 7758cacee..5fce3036c 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,13 +1,15 @@ # require 'open-uri' # require 'nokogiri' -module FetchTime - @queue = :my_job_queue +class FetchTime < Resque::Plugins::RestrictionJob + restrict :per_300 => 10 + + @queue = :low def self.perform() # sleep 10 - # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - # CronMail.time_check(doc.at('#ct').children.first.text).deliver - # puts "Mail Sent" - # true + doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + CronMail.time_check(doc.at('#ct').children.first.text).deliver + puts "Mail Sent" + true end end diff --git a/app/jobs/nccu_calendar.rb b/app/jobs/nccu_calendar.rb new file mode 100644 index 000000000..724804d4f --- /dev/null +++ b/app/jobs/nccu_calendar.rb @@ -0,0 +1,8 @@ +class NccuCalendar + @queue = :high + + def self.perform() +# sleep 10 + puts "NccuCalendar Sync" + end +end diff --git a/app/jobs/sync_db.rb b/app/jobs/sync_db.rb new file mode 100644 index 000000000..f6458204f --- /dev/null +++ b/app/jobs/sync_db.rb @@ -0,0 +1,9 @@ +class SyncDb + + @queue = :high + + def self.perform() +# sleep 10 + puts "DB Sync" + end +end diff --git a/config/application.rb b/config/application.rb index cef8c446c..8460d1365 100644 --- a/config/application.rb +++ b/config/application.rb @@ -62,6 +62,8 @@ module Orbit # Enable the asset pipeline config.assets.enabled = true + #config.time_zone = 'Taipei' + ENV['TZ'] = 'Asia/Taipei' end end Orbit_Apps = [] diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 69a535f36..f6f084061 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -3,7 +3,7 @@ require 'resque_scheduler' # require 'yaml' Resque.redis = 'localhost:6379' -Resque.redis.namespace = "resque:SchedulerExample" +#Resque.redis.namespace = "resque:SchedulerExample" # If you want to be able to dynamically change the schedule, # uncomment this line. A dynamic schedule can be updated via the diff --git a/config/resque.god b/config/resque.god new file mode 100644 index 000000000..6c4e4bded --- /dev/null +++ b/config/resque.god @@ -0,0 +1,55 @@ +rails_env = 'development' #ENV['RAILS_ENV'] || "production" +rails_root = ENV['RAILS_ROOT'] || "/Users/kaito/Documents/MyWorkspeace/orbit/orbit" +num_workers = rails_env == 'production' ? 5 : 2 + +num_workers.times do |num| + God.watch do |w| + w.dir = "#{rails_root}" + w.name = "resque-#{num}" + w.group = 'resque' + w.interval = 30.seconds + p "/usr/bin/rake -f #{rails_root}/Rakefile resque:work QUEUE=* RAILS_ENV=#{rails_env}" +# w.env = {"QUEUE"=>"critical,high,low", "RAILS_ENV"=>rails_env} + w.start = "rake -f #{rails_root}/Rakefile resque:work QUEUE=* RAILS_ENV=#{rails_env}" + + w.uid = 'kaito' + w.gid = 'staff' + + # restart if memory gets too high + w.transition(:up, :restart) do |on| + on.condition(:memory_usage) do |c| + c.above = 350.megabytes + c.times = 2 + end + end + + # determine the state on startup + w.transition(:init, { true => :up, false => :start }) do |on| + on.condition(:process_running) do |c| + c.running = true + end + end + + # determine when process has finished starting + w.transition([:start, :restart], :up) do |on| + on.condition(:process_running) do |c| + c.running = true + c.interval = 5.seconds + end + + # failsafe + on.condition(:tries) do |c| + c.times = 5 + c.transition = :start + c.interval = 5.seconds + end + end + + # start if process is not running + w.transition(:up, :start) do |on| + on.condition(:process_running) do |c| + c.running = false + end + end + end +end \ No newline at end of file diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 6c960ede9..10f97f5f4 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,5 +1,17 @@ -do_my_job: - every: 30s +do_mail_matt: + every: 10s class: FetchTime args: - description: Runs the perform method in MyJob + description: Runs the perform method in FetchTime + +nccu_daily_ldap_sync: + cron: 30 * * * * * + class: SyncDb + args: + description: Runs the perform method in SnycDB + +nccu_claender_sync: + every: 1m + class: NccuCalendar + args: + description: Runs the perform method in NccuCalendar \ No newline at end of file diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..e5b34fe1d130ce07b54b42b5af7c97f58de85954 GIT binary patch literal 899 zcmaizPfNov7{;@@t0JPHAWn1eFde+<+N{gfP4MEuc@qyYjcc*{W70B3{BHG&shJel z35mDzKK(t<19{(@;oxcn0OS*STT1HZLbAn7JxQg#?FrBG4o?*e{XUIYdu`AI)<&mm z2>S~#opY7T_`nC^cOdLQbWDJSl$nn+hyWTVmBUCRGA=TyhA(_F&m=QVOqXo7Xtdt2 z$hg*+;Y*o|1^w??sl5mNeqxLMs=6U87x> zCv|w*HA;F8&aP1sSvgAjC2C;jd$Hw~czCs2*FqE*Jd@LytNMB!u6`N4PQ~D%F1jvY Kc_IH_z}Gj{Qy>=r literal 0 HcmV?d00001 From 18c42a80a61ded29a0b22075a3aa7f37e67c3451 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Tue, 8 May 2012 20:06:56 +0800 Subject: [PATCH 07/16] Put site_settings in the orbit_button --- app/views/admin/sites/_side_bar.html.erb | 12 ++++++++++++ app/views/admin/sites/language.html.erb | 4 ++++ app/views/admin/sites/mail_setting.html.erb | 4 ++++ app/views/admin/sites/site_info.html.erb | 4 ++++ app/views/admin/sites/system_info.html.erb | 4 ++++ app/views/admin/sites/ui_theme.html.erb | 4 ++++ app/views/layouts/_orbit_bar.html.erb | 1 + app/views/layouts/_side_bar.html.erb | 11 ----------- app/views/layouts/new_admin.html.erb | 6 +++++- 9 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 app/views/admin/sites/_side_bar.html.erb diff --git a/app/views/admin/sites/_side_bar.html.erb b/app/views/admin/sites/_side_bar.html.erb new file mode 100644 index 000000000..4b25835ef --- /dev/null +++ b/app/views/admin/sites/_side_bar.html.erb @@ -0,0 +1,12 @@ +<%= content_tag :li, :class => active_for_controllers('sites') do -%> + <%= link_to content_tag(:i, nil, :class => 'icons-cog') + t('admin.site_settings'), admin_site_site_info_path(@site) %> + + <%= content_tag :ul, :class => ("nav nav-list " + visible_for_controllers('sites')) do -%> + <%= content_tag :li, link_to(t('admin.site_info'), admin_site_site_info_path(@site)), :class => active_for_action('sites', 'site_info') %> + <%= content_tag :li, link_to(t('admin.system_info'), admin_site_system_info_path(@site)), :class => active_for_action('sites', 'system_info') %> + <%= content_tag :li, link_to(t('admin.language'), admin_site_language_path(@site)), :class => active_for_action('sites', 'language') %> + <%= content_tag :li, link_to(t('admin.mail_setting'), admin_site_mail_setting_path(@site)), :class => active_for_action('sites', 'mail_setting') %> + <%= content_tag :li, link_to(t('admin.ui_theme'), admin_site_ui_theme_path(@site)), :class => active_for_action('sites', 'ui_theme') %> + <% end -%> + +<% end -%> diff --git a/app/views/admin/sites/language.html.erb b/app/views/admin/sites/language.html.erb index ceb9b0124..2b6265641 100644 --- a/app/views/admin/sites/language.html.erb +++ b/app/views/admin/sites/language.html.erb @@ -1 +1,5 @@ +<% content_for :side_bar do %> + <%= render 'side_bar' %> +<% end %> + language.html.erb \ No newline at end of file diff --git a/app/views/admin/sites/mail_setting.html.erb b/app/views/admin/sites/mail_setting.html.erb index 3a52ede2b..aaef18571 100644 --- a/app/views/admin/sites/mail_setting.html.erb +++ b/app/views/admin/sites/mail_setting.html.erb @@ -1 +1,5 @@ +<% content_for :side_bar do %> + <%= render 'side_bar' %> +<% end %> + mail_setting.html.erb \ No newline at end of file diff --git a/app/views/admin/sites/site_info.html.erb b/app/views/admin/sites/site_info.html.erb index 96a73aace..ba3bca2a7 100644 --- a/app/views/admin/sites/site_info.html.erb +++ b/app/views/admin/sites/site_info.html.erb @@ -1,3 +1,7 @@ +<% content_for :side_bar do %> + <%= render 'side_bar' %> +<% end %> +
<%= form_for @site, :url => admin_site_path(@site), :html => {:class => "clear"} do |f| %>
diff --git a/app/views/admin/sites/system_info.html.erb b/app/views/admin/sites/system_info.html.erb index 45535dacf..dc9d45c95 100644 --- a/app/views/admin/sites/system_info.html.erb +++ b/app/views/admin/sites/system_info.html.erb @@ -1 +1,5 @@ +<% content_for :side_bar do %> + <%= render 'side_bar' %> +<% end %> + system_info.html.erb \ No newline at end of file diff --git a/app/views/admin/sites/ui_theme.html.erb b/app/views/admin/sites/ui_theme.html.erb index 222f59695..540405da8 100644 --- a/app/views/admin/sites/ui_theme.html.erb +++ b/app/views/admin/sites/ui_theme.html.erb @@ -1 +1,5 @@ +<% content_for :side_bar do %> + <%= render 'side_bar' %> +<% end %> + ui_theme.html.erb \ No newline at end of file diff --git a/app/views/layouts/_orbit_bar.html.erb b/app/views/layouts/_orbit_bar.html.erb index 46f2b712f..4c14a8fe9 100644 --- a/app/views/layouts/_orbit_bar.html.erb +++ b/app/views/layouts/_orbit_bar.html.erb @@ -10,6 +10,7 @@
  • <%#= link_to content_tag(:i, nil, :class => 'icons-asset') + t('admin.asset'), admin_assets_path %>
  • <%= link_to content_tag(:i, nil, :class => 'icons-structure') + t('admin.structure'), admin_items_path %>
  • +
  • <%= link_to content_tag(:i, nil, :class => 'icons-cog') + t('admin.site_settings'), admin_site_site_info_path(@site) %>
  • <%#= link_to content_tag(:i, nil, :class => 'icons-plus-cube') + t('admin.add_item') %>
  • diff --git a/app/views/layouts/_side_bar.html.erb b/app/views/layouts/_side_bar.html.erb index c38388271..05562e0bf 100644 --- a/app/views/layouts/_side_bar.html.erb +++ b/app/views/layouts/_side_bar.html.erb @@ -67,14 +67,3 @@ <%= content_tag :li, link_to(t('announcement.tags'), panel_web_resource_back_end_tags_path), :class => active_for_action('/panel/web_resource/back_end/tags', 'index') %> <% end -%> <% end -%> - -<%= content_tag :li, :class => active_for_controllers('sites') do -%> - <%= link_to content_tag(:i, nil, :class => 'icons-cog') + t('admin.site_settings'), admin_site_site_info_path(@site) %> - <%= content_tag :ul, :class => ("nav nav-list " + visible_for_controllers('sites')) do -%> - <%= content_tag :li, link_to(t('admin.site_info'), admin_site_site_info_path(@site)), :class => active_for_action('sites', 'site_info') %> - <%= content_tag :li, link_to(t('admin.system_info'), admin_site_system_info_path(@site)), :class => active_for_action('sites', 'system_info') %> - <%= content_tag :li, link_to(t('admin.language'), admin_site_language_path(@site)), :class => active_for_action('sites', 'language') %> - <%= content_tag :li, link_to(t('admin.mail_setting'), admin_site_mail_setting_path(@site)), :class => active_for_action('sites', 'mail_setting') %> - <%= content_tag :li, link_to(t('admin.ui_theme'), admin_site_ui_theme_path(@site)), :class => active_for_action('sites', 'ui_theme') %> - <% end -%> -<% end -%> diff --git a/app/views/layouts/new_admin.html.erb b/app/views/layouts/new_admin.html.erb index 51a961904..3a493a9d6 100644 --- a/app/views/layouts/new_admin.html.erb +++ b/app/views/layouts/new_admin.html.erb @@ -26,7 +26,11 @@
    From c28d7d59b6da198952052b3ada33759cc9794535 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Fri, 13 Apr 2012 12:10:47 +0800 Subject: [PATCH 08/16] starting Resque --- Gemfile | 2 ++ Gemfile.lock | 18 ++++++++++++++ app/jobs/fetch_time.rb | 11 +++++++++ app/mailer/cron_mail.rb | 8 ++++++ config/environments/development.rb | 22 ++++++++--------- config/initializers/resque.rb | 15 ++++++++++++ config/resque.yml | 2 ++ config/resque_schedule.yml | 6 +++++ config/routes.rb | 1 + lib/tasks/anc_tasks.rake | 1 + lib/tasks/resque.rake | 39 ++++++++++++++++++++++++++++++ 11 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 app/jobs/fetch_time.rb create mode 100644 app/mailer/cron_mail.rb create mode 100644 config/initializers/resque.rb create mode 100644 config/resque.yml create mode 100644 config/resque_schedule.yml create mode 100644 lib/tasks/resque.rake diff --git a/Gemfile b/Gemfile index d1afdb8cc..a6b96ff23 100644 --- a/Gemfile +++ b/Gemfile @@ -19,6 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' +gem 'resque-scheduler', :require => 'resque_scheduler' +gem 'resque', :require => "resque/server" gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 71742974a..80ce363c4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -153,6 +153,18 @@ GEM rake (0.9.2.2) rdoc (3.12) json (~> 1.4) + redis (2.2.2) + redis-namespace (1.0.3) + redis (< 3.0.0) + resque (1.20.0) + multi_json (~> 1.0) + redis-namespace (~> 1.0.2) + sinatra (>= 0.9.2) + vegas (~> 0.1.2) + resque-scheduler (1.9.9) + redis (>= 2.0.1) + resque (>= 1.8.0) + rufus-scheduler rspec (2.8.0) rspec-core (~> 2.8.0) rspec-expectations (~> 2.8.0) @@ -182,6 +194,8 @@ GEM ruby_parser (2.3.1) sexp_processor (~> 3.0) rubyzip (0.9.6.1) + rufus-scheduler (2.0.16) + tzinfo (>= 0.3.23) ruport (1.6.3) fastercsv pdf-writer (= 1.1.8) @@ -222,6 +236,8 @@ GEM uglifier (1.2.3) execjs (>= 0.3.0) multi_json (>= 1.0.2) + vegas (0.1.11) + rack (>= 1.0.0) warden (1.1.1) rack (>= 1.0) watchr (0.7) @@ -259,6 +275,8 @@ DEPENDENCIES radius rails (>= 3.1.0, < 3.2.0) rake + resque + resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) ruby-debug19 diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb new file mode 100644 index 000000000..70e58b2b2 --- /dev/null +++ b/app/jobs/fetch_time.rb @@ -0,0 +1,11 @@ +require 'open-uri' +require 'nokogiri' +module FetchTime + @queue = :fetch_time + + def self.perform() + sleep 10 + doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + CronMail.time_check(doc.at('#ct').children.first.text).deliver + end +end diff --git a/app/mailer/cron_mail.rb b/app/mailer/cron_mail.rb new file mode 100644 index 000000000..8a4c97009 --- /dev/null +++ b/app/mailer/cron_mail.rb @@ -0,0 +1,8 @@ +class CronMail < ActionMailer::Base + default :from => "orbit_test@rulingcom.com" + + def time_check(msg) + #attachments["rails.png"] = File.read("#{Rails.root}/public/images/rails.png") + mail(:to => "Matt ", :subject => msg) + end +end \ No newline at end of file diff --git a/config/environments/development.rb b/config/environments/development.rb index 1dbff0320..20f4519b4 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -29,16 +29,16 @@ Orbit::Application.configure do # :sender_address => %{"notifier" }, # :exception_recipients => %w{chris@rulingcom.com} - # config.action_mailer.delivery_method = :smtp - # config.action_mailer.smtp_settings = { - # :tls => true, - # :enable_starttls_auto => true, - # :address => "smtp.gmail.com", - # :port => '587', - # :domain => "smtp.gmail.com", - # :authentication => "plain", - # :user_name => "redmine@rulingcom.com", - # :password => "rulingredmine" } - + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + :tls => true, + :enable_starttls_auto => true, + :address => "smtp.gmail.com", + :port => '587', + :domain => "smtp.gmail.com", + :authentication => "plain", + :user_name => "redmine@rulingcom.com", + :password => "rulingredmine" } + end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb new file mode 100644 index 000000000..69eabc9cf --- /dev/null +++ b/config/initializers/resque.rb @@ -0,0 +1,15 @@ +require 'resque_scheduler' +require 'resque_scheduler/server' +require 'yaml' + +rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' +rails_env = ENV['RAILS_ENV'] || 'development' + +resque_config = YAML.load_file(rails_root + '/config/resque.yml') +Resque.redis = resque_config[rails_env] + +Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") +Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } + +# current_path = Rails.root.to_s.gsub(/\s/,'\ ') +# queues = [:test] diff --git a/config/resque.yml b/config/resque.yml new file mode 100644 index 000000000..f874633c8 --- /dev/null +++ b/config/resque.yml @@ -0,0 +1,2 @@ +development: localhost:6379 +production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml new file mode 100644 index 000000000..08b1b7ea0 --- /dev/null +++ b/config/resque_schedule.yml @@ -0,0 +1,6 @@ +time_to_talk_a_rest: + cron: "*/5 * * * *" + class: FetchTime + queue: daemons + rails_env: development + description: Send Email for Remind Time diff --git a/config/routes.rb b/config/routes.rb index 1b98bcc25..627738d33 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,7 @@ Orbit::Application.routes.draw do # routes for admin namespace :admin do + mount Resque::Server.new, :at => "/resque" resources :assets resources :app_auths resources :object_auths do diff --git a/lib/tasks/anc_tasks.rake b/lib/tasks/anc_tasks.rake index cd534b939..a97e1830e 100644 --- a/lib/tasks/anc_tasks.rake +++ b/lib/tasks/anc_tasks.rake @@ -1,3 +1,4 @@ +require 'resque_scheduler/tasks' # encoding: utf-8 namespace :anc do diff --git a/lib/tasks/resque.rake b/lib/tasks/resque.rake new file mode 100644 index 000000000..66841c724 --- /dev/null +++ b/lib/tasks/resque.rake @@ -0,0 +1,39 @@ +# require "resque/tasks" +# require 'resque/scheduler' +# require 'resque/scheduler' + +# +# task "resque:setup" => :environment +# Resque tasks +require 'resque/tasks' +require 'resque_scheduler/tasks' + +namespace :resque do + task :setup => :environment do + require 'resque' + require 'resque_scheduler' + require 'resque/scheduler' + + # you probably already have this somewhere + Resque.redis = 'localhost:6379' + + # If you want to be able to dynamically change the schedule, + # uncomment this line. A dynamic schedule can be updated via the + # Resque::Scheduler.set_schedule (and remove_schedule) methods. + # When dynamic is set to true, the scheduler process looks for + # schedule changes and applies them on the fly. + # Note: This feature is only available in >=2.0.0. + #Resque::Scheduler.dynamic = true + + # The schedule doesn't need to be stored in a YAML, it just needs to + # be a hash. YAML is usually the easiest. + Resque.schedule = YAML.load_file('config/resque_schedule.yml') + + # If your schedule already has +queue+ set for each job, you don't + # need to require your jobs. This can be an advantage since it's + # less code that resque-scheduler needs to know about. But in a small + # project, it's usually easier to just include you job classes here. + # So, someting like this: + #require 'jobs' + end +end \ No newline at end of file From 69f2f6a716670619bcf44d09581c0721813f5b81 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Mon, 7 May 2012 10:23:16 +0800 Subject: [PATCH 09/16] now jobs is working --- Gemfile | 4 ++-- app/jobs/fetch_time.rb | 14 ++++++++------ config/initializers/resque.rb | 23 ++++++++++++++--------- config/resque.yml | 2 -- config/resque_schedule.yml | 9 ++++----- config/routes.rb | 2 +- 6 files changed, 29 insertions(+), 25 deletions(-) delete mode 100644 config/resque.yml diff --git a/Gemfile b/Gemfile index a6b96ff23..6e6bc39c7 100644 --- a/Gemfile +++ b/Gemfile @@ -19,8 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' -gem 'resque-scheduler', :require => 'resque_scheduler' -gem 'resque', :require => "resque/server" +gem 'resque' # background jobs +gem 'resque-scheduler' # job scheduling gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 70e58b2b2..7758cacee 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,11 +1,13 @@ -require 'open-uri' -require 'nokogiri' +# require 'open-uri' +# require 'nokogiri' module FetchTime - @queue = :fetch_time + @queue = :my_job_queue def self.perform() - sleep 10 - doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - CronMail.time_check(doc.at('#ct').children.first.text).deliver +# sleep 10 + # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + # CronMail.time_check(doc.at('#ct').children.first.text).deliver + # puts "Mail Sent" + # true end end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 69eabc9cf..69a535f36 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -1,15 +1,20 @@ require 'resque_scheduler' -require 'resque_scheduler/server' -require 'yaml' +# require 'resque_scheduler/server' +# require 'yaml' -rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' -rails_env = ENV['RAILS_ENV'] || 'development' +Resque.redis = 'localhost:6379' +Resque.redis.namespace = "resque:SchedulerExample" -resque_config = YAML.load_file(rails_root + '/config/resque.yml') -Resque.redis = resque_config[rails_env] +# If you want to be able to dynamically change the schedule, +# uncomment this line. A dynamic schedule can be updated via the +# Resque::Scheduler.set_schedule (and remove_schedule) methods. +# When dynamic is set to true, the scheduler process looks for +# schedule changes and applies them on the fly. +# Note: This feature is only available in >=2.0.0. +#Resque::Scheduler.dynamic = true -Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } -# current_path = Rails.root.to_s.gsub(/\s/,'\ ') -# queues = [:test] +# The schedule doesn't need to be stored in a YAML, it just needs to +# be a hash. YAML is usually the easiest. +Resque.schedule = YAML.load_file(Rails.root.join('config', 'resque_schedule.yml')) \ No newline at end of file diff --git a/config/resque.yml b/config/resque.yml deleted file mode 100644 index f874633c8..000000000 --- a/config/resque.yml +++ /dev/null @@ -1,2 +0,0 @@ -development: localhost:6379 -production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 08b1b7ea0..6c960ede9 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,6 +1,5 @@ -time_to_talk_a_rest: - cron: "*/5 * * * *" +do_my_job: + every: 30s class: FetchTime - queue: daemons - rails_env: development - description: Send Email for Remind Time + args: + description: Runs the perform method in MyJob diff --git a/config/routes.rb b/config/routes.rb index 627738d33..50600063a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Orbit::Application.routes.draw do - + mount Resque::Server, :at => "/admin/resque" devise_for :users # routes for sinatra app From f949523bbb110ab5b5e289e73062e483477c88ff Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Tue, 8 May 2012 11:31:35 +0800 Subject: [PATCH 10/16] God , Resque, Resque-schedule, is working,but buggy. Need to combine with LDAP and also implement XML calendar sync. --- Gemfile | 1 + Gemfile.lock | 3 ++ Rakefile | 2 ++ app/jobs/fetch_time.rb | 14 +++++---- app/jobs/nccu_calendar.rb | 8 +++++ app/jobs/sync_db.rb | 9 ++++++ config/application.rb | 2 ++ config/initializers/resque.rb | 2 +- config/resque.god | 55 ++++++++++++++++++++++++++++++++++ config/resque_schedule.yml | 18 +++++++++-- dump.rdb | Bin 0 -> 899 bytes 11 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 app/jobs/nccu_calendar.rb create mode 100644 app/jobs/sync_db.rb create mode 100644 config/resque.god create mode 100644 dump.rdb diff --git a/Gemfile b/Gemfile index 6e6bc39c7..d61290921 100644 --- a/Gemfile +++ b/Gemfile @@ -21,6 +21,7 @@ gem 'radius' gem 'rake' gem 'resque' # background jobs gem 'resque-scheduler' # job scheduling +gem 'resque-restriction' gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 80ce363c4..16acce214 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -161,6 +161,8 @@ GEM redis-namespace (~> 1.0.2) sinatra (>= 0.9.2) vegas (~> 0.1.2) + resque-restriction (0.3.0) + resque (>= 1.7.0) resque-scheduler (1.9.9) redis (>= 2.0.1) resque (>= 1.8.0) @@ -276,6 +278,7 @@ DEPENDENCIES rails (>= 3.1.0, < 3.2.0) rake resque + resque-restriction resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) diff --git a/Rakefile b/Rakefile index 9a495de7b..e0dc9c5b8 100644 --- a/Rakefile +++ b/Rakefile @@ -1,7 +1,9 @@ +# /usr/bin/ruby -Ku # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require File.expand_path('../config/application', __FILE__) +require 'resque/tasks' require 'rake/dsl_definition' require 'rake' diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 7758cacee..5fce3036c 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,13 +1,15 @@ # require 'open-uri' # require 'nokogiri' -module FetchTime - @queue = :my_job_queue +class FetchTime < Resque::Plugins::RestrictionJob + restrict :per_300 => 10 + + @queue = :low def self.perform() # sleep 10 - # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - # CronMail.time_check(doc.at('#ct').children.first.text).deliver - # puts "Mail Sent" - # true + doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + CronMail.time_check(doc.at('#ct').children.first.text).deliver + puts "Mail Sent" + true end end diff --git a/app/jobs/nccu_calendar.rb b/app/jobs/nccu_calendar.rb new file mode 100644 index 000000000..724804d4f --- /dev/null +++ b/app/jobs/nccu_calendar.rb @@ -0,0 +1,8 @@ +class NccuCalendar + @queue = :high + + def self.perform() +# sleep 10 + puts "NccuCalendar Sync" + end +end diff --git a/app/jobs/sync_db.rb b/app/jobs/sync_db.rb new file mode 100644 index 000000000..f6458204f --- /dev/null +++ b/app/jobs/sync_db.rb @@ -0,0 +1,9 @@ +class SyncDb + + @queue = :high + + def self.perform() +# sleep 10 + puts "DB Sync" + end +end diff --git a/config/application.rb b/config/application.rb index cef8c446c..8460d1365 100644 --- a/config/application.rb +++ b/config/application.rb @@ -62,6 +62,8 @@ module Orbit # Enable the asset pipeline config.assets.enabled = true + #config.time_zone = 'Taipei' + ENV['TZ'] = 'Asia/Taipei' end end Orbit_Apps = [] diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 69a535f36..f6f084061 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -3,7 +3,7 @@ require 'resque_scheduler' # require 'yaml' Resque.redis = 'localhost:6379' -Resque.redis.namespace = "resque:SchedulerExample" +#Resque.redis.namespace = "resque:SchedulerExample" # If you want to be able to dynamically change the schedule, # uncomment this line. A dynamic schedule can be updated via the diff --git a/config/resque.god b/config/resque.god new file mode 100644 index 000000000..6c4e4bded --- /dev/null +++ b/config/resque.god @@ -0,0 +1,55 @@ +rails_env = 'development' #ENV['RAILS_ENV'] || "production" +rails_root = ENV['RAILS_ROOT'] || "/Users/kaito/Documents/MyWorkspeace/orbit/orbit" +num_workers = rails_env == 'production' ? 5 : 2 + +num_workers.times do |num| + God.watch do |w| + w.dir = "#{rails_root}" + w.name = "resque-#{num}" + w.group = 'resque' + w.interval = 30.seconds + p "/usr/bin/rake -f #{rails_root}/Rakefile resque:work QUEUE=* RAILS_ENV=#{rails_env}" +# w.env = {"QUEUE"=>"critical,high,low", "RAILS_ENV"=>rails_env} + w.start = "rake -f #{rails_root}/Rakefile resque:work QUEUE=* RAILS_ENV=#{rails_env}" + + w.uid = 'kaito' + w.gid = 'staff' + + # restart if memory gets too high + w.transition(:up, :restart) do |on| + on.condition(:memory_usage) do |c| + c.above = 350.megabytes + c.times = 2 + end + end + + # determine the state on startup + w.transition(:init, { true => :up, false => :start }) do |on| + on.condition(:process_running) do |c| + c.running = true + end + end + + # determine when process has finished starting + w.transition([:start, :restart], :up) do |on| + on.condition(:process_running) do |c| + c.running = true + c.interval = 5.seconds + end + + # failsafe + on.condition(:tries) do |c| + c.times = 5 + c.transition = :start + c.interval = 5.seconds + end + end + + # start if process is not running + w.transition(:up, :start) do |on| + on.condition(:process_running) do |c| + c.running = false + end + end + end +end \ No newline at end of file diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 6c960ede9..10f97f5f4 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,5 +1,17 @@ -do_my_job: - every: 30s +do_mail_matt: + every: 10s class: FetchTime args: - description: Runs the perform method in MyJob + description: Runs the perform method in FetchTime + +nccu_daily_ldap_sync: + cron: 30 * * * * * + class: SyncDb + args: + description: Runs the perform method in SnycDB + +nccu_claender_sync: + every: 1m + class: NccuCalendar + args: + description: Runs the perform method in NccuCalendar \ No newline at end of file diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..e5b34fe1d130ce07b54b42b5af7c97f58de85954 GIT binary patch literal 899 zcmaizPfNov7{;@@t0JPHAWn1eFde+<+N{gfP4MEuc@qyYjcc*{W70B3{BHG&shJel z35mDzKK(t<19{(@;oxcn0OS*STT1HZLbAn7JxQg#?FrBG4o?*e{XUIYdu`AI)<&mm z2>S~#opY7T_`nC^cOdLQbWDJSl$nn+hyWTVmBUCRGA=TyhA(_F&m=QVOqXo7Xtdt2 z$hg*+;Y*o|1^w??sl5mNeqxLMs=6U87x> zCv|w*HA;F8&aP1sSvgAjC2C;jd$Hw~czCs2*FqE*Jd@LytNMB!u6`N4PQ~D%F1jvY Kc_IH_z}Gj{Qy>=r literal 0 HcmV?d00001 From f3b58ea36d148e620b7c13c01f99cef08f799fdb Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Fri, 13 Apr 2012 12:10:47 +0800 Subject: [PATCH 11/16] starting Resque --- Gemfile | 5 ++--- Gemfile.lock | 5 +++-- app/jobs/fetch_time.rb | 14 +++++--------- config/initializers/resque.rb | 24 +++++++++--------------- config/resque.yml | 2 ++ config/resque_schedule.yml | 21 +++++---------------- 6 files changed, 26 insertions(+), 45 deletions(-) create mode 100644 config/resque.yml diff --git a/Gemfile b/Gemfile index d61290921..a6b96ff23 100644 --- a/Gemfile +++ b/Gemfile @@ -19,9 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' -gem 'resque' # background jobs -gem 'resque-scheduler' # job scheduling -gem 'resque-restriction' +gem 'resque-scheduler', :require => 'resque_scheduler' +gem 'resque', :require => "resque/server" gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 16acce214..8e94537ee 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -161,8 +161,6 @@ GEM redis-namespace (~> 1.0.2) sinatra (>= 0.9.2) vegas (~> 0.1.2) - resque-restriction (0.3.0) - resque (>= 1.7.0) resque-scheduler (1.9.9) redis (>= 2.0.1) resque (>= 1.8.0) @@ -278,7 +276,10 @@ DEPENDENCIES rails (>= 3.1.0, < 3.2.0) rake resque +<<<<<<< HEAD resque-restriction +======= +>>>>>>> starting Resque resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 5fce3036c..70e58b2b2 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,15 +1,11 @@ -# require 'open-uri' -# require 'nokogiri' -class FetchTime < Resque::Plugins::RestrictionJob - restrict :per_300 => 10 - - @queue = :low +require 'open-uri' +require 'nokogiri' +module FetchTime + @queue = :fetch_time def self.perform() -# sleep 10 + sleep 10 doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) CronMail.time_check(doc.at('#ct').children.first.text).deliver - puts "Mail Sent" - true end end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index f6f084061..5bfe6d56c 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -1,20 +1,14 @@ -require 'resque_scheduler' -# require 'resque_scheduler/server' -# require 'yaml' +require 'resque_scheduler'require 'resque_scheduler/server' +require 'yaml' -Resque.redis = 'localhost:6379' -#Resque.redis.namespace = "resque:SchedulerExample" +rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' +rails_env = ENV['RAILS_ENV'] || 'development' -# If you want to be able to dynamically change the schedule, -# uncomment this line. A dynamic schedule can be updated via the -# Resque::Scheduler.set_schedule (and remove_schedule) methods. -# When dynamic is set to true, the scheduler process looks for -# schedule changes and applies them on the fly. -# Note: This feature is only available in >=2.0.0. -#Resque::Scheduler.dynamic = true +resque_config = YAML.load_file(rails_root + '/config/resque.yml') +Resque.redis = resque_config[rails_env] +Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } -# The schedule doesn't need to be stored in a YAML, it just needs to -# be a hash. YAML is usually the easiest. -Resque.schedule = YAML.load_file(Rails.root.join('config', 'resque_schedule.yml')) \ No newline at end of file +# current_path = Rails.root.to_s.gsub(/\s/,'\ ') +# queues = [:test] diff --git a/config/resque.yml b/config/resque.yml new file mode 100644 index 000000000..f874633c8 --- /dev/null +++ b/config/resque.yml @@ -0,0 +1,2 @@ +development: localhost:6379 +production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 10f97f5f4..08b1b7ea0 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,17 +1,6 @@ -do_mail_matt: - every: 10s +time_to_talk_a_rest: + cron: "*/5 * * * *" class: FetchTime - args: - description: Runs the perform method in FetchTime - -nccu_daily_ldap_sync: - cron: 30 * * * * * - class: SyncDb - args: - description: Runs the perform method in SnycDB - -nccu_claender_sync: - every: 1m - class: NccuCalendar - args: - description: Runs the perform method in NccuCalendar \ No newline at end of file + queue: daemons + rails_env: development + description: Send Email for Remind Time From dbac219c18cb4babb0e7e73e15f129057969f677 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Mon, 7 May 2012 10:23:16 +0800 Subject: [PATCH 12/16] now jobs is working --- Gemfile | 4 ++-- app/jobs/fetch_time.rb | 14 ++++++++------ config/initializers/resque.rb | 24 +++++++++++++++--------- config/resque.yml | 2 -- config/resque_schedule.yml | 9 ++++----- 5 files changed, 29 insertions(+), 24 deletions(-) delete mode 100644 config/resque.yml diff --git a/Gemfile b/Gemfile index a6b96ff23..6e6bc39c7 100644 --- a/Gemfile +++ b/Gemfile @@ -19,8 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' -gem 'resque-scheduler', :require => 'resque_scheduler' -gem 'resque', :require => "resque/server" +gem 'resque' # background jobs +gem 'resque-scheduler' # job scheduling gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 70e58b2b2..7758cacee 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,11 +1,13 @@ -require 'open-uri' -require 'nokogiri' +# require 'open-uri' +# require 'nokogiri' module FetchTime - @queue = :fetch_time + @queue = :my_job_queue def self.perform() - sleep 10 - doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - CronMail.time_check(doc.at('#ct').children.first.text).deliver +# sleep 10 + # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + # CronMail.time_check(doc.at('#ct').children.first.text).deliver + # puts "Mail Sent" + # true end end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 5bfe6d56c..06a25da4e 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -1,14 +1,20 @@ -require 'resque_scheduler'require 'resque_scheduler/server' -require 'yaml' +require 'resque_scheduler' +# require 'resque_scheduler/server' +# require 'yaml' -rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' -rails_env = ENV['RAILS_ENV'] || 'development' +Resque.redis = 'localhost:6379' +Resque.redis.namespace = "resque:SchedulerExample" -resque_config = YAML.load_file(rails_root + '/config/resque.yml') -Resque.redis = resque_config[rails_env] +# If you want to be able to dynamically change the schedule, +# uncomment this line. A dynamic schedule can be updated via the +# Resque::Scheduler.set_schedule (and remove_schedule) methods. +# When dynamic is set to true, the scheduler process looks for +# schedule changes and applies them on the fly. +# Note: This feature is only available in >=2.0.0. +#Resque::Scheduler.dynamic = true -Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } -# current_path = Rails.root.to_s.gsub(/\s/,'\ ') -# queues = [:test] +# The schedule doesn't need to be stored in a YAML, it just needs to +# be a hash. YAML is usually the easiest. +Resque.schedule = YAML.load_file(Rails.root.join('config', 'resque_schedule.yml')) diff --git a/config/resque.yml b/config/resque.yml deleted file mode 100644 index f874633c8..000000000 --- a/config/resque.yml +++ /dev/null @@ -1,2 +0,0 @@ -development: localhost:6379 -production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 08b1b7ea0..6c960ede9 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,6 +1,5 @@ -time_to_talk_a_rest: - cron: "*/5 * * * *" +do_my_job: + every: 30s class: FetchTime - queue: daemons - rails_env: development - description: Send Email for Remind Time + args: + description: Runs the perform method in MyJob From 7af17f19ac510efab9b129fa30257dc1d0ab3b31 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Tue, 8 May 2012 11:31:35 +0800 Subject: [PATCH 13/16] God , Resque, Resque-schedule, is working,but buggy. Need to combine with LDAP and also implement XML calendar sync. --- Gemfile | 1 + Gemfile.lock | 5 ++--- app/jobs/fetch_time.rb | 14 ++++++++------ config/initializers/resque.rb | 2 +- config/resque_schedule.yml | 18 +++++++++++++++--- 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/Gemfile b/Gemfile index 6e6bc39c7..d61290921 100644 --- a/Gemfile +++ b/Gemfile @@ -21,6 +21,7 @@ gem 'radius' gem 'rake' gem 'resque' # background jobs gem 'resque-scheduler' # job scheduling +gem 'resque-restriction' gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 8e94537ee..16acce214 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -161,6 +161,8 @@ GEM redis-namespace (~> 1.0.2) sinatra (>= 0.9.2) vegas (~> 0.1.2) + resque-restriction (0.3.0) + resque (>= 1.7.0) resque-scheduler (1.9.9) redis (>= 2.0.1) resque (>= 1.8.0) @@ -276,10 +278,7 @@ DEPENDENCIES rails (>= 3.1.0, < 3.2.0) rake resque -<<<<<<< HEAD resque-restriction -======= ->>>>>>> starting Resque resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 7758cacee..5fce3036c 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,13 +1,15 @@ # require 'open-uri' # require 'nokogiri' -module FetchTime - @queue = :my_job_queue +class FetchTime < Resque::Plugins::RestrictionJob + restrict :per_300 => 10 + + @queue = :low def self.perform() # sleep 10 - # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - # CronMail.time_check(doc.at('#ct').children.first.text).deliver - # puts "Mail Sent" - # true + doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + CronMail.time_check(doc.at('#ct').children.first.text).deliver + puts "Mail Sent" + true end end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 06a25da4e..62de3fa45 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -3,7 +3,7 @@ require 'resque_scheduler' # require 'yaml' Resque.redis = 'localhost:6379' -Resque.redis.namespace = "resque:SchedulerExample" +#Resque.redis.namespace = "resque:SchedulerExample" # If you want to be able to dynamically change the schedule, # uncomment this line. A dynamic schedule can be updated via the diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 6c960ede9..10f97f5f4 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,5 +1,17 @@ -do_my_job: - every: 30s +do_mail_matt: + every: 10s class: FetchTime args: - description: Runs the perform method in MyJob + description: Runs the perform method in FetchTime + +nccu_daily_ldap_sync: + cron: 30 * * * * * + class: SyncDb + args: + description: Runs the perform method in SnycDB + +nccu_claender_sync: + every: 1m + class: NccuCalendar + args: + description: Runs the perform method in NccuCalendar \ No newline at end of file From ffcfda912efb80044db3ab8514645a1d998d04da Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Tue, 8 May 2012 20:44:17 +0800 Subject: [PATCH 14/16] Patch from ldap: Calendar sync done,need Ray's JS change --- app/jobs/nccu_calendar.rb | 8 +++- config/resque_schedule.yml | 2 +- dump.rdb | Bin 899 -> 816 bytes public/static/nccu_calendar.rss | 64 ++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 public/static/nccu_calendar.rss diff --git a/app/jobs/nccu_calendar.rb b/app/jobs/nccu_calendar.rb index 724804d4f..1848c6918 100644 --- a/app/jobs/nccu_calendar.rb +++ b/app/jobs/nccu_calendar.rb @@ -1,8 +1,12 @@ class NccuCalendar + require 'open-uri' @queue = :high def self.perform() -# sleep 10 - puts "NccuCalendar Sync" + File.open(File.join(Rails.root, 'public/static', 'nccu_calendar.rss'),'w') do |file| + file << open('http://events.nccu.edu.tw/Feed').read + CronMail.time_check("NCCU Calendar synced").deliver + end + puts "NccuCalendar Synced" end end diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 10f97f5f4..1f4918987 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -5,7 +5,7 @@ do_mail_matt: description: Runs the perform method in FetchTime nccu_daily_ldap_sync: - cron: 30 * * * * * + cron: * * [0,12] * * * class: SyncDb args: description: Runs the perform method in SnycDB diff --git a/dump.rdb b/dump.rdb index e5b34fe1d130ce07b54b42b5af7c97f58de85954..a4a56dc0cba0b3124f374e1d3dba72ac23f09bae 100644 GIT binary patch delta 65 zcmZo>-@rCOT8L2~H?gEdH!-uw%FNi*)Y3|8vIDauE0{ewj#-@D)XLb%%GhvY6+a^r S7t3URM#;@f80RoD{s#acUJzIS delta 140 zcmdnM*33RZT9HX0H?gEdH!-uw%GAix%)&|wMZnx(qPDa$RK}{fB(bO@HAT|Mz|ct7 zz*N`3Lc!3$%GAutz+z)2KO++Z%fx?@nVsX diff --git a/public/static/nccu_calendar.rss b/public/static/nccu_calendar.rss new file mode 100644 index 000000000..0a78dc7f5 --- /dev/null +++ b/public/static/nccu_calendar.rss @@ -0,0 +1,64 @@ + + + 國立政治大學校園活動行事曆 + + 本日最新活動 + zh-tw + + 2012年世界狂歡節-「框」住瞬間「框」住世界 + + + + + 101/05/01-101/05/08 00:00-23:59 + + + 2012年世界狂歡節-環友世界 + + + + + 101/05/01-101/05/10 00:00-23:59 + + + 2012年世界狂歡節-從政大看台灣 + + + + + 101/05/01-101/05/10 08:00-22:00 + + + 2012年世界狂歡節-美食嘉年華 + + + + + 101/05/08-101/05/10 12:00-14:00 + + + 2012年世界狂歡節-「原,夜」晚會 + + + + + 101/05/08 19:00-21:00 + + + 2012年世界狂歡節-開幕式 + + + + + 101/05/08 12:10-13:30 + + + 職場講座「數位文本實務課程」 + + + + + 101/04/24-101/05/15 12:20-13:50 + + + From 0cc94c65a8724541fcb48d26e3c592dafdeec13e Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Tue, 8 May 2012 21:14:57 +0800 Subject: [PATCH 15/16] Patch from ldap: Test version for DB sync schedule job --- app/jobs/sync_db.rb | 10 ++++++++-- config/resque_schedule.yml | 16 ++++++++-------- dump.rdb | Bin 816 -> 1530 bytes 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/app/jobs/sync_db.rb b/app/jobs/sync_db.rb index f6458204f..d4bda7901 100644 --- a/app/jobs/sync_db.rb +++ b/app/jobs/sync_db.rb @@ -3,7 +3,13 @@ class SyncDb @queue = :high def self.perform() -# sleep 10 - puts "DB Sync" + self.start_sync + end + + def self.start_sync + task = 'mid_site:sync' + args = [] + %x[rake #{task} --trace >> #{Rails.root}/log/rake.log] + puts "SyncDb Synced" end end diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 1f4918987..6929152e6 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,17 +1,17 @@ -do_mail_matt: - every: 10s - class: FetchTime - args: - description: Runs the perform method in FetchTime +# do_mail_matt: +# every: 10s +# class: FetchTime +# args: +# description: Runs the perform method in FetchTime nccu_daily_ldap_sync: cron: * * [0,12] * * * class: SyncDb args: - description: Runs the perform method in SnycDB + description: Sync NCCU middle site with Orbit for LDAP data nccu_claender_sync: - every: 1m + cron: * * [0,12] * * * class: NccuCalendar args: - description: Runs the perform method in NccuCalendar \ No newline at end of file + description: Sync NCCU calendar RSS Feeds \ No newline at end of file diff --git a/dump.rdb b/dump.rdb index a4a56dc0cba0b3124f374e1d3dba72ac23f09bae..a3c1b42c46ad075453c0ee3cb39529b5802dd944 100644 GIT binary patch literal 1530 zcmbW1PjA~s5XC9_PmRQZn*xE0wunb-z)k{LT+$LP5iMdvc7q-o6mf#0DI94@jwRYl zF0)+9c8U~6i=6T$dhQ|T+^QhoB8NagZn^Z(dt1tqBclLy=#ev=d4u0oFxfy$k(X6&ix=nQX)*Yv(k@y zPxULK9cLqnKHUl0ovCb6`()He6jRPV3po0{qW0;i`eB(D)OVg(wz_p?1QJK=))#2INoX=bPapX(Xluy7^g zyF~EV!&n6(f~EN_*-k@@)Q*%w!it8ikCq&wWPm;>0iHyr5WdU60^uH@r{E}PbERb;0~(?@ zmzUv&1suD`lbb;9P5a2PU3}A@d!}y-&s)Bf7~h_JFXUkoBY8h#2;F6Axw|aHVZ3A%ZyF74^dSq7ap*D`Fqb1_2!uF@*N0a2%1PBs zU{7C#eONqg>rR7jb}yC4IBxl$xHHSnXd0WQA*_6GZEoaRVr)KI$XpvFYoEoMSqFUf c+`2C{+8D>fC~#&#Z$d=hpr6FTfG)_y7O^ delta 156 zcmeyxy@9Ph$koL&*ucQR@E-#cUr}mtVQH#Wd45rLYEdzxKyG45iEd(Mk(HUTsi~!v z7K0j!3M+JZtKyQxqLS1UNh1S8BV7YiT>}dRLsKhbBP(M=1#JTh0|Q1ys0qQz8L26y fITNLm7)2&NkeE2Fj){w9;seRe`iyfJ8UF(SGDa}@ From 49e2eb0187f7e8a8b963f172a0ef15a358d589c1 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Tue, 8 May 2012 21:46:24 +0800 Subject: [PATCH 16/16] Add class 'active' in the menu for current page --- lib/parsers/parser_common.rb | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/parsers/parser_common.rb b/lib/parsers/parser_common.rb index 1825d9fdc..2d131098e 100644 --- a/lib/parsers/parser_common.rb +++ b/lib/parsers/parser_common.rb @@ -1,7 +1,7 @@ module ParserCommon include ActionView::Helpers::TagHelper - def menu_level(page, current, menu, edit = false) + def menu_level(page, current_page_id, current, menu, edit = false) res = '' if page.ordered_and_visible_children.size > 0 res << "