Forked mumble-django project from https://bitbucket.org/Svedrin/mumble-django
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

400 lines
11 KiB

  1. # -*- coding: utf-8 -*-
  2. # mumble-django contributed by withgod@sourceforge.net
  3. #zope.interface is good but don't standard interface library
  4. #abc is better but 2.6 higher.
  5. #import abc
  6. #from django.conf import settings
  7. class MumbleCtlBase ():
  8. ''' abstract Ctrol Object '''
  9. def getAllConf(self, srvid):
  10. pass
  11. def setConf(self, srvid, key, value):
  12. pass
  13. def getDefaultConf(self):
  14. pass
  15. def getValue(self, srvid, key):
  16. pass
  17. def newServer(self):
  18. pass
  19. def setSuperUserPassword(self, srvid, value):
  20. pass
  21. def start(self, srvid):
  22. pass
  23. def stop(self, srvid):
  24. pass
  25. def isBooted(self, srvid):
  26. pass
  27. def deleteServer(self, srvid):
  28. pass
  29. def getUsers(self, srvid):
  30. pass
  31. def getPlayers(self, srvid):
  32. pass
  33. def getRegisteredPlayers(self, srvid):
  34. pass
  35. def getChannels(self, srvid):
  36. pass
  37. def registerPlayer(self, srvid, name):
  38. pass
  39. def setRegistration(self, srvid, mumbleid, name, email, password):
  40. pass
  41. def unregisterPlayer(self, srvid, mumbleid):
  42. pass
  43. def getBootedServers(self):
  44. pass
  45. def getAllServers(self):
  46. pass
  47. def getACL(self, srvid, identifier):
  48. pass
  49. def setACL(self, srvid, acl):
  50. pass
  51. @staticmethod
  52. def newInstance():
  53. # if dbus
  54. #if settings.DAOTYPE == 'dbus':
  55. #ret = MumbleCtlDbus()
  56. ret = MumbleCtlIce()
  57. #else:
  58. # ret = MumbleCtlIce()
  59. return ret
  60. import Ice
  61. class MumbleCtlIce(MumbleCtlBase):
  62. proxy = 'Meta:tcp -h 127.0.0.1 -p 6502'
  63. slice = '/usr/share/slice/Murmur.ice'
  64. meta = None
  65. def __init__(self):
  66. self.meta = self._getIceMeta()
  67. def _getIceMeta(self):
  68. Ice.loadSlice(self.slice)
  69. ice = Ice.initialize()
  70. import Murmur
  71. prx = ice.stringToProxy(self.proxy)
  72. return Murmur.MetaPrx.checkedCast(prx)
  73. def _getIceServerObject(self, srvid):
  74. return self.meta.getServer(srvid);
  75. def getBootedServers(self):
  76. ret = []
  77. for x in self.meta.getBootedServers():
  78. ret.append(x.id())
  79. return ret
  80. def getAllServers(self):
  81. ret = []
  82. for x in self.meta.getAllServers():
  83. ret.append(x.id())
  84. return ret
  85. def getRegisteredPlayers(self, srvid):
  86. users = self._getIceServerObject(srvid).getRegisteredPlayers('')
  87. ret = []
  88. for user in users:
  89. ret.append([user.playerid, unicode(user.name), unicode(user.email), unicode(user.pw)])
  90. return ret
  91. def getChannels(self, srvid):
  92. chans = self._getIceServerObject(srvid).getChannels()
  93. ret = []
  94. for x in chans:
  95. chan = chans[x]
  96. ret.append([chan.id, unicode(chan.name), chan.parent, chan.links])
  97. return ret
  98. def getPlayers(self, srvid):
  99. users = self._getIceServerObject(srvid).getPlayers()
  100. ret = []
  101. for x in users:
  102. user = users[x]
  103. ret.append([user.session, user.mute, user.deaf, user.suppressed, user.selfMute, user.selfDeaf, user.channel, user.playerid, unicode(user.name), user.onlinesecs, user.bytespersec])
  104. return ret
  105. def getACL(self, srvid, identifier):
  106. import Murmur
  107. acls = self._getIceServerObject(srvid).getACL(identifier)
  108. ret = []
  109. for x in acls:
  110. if isinstance(x, list):
  111. tmp = []
  112. for y in x:
  113. if y.__class__ is Murmur.ACL:
  114. tmp.append([y.applyHere, y.applySubs, y.inherited, y.playerid, unicode(y.group), y.allow, y.deny])
  115. elif y.__class__ is Murmur.Group:
  116. tmp.append([unicode(y.name), y.inherited, y.inherit, y.inheritable, y.add, y.remove, y.members])
  117. ret.append(tmp)
  118. else:
  119. ret.append(x)
  120. return ret
  121. def getDefaultConf(self):
  122. return MumbleCtlIce.setUnicodeFlag(self.meta.getDefaultConf())
  123. def getAllConf(self, srvid):
  124. return MumbleCtlIce.setUnicodeFlag(self._getIceServerObject(srvid).getAllConf())
  125. def newServer(self):
  126. return self.meta.newServer().id()
  127. def deleteServer( self, srvid ):
  128. if self._getIceServerObject(srvid).isRunning():
  129. self._getIceServerObject(srvid).stop()
  130. self._getIceServerObject(srvid).delete()
  131. def setSuperUserPassword(self, srvid, value):
  132. self.meta.setSuperUserPassword(srvid, value)
  133. def setConf(self, srvid, key, value):
  134. #print "%s server %s/%s" % (srvid, key, value)
  135. self._getIceServerObject(srvid).setConf(key, value)
  136. def registerPlayer(self, srvid, name):
  137. return self._getIceServerObject(srvid).registerPlayer(name)
  138. def unregisterPlayer(self, srvid, mumbleid):
  139. self._getIceServerObject(srvid).unregisterPlayer(mumbleid)
  140. def setRegistration(self, srvid, mumbleid, name, email, password):
  141. user = self._getIceServerObject(srvid).getRegistration(mumbleid)
  142. user.name = name
  143. user.email = email
  144. user.pw = password
  145. #print user
  146. # update*r*egistration r is lowercase...
  147. return self._getIceServerObject(srvid).updateregistration(user)
  148. def setACL(self, srvid, acl):
  149. '''
  150. print "xxxx"
  151. print srvid
  152. print acl
  153. print "--"
  154. print acl.pack()
  155. print "xxxx"
  156. '''
  157. import Murmur
  158. tmp = acl.pack()
  159. id = tmp[0]
  160. _acls = tmp[1]
  161. acls = []
  162. _groups = tmp[2]
  163. groups = []
  164. inherit = tmp[3]
  165. for x in _acls:
  166. acl = Murmur.ACL()
  167. acl.applyHere = x[0]
  168. acl.applySubs = x[1]
  169. acl.inherited = x[2]
  170. acl.playerid = x[3]
  171. acl.group = x[4]
  172. acl.allow = x[5]
  173. acl.deny = x[6]
  174. acls.append(acl)
  175. for x in _groups:
  176. group = Murmur.Group()
  177. group.name = x[0]
  178. group.inherited = x[1]
  179. group.inherit = x[2]
  180. group.inheritable = x[3]
  181. group.add = x[4]
  182. group.remove = x[5]
  183. group.members = x[6]
  184. groups.append(group)
  185. self._getIceServerObject(srvid).setACL(id, acls, groups, inherit)
  186. @staticmethod
  187. def setUnicodeFlag(data):
  188. ret = {}
  189. for key in data.keys():
  190. ret[unicode(key)] = unicode(data[key])
  191. return ret
  192. import dbus
  193. class MumbleCtlDbus(MumbleCtlBase):
  194. meta = None
  195. dbus_base='net.sourceforge.mumble.murmur'
  196. def __init__(self):
  197. # Prior to saving the model, connect to murmur via dbus and update its settings.
  198. self.meta = self._getDbusMeta();
  199. def _getDbusMeta( self ):
  200. return dbus.Interface( dbus.SystemBus().get_object( self.dbus_base, '/' ), 'net.sourceforge.mumble.Meta' );
  201. def _getDbusServerObject( self, srvid):
  202. "Connects to DBus and returns an mmServer object representing this Murmur instance."
  203. if srvid not in self.getBootedServers():
  204. raise Exception, 'No murmur process with the given server ID (%d) is running and attached to system dbus under %s.' % ( srvid, self.meta );
  205. return dbus.Interface( dbus.SystemBus().get_object( self.dbus_base, '/%d' % srvid ), 'net.sourceforge.mumble.Murmur' );
  206. def getAllConf(self, srvid):
  207. return MumbleCtlDbus.converDbusTypeToNative(self.meta.getAllConf(dbus.Int32(srvid)))
  208. def setConf(self, srvid, key, value):
  209. self.meta.setConf(dbus.Int32( srvid ), key, value)
  210. def getDefaultConf(self):
  211. return MumbleCtlDbus.converDbusTypeToNative(self.meta.getDefaultConf())
  212. def deleteServer( self, srvid ):
  213. srvid = dbus.Int32( srvid )
  214. if self.meta.isBooted( srvid ):
  215. self.meta.stop( srvid )
  216. self.meta.deleteServer( srvid )
  217. def newServer(self):
  218. return self.meta.newServer()
  219. def registerPlayer(self, srvid, name):
  220. return MumbleCtlDbus.converDbusTypeToNative(self._getDbusServerObject(srvid).registerPlayer(name))
  221. def unregisterPlayer(self, srvid, mumbleid):
  222. self._getDbusServerObject(srvid).unregisterPlayer(dbus.Int32( mumbleid ))
  223. def getChannels(self, srvid):
  224. return MumbleCtlDbus.converDbusTypeToNative(self._getDbusServerObject(srvid).getChannels())
  225. def getPlayers(self, srvid):
  226. return MumbleCtlDbus.converDbusTypeToNative(self._getDbusServerObject(srvid).getPlayers())
  227. def getRegisteredPlayers(self, srvid):
  228. return MumbleCtlDbus.converDbusTypeToNative(self._getDbusServerObject(srvid).getRegisteredPlayers(''))
  229. def getACL(self, srvid, identifier):
  230. return MumbleCtlDbus.converDbusTypeToNative(self._getDbusServerObject(srvid).getACL(identifier))
  231. def setACL(self, srvid, acl):
  232. self._getDbusServerObject(srvid).setACL(*acl.pack())
  233. def getBootedServers(self):
  234. return MumbleCtlDbus.converDbusTypeToNative(self.meta.getBootedServers())
  235. def getAllServers(self):
  236. return MumbleCtlDbus.converDbusTypeToNative(self.meta.getAllServers())
  237. def setSuperUserPassword(self, srvid, value):
  238. self.meta.setSuperUserPassword(dbus.Int32(srvid), value)
  239. def setRegistration(self, srvid, mumbleid, name, email, password):
  240. return MumbleCtlDbus.converDbusTypeToNative(self._getDbusServerObject(srvid).setRegistration(dbus.Int32(mumbleid), dbus.String(name), dbus.String(email), dbus.String(password)))
  241. @staticmethod
  242. def converDbusTypeToNative(data):
  243. #i know dbus.* type is extends python native type.
  244. #but dbus.* type is not native type. it's not good transparent for using Ice/Dbus.
  245. ret = None
  246. if isinstance(data, tuple) or type(data) is data.__class__ is dbus.Array or data.__class__ is dbus.Struct:
  247. ret = []
  248. for x in data:
  249. ret.append(MumbleCtlDbus.converDbusTypeToNative(x))
  250. elif data.__class__ is dbus.Dictionary:
  251. ret = {}
  252. for x in data.items():
  253. ret[MumbleCtlDbus.converDbusTypeToNative(x[0])] = MumbleCtlDbus.converDbusTypeToNative(x[1])
  254. else:
  255. if data.__class__ is dbus.Boolean:
  256. ret = bool(data)
  257. elif data.__class__ is dbus.String:
  258. ret = unicode(data)
  259. elif data.__class__ is dbus.Int32 or data.__class__ is dbus.UInt32:
  260. ret = int(data)
  261. return ret
  262. if __name__ == "__main__":
  263. import sys
  264. x = int(sys.argv[1])
  265. dbusCtl = MumbleCtlDbus()
  266. iceCtl = MumbleCtlIce()
  267. '''
  268. print "--- Dbus test start"
  269. #ctl = MumbleCtlBase.newInstance()
  270. print dbusCtl
  271. print dbusCtl.meta
  272. print "booted server", dbusCtl.getBootedServers()
  273. print "chans"
  274. print dbusCtl.getChannels(x)
  275. print "users"
  276. print dbusCtl.getPlayers(x)
  277. print "getACL", dbusCtl.getACL(x, 0)
  278. print "getAllServers()"
  279. print dbusCtl.getAllServers()
  280. print "getDefaultConf()"
  281. print dbusCtl.getDefaultConf()
  282. print "getAllConf(x)"
  283. print dbusCtl.getAllConf(x)
  284. print "--Dbus end--"
  285. print "--- Ice test start"
  286. print iceCtl
  287. print iceCtl.meta
  288. print "booted server", iceCtl.getBootedServers()
  289. print "chans"
  290. print iceCtl.getChannels(x)
  291. print "users"
  292. print iceCtl.getPlayers(x)
  293. print "getACL", iceCtl.getACL(x, 0)
  294. print "getAllServers()"
  295. print iceCtl.getAllServers()
  296. print "getDefaultConf()"
  297. print iceCtl.getDefaultConf()
  298. print "getAllConf(x)"
  299. print iceCtl.getAllConf(x)
  300. print "--- Ice test end"
  301. '''
  302. print "equal test ---"
  303. print "getBootedServers [%s]" % (dbusCtl.getBootedServers() == iceCtl.getBootedServers())
  304. print "getChannels [%s]" % (dbusCtl.getChannels(x) == iceCtl.getChannels(x))
  305. print "getPlayers [%s]" % (dbusCtl.getPlayers(x) == iceCtl.getPlayers(x))
  306. print "getACL(x, 0) [%s]" % (dbusCtl.getACL(x, 0) == iceCtl.getACL(x, 0))
  307. print "getAllServers [%s]" % (dbusCtl.getAllServers() == iceCtl.getAllServers())
  308. print "getDefaultConf [%s]" % (dbusCtl.getDefaultConf() == iceCtl.getDefaultConf())
  309. print "getAllConf(x) [%s]" % (dbusCtl.getAllConf(x) == iceCtl.getAllConf(x))
  310. print "getRegisteredPlayers(x) [%s]" % (dbusCtl.getRegisteredPlayers(x) == iceCtl.getRegisteredPlayers(x))
  311. #print iceCtl.getRegisteredPlayers(x)
  312. #print iceCtl.getACL(x, 0)