jp (pubsub/hook): added create/delete/list hook command to handle new Pubsub hook feature

This commit is contained in:
Goffi 2017-07-05 15:05:49 +02:00
commit 73ed5094b9

View file

@ -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'))