smartguard 0.2.10 → 0.3
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/bin/smartguard +167 -34
- data/bin/smartguardctl +70 -0
- data/lib/smartguard.rb +3 -0
- data/lib/smartguard/applications/smartkiosk/sidekiq.rb +7 -1
- data/lib/smartguard/applications/smartkiosk/smartware.rb +6 -1
- data/lib/smartguard/applications/smartkiosk/thin.rb +7 -3
- data/lib/smartguard/process.rb +1 -1
- data/lib/smartguard/process_manager.rb +3 -2
- data/lib/smartguard/version.rb +1 -1
- data/smartguard.gemspec +1 -1
- metadata +47 -16
data/bin/smartguard
CHANGED
@@ -1,63 +1,196 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'smartguard'
|
4
|
+
require 'trollop'
|
4
5
|
require 'colored'
|
5
|
-
require 'dante'
|
6
6
|
|
7
|
-
|
7
|
+
def start_application(application, opts, &block)
|
8
8
|
|
9
|
-
|
10
|
-
runner.description = "Smartkiosk services control daemon"
|
9
|
+
Smartguard::Logging.logger.info "Starting application"
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
unless opts[:pid].nil?
|
12
|
+
begin
|
13
|
+
File.open(opts[:pid], "w") do |io|
|
14
|
+
io.write Process.pid.to_s
|
15
|
+
end
|
16
|
+
rescue => e
|
17
|
+
Smartguard::Logging.logger.error "Unable to write pidfile: #{e}"
|
18
|
+
end
|
18
19
|
end
|
19
|
-
|
20
|
-
|
20
|
+
|
21
|
+
application = application.new opts[:path]
|
22
|
+
|
23
|
+
signal_handler = ->(signal) do
|
24
|
+
begin
|
25
|
+
if Smartguard.shutting_down
|
26
|
+
Smartguard::Logging.logger.info "Okay, okay."
|
27
|
+
else
|
28
|
+
Smartguard::Logging.logger.info "Catched signal, shutting down"
|
29
|
+
|
30
|
+
Smartguard.shutting_down = true
|
31
|
+
Smartguard::Logging.logger.info "Stopping services"
|
32
|
+
application.stop_services
|
33
|
+
end
|
34
|
+
|
35
|
+
rescue => e
|
36
|
+
Smartguard::Logging.logger.error "Shutdown failed: #{e}"
|
37
|
+
|
38
|
+
ensure
|
39
|
+
exit 1
|
40
|
+
end
|
21
41
|
end
|
22
42
|
|
23
|
-
|
24
|
-
|
43
|
+
trap :HUP, signal_handler
|
44
|
+
trap :INT, signal_handler
|
45
|
+
trap :QUIT, signal_handler
|
46
|
+
trap :PIPE, signal_handler
|
47
|
+
trap :TERM, signal_handler
|
48
|
+
Smartguard::ProcessManager.init
|
49
|
+
|
50
|
+
at_exit do
|
51
|
+
begin
|
52
|
+
Smartguard::Logging.logger.info "Killing any remaining processes"
|
53
|
+
ensure
|
54
|
+
Process.kill :KILL, 0
|
55
|
+
end
|
25
56
|
end
|
26
57
|
|
27
|
-
|
28
|
-
|
58
|
+
Smartguard::Logging.logger.info "Starting services"
|
59
|
+
|
60
|
+
begin
|
61
|
+
application.start_services do
|
62
|
+
Smartguard::Logging.logger.error "Startup failed, cleaning up and exiting"
|
63
|
+
application.stop_services
|
64
|
+
exit 1
|
65
|
+
end
|
66
|
+
rescue => e
|
67
|
+
Smartguard::Logging.logger.error "Exception catched during service startup: #{e}"
|
68
|
+
exit 1
|
29
69
|
end
|
30
70
|
|
31
|
-
|
32
|
-
|
71
|
+
Smartguard::Logging.logger.info "Services started"
|
72
|
+
|
73
|
+
DRb.start_service("druby://localhost:#{opts[:port]}", application)
|
74
|
+
Smartguard::Logging.logger.info "Smartguard ready"
|
75
|
+
|
76
|
+
yield if block_given?
|
77
|
+
|
78
|
+
DRb.thread.join
|
79
|
+
end
|
80
|
+
|
81
|
+
trap :TTIN do
|
82
|
+
Thread.list.each do |thread|
|
83
|
+
puts "Thread #{thread}:"
|
84
|
+
if thread.backtrace
|
85
|
+
puts thread.backtrace.join("\n")
|
86
|
+
else
|
87
|
+
puts "<no backtrace available>"
|
88
|
+
end
|
33
89
|
end
|
34
90
|
end
|
35
91
|
|
36
|
-
|
37
|
-
|
92
|
+
opts = Trollop.options do
|
93
|
+
version "Smartguard #{Smartguard::VERSION}"
|
38
94
|
|
39
|
-
|
95
|
+
opt :app, "Application to use", type: String
|
96
|
+
opt :path, "Path to application", type: String
|
97
|
+
opt :port, "Port to run DRB", default: 10000
|
98
|
+
opt :pid, "Pid file name", type: String
|
99
|
+
opt :log, "Log file name", type: String
|
100
|
+
opt :development, "Run in the development environment"
|
101
|
+
opt :daemon, "Daemonize Smartguard after initialization"
|
102
|
+
opt :kill, "Kill Smartguard by pidfile"
|
103
|
+
end
|
40
104
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
105
|
+
if opts[:kill]
|
106
|
+
Trollop::die :pid, "must be specified to kill" if opts[:pid].nil?
|
107
|
+
|
108
|
+
puts "Waiting for Smartguard to die."
|
109
|
+
begin
|
110
|
+
pid = File.read(opts[:pid]).to_i
|
111
|
+
|
112
|
+
Process.kill :TERM, pid
|
113
|
+
loop do
|
114
|
+
Process.kill 0, pid
|
115
|
+
sleep 0.5
|
46
116
|
end
|
117
|
+
rescue
|
47
118
|
end
|
48
119
|
|
49
|
-
|
120
|
+
exit 0
|
121
|
+
end
|
122
|
+
|
123
|
+
Trollop::die :app, "must be specified" if opts[:app].nil?
|
50
124
|
|
51
|
-
|
125
|
+
begin
|
126
|
+
application = Smartguard::Applications.const_get opts[:app].camelize
|
127
|
+
rescue
|
128
|
+
Trollop::die :app, "is not supported"
|
129
|
+
end
|
52
130
|
|
131
|
+
if opts[:path].nil?
|
53
132
|
if opts[:development]
|
54
|
-
|
133
|
+
opts[:path] = Dir.getwd
|
55
134
|
else
|
56
|
-
|
135
|
+
Trollop::die :path, "must be specified in production"
|
57
136
|
end
|
137
|
+
end
|
58
138
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
139
|
+
if opts[:development]
|
140
|
+
Smartguard.environment = :development
|
141
|
+
else
|
142
|
+
Smartguard.environment = :production
|
143
|
+
end
|
144
|
+
|
145
|
+
if opts[:log].nil?
|
146
|
+
Trollop::die :log, "must be specified for daemon" if opts[:daemon]
|
147
|
+
else
|
148
|
+
Smartguard::Logging.destination = opts[:log]
|
149
|
+
end
|
150
|
+
|
151
|
+
Smartguard::Logging.init
|
152
|
+
Smartguard::Logging.logger.info "Initializing Smartguard"
|
153
|
+
|
154
|
+
if opts[:daemon]
|
155
|
+
rd, wr = IO.pipe
|
156
|
+
|
157
|
+
pid = Process.fork
|
158
|
+
if pid.nil?
|
159
|
+
begin
|
160
|
+
Process.setsid
|
161
|
+
Dir.chdir '/'
|
162
|
+
File.umask 0
|
163
|
+
File.open("/dev/null", "r+") do |null|
|
164
|
+
[ STDIN, STDOUT, STDERR ].each do |io|
|
165
|
+
io.reopen null
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
rd.close
|
170
|
+
|
171
|
+
start_application(application, opts) do
|
172
|
+
wr.puts "1"
|
173
|
+
wr.flush
|
174
|
+
wr.close
|
175
|
+
end
|
176
|
+
|
177
|
+
exit 0
|
178
|
+
rescue
|
179
|
+
exit 1
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
wr.close
|
184
|
+
|
185
|
+
begin
|
186
|
+
rd.readline
|
187
|
+
|
188
|
+
puts "smartguard started"
|
189
|
+
exit 0
|
190
|
+
rescue => e
|
191
|
+
puts "smartguard initialization failed"
|
192
|
+
exit 1
|
193
|
+
end
|
194
|
+
else
|
195
|
+
start_application application, opts
|
63
196
|
end
|
data/bin/smartguardctl
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "trollop"
|
4
|
+
require "smartguard"
|
5
|
+
|
6
|
+
module CommandHandler
|
7
|
+
def self.cmd_start(drb)
|
8
|
+
status = drb.start_services
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.cmd_stop(drb)
|
12
|
+
drb.stop_services
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.cmd_restart(drb)
|
16
|
+
drb.restart
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.cmd_status(drb)
|
20
|
+
status = drb.status
|
21
|
+
|
22
|
+
status.each do |service, (pid, active)|
|
23
|
+
printf "%-16s: ", service
|
24
|
+
|
25
|
+
if active
|
26
|
+
puts "running, pid #{pid}"
|
27
|
+
else
|
28
|
+
puts "stopped"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.cmd_switch_release(drb)
|
34
|
+
if ARGV.empty?
|
35
|
+
warn "release must be specified"
|
36
|
+
exit 1
|
37
|
+
end
|
38
|
+
|
39
|
+
release = ARGV.shift
|
40
|
+
status = drb.switch_release release
|
41
|
+
if status
|
42
|
+
puts "releases switched"
|
43
|
+
else
|
44
|
+
warn "switch failed"
|
45
|
+
exit 1
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
opts = Trollop.options do
|
51
|
+
version "Smartguard CLI #{Smartguard::VERSION}"
|
52
|
+
opt :port, "DRB Port", default: 10000
|
53
|
+
stop_on_unknown
|
54
|
+
end
|
55
|
+
|
56
|
+
drb = DRb::DRbObject.new_with_uri "druby://localhost:#{opts[:port]}"
|
57
|
+
|
58
|
+
if ARGV.empty?
|
59
|
+
warn "command must be specified"
|
60
|
+
exit 1
|
61
|
+
end
|
62
|
+
|
63
|
+
cmd = :"cmd_#{ARGV.shift}"
|
64
|
+
|
65
|
+
unless CommandHandler.respond_to? cmd
|
66
|
+
warn "unsupported command"
|
67
|
+
exit 1
|
68
|
+
end
|
69
|
+
|
70
|
+
CommandHandler.send cmd, drb
|
data/lib/smartguard.rb
CHANGED
@@ -11,11 +11,17 @@ module Smartguard
|
|
11
11
|
log_path = @path.join('log/sidekiq_log')
|
12
12
|
pidfile = @path.join('tmp/pids/sidekiq.pid')
|
13
13
|
|
14
|
+
opts = []
|
15
|
+
if Smartguard.environment == :production
|
16
|
+
opts << "-L"
|
17
|
+
opts << "#{log_path}"
|
18
|
+
end
|
19
|
+
|
14
20
|
FileUtils.rm_f pidfile
|
15
21
|
if !run(@path,
|
16
22
|
{},
|
17
23
|
"bundle", "exec",
|
18
|
-
"sidekiq", "-e", Smartguard.environment.to_s, "--config=#{config_path}", "--pidfile=#{pidfile}"
|
24
|
+
"sidekiq", "-e", Smartguard.environment.to_s, "--config=#{config_path}", "--pidfile=#{pidfile}", *opts
|
19
25
|
)
|
20
26
|
return false
|
21
27
|
end
|
@@ -8,8 +8,13 @@ module Smartguard
|
|
8
8
|
log_file = @path.join('log/smartware.log')
|
9
9
|
config_file = @path.join('config/services/smartware.yml')
|
10
10
|
|
11
|
+
opts = []
|
12
|
+
if Smartguard.environment == :production
|
13
|
+
opts << "--log=#{log_file}"
|
14
|
+
end
|
15
|
+
|
11
16
|
Logging.logger.info "Starting smartware"
|
12
|
-
if !run(@path, {}, "bundle", "exec", "smartware", "--
|
17
|
+
if !run(@path, {}, "bundle", "exec", "smartware", "--config-file=#{config_file}", *opts)
|
13
18
|
return false
|
14
19
|
end
|
15
20
|
|
@@ -12,18 +12,22 @@ module Smartguard
|
|
12
12
|
Logging.logger.info "Starting thin"
|
13
13
|
end
|
14
14
|
|
15
|
+
log_path = @path.join('log/thin.log')
|
16
|
+
|
15
17
|
if !run(@path,
|
16
18
|
{},
|
17
19
|
"bundle", "exec",
|
18
|
-
"thin", "-e", Smartguard.environment.to_s, "-p", 3000,
|
20
|
+
"thin", "-e", Smartguard.environment.to_s, "-p", "3000", "-l", "#{log_path}",
|
19
21
|
"start"
|
20
22
|
)
|
21
23
|
return false
|
22
24
|
end
|
23
25
|
|
24
|
-
without_respawn do
|
25
|
-
wait_for_port
|
26
|
+
result = without_respawn do
|
27
|
+
wait_for_port 3000
|
26
28
|
end
|
29
|
+
|
30
|
+
result
|
27
31
|
end
|
28
32
|
|
29
33
|
def stop
|
data/lib/smartguard/process.rb
CHANGED
data/lib/smartguard/version.rb
CHANGED
data/smartguard.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.add_dependency 'smartkiosk-common'
|
21
21
|
gem.add_dependency 'i18n'
|
22
22
|
gem.add_dependency 'activesupport'
|
23
|
-
gem.add_dependency '
|
23
|
+
gem.add_dependency 'trollop'
|
24
24
|
gem.add_dependency 'colored'
|
25
25
|
|
26
26
|
gem.add_development_dependency 'pry'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smartguard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.3'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2013-01-14 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: smartkiosk-common
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: i18n
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: activesupport
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement:
|
63
|
+
name: trollop
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: colored
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ! '>='
|
@@ -65,10 +85,15 @@ dependencies:
|
|
65
85
|
version: '0'
|
66
86
|
type: :runtime
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: pry
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
98
|
requirements:
|
74
99
|
- - ! '>='
|
@@ -76,12 +101,18 @@ dependencies:
|
|
76
101
|
version: '0'
|
77
102
|
type: :development
|
78
103
|
prerelease: false
|
79
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
80
110
|
description: Smartguard is the Smartkiosk services control daemon
|
81
111
|
email:
|
82
112
|
- boris@roundlake.ru
|
83
113
|
executables:
|
84
114
|
- smartguard
|
115
|
+
- smartguardctl
|
85
116
|
extensions: []
|
86
117
|
extra_rdoc_files: []
|
87
118
|
files:
|
@@ -91,6 +122,7 @@ files:
|
|
91
122
|
- README.md
|
92
123
|
- Rakefile
|
93
124
|
- bin/smartguard
|
125
|
+
- bin/smartguardctl
|
94
126
|
- lib/smartguard.rb
|
95
127
|
- lib/smartguard/application.rb
|
96
128
|
- lib/smartguard/applications/smartkiosk.rb
|
@@ -124,9 +156,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
156
|
version: '0'
|
125
157
|
requirements: []
|
126
158
|
rubyforge_project:
|
127
|
-
rubygems_version: 1.8.
|
159
|
+
rubygems_version: 1.8.24
|
128
160
|
signing_key:
|
129
161
|
specification_version: 3
|
130
162
|
summary: Smartguard is the Smartkiosk services control daemon
|
131
163
|
test_files: []
|
132
|
-
has_rdoc:
|