~cloud-init-dev/cloud-init/trunk

« back to all changes in this revision

Viewing changes to cloudinit/distros/parsers/hostname.py

  • Committer: Scott Moser
  • Date: 2016-08-10 15:06:15 UTC
  • Revision ID: smoser@ubuntu.com-20160810150615-ma2fv107w3suy1ma
README: Mention move of revision control to git.

cloud-init development has moved its revision control to git.
It is available at 
  https://code.launchpad.net/cloud-init

Clone with 
  git clone https://git.launchpad.net/cloud-init
or
  git clone git+ssh://git.launchpad.net/cloud-init

For more information see
  https://git.launchpad.net/cloud-init/tree/HACKING.rst

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# vi: ts=4 expandtab
2
 
#
3
 
#    Copyright (C) 2012 Yahoo! Inc.
4
 
#
5
 
#    Author: Joshua Harlow <harlowja@yahoo-inc.com>
6
 
#
7
 
#    This program is free software: you can redistribute it and/or modify
8
 
#    it under the terms of the GNU General Public License version 3, as
9
 
#    published by the Free Software Foundation.
10
 
#
11
 
#    This program is distributed in the hope that it will be useful,
12
 
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 
#    GNU General Public License for more details.
15
 
#
16
 
#    You should have received a copy of the GNU General Public License
17
 
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
 
 
19
 
from six import StringIO
20
 
 
21
 
from cloudinit.distros.parsers import chop_comment
22
 
 
23
 
 
24
 
# Parser that knows how to work with /etc/hostname format
25
 
class HostnameConf(object):
26
 
    def __init__(self, text):
27
 
        self._text = text
28
 
        self._contents = None
29
 
 
30
 
    def parse(self):
31
 
        if self._contents is None:
32
 
            self._contents = self._parse(self._text)
33
 
 
34
 
    def __str__(self):
35
 
        self.parse()
36
 
        contents = StringIO()
37
 
        for (line_type, components) in self._contents:
38
 
            if line_type == 'blank':
39
 
                contents.write("%s\n" % (components[0]))
40
 
            elif line_type == 'all_comment':
41
 
                contents.write("%s\n" % (components[0]))
42
 
            elif line_type == 'hostname':
43
 
                (hostname, tail) = components
44
 
                contents.write("%s%s\n" % (hostname, tail))
45
 
        # Ensure trailing newline
46
 
        contents = contents.getvalue()
47
 
        if not contents.endswith("\n"):
48
 
            contents += "\n"
49
 
        return contents
50
 
 
51
 
    @property
52
 
    def hostname(self):
53
 
        self.parse()
54
 
        for (line_type, components) in self._contents:
55
 
            if line_type == 'hostname':
56
 
                return components[0]
57
 
        return None
58
 
 
59
 
    def set_hostname(self, your_hostname):
60
 
        your_hostname = your_hostname.strip()
61
 
        if not your_hostname:
62
 
            return
63
 
        self.parse()
64
 
        replaced = False
65
 
        for (line_type, components) in self._contents:
66
 
            if line_type == 'hostname':
67
 
                components[0] = str(your_hostname)
68
 
                replaced = True
69
 
        if not replaced:
70
 
            self._contents.append(('hostname', [str(your_hostname), '']))
71
 
 
72
 
    def _parse(self, contents):
73
 
        entries = []
74
 
        hostnames_found = set()
75
 
        for line in contents.splitlines():
76
 
            if not len(line.strip()):
77
 
                entries.append(('blank', [line]))
78
 
                continue
79
 
            (head, tail) = chop_comment(line.strip(), '#')
80
 
            if not len(head):
81
 
                entries.append(('all_comment', [line]))
82
 
                continue
83
 
            entries.append(('hostname', [head, tail]))
84
 
            hostnames_found.add(head)
85
 
        if len(hostnames_found) > 1:
86
 
            raise IOError("Multiple hostnames (%s) found!"
87
 
                          % (hostnames_found))
88
 
        return entries