runit-man 1.7.4 → 1.8.0
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.
- data/i18n/en.yml +13 -0
- data/i18n/ru.yml +13 -0
- data/lib/runit-man/helpers.rb +84 -76
- data/lib/runit-man/service_info.rb +233 -222
- data/public/css/runit-man.css +21 -21
- data/public/js/runit-man.js +66 -66
- data/views/_service_info.erb +4 -1
- data/views/_service_signal.erb +3 -0
- metadata +5 -4
data/i18n/en.yml
CHANGED
@@ -32,6 +32,19 @@ runit:
|
|
32
32
|
restart: Restart
|
33
33
|
switch_down: Deactivate
|
34
34
|
switch_up: Activate
|
35
|
+
signals:
|
36
|
+
t: TERM
|
37
|
+
k: KILL
|
38
|
+
i: INT
|
39
|
+
1: USR1
|
40
|
+
2: USR2
|
41
|
+
a: ALARM
|
42
|
+
q: QUIT
|
43
|
+
x: EXIT
|
44
|
+
p: PAUSE
|
45
|
+
c: CONT
|
46
|
+
h: HUP
|
47
|
+
o: ONCE
|
35
48
|
log:
|
36
49
|
title: "Tail %3 lines of service %1 log - %2"
|
37
50
|
header: "Tail %3 lines of service <strong>%1</strong> log: %2 (<code>%4</code>)"
|
data/i18n/ru.yml
CHANGED
@@ -34,6 +34,19 @@ runit:
|
|
34
34
|
restart: Перезапустить
|
35
35
|
switch_down: Выключить
|
36
36
|
switch_up: Включить
|
37
|
+
signals:
|
38
|
+
t: TERM
|
39
|
+
k: KILL
|
40
|
+
i: INT
|
41
|
+
1: USR1
|
42
|
+
2: USR2
|
43
|
+
a: ALARM
|
44
|
+
q: QUIT
|
45
|
+
x: EXIT
|
46
|
+
p: PAUSE
|
47
|
+
c: CONT
|
48
|
+
h: HUP
|
49
|
+
o: ONCE
|
37
50
|
log:
|
38
51
|
title: "Последние %3 строк лога сервиса %1 - %2"
|
39
52
|
header: "Последние %3 строк лога сервиса <strong>%1</strong>: %2 (<code>%4</code>)"
|
data/lib/runit-man/helpers.rb
CHANGED
@@ -1,76 +1,84 @@
|
|
1
|
-
require 'socket'
|
2
|
-
require 'runit-man/service_info'
|
3
|
-
require 'runit-man/partials'
|
4
|
-
require 'sinatra/content_for'
|
5
|
-
|
6
|
-
module Helpers
|
7
|
-
include Rack::Utils
|
8
|
-
include Sinatra::Partials
|
9
|
-
include Sinatra::ContentFor
|
10
|
-
alias_method :h, :escape_html
|
11
|
-
|
12
|
-
attr_accessor :even_or_odd_state
|
13
|
-
|
14
|
-
def host_name
|
15
|
-
unless @host_name
|
16
|
-
begin
|
17
|
-
@host_name = Socket.gethostbyname(Socket.gethostname).first
|
18
|
-
rescue
|
19
|
-
@host_name = Socket.gethostname
|
20
|
-
end
|
21
|
-
end
|
22
|
-
@host_name
|
23
|
-
end
|
24
|
-
|
25
|
-
def service_infos
|
26
|
-
ServiceInfo.all
|
27
|
-
end
|
28
|
-
|
29
|
-
def files_to_view
|
30
|
-
RunitMan.files_to_view.map do |f|
|
31
|
-
File.symlink?(f) ? File.expand_path(File.readlink(f), File.dirname(f)) : f
|
32
|
-
end.select do |f|
|
33
|
-
File.readable?(f)
|
34
|
-
end.uniq.sort
|
35
|
-
end
|
36
|
-
|
37
|
-
def all_files_to_view
|
38
|
-
(files_to_view + service_infos.map do |service|
|
39
|
-
service.files_to_view
|
40
|
-
end.flatten).uniq.sort
|
41
|
-
end
|
42
|
-
|
43
|
-
def service_action(name, action, label)
|
44
|
-
partial :service_action, :locals => {
|
45
|
-
:name => name,
|
46
|
-
:action => action,
|
47
|
-
:label => label
|
48
|
-
}
|
49
|
-
end
|
50
|
-
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
1
|
+
require 'socket'
|
2
|
+
require 'runit-man/service_info'
|
3
|
+
require 'runit-man/partials'
|
4
|
+
require 'sinatra/content_for'
|
5
|
+
|
6
|
+
module Helpers
|
7
|
+
include Rack::Utils
|
8
|
+
include Sinatra::Partials
|
9
|
+
include Sinatra::ContentFor
|
10
|
+
alias_method :h, :escape_html
|
11
|
+
|
12
|
+
attr_accessor :even_or_odd_state
|
13
|
+
|
14
|
+
def host_name
|
15
|
+
unless @host_name
|
16
|
+
begin
|
17
|
+
@host_name = Socket.gethostbyname(Socket.gethostname).first
|
18
|
+
rescue
|
19
|
+
@host_name = Socket.gethostname
|
20
|
+
end
|
21
|
+
end
|
22
|
+
@host_name
|
23
|
+
end
|
24
|
+
|
25
|
+
def service_infos
|
26
|
+
ServiceInfo.all
|
27
|
+
end
|
28
|
+
|
29
|
+
def files_to_view
|
30
|
+
RunitMan.files_to_view.map do |f|
|
31
|
+
File.symlink?(f) ? File.expand_path(File.readlink(f), File.dirname(f)) : f
|
32
|
+
end.select do |f|
|
33
|
+
File.readable?(f)
|
34
|
+
end.uniq.sort
|
35
|
+
end
|
36
|
+
|
37
|
+
def all_files_to_view
|
38
|
+
(files_to_view + service_infos.map do |service|
|
39
|
+
service.files_to_view
|
40
|
+
end.flatten).uniq.sort
|
41
|
+
end
|
42
|
+
|
43
|
+
def service_action(name, action, label)
|
44
|
+
partial :service_action, :locals => {
|
45
|
+
:name => name,
|
46
|
+
:action => action,
|
47
|
+
:label => label
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def service_signal(name, signal, label)
|
52
|
+
partial :service_signal, :locals => {
|
53
|
+
:name => name,
|
54
|
+
:signal => signal,
|
55
|
+
:label => label
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def log_link(name, options = {})
|
60
|
+
count = (options[:count] || 100).to_i
|
61
|
+
title = options[:title].to_s || count
|
62
|
+
blank = options[:blank] || false
|
63
|
+
hint = options[:hint].to_s || ''
|
64
|
+
raw = options[:raw] || false
|
65
|
+
hint = " title=\"#{h(hint)}\"" unless hint.empty?
|
66
|
+
blank = blank ? ' target="_blank"' : ''
|
67
|
+
"<a#{hint}#{blank} href=\"/#{h(name)}/log#{ (count != 100) ? "/#{count}" : '' }#{ raw ? '.txt' : '' }#footer\">#{h(title)}</a>"
|
68
|
+
end
|
69
|
+
|
70
|
+
def even_or_odd
|
71
|
+
self.even_or_odd_state = !even_or_odd_state
|
72
|
+
even_or_odd_state
|
73
|
+
end
|
74
|
+
|
75
|
+
def stat_subst(s)
|
76
|
+
s.split(/\s/).map do |s|
|
77
|
+
if s =~ /(\w+)/ && t.runit.services.table.subst[$1].translated?
|
78
|
+
s.sub(/\w+/, t.runit.services.table.subst[$1].to_s)
|
79
|
+
else
|
80
|
+
s
|
81
|
+
end
|
82
|
+
end.join(' ')
|
83
|
+
end
|
84
|
+
end
|
@@ -1,222 +1,233 @@
|
|
1
|
-
require 'runit-man/log_location_cache'
|
2
|
-
require 'runit-man/service_status'
|
3
|
-
|
4
|
-
class ServiceInfo
|
5
|
-
attr_reader :name
|
6
|
-
|
7
|
-
def initialize(a_name)
|
8
|
-
@name = a_name
|
9
|
-
@files = {}
|
10
|
-
|
11
|
-
@status = ServiceStatus.new(data_from_file(File.join(supervise_folder, 'status')))
|
12
|
-
@log_status = ServiceStatus.new(data_from_file(File.join(log_supervise_folder, 'status')))
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_json(*a)
|
16
|
-
data = {}
|
17
|
-
[
|
18
|
-
:name, :stat, :active?, :logged?, :switchable?,
|
19
|
-
:log_file_location, :log_pid
|
20
|
-
].each do |sym|
|
21
|
-
data[sym] = send(sym)
|
22
|
-
end
|
23
|
-
|
24
|
-
[
|
25
|
-
:run?, :pid, :finish?, :down?,
|
26
|
-
:want_up?, :want_down?, :got_term?,
|
27
|
-
:started_at, :uptime
|
28
|
-
].each do |sym|
|
29
|
-
data[sym] = @status.send(sym)
|
30
|
-
end
|
31
|
-
data.to_json(*a)
|
32
|
-
end
|
33
|
-
|
34
|
-
def logged?
|
35
|
-
File.directory?(log_supervise_folder)
|
36
|
-
end
|
37
|
-
|
38
|
-
def stat
|
39
|
-
r = data_from_file(File.join(supervise_folder, 'stat'))
|
40
|
-
r ? r : 'inactive'
|
41
|
-
end
|
42
|
-
|
43
|
-
def active?
|
44
|
-
File.directory?(active_service_folder) || File.symlink?(active_service_folder)
|
45
|
-
end
|
46
|
-
|
47
|
-
def switchable?
|
48
|
-
File.symlink?(active_service_folder) || File.directory?(inactive_service_folder)
|
49
|
-
end
|
50
|
-
|
51
|
-
def down?
|
52
|
-
@status.down?
|
53
|
-
end
|
54
|
-
|
55
|
-
def run?
|
56
|
-
@status.run?
|
57
|
-
end
|
58
|
-
|
59
|
-
def up!
|
60
|
-
send_signal :u
|
61
|
-
end
|
62
|
-
|
63
|
-
def down!
|
64
|
-
send_signal :d
|
65
|
-
end
|
66
|
-
|
67
|
-
def switch_down!
|
68
|
-
down!
|
69
|
-
File.unlink(active_service_folder)
|
70
|
-
end
|
71
|
-
|
72
|
-
def switch_up!
|
73
|
-
File.symlink(inactive_service_folder, active_service_folder)
|
74
|
-
end
|
75
|
-
|
76
|
-
def restart!
|
77
|
-
down!
|
78
|
-
up!
|
79
|
-
end
|
80
|
-
|
81
|
-
def pid
|
82
|
-
@status.pid
|
83
|
-
end
|
84
|
-
|
85
|
-
def uptime
|
86
|
-
@status.uptime
|
87
|
-
end
|
88
|
-
|
89
|
-
def log_pid
|
90
|
-
@log_status.pid
|
91
|
-
end
|
92
|
-
|
93
|
-
def log_file_location
|
94
|
-
rel_path =
|
95
|
-
return nil if rel_path.nil?
|
96
|
-
File.expand_path(rel_path, log_run_folder)
|
97
|
-
end
|
98
|
-
|
99
|
-
def send_signal(signal)
|
100
|
-
return unless supervise?
|
101
|
-
File.open(File.join(supervise_folder, 'control'), 'w') do |f|
|
102
|
-
f.print signal.to_s
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def files_to_view
|
107
|
-
return [] unless File.directory?(files_to_view_folder)
|
108
|
-
Dir.entries(files_to_view_folder).select do |name|
|
109
|
-
File.symlink?(File.join(files_to_view_folder, name))
|
110
|
-
end.map do |name|
|
111
|
-
File.expand_path(
|
112
|
-
File.readlink(File.join(files_to_view_folder, name)),
|
113
|
-
files_to_view_folder
|
114
|
-
)
|
115
|
-
end.select do |file_path|
|
116
|
-
File.file?(file_path)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def urls_to_view
|
121
|
-
return [] unless File.directory?(urls_to_view_folder)
|
122
|
-
Dir.entries(urls_to_view_folder).select do |name|
|
123
|
-
name =~ /\.url$/ && File.file?(File.join(urls_to_view_folder, name))
|
124
|
-
end.map do |name|
|
125
|
-
data_from_file(File.join(urls_to_view_folder, name))
|
126
|
-
end.select do |url|
|
127
|
-
!url.nil?
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
end
|
186
|
-
|
187
|
-
def
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
1
|
+
require 'runit-man/log_location_cache'
|
2
|
+
require 'runit-man/service_status'
|
3
|
+
|
4
|
+
class ServiceInfo
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
def initialize(a_name)
|
8
|
+
@name = a_name
|
9
|
+
@files = {}
|
10
|
+
|
11
|
+
@status = ServiceStatus.new(data_from_file(File.join(supervise_folder, 'status')))
|
12
|
+
@log_status = ServiceStatus.new(data_from_file(File.join(log_supervise_folder, 'status')))
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_json(*a)
|
16
|
+
data = {}
|
17
|
+
[
|
18
|
+
:name, :stat, :active?, :logged?, :switchable?,
|
19
|
+
:log_file_location, :log_pid
|
20
|
+
].each do |sym|
|
21
|
+
data[sym] = send(sym)
|
22
|
+
end
|
23
|
+
|
24
|
+
[
|
25
|
+
:run?, :pid, :finish?, :down?,
|
26
|
+
:want_up?, :want_down?, :got_term?,
|
27
|
+
:started_at, :uptime
|
28
|
+
].each do |sym|
|
29
|
+
data[sym] = @status.send(sym)
|
30
|
+
end
|
31
|
+
data.to_json(*a)
|
32
|
+
end
|
33
|
+
|
34
|
+
def logged?
|
35
|
+
File.directory?(log_supervise_folder)
|
36
|
+
end
|
37
|
+
|
38
|
+
def stat
|
39
|
+
r = data_from_file(File.join(supervise_folder, 'stat'))
|
40
|
+
r ? r : 'inactive'
|
41
|
+
end
|
42
|
+
|
43
|
+
def active?
|
44
|
+
File.directory?(active_service_folder) || File.symlink?(active_service_folder)
|
45
|
+
end
|
46
|
+
|
47
|
+
def switchable?
|
48
|
+
File.symlink?(active_service_folder) || File.directory?(inactive_service_folder)
|
49
|
+
end
|
50
|
+
|
51
|
+
def down?
|
52
|
+
@status.down?
|
53
|
+
end
|
54
|
+
|
55
|
+
def run?
|
56
|
+
@status.run?
|
57
|
+
end
|
58
|
+
|
59
|
+
def up!
|
60
|
+
send_signal :u
|
61
|
+
end
|
62
|
+
|
63
|
+
def down!
|
64
|
+
send_signal :d
|
65
|
+
end
|
66
|
+
|
67
|
+
def switch_down!
|
68
|
+
down!
|
69
|
+
File.unlink(active_service_folder)
|
70
|
+
end
|
71
|
+
|
72
|
+
def switch_up!
|
73
|
+
File.symlink(inactive_service_folder, active_service_folder)
|
74
|
+
end
|
75
|
+
|
76
|
+
def restart!
|
77
|
+
down!
|
78
|
+
up!
|
79
|
+
end
|
80
|
+
|
81
|
+
def pid
|
82
|
+
@status.pid
|
83
|
+
end
|
84
|
+
|
85
|
+
def uptime
|
86
|
+
@status.uptime
|
87
|
+
end
|
88
|
+
|
89
|
+
def log_pid
|
90
|
+
@log_status.pid
|
91
|
+
end
|
92
|
+
|
93
|
+
def log_file_location
|
94
|
+
rel_path = ServiceInfo.log_location_cache[log_pid]
|
95
|
+
return nil if rel_path.nil?
|
96
|
+
File.expand_path(rel_path, log_run_folder)
|
97
|
+
end
|
98
|
+
|
99
|
+
def send_signal(signal)
|
100
|
+
return unless supervise?
|
101
|
+
File.open(File.join(supervise_folder, 'control'), 'w') do |f|
|
102
|
+
f.print signal.to_s
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def files_to_view
|
107
|
+
return [] unless File.directory?(files_to_view_folder)
|
108
|
+
Dir.entries(files_to_view_folder).select do |name|
|
109
|
+
File.symlink?(File.join(files_to_view_folder, name))
|
110
|
+
end.map do |name|
|
111
|
+
File.expand_path(
|
112
|
+
File.readlink(File.join(files_to_view_folder, name)),
|
113
|
+
files_to_view_folder
|
114
|
+
)
|
115
|
+
end.select do |file_path|
|
116
|
+
File.file?(file_path)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def urls_to_view
|
121
|
+
return [] unless File.directory?(urls_to_view_folder)
|
122
|
+
Dir.entries(urls_to_view_folder).select do |name|
|
123
|
+
name =~ /\.url$/ && File.file?(File.join(urls_to_view_folder, name))
|
124
|
+
end.map do |name|
|
125
|
+
data_from_file(File.join(urls_to_view_folder, name))
|
126
|
+
end.select do |url|
|
127
|
+
!url.nil?
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def allowed_signals
|
132
|
+
return [] unless File.directory?(allowed_signals_folder)
|
133
|
+
Dir.entries(allowed_signals_folder).reject do |name|
|
134
|
+
ServiceInfo.itself_or_parent?(name)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
private
|
139
|
+
def inactive_service_folder
|
140
|
+
File.join(RunitMan.all_services_directory, name)
|
141
|
+
end
|
142
|
+
|
143
|
+
def active_service_folder
|
144
|
+
File.join(RunitMan.active_services_directory, name)
|
145
|
+
end
|
146
|
+
|
147
|
+
def files_to_view_folder
|
148
|
+
File.join(active_service_folder, 'runit-man', 'files-to-view')
|
149
|
+
end
|
150
|
+
|
151
|
+
def urls_to_view_folder
|
152
|
+
File.join(active_service_folder, 'runit-man', 'urls-to-view')
|
153
|
+
end
|
154
|
+
|
155
|
+
def allowed_signals_folder
|
156
|
+
File.join(active_service_folder, 'runit-man', 'allowed-signals')
|
157
|
+
end
|
158
|
+
|
159
|
+
def supervise_folder
|
160
|
+
File.join(active_service_folder, 'supervise')
|
161
|
+
end
|
162
|
+
|
163
|
+
def log_run_folder
|
164
|
+
File.join(active_service_folder, 'log')
|
165
|
+
end
|
166
|
+
|
167
|
+
def log_supervise_folder
|
168
|
+
File.join(log_run_folder, 'supervise')
|
169
|
+
end
|
170
|
+
|
171
|
+
def supervise?
|
172
|
+
File.directory?(supervise_folder)
|
173
|
+
end
|
174
|
+
|
175
|
+
def data_from_file(file_name)
|
176
|
+
return @files[file_name] if @files.include?(file_name)
|
177
|
+
@files[file_name] = ServiceInfo.real_data_from_file(file_name)
|
178
|
+
end
|
179
|
+
|
180
|
+
class << self
|
181
|
+
def all
|
182
|
+
all_service_names.sort.map do |name|
|
183
|
+
ServiceInfo.new(name)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def [](name)
|
188
|
+
all_service_names.include?(name) ? ServiceInfo.new(name) : nil
|
189
|
+
end
|
190
|
+
|
191
|
+
def log_location_cache
|
192
|
+
unless @log_location_cache
|
193
|
+
@log_location_cache = LogLocationCache.new
|
194
|
+
end
|
195
|
+
@log_location_cache
|
196
|
+
end
|
197
|
+
|
198
|
+
def real_data_from_file(file_name)
|
199
|
+
return nil unless File.readable?(file_name)
|
200
|
+
data = IO.read(file_name)
|
201
|
+
data.chomp! unless data.nil?
|
202
|
+
data.empty? ? nil : data
|
203
|
+
end
|
204
|
+
|
205
|
+
def itself_or_parent?(name)
|
206
|
+
name == '.' || name == '..'
|
207
|
+
end
|
208
|
+
|
209
|
+
private
|
210
|
+
def active_service_names
|
211
|
+
return [] unless File.directory?(RunitMan.active_services_directory)
|
212
|
+
Dir.entries(RunitMan.active_services_directory).reject do |name|
|
213
|
+
full_name = File.join(RunitMan.active_services_directory, name)
|
214
|
+
itself_or_parent?(name) || (!File.symlink?(full_name) && !File.directory?(full_name))
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def inactive_service_names
|
219
|
+
return [] unless File.directory?(RunitMan.all_services_directory)
|
220
|
+
actives = active_service_names
|
221
|
+
Dir.entries(RunitMan.all_services_directory).reject do |name|
|
222
|
+
full_name = File.join(RunitMan.all_services_directory, name)
|
223
|
+
itself_or_parent?(name) || !File.directory?(full_name) || actives.include?(name)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def all_service_names
|
228
|
+
(active_service_names + inactive_service_names)
|
229
|
+
end
|
230
|
+
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
data/public/css/runit-man.css
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
form.service-action
|
2
|
-
{
|
3
|
-
display: inline;
|
4
|
-
}
|
5
|
-
#container{margin:0 auto;border-top:0;width:900px;border-top:0;}
|
6
|
-
.content{position:relative;padding: 16px 0;color:#c0baba;font-size:1.27em;line-height:1.7}
|
7
|
-
.content:after{content:".";display:block;height:0;clear:both;visibility:hidden;}
|
8
|
-
.content{display:inline-block;}
|
9
|
-
/* \*/ * html .content{height:1%;}.content{display:block;}/* */
|
1
|
+
form.service-action, form.service-signal
|
2
|
+
{
|
3
|
+
display: inline;
|
4
|
+
}
|
5
|
+
#container{margin:0 auto;border-top:0;width:900px;border-top:0;}
|
6
|
+
.content{position:relative;padding: 16px 0;color:#c0baba;font-size:1.27em;line-height:1.7}
|
7
|
+
.content:after{content:".";display:block;height:0;clear:both;visibility:hidden;}
|
8
|
+
.content{display:inline-block;}
|
9
|
+
/* \*/ * html .content{height:1%;}.content{display:block;}/* */
|
10
|
+
|
11
|
+
#error { display: none; }
|
12
|
+
.error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;}
|
13
|
+
.error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;}
|
14
|
+
.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;}
|
15
|
+
.success {background:#E6EFC2;color:#264409;border-color:#C6D880;}
|
16
|
+
.error a {color:#8a1f11;}
|
17
|
+
.notice a {color:#514721;}
|
18
|
+
.success a {color:#264409;}
|
10
19
|
|
11
|
-
|
12
|
-
.
|
13
|
-
.
|
14
|
-
.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;}
|
15
|
-
.success {background:#E6EFC2;color:#264409;border-color:#C6D880;}
|
16
|
-
.error a {color:#8a1f11;}
|
17
|
-
.notice a {color:#514721;}
|
18
|
-
.success a {color:#264409;}
|
19
|
-
|
20
|
-
span.inactive {color:#gray;}
|
21
|
-
span.down {color:#8a1f11;}
|
22
|
-
span.run {color:#264409;}
|
20
|
+
span.inactive {color:#gray;}
|
21
|
+
span.down {color:#8a1f11;}
|
22
|
+
span.run {color:#264409;}
|
data/public/js/runit-man.js
CHANGED
@@ -1,66 +1,66 @@
|
|
1
|
-
(function($)
|
2
|
-
{
|
3
|
-
var REFRESH_SERVICES_TIMEOUT = 5000;
|
4
|
-
|
5
|
-
$.ajaxSetup({
|
6
|
-
error: function(e, req, options, error)
|
7
|
-
{
|
8
|
-
$('#url').text(settings.url);
|
9
|
-
$('#error').show();
|
10
|
-
}
|
11
|
-
});
|
12
|
-
|
13
|
-
var needRefreshServices;
|
14
|
-
var refreshServices = function()
|
15
|
-
{
|
16
|
-
refreshServices.timer = null;
|
17
|
-
$.ajax({
|
18
|
-
url: '/services',
|
19
|
-
cache: false,
|
20
|
-
error: function()
|
21
|
-
{
|
22
|
-
$('#url').text('/services');
|
23
|
-
$('#error').show();
|
24
|
-
},
|
25
|
-
success: function(html)
|
26
|
-
{
|
27
|
-
$('#error').hide();
|
28
|
-
$('#services').html(html);
|
29
|
-
},
|
30
|
-
complete: function()
|
31
|
-
{
|
32
|
-
needRefreshServices(false);
|
33
|
-
}
|
34
|
-
});
|
35
|
-
};
|
36
|
-
|
37
|
-
needRefreshServices = function(now)
|
38
|
-
{
|
39
|
-
if (refreshServices.timer != null)
|
40
|
-
{
|
41
|
-
clearTimeout(refreshServices.timer);
|
42
|
-
refreshServices.timer = null;
|
43
|
-
}
|
44
|
-
if (now)
|
45
|
-
{
|
46
|
-
refreshServices();
|
47
|
-
}
|
48
|
-
else
|
49
|
-
{
|
50
|
-
refreshServices.timer = setTimeout(refreshServices, REFRESH_SERVICES_TIMEOUT);
|
51
|
-
}
|
52
|
-
};
|
53
|
-
|
54
|
-
$('#services').delegate('form.service-action', 'submit', function()
|
55
|
-
{
|
56
|
-
$.post($(this).attr('action'), function(data)
|
57
|
-
{
|
58
|
-
needRefreshServices(true);
|
59
|
-
});
|
60
|
-
return false;
|
61
|
-
});
|
62
|
-
|
63
|
-
$('#service-refresh-interval').text(REFRESH_SERVICES_TIMEOUT / 1000);
|
64
|
-
|
65
|
-
needRefreshServices(true);
|
66
|
-
})(jQuery);
|
1
|
+
(function($)
|
2
|
+
{
|
3
|
+
var REFRESH_SERVICES_TIMEOUT = 5000;
|
4
|
+
|
5
|
+
$.ajaxSetup({
|
6
|
+
error: function(e, req, options, error)
|
7
|
+
{
|
8
|
+
$('#url').text(settings.url);
|
9
|
+
$('#error').show();
|
10
|
+
}
|
11
|
+
});
|
12
|
+
|
13
|
+
var needRefreshServices;
|
14
|
+
var refreshServices = function()
|
15
|
+
{
|
16
|
+
refreshServices.timer = null;
|
17
|
+
$.ajax({
|
18
|
+
url: '/services',
|
19
|
+
cache: false,
|
20
|
+
error: function()
|
21
|
+
{
|
22
|
+
$('#url').text('/services');
|
23
|
+
$('#error').show();
|
24
|
+
},
|
25
|
+
success: function(html)
|
26
|
+
{
|
27
|
+
$('#error').hide();
|
28
|
+
$('#services').html(html);
|
29
|
+
},
|
30
|
+
complete: function()
|
31
|
+
{
|
32
|
+
needRefreshServices(false);
|
33
|
+
}
|
34
|
+
});
|
35
|
+
};
|
36
|
+
|
37
|
+
needRefreshServices = function(now)
|
38
|
+
{
|
39
|
+
if (refreshServices.timer != null)
|
40
|
+
{
|
41
|
+
clearTimeout(refreshServices.timer);
|
42
|
+
refreshServices.timer = null;
|
43
|
+
}
|
44
|
+
if (now)
|
45
|
+
{
|
46
|
+
refreshServices();
|
47
|
+
}
|
48
|
+
else
|
49
|
+
{
|
50
|
+
refreshServices.timer = setTimeout(refreshServices, REFRESH_SERVICES_TIMEOUT);
|
51
|
+
}
|
52
|
+
};
|
53
|
+
|
54
|
+
$('#services').delegate('form.service-action,form.service-signal', 'submit', function()
|
55
|
+
{
|
56
|
+
$.post($(this).attr('action'), function(data)
|
57
|
+
{
|
58
|
+
needRefreshServices(true);
|
59
|
+
});
|
60
|
+
return false;
|
61
|
+
});
|
62
|
+
|
63
|
+
$('#service-refresh-interval').text(REFRESH_SERVICES_TIMEOUT / 1000);
|
64
|
+
|
65
|
+
needRefreshServices(true);
|
66
|
+
})(jQuery);
|
data/views/_service_info.erb
CHANGED
@@ -11,6 +11,9 @@ need_second_row = !service_info.files_to_view.empty? || !service_info.urls_to_vi
|
|
11
11
|
<% unless service_info.down? %>
|
12
12
|
<%= service_action service_info.name, :restart, t.runit.services.table.actions.restart %>
|
13
13
|
<%= service_action service_info.name, :down, t.runit.services.table.actions.stop %>
|
14
|
+
<% service_info.allowed_signals.each do |signal| %>
|
15
|
+
<%= service_signal service_info.name, signal, t.runit.services.table.signals[signal] %>
|
16
|
+
<% end %>
|
14
17
|
<% else %>
|
15
18
|
<%= service_action service_info.name, :up, t.runit.services.table.actions.start %>
|
16
19
|
<% end %>
|
@@ -31,7 +34,7 @@ need_second_row = !service_info.files_to_view.empty? || !service_info.urls_to_vi
|
|
31
34
|
<% end %>
|
32
35
|
</td>
|
33
36
|
</tr>
|
34
|
-
<% if need_second_row %><tr><td colspan="
|
37
|
+
<% if need_second_row %><tr><td colspan="5">
|
35
38
|
<% unless service_info.files_to_view.empty? %>
|
36
39
|
<%= h(t.runit.services.table.values.files_to_view) %>:
|
37
40
|
<% service_info.files_to_view.each do |f| %>
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 1
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 1.
|
7
|
+
- 8
|
8
|
+
- 0
|
9
|
+
version: 1.8.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Akzhan Abdulin
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-25 00:00:00 +04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -150,6 +150,7 @@ files:
|
|
150
150
|
- views/layout.erb
|
151
151
|
- views/view_file.erb
|
152
152
|
- views/index.erb
|
153
|
+
- views/_service_signal.erb
|
153
154
|
- views/_services.erb
|
154
155
|
- views/_service_action.erb
|
155
156
|
- views/_service_info.erb
|