haredo 0.0.5 → 2.0.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.
- checksums.yaml +4 -4
- data/README.md +355 -16
- data/src/bin/haredo +115 -0
- data/src/lib/haredo/admin/config.rb +178 -0
- data/src/lib/haredo/admin/interface.rb +25 -0
- data/src/lib/haredo/config.rb +54 -0
- data/src/lib/haredo/peer.rb +210 -110
- data/src/lib/haredo/plugin.rb +19 -0
- data/src/lib/haredo/plugins/echo.rb +15 -0
- data/src/lib/haredo/plugins/example.rb +17 -0
- data/src/lib/haredo/plugins/status.rb +31 -0
- data/src/lib/haredo/service/admin/daemon.rb +128 -0
- data/src/lib/haredo/service/config.rb +29 -0
- data/src/lib/haredo/service/daemon.rb +141 -0
- data/src/lib/haredo/version.rb +7 -1
- metadata +19 -6
@@ -0,0 +1,19 @@
|
|
1
|
+
module HareDo
|
2
|
+
|
3
|
+
class Plugin
|
4
|
+
|
5
|
+
attr_reader :uuid
|
6
|
+
|
7
|
+
def initialize(uuid, peer, config={})
|
8
|
+
@uuid = uuid
|
9
|
+
@peer = peer
|
10
|
+
@config = config
|
11
|
+
end
|
12
|
+
|
13
|
+
def finalize()
|
14
|
+
puts "finalize(#{@uuid})"
|
15
|
+
end
|
16
|
+
|
17
|
+
end # class Plugin
|
18
|
+
|
19
|
+
end # module Sonar
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'haredo/plugin'
|
3
|
+
|
4
|
+
class Plugin < HareDo::Plugin
|
5
|
+
|
6
|
+
UUID = 'example'
|
7
|
+
|
8
|
+
def initialize(service, config)
|
9
|
+
super UUID, service, config
|
10
|
+
end
|
11
|
+
|
12
|
+
def process(msg)
|
13
|
+
# Send back configuration
|
14
|
+
@peer.reply(msg, :data=>JSON::pretty_generate(@config))
|
15
|
+
end
|
16
|
+
|
17
|
+
end # class Plugin
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'haredo/plugin'
|
3
|
+
|
4
|
+
class Plugin < HareDo::Plugin
|
5
|
+
|
6
|
+
UUID = 'status'
|
7
|
+
|
8
|
+
attr_accessor :plugins
|
9
|
+
|
10
|
+
def initialize(service, config)
|
11
|
+
super UUID, service, config
|
12
|
+
|
13
|
+
@plugins = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def process(msg)
|
17
|
+
data = {}
|
18
|
+
data['time'] = Time.now()
|
19
|
+
data['pid'] = Process.pid.to_s
|
20
|
+
|
21
|
+
plugins = []
|
22
|
+
@plugins.each do |k,v|
|
23
|
+
plugins << k
|
24
|
+
end
|
25
|
+
|
26
|
+
data['plugins'] = plugins
|
27
|
+
|
28
|
+
@peer.reply(msg, :data=>JSON::generate(data))
|
29
|
+
end
|
30
|
+
|
31
|
+
end # class Plugin
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'haredo/peer'
|
2
|
+
require 'haredo/admin/interface'
|
3
|
+
require 'haredo/service/config'
|
4
|
+
|
5
|
+
module HareDo
|
6
|
+
module Admin
|
7
|
+
module Daemon
|
8
|
+
|
9
|
+
# The class implements to command line interface for configuration module
|
10
|
+
class Interface < Admin::Interface
|
11
|
+
|
12
|
+
include HareDo::Service::Config
|
13
|
+
|
14
|
+
def initialize()
|
15
|
+
super('daemon', 'Control daemon')
|
16
|
+
|
17
|
+
loadConfig()
|
18
|
+
|
19
|
+
@commands = {}
|
20
|
+
|
21
|
+
# Start the daemon
|
22
|
+
@commands['start'] = lambda do | name |
|
23
|
+
startCommand()
|
24
|
+
end
|
25
|
+
|
26
|
+
# Stop the daemon
|
27
|
+
@commands['stop'] = lambda do | name |
|
28
|
+
stopCommand()
|
29
|
+
end
|
30
|
+
|
31
|
+
# Check status
|
32
|
+
@commands['status'] = lambda do | name |
|
33
|
+
statusCommand()
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def startCommand()
|
38
|
+
$stderr.puts 'Daemon start'
|
39
|
+
|
40
|
+
# Check if already running
|
41
|
+
if daemonPid() != nil
|
42
|
+
$stderr.puts 'Daemon already running'
|
43
|
+
return
|
44
|
+
end
|
45
|
+
|
46
|
+
fork do
|
47
|
+
Process.daemon()
|
48
|
+
exec('/usr/bin/haredo', '-d')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def statusCommand()
|
53
|
+
if daemonPid() != nil
|
54
|
+
client = connectBroker()
|
55
|
+
client.timeout = 3
|
56
|
+
|
57
|
+
response = client.call('haredo', :headers=>{'uuid'=>'status'})
|
58
|
+
|
59
|
+
if response != nil
|
60
|
+
puts response.data()
|
61
|
+
end
|
62
|
+
|
63
|
+
client.disconnect()
|
64
|
+
else
|
65
|
+
puts 'down'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def stopCommand()
|
70
|
+
$stderr.puts "stop #{daemonPid()}"
|
71
|
+
|
72
|
+
daemon_key = @config['daemon']['key']
|
73
|
+
|
74
|
+
client = connectBroker()
|
75
|
+
|
76
|
+
client.send( 'haredo',
|
77
|
+
:headers => {
|
78
|
+
'command' => 'stop',
|
79
|
+
'key' => daemon_key,
|
80
|
+
})
|
81
|
+
|
82
|
+
client.disconnect()
|
83
|
+
end
|
84
|
+
|
85
|
+
def help(opts)
|
86
|
+
puts opts
|
87
|
+
end
|
88
|
+
|
89
|
+
def parse(args)
|
90
|
+
opts = OptionParser.new do |opts|
|
91
|
+
opts.separator ''
|
92
|
+
opts.banner = "Manage the haredo daemon\n\n"
|
93
|
+
opts.banner += "Usage: config [options] { start | stop | status }"
|
94
|
+
|
95
|
+
opts.separator 'Available options:'
|
96
|
+
|
97
|
+
opts.on('-c', '--config [val]', String, 'Use specific config file (default /etc/haredo/system.yml)') do |file|
|
98
|
+
@configfile = file
|
99
|
+
end
|
100
|
+
|
101
|
+
opts.on('-p', '--pidfile [val]', String, 'Use specific PID file') do |pid|
|
102
|
+
@pid = pid
|
103
|
+
end
|
104
|
+
|
105
|
+
opts.on_tail("-h", "--help", "Display help") do
|
106
|
+
puts opts
|
107
|
+
exit
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
opts.parse!(args)
|
112
|
+
|
113
|
+
command = args[0].chomp
|
114
|
+
|
115
|
+
if not @commands.has_key?(command)
|
116
|
+
help opts
|
117
|
+
|
118
|
+
return
|
119
|
+
end
|
120
|
+
|
121
|
+
@commands[command].call(command)
|
122
|
+
end
|
123
|
+
|
124
|
+
end # class
|
125
|
+
|
126
|
+
end # module Daemon
|
127
|
+
end # module Admin
|
128
|
+
end # module HareDo
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
require 'haredo/config'
|
4
|
+
|
5
|
+
module HareDo
|
6
|
+
module Service
|
7
|
+
|
8
|
+
module Config
|
9
|
+
|
10
|
+
include HareDo::Config
|
11
|
+
|
12
|
+
# @return Returns PID of running daemon if it corresponds to a running
|
13
|
+
# process. Returns nil otherwise.
|
14
|
+
def daemonPid()
|
15
|
+
pid = File.open(@pid_file).read().strip.chomp
|
16
|
+
|
17
|
+
return nil if pid.size == 0
|
18
|
+
|
19
|
+
if Dir.exist?("/proc/#{pid}")
|
20
|
+
return pid
|
21
|
+
end
|
22
|
+
|
23
|
+
return nil
|
24
|
+
end
|
25
|
+
|
26
|
+
end # class Context
|
27
|
+
|
28
|
+
end # module Service
|
29
|
+
end # module HareDo
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'syslog'
|
2
|
+
require 'haredo/service/config'
|
3
|
+
|
4
|
+
def dump_message(msg)
|
5
|
+
if msg.properties != nil
|
6
|
+
puts ' Headers:'
|
7
|
+
msg.properties.each do |k,v|
|
8
|
+
puts " #{k}: #{v}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
puts " Data: #{msg.data}"
|
13
|
+
puts
|
14
|
+
end
|
15
|
+
|
16
|
+
module HareDo
|
17
|
+
module Service
|
18
|
+
|
19
|
+
#-------------------------------------------------------------------------------
|
20
|
+
# The Daemon
|
21
|
+
#-------------------------------------------------------------------------------
|
22
|
+
|
23
|
+
class Daemon < HareDo::Peer
|
24
|
+
|
25
|
+
attr_reader :loaded_modules
|
26
|
+
|
27
|
+
include HareDo::Service::Config
|
28
|
+
|
29
|
+
def initialize(name='haredo')
|
30
|
+
super(name)
|
31
|
+
|
32
|
+
@name = name
|
33
|
+
@queue_name = 'haredo'
|
34
|
+
@queue_properties = {}
|
35
|
+
@loaded_modules = []
|
36
|
+
|
37
|
+
loadConfig()
|
38
|
+
|
39
|
+
account = @config['system']['broker']
|
40
|
+
|
41
|
+
connect( :user => account['user'],
|
42
|
+
:password => account['password'],
|
43
|
+
:host => account['host'],
|
44
|
+
:port => account['port'],
|
45
|
+
:vhost => account['vhost'],
|
46
|
+
:ssl => account['ssl'] )
|
47
|
+
|
48
|
+
@daemon_key = @config['daemon']['key']
|
49
|
+
|
50
|
+
# Load modules in config
|
51
|
+
daemon_conf = @config['daemon']
|
52
|
+
daemon_conf['modules'].each do |mod|
|
53
|
+
@loaded_modules << mod
|
54
|
+
require mod
|
55
|
+
end
|
56
|
+
|
57
|
+
# Use configuration file for queue name
|
58
|
+
|
59
|
+
if daemon_conf.has_key?('queue')
|
60
|
+
@queue_name = daemon_conf['queue']['name'] || 'haredo'
|
61
|
+
@queue_properties = daemon_conf['queue']['properties'] || {}
|
62
|
+
end
|
63
|
+
|
64
|
+
# Change module search path
|
65
|
+
|
66
|
+
plugin_conf = @config['daemon']['services'].each do |service_name, service_conf|
|
67
|
+
|
68
|
+
if service_conf.has_key?('path_prefix')
|
69
|
+
@plugins.module_path_prefix = service_conf['path_prefix']
|
70
|
+
end
|
71
|
+
|
72
|
+
@plugins.loadConfig(service_conf['plugins'])
|
73
|
+
end
|
74
|
+
|
75
|
+
# Load the status plugin
|
76
|
+
@plugins.module_path_prefix = 'haredo/plugins'
|
77
|
+
@plugins.load('status')
|
78
|
+
status_plugin = @plugins['status']
|
79
|
+
status_plugin.plugins = @plugins.loaded
|
80
|
+
end
|
81
|
+
|
82
|
+
# Defined the queue this service will listen on. Assumes a single-instance
|
83
|
+
# service therefore declares queue as exclusive.
|
84
|
+
def createQueue()
|
85
|
+
properties = {
|
86
|
+
:auto_delete => true,
|
87
|
+
:exclusive => true
|
88
|
+
}
|
89
|
+
|
90
|
+
@queue_properties.each do |k,v|
|
91
|
+
properties[k.to_sym] = v
|
92
|
+
end
|
93
|
+
|
94
|
+
return @channel.queue(@queue_name, properties)
|
95
|
+
end
|
96
|
+
|
97
|
+
def run(args={})
|
98
|
+
|
99
|
+
if not args.has_key?(:blocking)
|
100
|
+
args[:blocking] = true
|
101
|
+
end
|
102
|
+
|
103
|
+
if $syslog.nil?
|
104
|
+
Syslog.open('haredo', Syslog::LOG_PID,
|
105
|
+
Syslog::LOG_DAEMON | Syslog::LOG_LOCAL7)
|
106
|
+
|
107
|
+
Syslog.notice('Daemonizing')
|
108
|
+
|
109
|
+
$syslog = true
|
110
|
+
end
|
111
|
+
|
112
|
+
# Write PID file out
|
113
|
+
file = File.open(@pid_file, 'w')
|
114
|
+
file.write(Process.pid.to_s)
|
115
|
+
file.close()
|
116
|
+
|
117
|
+
listen(args)
|
118
|
+
end
|
119
|
+
|
120
|
+
def serve(msg)
|
121
|
+
data = msg.headers['i'].to_i + 1
|
122
|
+
|
123
|
+
if msg.headers.has_key?('command')
|
124
|
+
if msg.headers['key'] == @daemon_key
|
125
|
+
Syslog.notice('Exiting')
|
126
|
+
disconnect()
|
127
|
+
return
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
@plugins.process(msg)
|
132
|
+
end
|
133
|
+
|
134
|
+
def shutdown()
|
135
|
+
@plugins.shutdown()
|
136
|
+
end
|
137
|
+
|
138
|
+
end # class
|
139
|
+
|
140
|
+
end # module Service
|
141
|
+
end # module HareDo
|
data/src/lib/haredo/version.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
|
+
# Version information. Auto-generated by CMake.
|
1
2
|
module HareDo
|
2
3
|
|
3
|
-
|
4
|
+
VERSION_MAJ = '2'
|
5
|
+
VERSION_MIN = '0'
|
6
|
+
VERSION_CL = '-beta'
|
7
|
+
VERSION_PL = '0'
|
8
|
+
VERSION = '2.0.0-beta-1'
|
9
|
+
RELEASE_DATE = 'Tue, 01 Oct 2013 15:16:38 -0500'
|
4
10
|
|
5
11
|
end # module HareDo
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: haredo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Owens
|
8
8
|
autorequire:
|
9
|
-
bindir: bin
|
9
|
+
bindir: src/bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bunny
|
@@ -24,18 +24,31 @@ dependencies:
|
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
description:
|
27
|
+
description: A P2P framework over RabbitMQ
|
28
28
|
email: mikeowens@gmail.com
|
29
|
-
executables:
|
29
|
+
executables:
|
30
|
+
- haredo
|
30
31
|
extensions: []
|
31
32
|
extra_rdoc_files:
|
32
33
|
- README.md
|
33
34
|
files:
|
35
|
+
- src/lib/haredo/admin/config.rb
|
36
|
+
- src/lib/haredo/admin/interface.rb
|
37
|
+
- src/lib/haredo/config.rb
|
34
38
|
- src/lib/haredo/peer.rb
|
39
|
+
- src/lib/haredo/plugin.rb
|
40
|
+
- src/lib/haredo/plugins/echo.rb
|
41
|
+
- src/lib/haredo/plugins/example.rb
|
42
|
+
- src/lib/haredo/plugins/status.rb
|
43
|
+
- src/lib/haredo/service/admin/daemon.rb
|
44
|
+
- src/lib/haredo/service/config.rb
|
45
|
+
- src/lib/haredo/service/daemon.rb
|
35
46
|
- src/lib/haredo/version.rb
|
47
|
+
- src/bin/haredo
|
36
48
|
- README.md
|
37
49
|
homepage: https://github.com/mikeowens/haredo
|
38
|
-
licenses:
|
50
|
+
licenses:
|
51
|
+
- MIT
|
39
52
|
metadata: {}
|
40
53
|
post_install_message:
|
41
54
|
rdoc_options: []
|