Commit cca4ba4e authored by Seblu's avatar Seblu
Browse files

rpccall now use class option var to transmit its options

parent 01a30cd0
Loading
Loading
Loading
Loading
+47 −51
Original line number Diff line number Diff line
@@ -203,14 +203,14 @@ class RemoteCommand(OptionCommand):
        '''Return a set of needed remote functions'''
        raise NotImplementedError

    def print_objects(self, objectlist, index=None):
    def print_objects(self, objectlist):
        '''Trivial objectlist printing of tag'''
        if objectlist is None:
            return
        # get default index from local options
        _order = objectlist.get("order", None)
        for (i,o) in enumerate(objectlist["objects"]):
            if index or (index is None and self.options.index):
            if self.options.index:
                self.printer.out("[%s] "%i, nl="")
            self.print_tags(o, order=_order)

@@ -300,82 +300,78 @@ class TqlCommand(RemoteCommand):
        _arg_list: list of arg which are added to args one by one (=> multiple call)
        '''

        # set rpccall default option value
        _options = { "status": True,
                     "index": False,
                     "direct": False,
                     "exception": False,
                     "tql": "",
                     "tql_index": 1,
                     "tql_print": False,
                     "callback": None,
                     "arg_list": [],
                     }
        # check for options modifiers
        for o in _options.keys():
            _o = "_%s"%o
            if _o in kwargs:
                _options[o] =  kwargs[_o]
                del kwargs[_o]
            elif o in dir(self.options):
                x = getattr(self.options, o)
                if x is not None:
                    _options[o] = x
        # check tql index and get a copy
        if _options["tql_index"] < 0 or _options["tql_index"] >= len(args):
        # set on line modified options
        _saved_options = {}
        for _o in kwargs.copy():
            if _o.startswith("_"):
                o = _o[1:]
                _saved_options[o] = getattr(self.options, o)
                setattr(self.options, o, kwargs[_o])
                kwargs.pop(_o)
        # set tql_index to 1 if any
        if not hasattr(self.options, "tql_index"):
            self.options.tql_index = 1
        # check tql index
        if self.options.tql_index < 0 or self.options.tql_index >= len(args):
            raise cmdError("No indexed TQL")
        # append filter (empty if raw mode)
        if self.tql_filter != "":
            l = list(args)
            l[_options["tql_index"]] += self.tql_filter
            l[self.options.tql_index] += self.tql_filter
            args = tuple(l)
        # Tql printer
        if _options["tql_print"]:
            self.printer.out("TQL: %s"%args[_options["tql_index"]])
        if self.options.tql_print:
            self.printer.out("TQL: %s"%args[self.options.tql_index])
        # Tql check
        if _options["direct"]:
            return self._unsecure_rpccall(_options, args, kwargs)
        return self._secure_rpccall(_options, args, kwargs)

    def _unsecure_rpccall(self, _options, args, kwargs):
        if self.options.direct:
            out= self._unsecure_rpccall(args, **kwargs)
        else:
            out = self._secure_rpccall(args, **kwargs)
        # restore saved options
        for (k, v) in _saved_options.items():
            setattr(self.options, k, v)
        # return output
        return out

    def _unsecure_rpccall(self, args, **kwargs):
        '''Just call an RPC without checking before'''
        try:
            # arg_list mode call command for each argument
            # return is returned as a list
            if len(_options["arg_list"]) == 0:
            if not hasattr(self.options, "arg_list"):
                d = self.rpc.call(*args, **kwargs)
                if _options["callback"] is not None:
                    _options["callback"](d)
                if _options["status"]:
                    self.print_objects(d, ["output"], index=_options["index"])
                if hasattr(self.options, "callback"):
                    self.options.callback(d)
                if self.options.status:
                    self.print_objects(d, ["output"])
            else:
                # arg_list mode call command for each argument
                # return is returned as a list
                d = []
                for arg in _options["arg_list"]:
                for arg in self.options.arg_list:
                    args2 = args + [ arg ]
                    r = self.rpc.call(*args2, **kwargs)
                    d.append(r)
                    if _options["callback"] is not None:
                        _options["callback"](r)
                    if _options["status"]:
                        self.print_objects(r, ["output"], index=_options["index"])
                    if hasattr(self.options, "callback"):
                        self.options.callback(r)
                    if self.options.status:
                        self.print_objects(r, ["output"])
            return d
        except RpcError as e:
            if _options["exception"]:
            if self.options.exception:
                raise
            raise cmdError("RPCError: %s"%str(e))

    def _secure_rpccall(self, _options, args, kwargs):
    def _secure_rpccall(self, args, **kwargs):
        '''Call RPC after listing, confirmation and with id'''
        # get objects id
        try:
            objs = self.cli.rpc.call("list", args[_options["tql_index"]])
            objs = self.cli.rpc.call("list", args[self.options.tql_index])
        except RpcError as e:
            raise cmdError("RPCError: %s"%str(e))
        # no result, goodbye
        if len(objs["objects"]) == 0:
            raise cmdError("No selected object by TQL.")
        self.printer.out("Objects:")
        self.print_objects(objs, index=_options["index"])
        self.print_objects(objs)
        self.printer.out("Objects count: %s"%len(objs["objects"]))
        # be sure boby want do that
        if self.printer.ask("%sProceed?%s (yes): "%(color["lred"], color["reset"])) != "yes":
@@ -391,6 +387,6 @@ class TqlCommand(RemoteCommand):
            # make a list from tupe for editing
            args2 = list(args)
            # ovewrite tql object by id from object
            args2[_options["tql_index"]] = "id=%s"%obj["id"]
            args2[self.options.tql_index] = "id=%s"%obj["id"]
            # now we can make call
            self._unsecure_rpccall(_options, args2, kwargs)
            self._unsecure_rpccall(args2, **kwargs)