murmur-rpc 0.0.1
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/README.rdoc +83 -0
- data/Rakefile +51 -0
- data/lib/interfaces/ice.rb +157 -0
- data/lib/murmur-rpc.rb +5 -0
- data/vendor/ice/Murmur.ice +764 -0
- data/vendor/ice/Murmur.rb +1668 -0
- metadata +73 -0
data/README.rdoc
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
h1. Ruby Murmur Manager
|
2
|
+
|
3
|
+
This is a quick library and control script for managing a murmur daemon. It supports both DBus and ICE (though you should really use ICE).
|
4
|
+
|
5
|
+
h3. Getting and installing
|
6
|
+
|
7
|
+
pre. git clone git://github.com/cheald/murmur-manager.git
|
8
|
+
git submodule init
|
9
|
+
git submodule update
|
10
|
+
|
11
|
+
h3. Commands
|
12
|
+
|
13
|
+
pre. [server-id] List a server's config
|
14
|
+
[server-id] set [key] [val] Set a server's config value
|
15
|
+
[server-id] start Start a server
|
16
|
+
[server-id] stop Stop a server
|
17
|
+
[server-id] destroy Permanently destroy a server
|
18
|
+
new Create a new server
|
19
|
+
list List existing servers
|
20
|
+
|
21
|
+
h3. Example usage: Creating and configuring a new virtual server
|
22
|
+
|
23
|
+
pre.. # ./manager.rb list
|
24
|
+
|
25
|
+
Server ID Running
|
26
|
+
--------- ------
|
27
|
+
1 true
|
28
|
+
2 true
|
29
|
+
|
30
|
+
# ./manager.rb new
|
31
|
+
|
32
|
+
Server created. New ID is 2
|
33
|
+
|
34
|
+
Server config:
|
35
|
+
-------------
|
36
|
+
allowhtml true
|
37
|
+
obfuscate false
|
38
|
+
registerhostname
|
39
|
+
certificate ...
|
40
|
+
port 64738
|
41
|
+
registerurl
|
42
|
+
timeout 30
|
43
|
+
defaultchannel 0
|
44
|
+
textmessagelength 5000
|
45
|
+
username [-=\w\[\]\{\}\(\)\@\|\.]+
|
46
|
+
welcometext <br />Welcome to this server running <b>Murmur</b>.<br />Enjoy your stay!<br />
|
47
|
+
bonjour true
|
48
|
+
certrequired false
|
49
|
+
channelname [ \-=\w\#\[\]\{\}\(\)\@\|]+
|
50
|
+
registername
|
51
|
+
bandwidth 72000
|
52
|
+
host 0:0:0:0:0:0:0:0
|
53
|
+
registerpassword
|
54
|
+
users 100
|
55
|
+
key ...
|
56
|
+
password
|
57
|
+
|
58
|
+
# ./manager.rb list
|
59
|
+
|
60
|
+
Server ID Running
|
61
|
+
--------- ------
|
62
|
+
1 true
|
63
|
+
2 true
|
64
|
+
3 false
|
65
|
+
|
66
|
+
# ./manager.rb 3 set port 54321
|
67
|
+
|
68
|
+
Server ID 3: port set to 612312
|
69
|
+
Server restarted
|
70
|
+
|
71
|
+
# ./manager.rb 3 set welcometext "Welcome to my Mumble server"
|
72
|
+
|
73
|
+
Server ID 3: welcometext set to Welcome to my Mumble server
|
74
|
+
Server restarted
|
75
|
+
|
76
|
+
# ./manager.rb 3 set superuser_password mynewpassword
|
77
|
+
|
78
|
+
Server ID 3: superuser_password set to mynewpassword
|
79
|
+
Server restarted
|
80
|
+
|
81
|
+
# ./manager.rb 3 start
|
82
|
+
|
83
|
+
p. Tada! A new virtual server has been spawned.
|
data/Rakefile
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require "rake"
|
2
|
+
require "rake/clean"
|
3
|
+
require "rake/gempackagetask"
|
4
|
+
require "rake/rdoctask"
|
5
|
+
require "spec/rake/spectask"
|
6
|
+
|
7
|
+
require 'lib/murmur-rpc'
|
8
|
+
|
9
|
+
NAME = 'murmur-rpc'
|
10
|
+
VERSION = MurmurRPC::VERSION
|
11
|
+
TITLE = "Murmur RPC for Ruby"
|
12
|
+
CLEAN.include ["*.gem", "rdoc"]
|
13
|
+
RDOC_OPTS = [
|
14
|
+
"-U", "--title", TITLE,
|
15
|
+
"--op", "rdoc",
|
16
|
+
"--main", "README.rdoc"
|
17
|
+
]
|
18
|
+
|
19
|
+
Rake::RDocTask.new do |rdoc|
|
20
|
+
rdoc.rdoc_dir = "rdoc"
|
21
|
+
rdoc.options += RDOC_OPTS
|
22
|
+
rdoc.rdoc_files.add %w(README.rdoc lib/**/*.rb)
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Package"
|
26
|
+
task :package => [:clean] do |p|
|
27
|
+
sh "gem build #{NAME}.gemspec"
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Install gem"
|
31
|
+
task :install => [:package] do
|
32
|
+
sh "sudo gem install ./#{NAME}-#{VERSION} --local"
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "Uninstall gem"
|
36
|
+
task :uninstall => [:clean] do
|
37
|
+
sh "sudo gem uninstall #{NAME}"
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "Upload gem to gemcutter"
|
41
|
+
task :release => [:package] do
|
42
|
+
sh "gem push ./#{NAME}-#{VERSION}.gem"
|
43
|
+
end
|
44
|
+
|
45
|
+
desc "Run all specs"
|
46
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
47
|
+
t.spec_files = Dir['spec/**/*_spec.rb']
|
48
|
+
end
|
49
|
+
|
50
|
+
task :default => [:clean, :spec]
|
51
|
+
|
@@ -0,0 +1,157 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
require 'benchmark'
|
3
|
+
require 'Glacier2'
|
4
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "..", "..", "vendor", "ice", "Murmur.rb")
|
5
|
+
module Murmur
|
6
|
+
module Ice
|
7
|
+
class ::InvalidMetaException < Exception; end
|
8
|
+
class ::Murmur::Ice::InvalidServerException < Exception; end
|
9
|
+
class Meta
|
10
|
+
def initialize(glacierHost = nil, glacierPort = nil, user = nil, pass = nil, host = "127.0.0.1", port = "6502", icesecret = nil)
|
11
|
+
ic = nil
|
12
|
+
if icesecret and icesecret != ""
|
13
|
+
props = ::Ice::createProperties
|
14
|
+
props.setProperty "Ice.ImplicitContext", "Shared"
|
15
|
+
idd = ::Ice::InitializationData.new
|
16
|
+
idd.properties = props
|
17
|
+
ic = ::Ice::initialize idd
|
18
|
+
ic.getImplicitContext.put("secret", icesecret)
|
19
|
+
else
|
20
|
+
ic = ::Ice::initialize
|
21
|
+
end
|
22
|
+
|
23
|
+
if glacierHost and glacierHost != "" then
|
24
|
+
@glacierHost = glacierHost
|
25
|
+
@glacierPort = glacierPort
|
26
|
+
validate_connection(glacierHost, glacierPort)
|
27
|
+
prx = ic.stringToProxy("Glacier2/router:tcp -h #{glacierHost} -p #{glacierPort}")
|
28
|
+
@router = ::Glacier2::RouterPrx::uncheckedCast(prx).ice_router(nil)
|
29
|
+
@session = @router.createSession(user, pass)
|
30
|
+
end
|
31
|
+
|
32
|
+
conn = "tcp -h #{host} -p #{port}"
|
33
|
+
@meta = add_proxy_router(Murmur::MetaPrx::checkedCast(ic.stringToProxy("Meta:#{conn}")))
|
34
|
+
raise "Invalid proxy" unless @meta
|
35
|
+
|
36
|
+
@servers = {}
|
37
|
+
end
|
38
|
+
|
39
|
+
def destroy
|
40
|
+
begin
|
41
|
+
@router.destroySession @session unless @router.nil?
|
42
|
+
rescue ::Ice::ConnectionLostException
|
43
|
+
# Expected - Ice raises this when the connection is terminated. Yay for exceptions as flow control?
|
44
|
+
end
|
45
|
+
return nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def add_proxy_router(prx)
|
49
|
+
@router ? prx.ice_router(@router) : prx
|
50
|
+
end
|
51
|
+
|
52
|
+
def get_server(id)
|
53
|
+
@servers[id] ||= Server.new(self, @meta, id)
|
54
|
+
end
|
55
|
+
|
56
|
+
def uncache_server(id)
|
57
|
+
@servers[id] = nil
|
58
|
+
end
|
59
|
+
|
60
|
+
def list_servers(only_booted = false)
|
61
|
+
method = only_booted ? :getBootedServers : :getAllServers
|
62
|
+
@meta.send(method).collect do |server|
|
63
|
+
server = add_proxy_router(server)
|
64
|
+
@servers[server.id] ||= Server.new(self, @meta, nil, server)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def validate
|
69
|
+
@meta.getVersion
|
70
|
+
return true
|
71
|
+
end
|
72
|
+
|
73
|
+
def new_server(port = nil)
|
74
|
+
server = @meta.newServer
|
75
|
+
@servers[server.id] = Server.new(self, @meta, nil, add_proxy_router(server))
|
76
|
+
end
|
77
|
+
|
78
|
+
def method_missing(method, *args)
|
79
|
+
method = method.to_s
|
80
|
+
method.gsub!(/_([a-z])/) { $1.upcase }
|
81
|
+
@meta.send method, *args
|
82
|
+
end
|
83
|
+
|
84
|
+
def validate_connection(host, port)
|
85
|
+
Timeout::timeout(2) do
|
86
|
+
begin
|
87
|
+
s = TCPSocket.new(host, port)
|
88
|
+
s.close
|
89
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
90
|
+
raise InvalidMetaException
|
91
|
+
end
|
92
|
+
end
|
93
|
+
rescue Timeout::Error
|
94
|
+
raise InvalidMetaException
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Server
|
99
|
+
def initialize(host, meta, id = nil, interface = nil)
|
100
|
+
@meta = meta
|
101
|
+
@host = host
|
102
|
+
if id.nil? and interface.nil? then
|
103
|
+
raise "Must pass either a server ID or a server interface instance"
|
104
|
+
end
|
105
|
+
@interface = interface || begin
|
106
|
+
server = @meta.getServer(id)
|
107
|
+
raise ::Murmur::Ice::InvalidServerException if server.nil?
|
108
|
+
host.add_proxy_router(server)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def id
|
113
|
+
@interface.id
|
114
|
+
end
|
115
|
+
|
116
|
+
def running?
|
117
|
+
@interface.isRunning
|
118
|
+
end
|
119
|
+
|
120
|
+
def config
|
121
|
+
@config = @meta.getDefaultConf.merge(@interface.getAllConf)
|
122
|
+
end
|
123
|
+
|
124
|
+
def destroy!
|
125
|
+
@interface.stop if running?
|
126
|
+
@host.uncache_server @interface.id
|
127
|
+
@interface.delete
|
128
|
+
end
|
129
|
+
alias :delete :destroy!
|
130
|
+
|
131
|
+
def restart!
|
132
|
+
@interface.stop if running?
|
133
|
+
@interface.start
|
134
|
+
@running = nil
|
135
|
+
end
|
136
|
+
|
137
|
+
def [](key)
|
138
|
+
config[key]
|
139
|
+
end
|
140
|
+
|
141
|
+
def []=(key, val)
|
142
|
+
@interface.setConf(key, val.to_s)
|
143
|
+
@config = nil
|
144
|
+
end
|
145
|
+
|
146
|
+
def setConf(key, val)
|
147
|
+
self[key] = val
|
148
|
+
end
|
149
|
+
|
150
|
+
def method_missing(method, *args)
|
151
|
+
method = method.to_s
|
152
|
+
method.gsub!(/_([a-z])/) { $1.upcase }
|
153
|
+
ret = @interface.send method, *args
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|