示例#1
0
    def do_edit(self, options):
        '''
        edit PATH

        Changes the current configuration edit level to PATH, relative to the
        current configuration edit level. If PATH does not exist currently, it
        will be created.
        '''
        level = self.edit_levels[-1]
        nodes = self.config.search("%s %s" % (level, options))
        if not nodes:
            nodes_beyond = self.config.search("%s %s .*" % (level, options))
            if nodes_beyond:
                raise CliError("Incomplete path: [%s]" % options)
            else:
                statement = "%s %s" % (self.edit_levels[-1], options)
                log.debug("Setting statement '%s'" % statement)
                self.config.set(statement)
                self.needs_save = True
                node = self.config.search(statement)[0]
                log.info("Created configuration level: %s" % node.path_str)
                self.add_edit_level(node.path_str)
                self.do_missing('')
        elif len(nodes) > 1:
            raise CliError("Ambiguous path: [%s]" % options)
        else:
            self.add_edit_level(nodes[0].path_str)
            self.do_missing('')
示例#2
0
    def do_edit(self, options):
        '''
        edit PATH

        Changes the current configuration edit level to PATH, relative to the
        current configuration edit level. If PATH does not exist currently, it
        will be created.
        '''
        level = self.edit_levels[-1]
        nodes = self.config.search("%s %s" % (level, options))
        if not nodes:
            nodes_beyond = self.config.search("%s %s .*" % (level, options))
            if nodes_beyond:
                raise CliError("Incomplete path: [%s]" % options)
            else:
                statement = "%s %s" % (self.edit_levels[-1], options)
                log.debug("Setting statement '%s'" % statement)
                self.config.set(statement)
                self.needs_save = True
                node = self.config.search(statement)[0]
                log.info("Created configuration level: %s" % node.path_str)
                self.add_edit_level(node.path_str)
                self.do_missing('')
        elif len(nodes) > 1:
            raise CliError("Ambiguous path: [%s]" % options)
        else:
            self.add_edit_level(nodes[0].path_str)
            self.do_missing('')
示例#3
0
文件: cli.py 项目: mydaisy2/targetcli
 def load_history(self):
     '''
     Loads the command history.
     '''
     try:
         readline.read_history_file(self.history_path)
     except IOError, e:
         log.debug("Error while reading history: %s" % e)
示例#4
0
文件: cli.py 项目: mydaisy2/targetcli
 def parse(self, line, header, grammar):
     '''
     Parses line using a pyparsing grammar.
     Returns the parse tree as a list.
     '''
     if not grammar:
         grammar = pp.Empty()
     grammar = pp.Literal(header) + grammar
     line = "%s %s" % (header, line)
     log.debug("Parsing line '%s'" % line)
     tokens = grammar.parseString(line, parseAll=True).asList()
     log.debug("Got parse tree %s" % tokens)
     return tokens
示例#5
0
文件: cli.py 项目: mydaisy2/targetcli
    def yes_no(self, question, default=None):
        '''
        Asks a yes/no question to be answered by typing a single 'y' or 'n'
        character. If we do not run in interactive mode, returns None. Else
        returns True for yes and False for not.

        default can either be True (yes is the default), False (no is the
        default) or None (no default).
        '''
        keys = {'\x03': '^C', '\x04': '^D'}
        if not self.interactive:
            result = None
        else:
            if default is None:
                choices = "y/n"
            elif default is True:
                choices = "Y/n"
                dfl_key = 'y'
            elif default is False:
                choices = "y/N"
                dfl_key = 'n'
            key = None
            replies = ['y', 'n', 'Y', 'N']
            if default is not None:
                replies.append('\r')
            while key not in replies:
                log.debug("Got key %r" % key)
                sys.stdout.write("%s [%s] " % (question, choices))
                key = self.getchar()
                key = keys.get(key, key)
                if key == '\r' and default is not None:
                    sys.stdout.write("%s\n" % dfl_key)
                else:
                    sys.stdout.write("%s\n" % key)
                if key in ['^C', '^D']:
                    raise CliError("Aborted")
            if key == '\r':
                result = default
            elif key.lower() == 'y':
                result = True
            else:
                result = False

        log.debug("yes_no(%s) -> %r" % (question, result))
        return result
示例#6
0
    def do_set(self, options):
        '''
        set [PATH] OBJECT IDENTIFIER
        set [PATH] ATTRIBUTE VALUE

        Sets either an OBJECT IDENTIFIER (i.e. "disk mydisk") or an ATTRIBUTE
        VALUE (i.e. "enable yes").
        '''
        if not options:
            raise CliError("Missing required options")
        statement = "%s %s" % (self.edit_levels[-1], options)
        log.debug("Setting statement '%s'" % statement)
        created = self.config.set(statement)
        for node in created:
            log.info("[%s] has been set" % node.path_str)
        if not created:
            log.info("Ignored: Current configuration already match statement")
        else:
            self.needs_save = True
示例#7
0
    def do_set(self, options):
        '''
        set [PATH] OBJECT IDENTIFIER
        set [PATH] ATTRIBUTE VALUE

        Sets either an OBJECT IDENTIFIER (i.e. "disk mydisk") or an ATTRIBUTE
        VALUE (i.e. "enable yes").
        '''
        if not options:
            raise CliError("Missing required options")
        statement = "%s %s" % (self.edit_levels[-1], options)
        log.debug("Setting statement '%s'" % statement)
        created = self.config.set(statement)
        for node in created:
            log.info("[%s] has been set" % node.path_str)
        if not created:
            log.info("Ignored: Current configuration already match statement")
        else:
            self.needs_save = True