murmur-rpc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
data/lib/murmur-rpc.rb ADDED
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/interfaces/ice.rb'
2
+
3
+ module MurmurRPC
4
+ VERSION="0.0.1"
5
+ end