comparison libervia/server/server.py @ 1245:079e8eb6e327

server (tasks): refactoring: - moved `TasksManager` to `server.tasks.manager` - tasks modules now must have a `Task` class which will be instanciated by TasksManager - `server.tasks.task` has a basis for `Task` class - `Task.prepare` can now be asynchronous - `importlib` is now used to import tasks, instead of exec - tasks are now parsed/run after pages are imported - `server.BackendReady` is now a coroutine - type hinting for Task attributes
author Goffi <goffi@goffi.org>
date Sat, 25 Apr 2020 16:08:55 +0200
parents 8f39d98416c5
children aaf28d45ae67
comparison
equal deleted inserted replaced
1244:2ed4e399e1d4 1245:079e8eb6e327
52 from sat.tools.common import uri as common_uri 52 from sat.tools.common import uri as common_uri
53 import libervia 53 import libervia
54 from libervia.server import websockets 54 from libervia.server import websockets
55 from libervia.server.pages import LiberviaPage 55 from libervia.server.pages import LiberviaPage
56 from libervia.server.utils import quote, ProgressHandler 56 from libervia.server.utils import quote, ProgressHandler
57 from libervia.server.tasks import TasksManager 57 from libervia.server.tasks.manager import TasksManager
58 from functools import partial 58 from functools import partial
59 59
60 try: 60 try:
61 import OpenSSL 61 import OpenSSL
62 from twisted.internet import ssl 62 from twisted.internet import ssl
732 for key in to_delete: 732 for key in to_delete:
733 del conf[key] 733 del conf[key]
734 if default_dict: 734 if default_dict:
735 conf[''] = default_dict 735 conf[''] = default_dict
736 736
737 @defer.inlineCallbacks 737 async def backendReady(self):
738 def backendReady(self, __):
739 log.info(f"Libervia v{self.full_version}") 738 log.info(f"Libervia v{self.full_version}")
740 if self.options['dev_mode']: 739 if self.options['dev_mode']:
741 log.info(_("Developer mode activated")) 740 log.info(_("Developer mode activated"))
742 self.media_dir = self.bridge.getConfig("", "media_dir") 741 self.media_dir = self.bridge.getConfig("", "media_dir")
743 self.local_dir = self.bridge.getConfig("", "local_dir") 742 self.local_dir = self.bridge.getConfig("", "local_dir")
761 if self.options['dev_mode']: 760 if self.options['dev_mode']:
762 self.files_watcher.watchDir( 761 self.files_watcher.watchDir(
763 default_site_path, auto_add=True, recursive=True, 762 default_site_path, auto_add=True, recursive=True,
764 callback=LiberviaPage.onFileChange, site_root=self.sat_root, 763 callback=LiberviaPage.onFileChange, site_root=self.sat_root,
765 site_path=default_site_path) 764 site_path=default_site_path)
765 LiberviaPage.importPages(self, self.sat_root)
766 tasks_manager = TasksManager(self, self.sat_root) 766 tasks_manager = TasksManager(self, self.sat_root)
767 yield tasks_manager.runTasks() 767 await tasks_manager.parseTasks()
768 LiberviaPage.importPages(self, self.sat_root) 768 await tasks_manager.runTasks()
769 # FIXME: handle _setMenu in a more generic way, taking care of external sites 769 # FIXME: handle _setMenu in a more generic way, taking care of external sites
770 self.sat_root._setMenu(self.options["menu_json"]) 770 self.sat_root._setMenu(self.options["menu_json"])
771 self.vhost_root.default = default_root 771 self.vhost_root.default = default_root
772 existing_vhosts = {b'': default_root} 772 existing_vhosts = {b'': default_root}
773 773
803 if self.options['dev_mode']: 803 if self.options['dev_mode']:
804 self.files_watcher.watchDir( 804 self.files_watcher.watchDir(
805 site_path, auto_add=True, recursive=True, 805 site_path, auto_add=True, recursive=True,
806 callback=LiberviaPage.onFileChange, site_root=res, 806 callback=LiberviaPage.onFileChange, site_root=res,
807 site_path=site_path) 807 site_path=site_path)
808 tasks_manager = TasksManager(self, res)
809 yield tasks_manager.runTasks()
810 res.putChild( 808 res.putChild(
811 C.BUILD_DIR.encode('utf-8'), 809 C.BUILD_DIR.encode('utf-8'),
812 ProtectedFile( 810 ProtectedFile(
813 self.getBuildPath(site_name), 811 self.getBuildPath(site_name),
814 defaultType="application/octet-stream"), 812 defaultType="application/octet-stream"),
818 # FIXME: default pages are accessible if not overriden by external website 816 # FIXME: default pages are accessible if not overriden by external website
819 # while necessary for login or re-using existing pages 817 # while necessary for login or re-using existing pages
820 # we may want to disable access to the page by direct URL 818 # we may want to disable access to the page by direct URL
821 # (e.g. /blog disabled except if called by external site) 819 # (e.g. /blog disabled except if called by external site)
822 LiberviaPage.importPages(self, res, root_path=default_site_path) 820 LiberviaPage.importPages(self, res, root_path=default_site_path)
821 tasks_manager = TasksManager(self, res)
822 await tasks_manager.parseTasks()
823 await tasks_manager.runTasks()
823 res._setMenu(self.options["menu_json"]) 824 res._setMenu(self.options["menu_json"])
824 825
825 self.vhost_root.addHost(host_name.encode('utf-8'), res) 826 self.vhost_root.addHost(host_name.encode('utf-8'), res)
826 827
827 templates_res = web_resource.Resource() 828 templates_res = web_resource.Resource()
893 def _bridgeCb(self): 894 def _bridgeCb(self):
894 self.bridge.getReady( 895 self.bridge.getReady(
895 lambda: self.initialised.callback(None), 896 lambda: self.initialised.callback(None),
896 lambda failure: self.initialised.errback(Exception(failure)), 897 lambda failure: self.initialised.errback(Exception(failure)),
897 ) 898 )
898 self.initialised.addCallback(self.backendReady) 899 self.initialised.addCallback(lambda __: defer.ensureDeferred(self.backendReady()))
899 self.initialised.addErrback(self.initEb) 900 self.initialised.addErrback(self.initEb)
900 901
901 def _bridgeEb(self, failure_): 902 def _bridgeEb(self, failure_):
902 if isinstance(failure_, BridgeExceptionNoService): 903 if isinstance(failure_, BridgeExceptionNoService):
903 print("Can't connect to SàT backend, are you sure it's launched ?") 904 print("Can't connect to SàT backend, are you sure it's launched ?")