rest-ftp-daemon 0.90.1 → 0.94.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile.lock +8 -4
- data/README.md +16 -0
- data/bin/rest-ftp-daemon +1 -1
- data/lib/rest-ftp-daemon.rb +13 -3
- data/lib/rest-ftp-daemon/api/dashboard.rb +60 -0
- data/lib/rest-ftp-daemon/api/debug.rb +25 -0
- data/lib/rest-ftp-daemon/api/job_presenter.rb +33 -0
- data/lib/rest-ftp-daemon/api/jobs.rb +37 -116
- data/lib/rest-ftp-daemon/api/root.rb +39 -107
- data/lib/rest-ftp-daemon/api/routes.rb +16 -0
- data/lib/rest-ftp-daemon/api/status.rb +29 -0
- data/lib/rest-ftp-daemon/constants.rb +5 -3
- data/lib/rest-ftp-daemon/helpers.rb +38 -12
- data/lib/rest-ftp-daemon/job.rb +186 -131
- data/lib/rest-ftp-daemon/job_queue.rb +15 -16
- data/lib/rest-ftp-daemon/notification.rb +1 -2
- data/lib/rest-ftp-daemon/static/css/main.css +45 -4
- data/lib/rest-ftp-daemon/views/dashboard.haml +16 -55
- data/lib/rest-ftp-daemon/views/dashboard_counters.haml +14 -0
- data/lib/rest-ftp-daemon/views/dashboard_headers.haml +29 -0
- data/lib/rest-ftp-daemon/views/dashboard_jobs.haml +37 -21
- data/lib/rest-ftp-daemon/views/dashboard_tokens.haml +6 -1
- data/lib/rest-ftp-daemon/views/dashboard_workers.haml +9 -25
- data/lib/rest-ftp-daemon/worker_pool.rb +1 -1
- data/rest-ftp-daemon.gemspec +1 -0
- metadata +24 -6
- data/lib/rest-ftp-daemon/api/defaults.rb +0 -66
- data/lib/rest-ftp-daemon/api/workers.rb +0 -49
- data/lib/rest-ftp-daemon/static/css/bootstrap.min.old1.css +0 -5
@@ -76,23 +76,16 @@ module RestFtpDaemon
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
# def by_status status
|
80
|
-
# return [] if status.nil?
|
81
|
-
|
82
|
-
# # Select jobs from the queue if their status is (status)
|
83
|
-
# all.select { |item| item.get(:status) == status.to_sym }
|
84
|
-
# end
|
85
|
-
|
86
79
|
def popped_reverse_sorted_by_status status
|
87
80
|
return [] if status.nil?
|
88
81
|
|
89
82
|
# Select jobs from the queue if their status is (status)
|
90
|
-
ordered_popped.reverse.select { |item| item.
|
83
|
+
ordered_popped.reverse.select { |item| item.status == status.to_sym }
|
91
84
|
end
|
92
85
|
|
93
|
-
def
|
86
|
+
def counts_by_status
|
94
87
|
statuses = {}
|
95
|
-
|
88
|
+
all.group_by { |job| job.status }.map { |status, jobs| statuses[status] = jobs.size }
|
96
89
|
statuses
|
97
90
|
end
|
98
91
|
|
@@ -114,12 +107,18 @@ module RestFtpDaemon
|
|
114
107
|
@queued.select { |item| item.id == id }.last || @popped.select { |item| item.id == id }.last
|
115
108
|
end
|
116
109
|
|
117
|
-
def push
|
110
|
+
def push job
|
118
111
|
# Check that item responds to "priorty" method
|
119
|
-
raise "JobQueue.push:
|
112
|
+
raise "JobQueue.push: job should respond to priority method" unless job.respond_to? :priority
|
120
113
|
|
121
114
|
@mutex.synchronize do
|
122
|
-
|
115
|
+
# Push job into the queue
|
116
|
+
@queued.push job
|
117
|
+
|
118
|
+
# Tell the job it's been queued
|
119
|
+
job.set_queued if job.respond_to? :set_queued
|
120
|
+
|
121
|
+
# Try to wake a worker up
|
123
122
|
begin
|
124
123
|
t = @waiting.shift
|
125
124
|
t.wakeup if t
|
@@ -165,7 +164,7 @@ module RestFtpDaemon
|
|
165
164
|
end
|
166
165
|
|
167
166
|
def ordered_popped
|
168
|
-
@popped.sort_by { |item| [item.
|
167
|
+
@popped.sort_by { |item| [item.updated_at] }
|
169
168
|
end
|
170
169
|
|
171
170
|
protected
|
@@ -195,10 +194,10 @@ module RestFtpDaemon
|
|
195
194
|
# Delete jobs from the queue if their status is (status)
|
196
195
|
@popped.delete_if do |job|
|
197
196
|
# Skip it if wrong status
|
198
|
-
next unless job.
|
197
|
+
next unless job.status == status.to_sym
|
199
198
|
|
200
199
|
# Skip it if updated_at invalid
|
201
|
-
updated_at = job.
|
200
|
+
updated_at = job.updated_at
|
202
201
|
next if updated_at.nil?
|
203
202
|
|
204
203
|
# Skip it if not aged enough yet
|
@@ -37,8 +37,7 @@ module RestFtpDaemon
|
|
37
37
|
error: params[:error],
|
38
38
|
host: Settings['host'].to_s,
|
39
39
|
}
|
40
|
-
body[:status] = params[:status] if (params[:status].is_a? Enumerable)
|
41
|
-
# && (!params[:status].empty?)
|
40
|
+
body[:status] = params[:status] if (params[:status].is_a? Enumerable) unless params[:status].nil?
|
42
41
|
|
43
42
|
# Send message in a thread
|
44
43
|
Thread.new do |thread|
|
@@ -4,14 +4,55 @@
|
|
4
4
|
|
5
5
|
.transfer-method {
|
6
6
|
display: inline-block;
|
7
|
-
width: 35px
|
8
|
-
padding:
|
7
|
+
/*width: 35px;*/
|
8
|
+
padding: 3px 3px;
|
9
9
|
font-weight: normal;
|
10
10
|
}
|
11
11
|
|
12
12
|
.nobr {
|
13
13
|
white-space: nowrap;
|
14
14
|
}
|
15
|
-
|
16
|
-
|
15
|
+
|
16
|
+
table tr td, .fixed {
|
17
|
+
font-family: 'Inconsolata', sans-serif;
|
18
|
+
font-size: 1em;
|
19
|
+
}
|
20
|
+
|
21
|
+
.token {
|
22
|
+
display: inline-block;
|
23
|
+
background-color: #f8f8f8;
|
24
|
+
padding: 0 2px;
|
25
|
+
/*font-weight: bold;*/
|
17
26
|
}
|
27
|
+
|
28
|
+
/*
|
29
|
+
.label-outline.badge-success {
|
30
|
+
border-color: #468847;
|
31
|
+
}
|
32
|
+
*/
|
33
|
+
.label-outline {
|
34
|
+
color: black;
|
35
|
+
border: 1px solid #999;
|
36
|
+
background-color: transparent;
|
37
|
+
}
|
38
|
+
|
39
|
+
.flag {
|
40
|
+
margin-right: 3px;
|
41
|
+
}
|
42
|
+
|
43
|
+
h2 {
|
44
|
+
font-size: 1.5em;
|
45
|
+
margin-top: 2em;
|
46
|
+
}
|
47
|
+
|
48
|
+
#header {
|
49
|
+
padding: 20px auto;
|
50
|
+
border-bottom: 1px solid silver;
|
51
|
+
background-color: #eee;
|
52
|
+
}
|
53
|
+
|
54
|
+
.progress {
|
55
|
+
margin-bottom: 0;
|
56
|
+
}
|
57
|
+
|
58
|
+
|
@@ -4,26 +4,9 @@
|
|
4
4
|
%meta{:charset => "utf-8"}/
|
5
5
|
%link{ href:"/css/bootstrap.css" , rel: "stylesheet"}
|
6
6
|
%link{ href:"/css/main.css" , rel: "stylesheet"}
|
7
|
-
|
7
|
+
%link{ href:"http://fonts.googleapis.com/css?family=Inconsolata:400,700" , rel: "stylesheet"}
|
8
8
|
%title="#{Settings['host']} [#{Settings.namespace}] #{APP_NAME}"
|
9
9
|
|
10
|
-
:css
|
11
|
-
|
12
|
-
h2 {
|
13
|
-
font-size: 1.5em;
|
14
|
-
margin-top: 2em;
|
15
|
-
}
|
16
|
-
|
17
|
-
#header {
|
18
|
-
padding: 20px auto;
|
19
|
-
border-bottom: 1px solid silver;
|
20
|
-
background-color: #eee;
|
21
|
-
}
|
22
|
-
|
23
|
-
.progress {
|
24
|
-
margin-bottom: 0;
|
25
|
-
}
|
26
|
-
|
27
10
|
%body
|
28
11
|
|
29
12
|
.navbar.navbar-default.navbar-fixed
|
@@ -39,38 +22,10 @@
|
|
39
22
|
|
40
23
|
.container
|
41
24
|
|
42
|
-
|
43
|
-
.btn-group.btn-group-sm
|
44
|
-
.btn.btn-default.btn-success Processors
|
45
|
-
.btn.btn-default= @info_procs
|
46
|
-
|
47
|
-
.btn-group.btn-group-sm
|
48
|
-
.btn.btn-default.btn-success IP
|
49
|
-
.btn.btn-default= @info_ipaddr
|
50
|
-
|
51
|
-
.btn-group.btn-group-sm
|
52
|
-
.btn.btn-default.btn-success Host
|
53
|
-
.btn.btn-default= Settings['host']
|
54
|
-
|
55
|
-
.btn-group.btn-group-sm
|
56
|
-
.btn.btn-default.btn-warning Load
|
57
|
-
.btn.btn-default= @info_load.round(1)
|
58
|
-
|
59
|
-
.btn-group.btn-group-sm
|
60
|
-
.btn.btn-default.btn-warning CPU
|
61
|
-
.btn.btn-default= "#{@info_norm} %"
|
62
|
-
|
63
|
-
.btn-group.btn-group-sm
|
64
|
-
.btn.btn-default.btn-warning Free
|
65
|
-
.btn.btn-default= @info_memfree
|
66
|
-
|
67
|
-
.btn-group.btn-group-sm
|
68
|
-
.btn.btn-default.btn-info Transferred
|
69
|
-
.btn.btn-default= Helpers.format_bytes(trans, "B")
|
70
|
-
|
25
|
+
= render :dashboard_headers
|
71
26
|
|
72
27
|
.row
|
73
|
-
.col-md-
|
28
|
+
.col-md-12
|
74
29
|
|
75
30
|
%h2
|
76
31
|
Jobs
|
@@ -88,13 +43,14 @@
|
|
88
43
|
%table.table.table-striped.table-hover.table-condensed
|
89
44
|
%tr
|
90
45
|
%th JID
|
91
|
-
%th
|
92
|
-
%th
|
46
|
+
%th P
|
47
|
+
%th W
|
93
48
|
%th source
|
94
49
|
%th target
|
50
|
+
%th started
|
95
51
|
%th status
|
96
|
-
%th error
|
97
52
|
%th progress
|
53
|
+
%th error
|
98
54
|
%th.text-right size
|
99
55
|
%th.text-right bitrate
|
100
56
|
|
@@ -106,10 +62,15 @@
|
|
106
62
|
= render :dashboard_jobs, {jobs: @jobs_popped, counts: @counts}
|
107
63
|
|
108
64
|
|
109
|
-
.col-md-2
|
110
|
-
= render :dashboard_workers, {}
|
111
65
|
|
112
|
-
|
66
|
+
.row
|
67
|
+
.col-md-7
|
68
|
+
= render :dashboard_tokens, {tokens: Settings.endpoints || {}}
|
69
|
+
|
70
|
+
.col-md-3
|
71
|
+
= render :dashboard_workers
|
72
|
+
|
73
|
+
.col-md-2
|
74
|
+
= render :dashboard_counters
|
113
75
|
|
114
|
-
%br
|
115
76
|
%br
|
@@ -0,0 +1,29 @@
|
|
1
|
+
- trans = $queue.counter_get :transferred
|
2
|
+
.btn-group.btn-group-sm
|
3
|
+
.btn.btn-default.btn-success Processors
|
4
|
+
.btn.btn-default= @info_procs
|
5
|
+
|
6
|
+
.btn-group.btn-group-sm
|
7
|
+
.btn.btn-default.btn-success IP
|
8
|
+
.btn.btn-default= @info_ipaddr
|
9
|
+
|
10
|
+
.btn-group.btn-group-sm
|
11
|
+
.btn.btn-default.btn-success Host
|
12
|
+
.btn.btn-default= Settings['host']
|
13
|
+
|
14
|
+
.btn-group.btn-group-sm
|
15
|
+
.btn.btn-default.btn-warning Load
|
16
|
+
.btn.btn-default= @info_load.round(1)
|
17
|
+
|
18
|
+
.btn-group.btn-group-sm
|
19
|
+
.btn.btn-default.btn-warning CPU
|
20
|
+
.btn.btn-default= "#{@info_norm} %"
|
21
|
+
|
22
|
+
.btn-group.btn-group-sm
|
23
|
+
.btn.btn-default.btn-warning Free
|
24
|
+
.btn.btn-default= @info_memfree
|
25
|
+
|
26
|
+
.btn-group.btn-group-sm
|
27
|
+
.btn.btn-default.btn-info Transferred
|
28
|
+
.btn.btn-default= Helpers.format_bytes(trans, "B")
|
29
|
+
|
@@ -1,45 +1,51 @@
|
|
1
1
|
- jobs.each do |job|
|
2
|
-
- error = job.get :error
|
3
|
-
- status = job.get :status
|
4
2
|
- size = job.get :transfer_total
|
5
3
|
- progress = job.get :progress
|
6
|
-
-
|
7
|
-
-
|
4
|
+
- source_count = job.get(:source_count) || 0
|
5
|
+
- source_processed = job.get(:source_processed) || 0
|
6
|
+
- source_processing = job.get(:source_processing)
|
7
|
+
- presented = present job, :with => RestFtpDaemon::API::Entities::JobPresenter, hide_params: true
|
8
8
|
|
9
|
-
- if
|
9
|
+
- if !job.error.nil?
|
10
10
|
- trclass = "danger"
|
11
|
-
- elsif status == :uploading
|
11
|
+
- elsif job.status == :uploading
|
12
12
|
- trclass = "info"
|
13
|
-
- elsif status == :finished
|
13
|
+
- elsif job.status == :finished
|
14
14
|
- trclass = "success"
|
15
15
|
- else
|
16
16
|
- trclass = "warning"
|
17
17
|
|
18
|
+
|
18
19
|
%tr{class: trclass}
|
19
20
|
|
20
|
-
%td= job.id
|
21
|
+
%td{title: presented.to_json}= job.id
|
22
|
+
|
23
|
+
%td
|
24
|
+
- unless job.priority.nil?
|
25
|
+
= job.priority
|
26
|
+
|
27
|
+
%td
|
21
28
|
|
22
|
-
%td= job.get :priority
|
23
29
|
|
24
|
-
|
30
|
+
- unless job.wid.nil?
|
31
|
+
.label.label-warning.flag= "w#{job.wid}"
|
25
32
|
|
26
|
-
%td
|
27
|
-
|
28
|
-
= job.
|
33
|
+
%td{title: job.get(:source_path)}
|
34
|
+
=# Helpers.job_method_label job.get(:source_method)
|
35
|
+
= Helpers.highlight_tokens job.source
|
29
36
|
|
30
|
-
%td
|
37
|
+
%td{title: job.get(:target_url)}
|
31
38
|
= Helpers.job_method_label job.get(:target_method)
|
32
|
-
|
39
|
+
=# job.target
|
40
|
+
= Helpers.highlight_tokens job.target
|
33
41
|
|
34
42
|
%td
|
35
|
-
=
|
36
|
-
- if (transfer_source_count > 0) #&& (transfer_source_done < transfer_source_count)
|
37
|
-
%small= " #{transfer_source_done}/#{transfer_source_count}"
|
43
|
+
= Helpers.datetime_short(job.started_at)
|
38
44
|
|
39
45
|
%td
|
40
|
-
=
|
41
|
-
-
|
42
|
-
%small= "#{
|
46
|
+
= job.status
|
47
|
+
- if (source_count > 1) && (source_processed < source_count)
|
48
|
+
%small= " #{source_processed}/#{source_count}"
|
43
49
|
|
44
50
|
%td
|
45
51
|
- unless progress.nil?
|
@@ -47,6 +53,15 @@
|
|
47
53
|
.progress-bar{style:"width: #{progress}%;"}
|
48
54
|
= Helpers.format_bytes job.get(:transfer_sent), "B"
|
49
55
|
|
56
|
+
%td
|
57
|
+
- unless job.error || job.status == :finished
|
58
|
+
- unless progress.nil?
|
59
|
+
= "#{progress}%"
|
60
|
+
- unless source_processing.nil?
|
61
|
+
%small= " (#{source_processing})"
|
62
|
+
- else
|
63
|
+
= Helpers.text_or_empty(job.error)
|
64
|
+
|
50
65
|
%td.nobr.text-right
|
51
66
|
= Helpers.format_bytes(size, "B")
|
52
67
|
|
@@ -54,3 +69,4 @@
|
|
54
69
|
- if (bitrate = job.get :transfer_bitrate)
|
55
70
|
= Helpers.format_bytes(bitrate, "bps")
|
56
71
|
|
72
|
+
|
@@ -1,45 +1,29 @@
|
|
1
1
|
- styles = {waiting: :success, processing: :info, crashed: :error, done: :success }
|
2
2
|
|
3
|
-
%h2
|
4
|
-
Workers
|
5
|
-
= " "
|
6
|
-
|
7
|
-
.btn-group.btn-group-md
|
8
|
-
.btn.btn-default
|
9
|
-
= Settings.workers
|
10
|
-
|
3
|
+
%h2 Workers
|
11
4
|
|
12
5
|
%table.table.table-striped.table-hover.table-condensed
|
13
6
|
|
14
7
|
%tr
|
15
|
-
%th
|
16
|
-
%th
|
17
|
-
%th
|
18
|
-
%th
|
8
|
+
%th ID
|
9
|
+
%th status
|
10
|
+
%th job
|
11
|
+
%th.text-right idle
|
19
12
|
|
20
13
|
- @gworker_statuses.each do |wid, infos|
|
21
14
|
- status = infos[:status]
|
15
|
+
- style = styles[status] || ""
|
16
|
+
|
22
17
|
- if infos[:active_at].is_a? Time
|
23
18
|
- no_news_for = (Time.now - infos[:active_at]).round(0)
|
24
19
|
- else
|
25
20
|
- no_news_for = "?"
|
26
21
|
|
27
|
-
-# status = :waiting
|
28
|
-
- style = styles[status] || ""
|
29
|
-
-# style = "success"
|
30
|
-
|
31
22
|
%tr{class: style.to_s}
|
32
|
-
|
33
23
|
%td= wid
|
34
24
|
%td= infos[:status]
|
35
25
|
%td= infos[:jobid]
|
36
|
-
%td
|
26
|
+
%td.text-right
|
37
27
|
= no_news_for
|
38
|
-
|
39
|
-
%h2 Counters
|
40
|
-
- $queue.counters.each do |name, value|
|
41
|
-
%b= "#{name}"
|
42
|
-
= value
|
43
|
-
%br
|
44
|
-
|
28
|
+
s
|
45
29
|
|