예제 #1
0
    def _parse_host_definition(self, line):
        '''
        Takes a single line and tries to parse it as a host definition. Returns
        a list of Hosts if successful, or raises an error.
        '''

        # A host definition comprises (1) a non-whitespace hostname or range,
        # optionally followed by (2) a series of key="some value" assignments.
        # We ignore any trailing whitespace and/or comments. For example, here
        # are a series of host definitions in a group:
        #
        # [groupname]
        # alpha
        # beta:2345 user=admin      # we'll tell shlex
        # gamma sudo=True user=root # to ignore comments

        try:
            tokens = shlex_split(line, comments=True)
        except ValueError as e:
            self._raise_error("Error parsing host definition '%s': %s" %
                              (line, e))

        (hostnames, port) = self._expand_hostpattern(tokens[0])

        # Try to process anything remaining as a series of key=value pairs.
        variables = {}
        for t in tokens[1:]:
            if '=' not in t:
                self._raise_error(
                    "Expected key=value host variable assignment, got: %s" %
                    (t))
            (k, v) = t.split('=', 1)
            variables[k] = self._parse_value(v)

        return hostnames, port, variables
예제 #2
0
 def test_comments(self):
     self.assertEqual(shlex_split('"a b" c # d', comments=True), ["a b", "c"])
예제 #3
0
 def test_unicode(self):
     self.assertEqual(shlex_split(u"a b \u010D"), [u"a", u"b", u"\u010D"])
예제 #4
0
 def test_quoted(self):
     self.assertEqual(shlex_split('"a b" c'), ["a b", "c"])
예제 #5
0
 def test_trivial(self):
     self.assertEqual(shlex_split("a b c"), ["a", "b", "c"])