Blame cloudinit/distros/parsers/hosts.py

Packit Service a04d08
# Copyright (C) 2012 Yahoo! Inc.
Packit Service a04d08
#
Packit Service a04d08
# Author: Joshua Harlow <harlowja@yahoo-inc.com>
Packit Service a04d08
#
Packit Service a04d08
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service a04d08
Packit Service 11b429
from six import StringIO
Packit Service a04d08
Packit Service a04d08
from cloudinit.distros.parsers import chop_comment
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
# See: man hosts
Packit Service a04d08
# or https://linux.die.net/man/5/hosts
Packit Service a04d08
# or https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/configtuning-configfiles.html # noqa
Packit Service a04d08
class HostsConf(object):
Packit Service a04d08
    def __init__(self, text):
Packit Service a04d08
        self._text = text
Packit Service a04d08
        self._contents = None
Packit Service a04d08
Packit Service a04d08
    def parse(self):
Packit Service a04d08
        if self._contents is None:
Packit Service a04d08
            self._contents = self._parse(self._text)
Packit Service a04d08
Packit Service a04d08
    def get_entry(self, ip):
Packit Service a04d08
        self.parse()
Packit Service a04d08
        options = []
Packit Service a04d08
        for (line_type, components) in self._contents:
Packit Service a04d08
            if line_type == 'option':
Packit Service a04d08
                (pieces, _tail) = components
Packit Service a04d08
                if len(pieces) and pieces[0] == ip:
Packit Service a04d08
                    options.append(pieces[1:])
Packit Service a04d08
        return options
Packit Service a04d08
Packit Service a04d08
    def del_entries(self, ip):
Packit Service a04d08
        self.parse()
Packit Service a04d08
        n_entries = []
Packit Service a04d08
        for (line_type, components) in self._contents:
Packit Service a04d08
            if line_type != 'option':
Packit Service a04d08
                n_entries.append((line_type, components))
Packit Service a04d08
                continue
Packit Service a04d08
            else:
Packit Service a04d08
                (pieces, _tail) = components
Packit Service a04d08
                if len(pieces) and pieces[0] == ip:
Packit Service a04d08
                    pass
Packit Service a04d08
                elif len(pieces):
Packit Service a04d08
                    n_entries.append((line_type, list(components)))
Packit Service a04d08
        self._contents = n_entries
Packit Service a04d08
Packit Service a04d08
    def add_entry(self, ip, canonical_hostname, *aliases):
Packit Service a04d08
        self.parse()
Packit Service a04d08
        self._contents.append(('option',
Packit Service a04d08
                              ([ip, canonical_hostname] + list(aliases), '')))
Packit Service a04d08
Packit Service a04d08
    def _parse(self, contents):
Packit Service a04d08
        entries = []
Packit Service a04d08
        for line in contents.splitlines():
Packit Service a04d08
            if not len(line.strip()):
Packit Service a04d08
                entries.append(('blank', [line]))
Packit Service a04d08
                continue
Packit Service a04d08
            (head, tail) = chop_comment(line.strip(), '#')
Packit Service a04d08
            if not len(head):
Packit Service a04d08
                entries.append(('all_comment', [line]))
Packit Service a04d08
                continue
Packit Service a04d08
            entries.append(('option', [head.split(None), tail]))
Packit Service a04d08
        return entries
Packit Service a04d08
Packit Service a04d08
    def __str__(self):
Packit Service a04d08
        self.parse()
Packit Service a04d08
        contents = StringIO()
Packit Service a04d08
        for (line_type, components) in self._contents:
Packit Service a04d08
            if line_type == 'blank':
Packit Service a04d08
                contents.write("%s\n" % (components[0]))
Packit Service a04d08
            elif line_type == 'all_comment':
Packit Service a04d08
                contents.write("%s\n" % (components[0]))
Packit Service a04d08
            elif line_type == 'option':
Packit Service a04d08
                (pieces, tail) = components
Packit Service a04d08
                pieces = [str(p) for p in pieces]
Packit Service a04d08
                pieces = "\t".join(pieces)
Packit Service a04d08
                contents.write("%s%s\n" % (pieces, tail))
Packit Service a04d08
        return contents.getvalue()
Packit Service a04d08
Packit Service a04d08
# vi: ts=4 expandtab