murmur-rpc 0.0.8 → 0.1.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.
- checksums.yaml +7 -0
- data/README.md +11 -0
- data/lib/murmur-rpc/interfaces/ice.rb +161 -0
- data/lib/murmur-rpc/version.rb +3 -0
- data/lib/murmur-rpc.rb +1 -5
- data/vendor/ice/Murmur.ice +37 -3
- data/vendor/ice/Murmur.rb +252 -143
- metadata +49 -47
- data/README.rdoc +0 -83
- data/lib/interfaces/ice.rb +0 -159
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9c00935a2c1e63c82960fb0c0ec13e844e0e53ec
|
4
|
+
data.tar.gz: 07b869391a613277388e2d4789fecd73222d4834
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 79c3db87c1b3d776c933fbbcd1fb2d4d8edbdc3b7b40b46c3d8e980b5113609fe0426f410ec3a43562f7c347c922790a0e8737cf4c5a607fa205d2cb6bbb86d7
|
7
|
+
data.tar.gz: 078143492c5360ef460553f083f0e80a1c13899bb356ac2cebeb9352805b461c030a0eeea745c80656c02d3accdd82f406c89aa14c3f6170494f67c44d12c2cc
|
data/README.md
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# Murmur RPC Ruby Library
|
2
|
+
|
3
|
+
This is a rubygem that allows you to connect and manage a murmurd server using the Ice interface. It require the ruby Ice libraries to be installed.
|
4
|
+
|
5
|
+
### How to update slice
|
6
|
+
|
7
|
+
```
|
8
|
+
cd vendor/ice
|
9
|
+
wget -O Murmur.ice "https://raw.githubusercontent.com/mumble-voip/mumble/master/src/murmur/Murmur.ice"
|
10
|
+
slice2rb Murmur.ice
|
11
|
+
```
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
require 'benchmark'
|
3
|
+
require 'Glacier2'
|
4
|
+
|
5
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "..", "..", "..", "vendor", "ice", "Murmur.rb")
|
6
|
+
|
7
|
+
module Murmur
|
8
|
+
module Ice
|
9
|
+
class ::InvalidMetaException < Exception; end
|
10
|
+
class ::Murmur::Ice::InvalidServerException < Exception; end
|
11
|
+
class Meta
|
12
|
+
def initialize(glacierHost = nil, glacierPort = nil, user = nil, pass = nil, host = "127.0.0.1", port = "6502", icesecret = nil, connect_timeout=nil, idletime = nil)
|
13
|
+
ic = nil
|
14
|
+
if icesecret and icesecret != ""
|
15
|
+
props = ::Ice::createProperties
|
16
|
+
props.setProperty "Ice.ImplicitContext", "Shared"
|
17
|
+
props.setProperty "Ice.Override.Timeout", connect_timeout.to_s unless connect_timeout == nil
|
18
|
+
props.setProperty "Ice.MessageSizeMax", "65536"
|
19
|
+
props.setProperty "Ice.Default.EncodingVersion", "1.0"
|
20
|
+
idd = ::Ice::InitializationData.new
|
21
|
+
idd.properties = props
|
22
|
+
ic = ::Ice::initialize idd
|
23
|
+
ic.getImplicitContext.put("secret", icesecret)
|
24
|
+
else
|
25
|
+
ic = ::Ice::initialize
|
26
|
+
end
|
27
|
+
|
28
|
+
if glacierHost and glacierHost != "" then
|
29
|
+
@glacierHost = glacierHost
|
30
|
+
@glacierPort = glacierPort
|
31
|
+
validate_connection(glacierHost, glacierPort)
|
32
|
+
prx = ic.stringToProxy("Glacier2/router:tcp -h #{glacierHost} -p #{glacierPort}")
|
33
|
+
@router = ::Glacier2::RouterPrx::uncheckedCast(prx).ice_router(nil)
|
34
|
+
@session = @router.createSession(user, pass)
|
35
|
+
end
|
36
|
+
conn = "tcp -h #{host} -p #{port}"
|
37
|
+
@meta = add_proxy_router(Murmur::MetaPrx::checkedCast(ic.stringToProxy("Meta:#{conn}")))
|
38
|
+
raise "Invalid proxy" unless @meta
|
39
|
+
|
40
|
+
@servers = {}
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy
|
44
|
+
begin
|
45
|
+
@router.destroySession @session unless @router.nil?
|
46
|
+
rescue ::Ice::ConnectionLostException
|
47
|
+
# Expected - Ice raises this when the connection is terminated. Yay for exceptions as flow control?
|
48
|
+
end
|
49
|
+
return nil
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_proxy_router(prx)
|
53
|
+
@router ? prx.ice_router(@router) : prx
|
54
|
+
end
|
55
|
+
|
56
|
+
def get_server(id)
|
57
|
+
@servers[id] ||= Server.new(self, @meta, id)
|
58
|
+
end
|
59
|
+
|
60
|
+
def uncache_server(id)
|
61
|
+
@servers[id] = nil
|
62
|
+
end
|
63
|
+
|
64
|
+
def list_servers(only_booted = false)
|
65
|
+
method = only_booted ? :getBootedServers : :getAllServers
|
66
|
+
@meta.send(method).collect do |server|
|
67
|
+
server = add_proxy_router(server)
|
68
|
+
@servers[server.id] ||= Server.new(self, @meta, nil, server)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def validate
|
73
|
+
@meta.getVersion
|
74
|
+
return true
|
75
|
+
end
|
76
|
+
|
77
|
+
def new_server(port = nil)
|
78
|
+
server = @meta.newServer
|
79
|
+
@servers[server.id] = Server.new(self, @meta, nil, add_proxy_router(server))
|
80
|
+
end
|
81
|
+
|
82
|
+
def method_missing(method, *args)
|
83
|
+
method = method.to_s
|
84
|
+
method.gsub!(/_([a-z])/) { $1.upcase }
|
85
|
+
@meta.send method, *args
|
86
|
+
end
|
87
|
+
|
88
|
+
def validate_connection(host, port)
|
89
|
+
Timeout::timeout(2) do
|
90
|
+
begin
|
91
|
+
s = TCPSocket.new(host, port)
|
92
|
+
s.close
|
93
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
94
|
+
raise InvalidMetaException
|
95
|
+
end
|
96
|
+
end
|
97
|
+
rescue Timeout::Error
|
98
|
+
raise InvalidMetaException
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
class Server
|
103
|
+
def initialize(host, meta, id = nil, interface = nil)
|
104
|
+
@meta = meta
|
105
|
+
@host = host
|
106
|
+
if id.nil? and interface.nil? then
|
107
|
+
raise "Must pass either a server ID or a server interface instance"
|
108
|
+
end
|
109
|
+
@interface = interface || begin
|
110
|
+
server = @meta.getServer(id)
|
111
|
+
raise ::Murmur::Ice::InvalidServerException if server.nil?
|
112
|
+
host.add_proxy_router(server)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def id
|
117
|
+
@interface.id
|
118
|
+
end
|
119
|
+
|
120
|
+
def running?
|
121
|
+
@interface.isRunning
|
122
|
+
end
|
123
|
+
|
124
|
+
def config
|
125
|
+
@config = @meta.getDefaultConf.merge(@interface.getAllConf)
|
126
|
+
end
|
127
|
+
|
128
|
+
def destroy!
|
129
|
+
@interface.stop if running?
|
130
|
+
@host.uncache_server @interface.id
|
131
|
+
@interface.delete
|
132
|
+
end
|
133
|
+
alias :delete :destroy!
|
134
|
+
|
135
|
+
def restart!
|
136
|
+
@interface.stop if running?
|
137
|
+
@interface.start
|
138
|
+
@running = nil
|
139
|
+
end
|
140
|
+
|
141
|
+
def [](key)
|
142
|
+
config[key]
|
143
|
+
end
|
144
|
+
|
145
|
+
def []=(key, val)
|
146
|
+
@interface.setConf(key, val.to_s)
|
147
|
+
@config = nil
|
148
|
+
end
|
149
|
+
|
150
|
+
def setConf(key, val)
|
151
|
+
self[key] = val
|
152
|
+
end
|
153
|
+
|
154
|
+
def method_missing(method, *args)
|
155
|
+
method = method.to_s
|
156
|
+
method.gsub!(/_([a-z])/) { $1.upcase }
|
157
|
+
@interface.send method, *args
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
data/lib/murmur-rpc.rb
CHANGED
data/vendor/ice/Murmur.ice
CHANGED
@@ -64,10 +64,27 @@ module Murmur
|
|
64
64
|
bool tcponly;
|
65
65
|
/** Idle time. This is how many seconds it is since the user last spoke. Other activity is not counted. */
|
66
66
|
int idlesecs;
|
67
|
+
/** UDP Ping Average. This is the average ping for the user via UDP over the duration of the connection. */
|
68
|
+
float udpPing;
|
69
|
+
/** TCP Ping Average. This is the average ping for the user via TCP over the duration of the connection. */
|
70
|
+
float tcpPing;
|
67
71
|
};
|
68
72
|
|
69
73
|
sequence<int> IntList;
|
70
74
|
|
75
|
+
/** A text message between users.
|
76
|
+
**/
|
77
|
+
struct TextMessage {
|
78
|
+
/** Sessions (connected users) who were sent this message. */
|
79
|
+
IntList sessions;
|
80
|
+
/** Channels who were sent this message. */
|
81
|
+
IntList channels;
|
82
|
+
/** Trees of channels who were sent this message. */
|
83
|
+
IntList trees;
|
84
|
+
/** The contents of the message. */
|
85
|
+
string text;
|
86
|
+
};
|
87
|
+
|
71
88
|
/** A channel.
|
72
89
|
**/
|
73
90
|
struct Channel {
|
@@ -245,6 +262,8 @@ module Murmur
|
|
245
262
|
exception InvalidCallbackException extends MurmurException {};
|
246
263
|
/** This is thrown when you supply the wrong secret in the calling context. */
|
247
264
|
exception InvalidSecretException extends MurmurException {};
|
265
|
+
/** This is thrown when the channel operation would excede the channel nesting limit */
|
266
|
+
exception NestingLimitException extends MurmurException {};
|
248
267
|
|
249
268
|
/** Callback interface for servers. You can supply an implementation of this to receive notification
|
250
269
|
* messages from the server.
|
@@ -270,6 +289,11 @@ module Murmur
|
|
270
289
|
* @param state New state of user.
|
271
290
|
*/
|
272
291
|
idempotent void userStateChanged(User state);
|
292
|
+
/** Called when user writes a text message
|
293
|
+
* @param state the User sending the message
|
294
|
+
* @param message the TextMessage the user has sent
|
295
|
+
*/
|
296
|
+
idempotent void userTextMessage(User state, TextMessage message);
|
273
297
|
/** Called when a new channel is created.
|
274
298
|
* @param state State of new channel.
|
275
299
|
*/
|
@@ -414,7 +438,10 @@ module Murmur
|
|
414
438
|
/** Start server. */
|
415
439
|
void start() throws ServerBootedException, ServerFailureException, InvalidSecretException;
|
416
440
|
|
417
|
-
/** Stop server.
|
441
|
+
/** Stop server.
|
442
|
+
* Note: Server will be restarted on Murmur restart unless explicitly disabled
|
443
|
+
* with setConf("boot", false)
|
444
|
+
*/
|
418
445
|
void stop() throws ServerBootedException, InvalidSecretException;
|
419
446
|
|
420
447
|
/** Delete server and all it's configuration. */
|
@@ -550,6 +577,13 @@ module Murmur
|
|
550
577
|
* @return true if any of the permissions in perm were set for the user.
|
551
578
|
*/
|
552
579
|
bool hasPermission(int session, int channelid, int perm) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException;
|
580
|
+
|
581
|
+
/** Return users effective permissions
|
582
|
+
* @param session Connection ID of user. See {@link User.session}.
|
583
|
+
* @param channelid ID of Channel. See {@link Channel.id}.
|
584
|
+
* @return bitfield of allowed actions
|
585
|
+
*/
|
586
|
+
idempotent int effectivePermissions(int session, int channelid) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException;
|
553
587
|
|
554
588
|
/** Add a context callback. This is done per user, and will add a context menu action for the user.
|
555
589
|
*
|
@@ -581,7 +615,7 @@ module Murmur
|
|
581
615
|
* @param state Channel state to set.
|
582
616
|
* @see getChannelState
|
583
617
|
*/
|
584
|
-
idempotent void setChannelState(Channel state) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
|
618
|
+
idempotent void setChannelState(Channel state) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException;
|
585
619
|
|
586
620
|
/** Remove a channel and all its subchannels.
|
587
621
|
* @param channelid ID of Channel. See {@link Channel.id}.
|
@@ -593,7 +627,7 @@ module Murmur
|
|
593
627
|
* @param parent Channel ID of parent channel. See {@link Channel.id}.
|
594
628
|
* @return ID of newly created channel.
|
595
629
|
*/
|
596
|
-
int addChannel(string name, int parent) throws ServerBootedException, InvalidChannelException, InvalidSecretException;
|
630
|
+
int addChannel(string name, int parent) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException;
|
597
631
|
|
598
632
|
/** Send text message to channel or a tree of channels.
|
599
633
|
* @param channelid Channel ID of channel to send to. See {@link Channel.id}.
|