From 73ed5094b910f7c030660a1e5b9ab0d486dda6d2 Mon Sep 17 00:00:00 2001 From: Goffi Date: Wed, 5 Jul 2017 15:05:49 +0200 Subject: [PATCH] jp (pubsub/hook): added create/delete/list hook command to handle new Pubsub hook feature --- frontends/src/jp/cmd_pubsub.py | 100 ++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/frontends/src/jp/cmd_pubsub.py b/frontends/src/jp/cmd_pubsub.py index 42dfcd67..21aa496c 100644 --- a/frontends/src/jp/cmd_pubsub.py +++ b/frontends/src/jp/cmd_pubsub.py @@ -25,11 +25,14 @@ from sat_frontends.jp import common from functools import partial from sat.tools.common import uri from sat_frontends.tools import jid +import os.path __commands__ = ["Pubsub"] PUBSUB_TMP_DIR = u"pubsub" +# TODO: need to split this class in several modules, plugin should handle subcommands + class NodeInfo(base.CommandBase): @@ -448,8 +451,103 @@ class Uri(base.CommandBase): self.display_uri(None) +class HookCreate(base.CommandBase): + + def __init__(self, host): + base.CommandBase.__init__(self, host, 'create', use_pubsub_node_req=True, help=_(u'create a Pubsub hook')) + self.need_loop=True + + def add_parser_options(self): + self.parser.add_argument('-t', '--type', default=u'python', choices=('python', 'python_file', 'python_code'), help=_(u"hook type")) + self.parser.add_argument('-P', '--persistent', action='store_true', help=_(u"make hook persistent across restarts")) + self.parser.add_argument("hook_arg", type=base.unicode_decoder, help=_(u"argument of the hook (depend of the type)")) + + @staticmethod + def checkArgs(self): + if self.args.type == u'python_file': + self.args.hook_arg = os.path.abspath(self.args.hook_arg) + if not os.path.isfile(self.args.hook_arg): + self.parser.error(_(u"{path} is not a file").format(path=self.args.hook_arg)) + + def start(self): + common.checkURI(self.args) + self.checkArgs(self) + self.host.bridge.psHookAdd( + self.args.service, + self.args.node, + self.args.type, + self.args.hook_arg, + self.args.persistent, + self.profile, + callback=self.host.quit, + errback=partial(self.errback, + msg=_(u"can't create hook: {}"), + exit_code=C.EXIT_BRIDGE_ERRBACK)) + + +class HookDelete(base.CommandBase): + + def __init__(self, host): + base.CommandBase.__init__(self, host, 'delete', use_pubsub_node_req=True, help=_(u'delete a Pubsub hook')) + self.need_loop=True + + def add_parser_options(self): + self.parser.add_argument('-t', '--type', default=u'', choices=('', 'python', 'python_file', 'python_code'), help=_(u"hook type to remove, empty to remove all (DEFAULT: remove all)")) + self.parser.add_argument('-a', '--arg', dest='hook_arg', type=base.unicode_decoder, default=u'', help=_(u"argument of the hook to remove, empty to remove all (DEFAULT: remove all)")) + + def psHookRemoveCb(self, nb_deleted): + self.disp(_(u'{nb_deleted} hook(s) have been deleted').format( + nb_deleted = nb_deleted)) + self.host.quit() + + def start(self): + common.checkURI(self.args) + HookCreate.checkArgs(self) + self.host.bridge.psHookRemove( + self.args.service, + self.args.node, + self.args.type, + self.args.hook_arg, + self.profile, + callback=self.psHookRemoveCb, + errback=partial(self.errback, + msg=_(u"can't delete hook: {}"), + exit_code=C.EXIT_BRIDGE_ERRBACK)) + + +class HookList(base.CommandBase): + + def __init__(self, host): + base.CommandBase.__init__(self, host, 'list', use_output=C.OUTPUT_LIST_DICT, help=_(u'list hooks of a profile')) + self.need_loop = True + + def add_parser_options(self): + pass + + def psHookListCb(self, data): + if not data: + self.disp(_(u'No hook found.')) + self.output(data) + self.host.quit() + + def start(self): + self.host.bridge.psHookList( + self.profile, + callback=self.psHookListCb, + errback=partial(self.errback, + msg=_(u"can't list hooks: {}"), + exit_code=C.EXIT_BRIDGE_ERRBACK)) + + +class Hook(base.CommandBase): + subcommands = (HookCreate, HookDelete, HookList) + + def __init__(self, host): + super(Hook, self).__init__(host, 'hook', use_profile=False, help=_('trigger action on Pubsub notifications')) + + class Pubsub(base.CommandBase): - subcommands = (Get, Delete, Edit, Node, Affiliations, Uri) + subcommands = (Get, Delete, Edit, Node, Affiliations, Hook, Uri) def __init__(self, host): super(Pubsub, self).__init__(host, 'pubsub', use_profile=False, help=_('PubSub nodes/items management'))