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 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