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