tasks_scheduler 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/tasks_scheduler_daemon_controller.rb +4 -20
- data/app/controllers/tasks_scheduler_daemon_controller/_download_log.rb +36 -0
- data/app/models/scheduled_task.rb +14 -1
- data/app/models/scheduled_task/checker.rb +4 -2
- data/app/models/scheduled_task/log.rb +6 -3
- data/app/views/scheduled_tasks/status_content.html.erb +1 -0
- data/app/views/tasks_scheduler_daemon/_daemon.html.erb +11 -0
- data/app/views/tasks_scheduler_daemon/_logs.html.erb +12 -0
- data/app/views/tasks_scheduler_daemon/_results.html.erb +9 -0
- data/app/views/tasks_scheduler_daemon/_running_status.html.erb +0 -1
- data/app/views/tasks_scheduler_daemon/index.html.erb +3 -20
- data/config/routes.rb +2 -2
- data/lib/tasks_scheduler/checker.rb +19 -3
- data/lib/tasks_scheduler/checker/log.rb +32 -0
- data/lib/tasks_scheduler/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89877b670ebd68e63175333d60bce49d90de7c4e04737189f5c73a6a277f0595
|
4
|
+
data.tar.gz: 18d4d5224dcabd9dd2238d0cc8a5dea03689d58323de808b5bb4622664a2cc01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6bb72a00e15bd394f6baa9cbae395e8737295ff72f1177315fd15937b2b60189901b7db0cfe3c2b7b9daf08599023c694558231539d1f6e2b92ea4f6fd0bd2a4
|
7
|
+
data.tar.gz: 766a81812effee371317d38ee615e0e5b57400abac7d6a376a6a5971bc98fc301bdca3e03dbfa3c8f1d3f1c7903ddbdf479fc7b89451292880c386c813311b69
|
@@ -1,4 +1,8 @@
|
|
1
|
+
require 'tasks_scheduler/checker'
|
2
|
+
|
1
3
|
class TasksSchedulerDaemonController < ApplicationController
|
4
|
+
require_relative 'tasks_scheduler_daemon_controller/_download_log'
|
5
|
+
|
2
6
|
def index
|
3
7
|
end
|
4
8
|
|
@@ -11,24 +15,4 @@ class TasksSchedulerDaemonController < ApplicationController
|
|
11
15
|
render json: { daemon_running: ::TasksScheduler::Daemon.running?,
|
12
16
|
tasks_all_ok: !::ScheduledTask.all.any?(&:failed?) }
|
13
17
|
end
|
14
|
-
|
15
|
-
def download_log
|
16
|
-
if File.exist?(::TasksScheduler::Checker.instance.log_path)
|
17
|
-
send_log_file
|
18
|
-
else
|
19
|
-
redirect_to(tasks_scheduler_daemon_path,
|
20
|
-
notice: "Arquivo \"#{::TasksScheduler::Checker.instance.log_path}\" não existe")
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def send_log_file
|
27
|
-
send_file(
|
28
|
-
::TasksScheduler::Checker.instance.log_path,
|
29
|
-
filename: "#{request.base_url.parameterize}_tasks-scheduler_checker-log_" \
|
30
|
-
"#{Time.zone.now.to_s.parameterize}.log",
|
31
|
-
type: 'text/plain'
|
32
|
-
)
|
33
|
-
end
|
34
18
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class TasksSchedulerDaemonController < ApplicationController
|
2
|
+
def download_log
|
3
|
+
return unless download_log_validate_log_key
|
4
|
+
log = ::TasksScheduler::Checker.instance.send("#{download_log_key}_log")
|
5
|
+
return unless download_log_validate_log_exist(log)
|
6
|
+
send_log_file(log)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def download_log_key
|
12
|
+
params[:log_key]
|
13
|
+
end
|
14
|
+
|
15
|
+
def download_log_validate_log_key
|
16
|
+
return true if ::TasksScheduler::Checker::LOGS_KEYS.include?(download_log_key)
|
17
|
+
redirect_to(tasks_scheduler_daemon_path,
|
18
|
+
notice: "Invalid log key: \"#{download_log_key}\"")
|
19
|
+
false
|
20
|
+
end
|
21
|
+
|
22
|
+
def download_log_validate_log_exist(log)
|
23
|
+
return true if log.exist?
|
24
|
+
redirect_to(tasks_scheduler_daemon_path, notice: "Log \"#{log.key}\" does not exist.")
|
25
|
+
false
|
26
|
+
end
|
27
|
+
|
28
|
+
def send_log_file(log)
|
29
|
+
send_file(
|
30
|
+
log.path,
|
31
|
+
filename: "#{request.base_url.parameterize}_tasks-scheduler_checker-log_" \
|
32
|
+
"#{Time.zone.now.to_s.parameterize}.log",
|
33
|
+
type: 'text/plain'
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
@@ -37,9 +37,11 @@ class ScheduledTask < ActiveRecord::Base
|
|
37
37
|
LAST_FAIL_STATUSES = [STATUS_FAILED, STATUS_ABORTED, STATUS_TIMEOUT]
|
38
38
|
|
39
39
|
validates :scheduling, presence: true, 'tasks_scheduler/cron_scheduling': true
|
40
|
-
validates :task, presence: true
|
40
|
+
validates :task, presence: true
|
41
41
|
validates :last_fail_status, allow_blank: true, inclusion: { in: LAST_FAIL_STATUSES }
|
42
42
|
|
43
|
+
validate :validate_task
|
44
|
+
|
43
45
|
LOG_RUNNING = 'running'
|
44
46
|
LOG_SUCCESSFUL = 'successful'
|
45
47
|
LOG_UNSUCCESSFUL = 'unsuccessful'
|
@@ -76,4 +78,15 @@ class ScheduledTask < ActiveRecord::Base
|
|
76
78
|
rescue
|
77
79
|
raise "Unable to determine status for #{pid}"
|
78
80
|
end
|
81
|
+
|
82
|
+
def task_exist?
|
83
|
+
self.class.rake_tasks.include?(task)
|
84
|
+
end
|
85
|
+
|
86
|
+
def validate_task
|
87
|
+
return if task.blank?
|
88
|
+
return unless task_changed?
|
89
|
+
return if self.class.rake_tasks.include?(task)
|
90
|
+
errors.add(:task, "Task \"#{task}\" not found")
|
91
|
+
end
|
79
92
|
end
|
@@ -60,7 +60,9 @@ class ScheduledTask < ActiveRecord::Base
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def check_task_with_next_run
|
63
|
-
if
|
63
|
+
if !task_exist?
|
64
|
+
check_log("Task does not exist: #{task}")
|
65
|
+
elsif next_run < Time.zone.now
|
64
66
|
check_log('Next run reached. Running...')
|
65
67
|
spawn_task
|
66
68
|
else
|
@@ -70,7 +72,7 @@ class ScheduledTask < ActiveRecord::Base
|
|
70
72
|
|
71
73
|
def spawn_task
|
72
74
|
params = ['bundle', 'exec', 'tasks_scheduler_run_task', id.to_s]
|
73
|
-
check_log("Spawn command: #{params}")
|
75
|
+
check_log("Spawn command: #{params} (Task: #{task})")
|
74
76
|
spawn_pid = nil
|
75
77
|
Dir.chdir(Rails.root) do
|
76
78
|
spawn_pid = Process.spawn(*params)
|
@@ -23,9 +23,12 @@ class ScheduledTask < ActiveRecord::Base
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def log_on_end(exception)
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
running_log = log_file(LOG_RUNNING)
|
27
|
+
if ::File.exist?(running_log)
|
28
|
+
target_log = exception ? log_file(LOG_UNSUCCESSFUL) : log_file(LOG_SUCCESSFUL)
|
29
|
+
File.unlink(target_log) if File.exist?(target_log)
|
30
|
+
File.rename(running_log, target_log)
|
31
|
+
end
|
29
32
|
end
|
30
33
|
end
|
31
34
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<h3>Daemon</h3>
|
2
|
+
<p>
|
3
|
+
<strong>Status: </strong>
|
4
|
+
<%= render partial: '/tasks_scheduler_daemon/running_status' %>
|
5
|
+
<br/>
|
6
|
+
<strong>Actions: </strong>
|
7
|
+
<%= safe_join(::TasksScheduler::Daemon::ACTIONS.map do |action|
|
8
|
+
link_to action, execute_tasks_scheduler_daemon_path(action), method: :post
|
9
|
+
end, ' | ') %>
|
10
|
+
<br/>
|
11
|
+
</p>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<h3>Logs</h3>
|
2
|
+
<ul>
|
3
|
+
<% ::TasksScheduler::Checker.instance.logs.each do |log| %>
|
4
|
+
<li>
|
5
|
+
<% if log.exist? %>
|
6
|
+
<%= link_to log.key, download_log_tasks_scheduler_daemon_path(log.key) %>
|
7
|
+
<% else %>
|
8
|
+
<span style="color: grey" title='Log "<%= log.key %>" does not exist.'><%= log.key %></span>
|
9
|
+
<% end %>
|
10
|
+
</li>
|
11
|
+
<% end %>
|
12
|
+
</ul>
|
@@ -1,22 +1,5 @@
|
|
1
1
|
<%= render partial: '/tasks_scheduler/navbar' %>
|
2
2
|
<h2><%= I18n.t(:tasks_scheduler_daemon) %></h2>
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
<strong>Actions: </strong>
|
7
|
-
<%= safe_join(::TasksScheduler::Daemon::ACTIONS.map do |action|
|
8
|
-
link_to action, execute_tasks_scheduler_daemon_path(action), method: :post
|
9
|
-
end, ' | ') %>
|
10
|
-
<br/>
|
11
|
-
<strong>Log: </strong>
|
12
|
-
<%= link_to 'download', download_log_tasks_scheduler_daemon_path %>
|
13
|
-
</p>
|
14
|
-
<% if @result %>
|
15
|
-
<h3>Results</h3>
|
16
|
-
<dl>
|
17
|
-
<% @result.each do |k, v| %>
|
18
|
-
<dt><%= k %></dt>
|
19
|
-
<dd><%= v.present? ? v : '-' %></dd>
|
20
|
-
<% end %>
|
21
|
-
</dl>
|
22
|
-
<% end %>
|
3
|
+
<%= render partial: 'daemon', locals: {status_label: 'Status:'} %>
|
4
|
+
<%= render partial: 'logs' %>
|
5
|
+
<%= render partial: 'results' %>
|
data/config/routes.rb
CHANGED
@@ -15,6 +15,6 @@ Rails.application.routes.draw do
|
|
15
15
|
to: 'tasks_scheduler_daemon#execute', as: :execute_tasks_scheduler_daemon
|
16
16
|
get '/tasks_scheduler_daemon/status', to: 'tasks_scheduler_daemon#status',
|
17
17
|
as: :status_tasks_scheduler_daemon
|
18
|
-
get '/tasks_scheduler_daemon/download_log', to: 'tasks_scheduler_daemon#download_log',
|
19
|
-
|
18
|
+
get '/tasks_scheduler_daemon/download_log/:log_key', to: 'tasks_scheduler_daemon#download_log',
|
19
|
+
as: :download_log_tasks_scheduler_daemon
|
20
20
|
end
|
@@ -1,9 +1,12 @@
|
|
1
|
+
require 'tasks_scheduler/checker/log'
|
2
|
+
|
1
3
|
module TasksScheduler
|
2
4
|
class Checker
|
3
5
|
include Singleton
|
4
6
|
|
5
7
|
CHECK_INTERVAL = 15
|
6
8
|
LOG_ON_FILE_ENV_KEY = 'TASKS_SCHEDULER_LOG_ON_FILE'.freeze
|
9
|
+
LOGS_KEYS = %w(rails stdout stderr).freeze
|
7
10
|
|
8
11
|
def run
|
9
12
|
check_log
|
@@ -18,15 +21,28 @@ module TasksScheduler
|
|
18
21
|
end
|
19
22
|
|
20
23
|
def log_path
|
21
|
-
|
24
|
+
rais_log.path
|
25
|
+
end
|
26
|
+
|
27
|
+
def logs
|
28
|
+
LOGS_KEYS.map { |key| send("#{key}_log") }
|
29
|
+
end
|
30
|
+
|
31
|
+
LOGS_KEYS.each do |log_key|
|
32
|
+
class_eval <<CODE, __FILE__, __LINE__ + 1
|
33
|
+
def #{log_key}_log
|
34
|
+
@#{log_key}_log ||= ::TasksScheduler::Checker::Log.new('#{log_key}')
|
35
|
+
end
|
36
|
+
CODE
|
22
37
|
end
|
23
38
|
|
24
39
|
private
|
25
40
|
|
26
41
|
def check_log
|
27
42
|
return unless log_on_file?
|
28
|
-
::
|
29
|
-
|
43
|
+
::Rails.logger = ::Logger.new(rails_log.path)
|
44
|
+
$stdout.reopen(stdout_log.path, 'w')
|
45
|
+
$stderr.reopen(stderr_log.path, 'w')
|
30
46
|
end
|
31
47
|
|
32
48
|
def log_on_file?
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module TasksScheduler
|
4
|
+
class Checker
|
5
|
+
class Log
|
6
|
+
class << self
|
7
|
+
def logs_directory
|
8
|
+
@logs_directory ||= ::Rails.root.join('log', 'tasks_scheduler', 'checker')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :key
|
13
|
+
|
14
|
+
def initialize(key)
|
15
|
+
@key = key
|
16
|
+
::FileUtils.mkdir_p(dirname)
|
17
|
+
end
|
18
|
+
|
19
|
+
def dirname
|
20
|
+
::File.dirname(path)
|
21
|
+
end
|
22
|
+
|
23
|
+
def exist?
|
24
|
+
::File.exist?(path)
|
25
|
+
end
|
26
|
+
|
27
|
+
def path
|
28
|
+
self.class.logs_directory.join("#{key}.log")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tasks_scheduler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo H. Bogoni
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_scaffold
|
@@ -111,6 +111,7 @@ files:
|
|
111
111
|
- app/assets/stylesheets/tasks_scheduler/alert.scss
|
112
112
|
- app/controllers/scheduled_tasks_controller.rb
|
113
113
|
- app/controllers/tasks_scheduler_daemon_controller.rb
|
114
|
+
- app/controllers/tasks_scheduler_daemon_controller/_download_log.rb
|
114
115
|
- app/helpers/scheduled_tasks_helper.rb
|
115
116
|
- app/models/scheduled_task.rb
|
116
117
|
- app/models/scheduled_task/checker.rb
|
@@ -123,6 +124,9 @@ files:
|
|
123
124
|
- app/views/scheduled_tasks/status_content.html.erb
|
124
125
|
- app/views/tasks_scheduler/_alert.html.erb
|
125
126
|
- app/views/tasks_scheduler/_navbar.html.erb
|
127
|
+
- app/views/tasks_scheduler_daemon/_daemon.html.erb
|
128
|
+
- app/views/tasks_scheduler_daemon/_logs.html.erb
|
129
|
+
- app/views/tasks_scheduler_daemon/_results.html.erb
|
126
130
|
- app/views/tasks_scheduler_daemon/_running_status.html.erb
|
127
131
|
- app/views/tasks_scheduler_daemon/index.html.erb
|
128
132
|
- config/initializers/assets.rb
|
@@ -139,6 +143,7 @@ files:
|
|
139
143
|
- exe/tasks_scheduler_run_task
|
140
144
|
- lib/tasks_scheduler.rb
|
141
145
|
- lib/tasks_scheduler/checker.rb
|
146
|
+
- lib/tasks_scheduler/checker/log.rb
|
142
147
|
- lib/tasks_scheduler/cron_parser_patch.rb
|
143
148
|
- lib/tasks_scheduler/cron_scheduling_validator.rb
|
144
149
|
- lib/tasks_scheduler/daemon.rb
|