comparison libervia.tac @ 127:e19a8de8b3de

radio collective first draft
author Goffi <goffi@goffi.org>
date Sun, 22 Jan 2012 19:38:05 +0100
parents f9d63624699f
children 2849ec993d89
comparison
equal deleted inserted replaced
126:adecb2566b53 127:e19a8de8b3de
41 from txjsonrpc.web import jsonrpc 41 from txjsonrpc.web import jsonrpc
42 from txjsonrpc import jsonrpclib 42 from txjsonrpc import jsonrpclib
43 from sat_frontends.bridge.DBus import DBusBridgeFrontend,BridgeExceptionNoService 43 from sat_frontends.bridge.DBus import DBusBridgeFrontend,BridgeExceptionNoService
44 from email.mime.text import MIMEText 44 from email.mime.text import MIMEText
45 from logging import debug, info, warning, error 45 from logging import debug, info, warning, error
46 import re 46 import re, glob
47 import glob 47 import os.path, sys
48 import os.path 48 import tempfile, shutil, uuid
49 import sys
50 from server_side.blog import MicroBlog 49 from server_side.blog import MicroBlog
51 from zope.interface import Interface, Attribute, implements 50 from zope.interface import Interface, Attribute, implements
52 51
53 TIMEOUT = 10 #Session's time out, after that the user will be disconnected 52 TIMEOUT = 10 #Session's time out, after that the user will be disconnected
54 LIBERVIA_DIR = "output/" 53 LIBERVIA_DIR = "output/"
596 if request: 595 if request:
597 self.register._logged(profile, request) 596 self.register._logged(profile, request)
598 597
599 def connectionError(self, error_type, profile): 598 def connectionError(self, error_type, profile):
600 assert(self.register) #register must be plugged 599 assert(self.register) #register must be plugged
601 import pdb
602 pdb.set_trace()
603 request = self.register.getWaitingRequest(profile) 600 request = self.register.getWaitingRequest(profile)
604 if request: #The user is trying to log in 601 if request: #The user is trying to log in
605 if error_type == "AUTH_ERROR": 602 if error_type == "AUTH_ERROR":
606 _error_t = "AUTH ERROR" 603 _error_t = "AUTH ERROR"
607 else: 604 else:
620 fault = jsonrpclib.Fault(0, "Not allowed") #FIXME: define some standard error codes for libervia 617 fault = jsonrpclib.Fault(0, "Not allowed") #FIXME: define some standard error codes for libervia
621 return jsonrpc.JSONRPC._cbRender(self, fault, request, parsed.get('id'), parsed.get('jsonrpc')) 618 return jsonrpc.JSONRPC._cbRender(self, fault, request, parsed.get('id'), parsed.get('jsonrpc'))
622 self.request = request 619 self.request = request
623 return jsonrpc.JSONRPC.render(self, request) 620 return jsonrpc.JSONRPC.render(self, request)
624 621
622 class UploadManager(Resource):
623 """This class manage the upload of a file
624 It redirect the stream to SàT core backend"""
625 isLeaf = True
626
627 def __init__(self, sat_host):
628 self.sat_host=sat_host
629 self.upload_dir = tempfile.mkdtemp()
630 self.sat_host.addCleanup(shutil.rmtree, self.upload_dir)
631
632 def render(self, request):
633 """
634 Render method with some hacks:
635 - if login is requested, try to login with form data
636 - except login, every method is jsonrpc
637 - user doesn't need to be authentified for isRegistered, but must be for all other methods
638 """
639 filename = str(uuid.uuid4())
640 with open(os.path.join(self.upload_dir, filename),'w') as f:
641 f.write(request.args['song'][0])
642 return "OK"
625 643
626 class Libervia(service.Service): 644 class Libervia(service.Service):
627 645
628 def __init__(self): 646 def __init__(self):
647 self._cleanup = []
629 root = ProtectedFile(LIBERVIA_DIR) 648 root = ProtectedFile(LIBERVIA_DIR)
630 self.signal_handler = SignalHandler(self) 649 self.signal_handler = SignalHandler(self)
631 _register = Register(self) 650 _register = Register(self)
651 _upload = UploadManager(self)
632 self.signal_handler.plugRegister(_register) 652 self.signal_handler.plugRegister(_register)
633 self.sessions = {} #key = session value = user 653 self.sessions = {} #key = session value = user
634 self.prof_connected = set() #Profiles connected 654 self.prof_connected = set() #Profiles connected
635 self.action_handler = SATActionIDHandler() 655 self.action_handler = SATActionIDHandler()
636 ## bridge ## 656 ## bridge ##
645 #core 665 #core
646 for signal_name in ['presenceUpdate', 'newMessage', 'subscribe', 'contactDeleted', 'newContact', 'updatedValue']: 666 for signal_name in ['presenceUpdate', 'newMessage', 'subscribe', 'contactDeleted', 'newContact', 'updatedValue']:
647 self.bridge.register(signal_name, self.signal_handler.getGenericCb(signal_name)) 667 self.bridge.register(signal_name, self.signal_handler.getGenericCb(signal_name))
648 #plugins 668 #plugins
649 for signal_name in ['personalEvent', 'roomJoined', 'roomUserJoined', 'roomUserLeft', 'tarotGameStarted', 'tarotGameNew', 'tarotGameChooseContrat', 669 for signal_name in ['personalEvent', 'roomJoined', 'roomUserJoined', 'roomUserLeft', 'tarotGameStarted', 'tarotGameNew', 'tarotGameChooseContrat',
650 'tarotGameShowCards', 'tarotGameInvalidCards', 'tarotGameCardsPlayed', 'tarotGameYourTurn', 'tarotGameScore']: 670 'tarotGameShowCards', 'tarotGameInvalidCards', 'tarotGameCardsPlayed', 'tarotGameYourTurn', 'tarotGameScore',
671 'radiocolStarted']:
651 self.bridge.register(signal_name, self.signal_handler.getGenericCb(signal_name), "plugin") 672 self.bridge.register(signal_name, self.signal_handler.getGenericCb(signal_name), "plugin")
652 self.media_dir = self.bridge.getConfig('','media_dir') 673 self.media_dir = self.bridge.getConfig('','media_dir')
653 self.local_dir = self.bridge.getConfig('','local_dir') 674 self.local_dir = self.bridge.getConfig('','local_dir')
654 root.putChild('json_signal_api', self.signal_handler) 675 root.putChild('json_signal_api', self.signal_handler)
655 root.putChild('json_api', MethodHandler(self)) 676 root.putChild('json_api', MethodHandler(self))
656 root.putChild('register_api', _register) 677 root.putChild('register_api', _register)
678 root.putChild('upload', _upload)
657 root.putChild('blog', MicroBlog(self)) 679 root.putChild('blog', MicroBlog(self))
658 root.putChild('css', ProtectedFile("server_css/")) 680 root.putChild('css', ProtectedFile("server_css/"))
659 root.putChild(os.path.dirname(MEDIA_DIR), ProtectedFile(self.media_dir)) 681 root.putChild(os.path.dirname(MEDIA_DIR), ProtectedFile(self.media_dir))
660 root.putChild(os.path.dirname(AVATARS_DIR), ProtectedFile(os.path.join(self.local_dir, AVATARS_DIR))) 682 root.putChild(os.path.dirname(AVATARS_DIR), ProtectedFile(os.path.join(self.local_dir, AVATARS_DIR)))
661 self.site = server.Site(root) 683 self.site = server.Site(root)
662 self.site.sessionFactory = LiberviaSession 684 self.site.sessionFactory = LiberviaSession
663 685
686 def addCleanup(self, callback, *args, **kwargs):
687 """Add cleaning method to call when service is stopped
688 cleaning method will be called in reverse order of they insertion
689 @param callback: callable to call on service stop
690 @param *args: list of arguments of the callback
691 @param **kwargs: list of keyword arguments of the callback"""
692 self._cleanup.insert(0, (callback, args, kwargs))
693
664 def startService(self): 694 def startService(self):
665 reactor.listenTCP(8080, self.site) 695 reactor.listenTCP(8080, self.site)
696
697 def stopService(self):
698 print "launching cleaning methods"
699 for callback, args, kwargs in self._cleanup:
700 callback(*args, **kwargs)
666 701
667 def run(self): 702 def run(self):
668 reactor.run() 703 reactor.run()
669 704
670 def stop(self): 705 def stop(self):