# HG changeset patch # User Goffi # Date 1499259949 -7200 # Node ID 0b21d87c91cf7f2670a2fd6d9d2040b1d175e197 # Parent 8fa7edd0da24eb9259eabcccecea28d6bb9fb7ad jp (pubsub/hook): added create/delete/list hook command to handle new Pubsub hook feature diff -r 8fa7edd0da24 -r 0b21d87c91cf frontends/src/jp/cmd_pubsub.py --- a/frontends/src/jp/cmd_pubsub.py Wed Jul 05 15:05:47 2017 +0200 +++ b/frontends/src/jp/cmd_pubsub.py Wed Jul 05 15:05:49 2017 +0200 @@ -25,11 +25,14 @@ 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 @@ 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'))