evesync 1.0.7 → 1.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +12 -9
- data/bin/evedatad +5 -27
- data/bin/evehand +5 -29
- data/bin/evemond +6 -30
- data/bin/evesync +10 -18
- data/bin/evesyncd +7 -34
- data/bin/start +4 -15
- data/lib/evesync.rb +1 -1
- data/lib/evesync/constants.rb +1 -1
- data/lib/evesync/discover.rb +34 -6
- data/lib/evesync/ipc/server.rb +1 -1
- data/lib/evesync/log.rb +76 -33
- data/lib/evesync/os/linux.rb +5 -0
- data/lib/evesync/service.rb +104 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32546fdd2bf3681b09b5d76b29a9afe2559f726f328274b8d0cccbe26a6cbc46
|
4
|
+
data.tar.gz: b9e529c9972c92dcc3035ef8028600c6ecfe30004dd704dc01c0f45eb8728cce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d467ccd88887d72c85056c0097838cb9e11416e07d1ab2b3b616642a0984cef50c1a60cf0f3595c9c4e6aa806f4bd48fc2581aea56fe374c6f5a1bb669ceb38
|
7
|
+
data.tar.gz: 836b9e00da567d26161402c41146b37166d60627e536b0e4a26c6e154ee54fc21f2ed439ee09b0e9280b25be7663119229eab09eb98a2e2ef2e9c18ead41e8b8
|
data/Rakefile
CHANGED
@@ -56,17 +56,20 @@ end
|
|
56
56
|
|
57
57
|
## Docker related targets
|
58
58
|
|
59
|
-
|
60
|
-
sh 'docker-compose build'
|
61
|
-
end
|
59
|
+
namespace :docker do
|
62
60
|
|
63
|
-
task :
|
64
|
-
|
65
|
-
end
|
61
|
+
task :build do
|
62
|
+
sh 'docker-compose build'
|
63
|
+
end
|
66
64
|
|
67
|
-
task :
|
68
|
-
|
69
|
-
|
65
|
+
task :up do
|
66
|
+
sh 'docker-compose up -d node-1 node-2'
|
67
|
+
end
|
68
|
+
|
69
|
+
task :down do
|
70
|
+
sh 'docker-compose stop || docker-compose kill ||:'
|
71
|
+
sh 'docker-compose rm --force ||:'
|
72
|
+
end
|
70
73
|
end
|
71
74
|
|
72
75
|
namespace :rhel do
|
data/bin/evedatad
CHANGED
@@ -1,34 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- mode: ruby -*-
|
3
3
|
|
4
|
-
require 'evesync/
|
5
|
-
require 'evesync/log'
|
4
|
+
require 'evesync/service'
|
6
5
|
require 'evesync/database'
|
7
6
|
|
8
|
-
Evesync::
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# Creating an IPC server to accept data
|
13
|
-
data_server = Evesync::IPC::Server.new(
|
14
|
-
port: :evedatad,
|
15
|
-
proxy: database
|
16
|
-
).start
|
17
|
-
|
18
|
-
Signal.trap('TERM') do
|
19
|
-
data_server.stop
|
20
|
-
exit(0)
|
7
|
+
evedata = Evesync::Service.new(:evedatad) do |config|
|
8
|
+
config.proxy = Evesync::Database.new
|
9
|
+
# zip db if needed, save backup
|
21
10
|
end
|
22
11
|
|
23
|
-
|
24
|
-
|
25
|
-
begin
|
26
|
-
loop do
|
27
|
-
sleep 3600 # FIXME: 1 hour, rewrite better
|
28
|
-
# zip db if needed, save backup
|
29
|
-
end
|
30
|
-
rescue SignalException => e
|
31
|
-
data_server.stop
|
32
|
-
Evesync::Log.warn("Database daemon received signal: #{e.signm}(#{e.signo})")
|
33
|
-
exit(0)
|
34
|
-
end
|
12
|
+
evedata.start
|
data/bin/evehand
CHANGED
@@ -1,36 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- mode: ruby -*-
|
3
3
|
|
4
|
-
require 'evesync/
|
5
|
-
require 'evesync/ipc/server'
|
4
|
+
require 'evesync/service'
|
6
5
|
require 'evesync/handler'
|
7
6
|
|
8
|
-
Evesync::
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
handler_server = Evesync::IPC::Server.new(
|
13
|
-
port: :evehand,
|
14
|
-
proxy: all_handler,
|
15
|
-
ip: '*' # accept remote requests
|
16
|
-
).start
|
17
|
-
|
18
|
-
Evesync::Log.info('Handle daemon started!')
|
19
|
-
|
20
|
-
# Signal handling
|
21
|
-
|
22
|
-
Signal.trap('TERM') do
|
23
|
-
handler_server.stop
|
24
|
-
exit(0)
|
7
|
+
evehand = Evesync::Service.new(:evehand) do |config|
|
8
|
+
config.proxy = Evesync::Handler.new
|
9
|
+
config.ip = '*'
|
25
10
|
end
|
26
11
|
|
27
|
-
|
28
|
-
loop do
|
29
|
-
sleep 3600 # FIXME: 1 hour, rewrite better
|
30
|
-
# FIXME: know what to do
|
31
|
-
end
|
32
|
-
rescue SignalException => e
|
33
|
-
handler_server.stop
|
34
|
-
Evesync::Log.warn("Received signal: #{e.signm}(#{e.signo})")
|
35
|
-
exit(0)
|
36
|
-
end
|
12
|
+
evehand.start
|
data/bin/evemond
CHANGED
@@ -1,42 +1,18 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- mode: ruby -*-
|
3
3
|
|
4
|
-
require 'evesync/
|
5
|
-
require 'evesync/ipc/server'
|
4
|
+
require 'evesync/service'
|
6
5
|
require 'evesync/trigger'
|
7
6
|
require 'evesync/watcher'
|
8
7
|
|
9
|
-
Evesync::Log.info 'Monitoring daemon starting...'
|
10
|
-
|
11
8
|
queue = Queue.new
|
12
9
|
trigger = Evesync::Trigger.new(queue)
|
13
10
|
watcher = Evesync::Watcher.new(queue)
|
14
11
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
proxy: trigger
|
20
|
-
).start
|
21
|
-
|
22
|
-
Evesync::Log.info 'Monitoring daemon started!'
|
23
|
-
|
24
|
-
# Signal handling
|
25
|
-
|
26
|
-
Signal.trap('SIGINT') do
|
27
|
-
[watcher, trigger].each(&:stop)
|
28
|
-
evesync_server.stop
|
29
|
-
exit(0)
|
12
|
+
evemon = Evesync::Service.new(:evemond) do |config|
|
13
|
+
config.proxy = trigger
|
14
|
+
config.at_start = lambda { [trigger, watcher].each(&:start) }
|
15
|
+
config.at_exit = lambda { [trigger, watcher].each(&:stop) }
|
30
16
|
end
|
31
17
|
|
32
|
-
|
33
|
-
loop do
|
34
|
-
sleep 100
|
35
|
-
# FIXME: know what to do
|
36
|
-
end
|
37
|
-
rescue SignalException => e
|
38
|
-
watcher.stop
|
39
|
-
evesync_server.stop
|
40
|
-
Evesync::Log.warn("Monitoring daemon received signal: #{e.signm}(#{e.signo})")
|
41
|
-
exit(0)
|
42
|
-
end
|
18
|
+
evemon.start
|
data/bin/evesync
CHANGED
@@ -14,28 +14,24 @@ require 'evesync/config'
|
|
14
14
|
require 'evesync/sync'
|
15
15
|
require 'evesync/ipc/client'
|
16
16
|
|
17
|
-
DB_TAG
|
18
|
-
FILES_TAG = 'files'
|
17
|
+
DB_TAG = 'db'.freeze
|
18
|
+
FILES_TAG = 'files'.freeze
|
19
19
|
|
20
|
-
opts
|
20
|
+
opts = {}
|
21
21
|
$program = File.basename($0)
|
22
|
-
#Evesync::Log.level = :warn
|
23
|
-
Evesync::Log.simple = true
|
24
22
|
|
25
23
|
def kill_by_pid(daemon)
|
26
24
|
begin
|
27
|
-
|
28
|
-
|
25
|
+
puts "Killing #{daemon}..."
|
26
|
+
pid = File.read("/var/run/evesync/#{daemon}.pid").to_i
|
27
|
+
Process.kill('INT', pid)
|
28
|
+
rescue Errno::ESRCH, Errno::ENOENT
|
29
29
|
puts("#{daemon} already killed")
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
33
|
def spawn_daemon(daemon)
|
34
|
-
|
35
|
-
:err => "/var/log/evesync/#{daemon}.log",
|
36
|
-
:out=>:err)
|
37
|
-
File.write("/var/run/evesync/#{daemon}.pid", pid)
|
38
|
-
pid
|
34
|
+
system(daemon)
|
39
35
|
end
|
40
36
|
|
41
37
|
OptionParser.new do |parser|
|
@@ -84,8 +80,6 @@ OptionParser.new do |parser|
|
|
84
80
|
|
85
81
|
# TODO: refactor
|
86
82
|
parser.on('-r', '--run', 'Start daemons') do
|
87
|
-
FileUtils.mkdir_p '/var/log/evesync'
|
88
|
-
FileUtils.mkdir_p '/var/run/evesync'
|
89
83
|
spawn_daemon 'evedatad'
|
90
84
|
spawn_daemon 'evemond'
|
91
85
|
spawn_daemon 'evehand'
|
@@ -99,10 +93,8 @@ OptionParser.new do |parser|
|
|
99
93
|
kill_by_pid 'evesyncd'
|
100
94
|
kill_by_pid 'evedatad'
|
101
95
|
rescue StandardError => e
|
102
|
-
puts("Error: #{e}")
|
103
|
-
puts('Something went wrong while killing processes
|
104
|
-
ensure
|
105
|
-
FileUtils.rm_f Dir.glob('/var/run/evesync/*.pid')
|
96
|
+
puts("(!) Error: #{e} (!)")
|
97
|
+
puts('Something went wrong while killing processes...')
|
106
98
|
end
|
107
99
|
end
|
108
100
|
end.parse!
|
data/bin/evesyncd
CHANGED
@@ -1,44 +1,17 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- mode: ruby -*-
|
3
3
|
|
4
|
-
require 'evesync/
|
4
|
+
require 'evesync/service'
|
5
5
|
require 'evesync/sync'
|
6
|
-
require 'evesync/config'
|
7
|
-
require 'evesync/ipc/server'
|
8
|
-
|
9
|
-
# Exiting if `auto_discover = false'
|
10
|
-
unless Evesync::Config['auto_discover']
|
11
|
-
Evesync::Log.info('Synchronizing not required')
|
12
|
-
exit(0)
|
13
|
-
end
|
14
|
-
|
15
|
-
Evesync::Log.info('Synchronizing daemon starting...')
|
16
6
|
|
17
7
|
sync = Evesync::Sync.new
|
18
8
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
Signal.trap('TERM') do
|
25
|
-
sync_server.stop
|
26
|
-
exit(0)
|
9
|
+
evesync = Evesync::Service.new(:evesyncd) do |config|
|
10
|
+
config.proxy = sync
|
11
|
+
config.at_start = sync.method(:discover)
|
12
|
+
config.interval = 15 # TODO: read from config
|
27
13
|
end
|
28
14
|
|
29
|
-
|
30
|
-
|
31
|
-
few_seconds = Evesync::Config['discover_timeout'].to_i
|
32
|
-
|
33
|
-
sync.discover # discovering nodes
|
34
|
-
sleep 3 # giving 3 seconds to complete
|
35
|
-
|
36
|
-
begin
|
37
|
-
loop do
|
38
|
-
sync.synchronize # updating this node
|
39
|
-
sleep few_seconds # ... in some interval
|
40
|
-
end
|
41
|
-
rescue SignalException
|
42
|
-
sync_server.stop
|
43
|
-
exit(0)
|
15
|
+
evesync.start do
|
16
|
+
sync.synchronize
|
44
17
|
end
|
data/bin/start
CHANGED
@@ -1,16 +1,5 @@
|
|
1
1
|
#!/usr/bin/env bash
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
pkill evesyncd
|
7
|
-
exit 1' 2
|
8
|
-
evedatad &
|
9
|
-
evemond &
|
10
|
-
evehand &
|
11
|
-
sleep 3s
|
12
|
-
evesyncd &
|
13
|
-
|
14
|
-
while true; do
|
15
|
-
sleep 1000
|
16
|
-
done
|
2
|
+
evedatad
|
3
|
+
evemond
|
4
|
+
evehand
|
5
|
+
evesyncd
|
data/lib/evesync.rb
CHANGED
data/lib/evesync/constants.rb
CHANGED
data/lib/evesync/discover.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'evesync/ipc/client'
|
2
2
|
require 'evesync/log'
|
3
3
|
require 'evesync/config'
|
4
|
+
require 'evesync/os'
|
5
|
+
|
6
|
+
require 'json'
|
4
7
|
|
5
8
|
module Evesync
|
6
9
|
|
@@ -35,14 +38,14 @@ module Evesync
|
|
35
38
|
# Sending UDP message on broadcast
|
36
39
|
# Discovering our nodes
|
37
40
|
|
38
|
-
def send_discovery_message(ip
|
41
|
+
def send_discovery_message(ip='<broadcast>', message=DISCOVERY_REQ)
|
39
42
|
udp_sock = UDPSocket.new
|
40
|
-
if ip
|
43
|
+
if is_broadcast(ip)
|
41
44
|
udp_sock.setsockopt(
|
42
45
|
Socket::SOL_SOCKET, Socket::SO_BROADCAST, true
|
43
46
|
)
|
44
47
|
end
|
45
|
-
udp_sock.send(message, 0, ip, @port)
|
48
|
+
udp_sock.send(to_discover_msg(message: message), 0, ip, @port)
|
46
49
|
udp_sock.close
|
47
50
|
end
|
48
51
|
|
@@ -54,17 +57,18 @@ module Evesync
|
|
54
57
|
|
55
58
|
def listen_discovery
|
56
59
|
loop do
|
57
|
-
|
60
|
+
datajson, recvdata = @listen_sock.recvfrom(1024)
|
58
61
|
node_ip = recvdata[-1]
|
59
62
|
|
60
63
|
next if Utils.local_ip?(node_ip)
|
61
64
|
|
62
|
-
|
65
|
+
data = from_discover_msg(datajson)
|
66
|
+
if fine_node?(data)
|
63
67
|
# Push new node_ip to trigger
|
64
68
|
@evesync.add_remote_node(node_ip)
|
65
69
|
end
|
66
70
|
|
67
|
-
case data
|
71
|
+
case data['message']
|
68
72
|
when DISCOVERY_REQ
|
69
73
|
Log.info("Discover host request got: #{node_ip}")
|
70
74
|
send_discovery_message(node_ip, DISCOVERY_ANS)
|
@@ -73,5 +77,29 @@ module Evesync
|
|
73
77
|
end
|
74
78
|
end
|
75
79
|
end
|
80
|
+
|
81
|
+
def to_discover_msg(msg)
|
82
|
+
{
|
83
|
+
evesync: {
|
84
|
+
message: msg,
|
85
|
+
os: EVESYNC_OS,
|
86
|
+
}
|
87
|
+
}.to_json.freeze
|
88
|
+
end
|
89
|
+
|
90
|
+
def from_discover_msg(data)
|
91
|
+
JSON.parse(data)['evesync'] # TODO: catch error
|
92
|
+
end
|
93
|
+
|
94
|
+
def is_broadcast(ip)
|
95
|
+
ip == '<broadcast>'
|
96
|
+
end
|
97
|
+
|
98
|
+
def fine_node?(data)
|
99
|
+
[
|
100
|
+
[DISCOVERY_ANS, DISCOVERY_REQ].include?(data['message']),
|
101
|
+
data['os'] == EVESYNC_OS,
|
102
|
+
].all?
|
103
|
+
end
|
76
104
|
end
|
77
105
|
end
|
data/lib/evesync/ipc/server.rb
CHANGED
data/lib/evesync/log.rb
CHANGED
@@ -1,62 +1,105 @@
|
|
1
|
-
require 'logger'
|
2
1
|
require 'evesync/config'
|
3
2
|
require 'evesync/constants'
|
4
3
|
|
4
|
+
require 'syslog'
|
5
|
+
require 'logger'
|
6
|
+
require 'fileutils'
|
5
7
|
|
6
8
|
module Evesync
|
7
9
|
|
8
|
-
#
|
10
|
+
# Logging via syslog
|
9
11
|
module Log
|
10
12
|
# Supported levels for logging
|
11
|
-
LEVELS = %i[debug info warn error fatal]
|
13
|
+
LEVELS = %i[debug info notice warn error fatal]
|
14
|
+
def LEVELS.less(a, b)
|
15
|
+
(self.index(a) <=> self.index(b) or -1) >= 0
|
16
|
+
end
|
17
|
+
|
18
|
+
# Default engine for logging, one of (:io, :syslog)
|
19
|
+
DEFAULT_ENGINE = :io
|
20
|
+
|
21
|
+
# Log level mapping for syslog
|
22
|
+
SYSLOG = {
|
23
|
+
:debug => Syslog::LOG_DEBUG,
|
24
|
+
:info => Syslog::LOG_INFO,
|
25
|
+
:notice => Syslog::LOG_NOTICE,
|
26
|
+
:warn => Syslog::LOG_WARNING,
|
27
|
+
:error => Syslog::LOG_ERR,
|
28
|
+
:fatal => Syslog::LOG_CRIT,
|
29
|
+
#:alert => Syslog::LOG_ALERT,
|
30
|
+
#:emerg => Syslog::LOG_EMERG,
|
31
|
+
}
|
32
|
+
|
33
|
+
SYSLOG_OPTIONS = [
|
34
|
+
Syslog::LOG_PID,
|
35
|
+
Syslog::LOG_NOWAIT,
|
36
|
+
Syslog::LOG_CONS,
|
37
|
+
Syslog::LOG_PERROR,
|
38
|
+
].inject(&:|)
|
39
|
+
|
40
|
+
SYSLOG_FACILITY = [
|
41
|
+
Syslog::LOG_DAEMON,
|
42
|
+
Syslog::LOG_LOCAL5,
|
43
|
+
].inject(&:|)
|
12
44
|
|
45
|
+
# Public methods available via Log.method
|
13
46
|
class << self
|
14
|
-
def method_missing(m, *args)
|
15
|
-
# Unlisted methods are not allowed
|
16
|
-
raise NoMethodError unless LEVELS.include?(m)
|
17
47
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
48
|
+
LEVELS.each do |level|
|
49
|
+
define_method(level) do |*args|
|
50
|
+
check_logger
|
51
|
+
return unless LEVELS.less(level.to_sym, @level.to_sym)
|
22
52
|
|
23
|
-
|
24
|
-
|
53
|
+
case @engine
|
54
|
+
when :syslog
|
55
|
+
@logger.log(SYSLOG[level], to_string(*args))
|
56
|
+
when :io
|
57
|
+
@logger.send(level, to_string(*args))
|
58
|
+
end
|
59
|
+
|
60
|
+
nil # prevent from being able to access the object
|
61
|
+
end
|
25
62
|
end
|
26
63
|
|
27
64
|
def level=(lvl)
|
28
65
|
check_logger
|
29
|
-
|
30
|
-
|
31
|
-
begin
|
32
|
-
Logger.const_get(lvl.to_s.upcase)
|
33
|
-
rescue NameError
|
34
|
-
Logger::DEBUG
|
35
|
-
end
|
36
|
-
end
|
66
|
+
raise "Unknown level #{lvl}" unless LEVELS.include? lvl
|
67
|
+
@level = lvl
|
37
68
|
end
|
38
69
|
|
39
70
|
def level
|
40
|
-
|
41
|
-
@logger.level
|
71
|
+
@level
|
42
72
|
end
|
43
73
|
|
44
|
-
def
|
74
|
+
def check_logger
|
45
75
|
init_logger unless @logger
|
46
|
-
if bool
|
47
|
-
@logger.formatter = proc do |_sev, _dt, _prog, msg|
|
48
|
-
"#{msg}\n"
|
49
|
-
end
|
50
|
-
end
|
51
76
|
end
|
52
77
|
|
78
|
+
def engine=(engine)
|
79
|
+
raise UnsupportedLogEngine.new(engine) \
|
80
|
+
unless [:syslog, :io].member? engine
|
81
|
+
@engine = engine
|
82
|
+
end
|
83
|
+
|
84
|
+
# Using syslog implementation
|
53
85
|
def init_logger
|
54
|
-
@
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
86
|
+
@engine ||= DEFAULT_ENGINE
|
87
|
+
prog = File.basename($PROGRAM_NAME)
|
88
|
+
|
89
|
+
case @engine
|
90
|
+
when :syslog
|
91
|
+
@logger = Syslog.open(prog, SYSLOG_OPTIONS, SYSLOG_FACILITY)
|
92
|
+
|
93
|
+
when :io
|
94
|
+
FileUtils.mkdir_p '/var/log/evesync/'
|
95
|
+
@logger = Logger.new("/var/log/evesync/#{prog}.log")
|
96
|
+
@logger.formatter = proc do |sev, dtime, _prog, msg|
|
97
|
+
time = dtime.strftime('%Y-%m-%d %H:%M:%S')
|
98
|
+
"[#{time}] #{prog.ljust(8)} #{sev.ljust(5)}: #{msg}\n"
|
99
|
+
end
|
59
100
|
end
|
101
|
+
|
102
|
+
@level = Config[:loglevel] || :info
|
60
103
|
end
|
61
104
|
|
62
105
|
def to_string(*args)
|
data/lib/evesync/os/linux.rb
CHANGED
@@ -2,8 +2,13 @@ text = File.new('/etc/os-release').read
|
|
2
2
|
|
3
3
|
if text =~ /^ID.*(rhel|centos|fedora)/
|
4
4
|
require 'evesync/os/linux/rhel'
|
5
|
+
EVESYNC_OS = 'rhel'.freeze
|
5
6
|
elsif text =~ /ID.*arch/
|
6
7
|
require 'evesync/os/linux/arch'
|
8
|
+
EVESYNC_OS = 'arch'.freeze
|
7
9
|
elsif text =~ /ID.*debian/
|
8
10
|
require 'evesync/os/linux/deb'
|
11
|
+
EVESYNC_OS = 'deb'.freeze
|
12
|
+
else
|
13
|
+
EVESYNC_OS = 'not implemented'
|
9
14
|
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'evesync/log'
|
2
|
+
require 'evesync/ipc/server'
|
3
|
+
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
module Evesync
|
7
|
+
# Class for creating daemons which are DRb servers with
|
8
|
+
# proxy object to accept requests.
|
9
|
+
#
|
10
|
+
# Traps signals to exit.
|
11
|
+
#
|
12
|
+
# Example:
|
13
|
+
# d = Evesync::Service.new(:mydaemond) do |config|
|
14
|
+
# config.proxy = SomeProxyObject.new
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# d.start
|
18
|
+
#
|
19
|
+
class Service
|
20
|
+
def initialize(name)
|
21
|
+
@factory = ServiceFactory.new
|
22
|
+
@factory.name = name unless name.nil?
|
23
|
+
yield @factory
|
24
|
+
end
|
25
|
+
|
26
|
+
def start
|
27
|
+
daemonize
|
28
|
+
|
29
|
+
Log.info("#{@factory.name} daemon starting...")
|
30
|
+
|
31
|
+
@ipc_server = IPC::Server.new(
|
32
|
+
port: @factory.port,
|
33
|
+
proxy: @factory.proxy,
|
34
|
+
ip: @factory.ip,
|
35
|
+
).start
|
36
|
+
|
37
|
+
Signal.trap('TERM') do
|
38
|
+
@ipc_server.stop
|
39
|
+
exit 0
|
40
|
+
end
|
41
|
+
|
42
|
+
Log.info("#{@factory.name} daemon started!")
|
43
|
+
|
44
|
+
@factory.at_start.call if @factory.at_start.respond_to? :call
|
45
|
+
|
46
|
+
loop do
|
47
|
+
sleep @factory.interval
|
48
|
+
yield if block_given?
|
49
|
+
end
|
50
|
+
|
51
|
+
rescue SignalException => e
|
52
|
+
Log.warn("#{@factory.name} daemon received signal: " \
|
53
|
+
"#{e.signm}(#{e.signo})")
|
54
|
+
exit 0
|
55
|
+
|
56
|
+
# rubocop:disable Lint/RescueException
|
57
|
+
rescue Exception => crit
|
58
|
+
Log.fatal(crit)
|
59
|
+
crit.backtrace.each { |line| Log.fatal(line) }
|
60
|
+
exit 1
|
61
|
+
|
62
|
+
# rubocop:enable Lint/RescueException
|
63
|
+
ensure
|
64
|
+
@factory.at_exit.call if @factory.at_exit.respond_to? :call
|
65
|
+
@ipc_server.stop
|
66
|
+
end
|
67
|
+
|
68
|
+
def daemonize
|
69
|
+
Process.daemon
|
70
|
+
Process.setproctitle(@factory.name.to_s) \
|
71
|
+
if Process.respond_to? :setproctitle
|
72
|
+
$0 = @factory.name.to_s
|
73
|
+
FileUtils.mkdir_p @factory.pids
|
74
|
+
File.open("#{@factory.pids}/#{@factory.name}.pid", 'w') do |f|
|
75
|
+
f.puts(Process.pid)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class ServiceFactory
|
81
|
+
attr_accessor :name, :proxy, :at_start, :at_exit
|
82
|
+
attr_writer :interval, :port, :ip, :logs, :pids
|
83
|
+
|
84
|
+
def logs
|
85
|
+
@logs || '/var/log/evesync/'
|
86
|
+
end
|
87
|
+
|
88
|
+
def pids
|
89
|
+
@pids || '/var/run/evesync/'
|
90
|
+
end
|
91
|
+
|
92
|
+
def port
|
93
|
+
@port || name.to_sym
|
94
|
+
end
|
95
|
+
|
96
|
+
def ip
|
97
|
+
@ip || 'localhost'
|
98
|
+
end
|
99
|
+
|
100
|
+
def interval
|
101
|
+
@interval || 3600
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evesync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kiselev Valentine
|
@@ -163,6 +163,7 @@ files:
|
|
163
163
|
- lib/evesync/os/linux/rhel/package_manager.rb
|
164
164
|
- lib/evesync/os/linux/rhel/package_watcher.rb
|
165
165
|
- lib/evesync/os/linux/rhel/rpm.rb
|
166
|
+
- lib/evesync/service.rb
|
166
167
|
- lib/evesync/sync.rb
|
167
168
|
- lib/evesync/trigger.rb
|
168
169
|
- lib/evesync/trigger/base.rb
|