Exemple #1
0
def _update_or_add_directives(directives: List[Any], insert_at_top: bool,
                              block: UnspacedList) -> None:
    """Adds or replaces directives in a config block."""
    for directive in directives:
        _update_or_add_directive(block, directive, insert_at_top)
    if block and '\n' not in block[-1]:  # could be "   \n  " or ["\n"] !
        block.append(nginxparser.UnspacedList('\n'))
Exemple #2
0
 def test_is_dirty(self):
     self.assertEqual(False, self.ul2.is_dirty())
     ul3 = UnspacedList([])
     ul3.append(self.ul)
     self.assertEqual(False, self.ul.is_dirty())
     self.assertEqual(True, ul3.is_dirty())
     ul4 = UnspacedList([[1], [2, 3, 4]])
     self.assertEqual(False, ul4.is_dirty())
     ul4[1][2] = 5
     self.assertEqual(True, ul4.is_dirty())
Exemple #3
0
 def test_is_dirty(self):
     self.assertIs(self.ul2.is_dirty(), False)
     ul3 = UnspacedList([])
     ul3.append(self.ul)
     self.assertIs(self.ul.is_dirty(), False)
     self.assertIs(ul3.is_dirty(), True)
     ul4 = UnspacedList([[1], [2, 3, 4]])
     self.assertIs(ul4.is_dirty(), False)
     ul4[1][2] = 5
     self.assertIs(ul4.is_dirty(), True)
Exemple #4
0
def _update_or_add_directive(block: UnspacedList, directive: Sequence[Any],
                             insert_at_top: bool) -> None:
    if not isinstance(directive, nginxparser.UnspacedList):
        directive = nginxparser.UnspacedList(directive)
    if _is_whitespace_or_comment(directive):
        # whitespace or comment
        block.append(directive)
        return

    location = _find_location(block, directive[0])

    # we can update directive
    if location is not None:
        _update_directive(block, directive, location)
        return

    _add_directive(block, directive, insert_at_top)
Exemple #5
0
def _add_directive(block: UnspacedList, directive: Sequence[Any],
                   insert_at_top: bool) -> None:
    if not isinstance(directive, nginxparser.UnspacedList):
        directive = nginxparser.UnspacedList(directive)
    if _is_whitespace_or_comment(directive):
        # whitespace or comment
        block.append(directive)
        return

    location = _find_location(block, directive[0])

    # Append or prepend directive. Fail if the name is not a repeatable directive name,
    # and there is already a copy of that directive with a different value
    # in the config file.

    # handle flat include files

    directive_name = directive[0]

    def can_append(loc: Optional[int], dir_name: str) -> bool:
        """ Can we append this directive to the block? """
        return loc is None or (isinstance(dir_name, str)
                               and dir_name in REPEATABLE_DIRECTIVES)

    err_fmt = 'tried to insert directive "{0}" but found conflicting "{1}".'

    # Give a better error message about the specific directive than Nginx's "fail to restart"
    if directive_name == INCLUDE:
        # in theory, we might want to do this recursively, but in practice, that's really not
        # necessary because we know what file we're talking about (and if we don't recurse, we
        # just give a worse error message)
        included_directives = _parse_ssl_options(directive[1])

        for included_directive in included_directives:
            included_dir_loc = _find_location(block, included_directive[0])
            included_dir_name = included_directive[0]
            if (not _is_whitespace_or_comment(included_directive)
                    and not can_append(included_dir_loc, included_dir_name)):

                # By construction of can_append(), included_dir_loc cannot be None at that point
                resolved_included_dir_loc = cast(int, included_dir_loc)

                if block[resolved_included_dir_loc] != included_directive:
                    raise errors.MisconfigurationError(
                        err_fmt.format(included_directive,
                                       block[resolved_included_dir_loc]))
                _comment_out_directive(block, resolved_included_dir_loc,
                                       directive[1])

    if can_append(location, directive_name):
        if insert_at_top:
            # Add a newline so the comment doesn't comment
            # out existing directives
            block.insert(0, nginxparser.UnspacedList('\n'))
            block.insert(0, directive)
            comment_directive(block, 0)
        else:
            block.append(directive)
            comment_directive(block, len(block) - 1)
        return

    # By construction of can_append(), location cannot be None at that point
    resolved_location = cast(int, location)

    if block[resolved_location] != directive:
        raise errors.MisconfigurationError(
            err_fmt.format(directive, block[resolved_location]))