Statistics
| Branch: | Tag: | Revision:

root / lib / utils / nodesetup.py @ adc523ab

History | View | Annotate | Download (3.8 kB)

1 17b97ab3 Michael Hanselmann
#
2 17b97ab3 Michael Hanselmann
#
3 17b97ab3 Michael Hanselmann
4 17b97ab3 Michael Hanselmann
# Copyright (C) 2006, 2007, 2010, 2011 Google Inc.
5 17b97ab3 Michael Hanselmann
#
6 17b97ab3 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 17b97ab3 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 17b97ab3 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 17b97ab3 Michael Hanselmann
# (at your option) any later version.
10 17b97ab3 Michael Hanselmann
#
11 17b97ab3 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 17b97ab3 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 17b97ab3 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 17b97ab3 Michael Hanselmann
# General Public License for more details.
15 17b97ab3 Michael Hanselmann
#
16 17b97ab3 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 17b97ab3 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 17b97ab3 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 17b97ab3 Michael Hanselmann
# 02110-1301, USA.
20 17b97ab3 Michael Hanselmann
21 17b97ab3 Michael Hanselmann
"""Utility functions for manipulating /etc/hosts.
22 17b97ab3 Michael Hanselmann

23 17b97ab3 Michael Hanselmann
"""
24 17b97ab3 Michael Hanselmann
25 17b97ab3 Michael Hanselmann
import os
26 17b97ab3 Michael Hanselmann
27 17b97ab3 Michael Hanselmann
from ganeti import constants
28 17b97ab3 Michael Hanselmann
29 17b97ab3 Michael Hanselmann
from ganeti.utils import algo
30 17b97ab3 Michael Hanselmann
from ganeti.utils import io
31 17b97ab3 Michael Hanselmann
32 17b97ab3 Michael Hanselmann
33 17b97ab3 Michael Hanselmann
def SetEtcHostsEntry(file_name, ip, hostname, aliases):
34 17b97ab3 Michael Hanselmann
  """Sets the name of an IP address and hostname in /etc/hosts.
35 17b97ab3 Michael Hanselmann

36 17b97ab3 Michael Hanselmann
  @type file_name: str
37 17b97ab3 Michael Hanselmann
  @param file_name: path to the file to modify (usually C{/etc/hosts})
38 17b97ab3 Michael Hanselmann
  @type ip: str
39 17b97ab3 Michael Hanselmann
  @param ip: the IP address
40 17b97ab3 Michael Hanselmann
  @type hostname: str
41 17b97ab3 Michael Hanselmann
  @param hostname: the hostname to be added
42 17b97ab3 Michael Hanselmann
  @type aliases: list
43 17b97ab3 Michael Hanselmann
  @param aliases: the list of aliases to add for the hostname
44 17b97ab3 Michael Hanselmann

45 17b97ab3 Michael Hanselmann
  """
46 17b97ab3 Michael Hanselmann
  # Ensure aliases are unique
47 17b97ab3 Michael Hanselmann
  aliases = algo.UniqueSequence([hostname] + aliases)[1:]
48 17b97ab3 Michael Hanselmann
49 17b97ab3 Michael Hanselmann
  def _WriteEtcHosts(fd):
50 17b97ab3 Michael Hanselmann
    # Duplicating file descriptor because os.fdopen's result will automatically
51 17b97ab3 Michael Hanselmann
    # close the descriptor, but we would still like to have its functionality.
52 17b97ab3 Michael Hanselmann
    out = os.fdopen(os.dup(fd), "w")
53 17b97ab3 Michael Hanselmann
    try:
54 17b97ab3 Michael Hanselmann
      for line in io.ReadFile(file_name).splitlines(True):
55 17b97ab3 Michael Hanselmann
        fields = line.split()
56 17b97ab3 Michael Hanselmann
        if fields and not fields[0].startswith("#") and ip == fields[0]:
57 17b97ab3 Michael Hanselmann
          continue
58 17b97ab3 Michael Hanselmann
        out.write(line)
59 17b97ab3 Michael Hanselmann
60 17b97ab3 Michael Hanselmann
      out.write("%s\t%s" % (ip, hostname))
61 17b97ab3 Michael Hanselmann
      if aliases:
62 17b97ab3 Michael Hanselmann
        out.write(" %s" % " ".join(aliases))
63 17b97ab3 Michael Hanselmann
      out.write("\n")
64 17b97ab3 Michael Hanselmann
      out.flush()
65 17b97ab3 Michael Hanselmann
    finally:
66 17b97ab3 Michael Hanselmann
      out.close()
67 17b97ab3 Michael Hanselmann
68 17b97ab3 Michael Hanselmann
  io.WriteFile(file_name, fn=_WriteEtcHosts, mode=0644)
69 17b97ab3 Michael Hanselmann
70 17b97ab3 Michael Hanselmann
71 17b97ab3 Michael Hanselmann
def AddHostToEtcHosts(hostname, ip):
72 17b97ab3 Michael Hanselmann
  """Wrapper around SetEtcHostsEntry.
73 17b97ab3 Michael Hanselmann

74 17b97ab3 Michael Hanselmann
  @type hostname: str
75 17b97ab3 Michael Hanselmann
  @param hostname: a hostname that will be resolved and added to
76 17b97ab3 Michael Hanselmann
      L{constants.ETC_HOSTS}
77 17b97ab3 Michael Hanselmann
  @type ip: str
78 17b97ab3 Michael Hanselmann
  @param ip: The ip address of the host
79 17b97ab3 Michael Hanselmann

80 17b97ab3 Michael Hanselmann
  """
81 17b97ab3 Michael Hanselmann
  SetEtcHostsEntry(constants.ETC_HOSTS, ip, hostname, [hostname.split(".")[0]])
82 17b97ab3 Michael Hanselmann
83 17b97ab3 Michael Hanselmann
84 17b97ab3 Michael Hanselmann
def RemoveEtcHostsEntry(file_name, hostname):
85 17b97ab3 Michael Hanselmann
  """Removes a hostname from /etc/hosts.
86 17b97ab3 Michael Hanselmann

87 17b97ab3 Michael Hanselmann
  IP addresses without names are removed from the file.
88 17b97ab3 Michael Hanselmann

89 17b97ab3 Michael Hanselmann
  @type file_name: str
90 17b97ab3 Michael Hanselmann
  @param file_name: path to the file to modify (usually C{/etc/hosts})
91 17b97ab3 Michael Hanselmann
  @type hostname: str
92 17b97ab3 Michael Hanselmann
  @param hostname: the hostname to be removed
93 17b97ab3 Michael Hanselmann

94 17b97ab3 Michael Hanselmann
  """
95 17b97ab3 Michael Hanselmann
  def _WriteEtcHosts(fd):
96 17b97ab3 Michael Hanselmann
    # Duplicating file descriptor because os.fdopen's result will automatically
97 17b97ab3 Michael Hanselmann
    # close the descriptor, but we would still like to have its functionality.
98 17b97ab3 Michael Hanselmann
    out = os.fdopen(os.dup(fd), "w")
99 17b97ab3 Michael Hanselmann
    try:
100 17b97ab3 Michael Hanselmann
      for line in io.ReadFile(file_name).splitlines(True):
101 17b97ab3 Michael Hanselmann
        fields = line.split()
102 17b97ab3 Michael Hanselmann
        if len(fields) > 1 and not fields[0].startswith("#"):
103 17b97ab3 Michael Hanselmann
          names = fields[1:]
104 17b97ab3 Michael Hanselmann
          if hostname in names:
105 17b97ab3 Michael Hanselmann
            while hostname in names:
106 17b97ab3 Michael Hanselmann
              names.remove(hostname)
107 17b97ab3 Michael Hanselmann
            if names:
108 17b97ab3 Michael Hanselmann
              out.write("%s %s\n" % (fields[0], " ".join(names)))
109 17b97ab3 Michael Hanselmann
            continue
110 17b97ab3 Michael Hanselmann
111 17b97ab3 Michael Hanselmann
        out.write(line)
112 17b97ab3 Michael Hanselmann
113 17b97ab3 Michael Hanselmann
      out.flush()
114 17b97ab3 Michael Hanselmann
    finally:
115 17b97ab3 Michael Hanselmann
      out.close()
116 17b97ab3 Michael Hanselmann
117 17b97ab3 Michael Hanselmann
  io.WriteFile(file_name, fn=_WriteEtcHosts, mode=0644)
118 17b97ab3 Michael Hanselmann
119 17b97ab3 Michael Hanselmann
120 17b97ab3 Michael Hanselmann
def RemoveHostFromEtcHosts(hostname):
121 17b97ab3 Michael Hanselmann
  """Wrapper around RemoveEtcHostsEntry.
122 17b97ab3 Michael Hanselmann

123 17b97ab3 Michael Hanselmann
  @type hostname: str
124 17b97ab3 Michael Hanselmann
  @param hostname: hostname that will be resolved and its
125 17b97ab3 Michael Hanselmann
      full and shot name will be removed from
126 17b97ab3 Michael Hanselmann
      L{constants.ETC_HOSTS}
127 17b97ab3 Michael Hanselmann

128 17b97ab3 Michael Hanselmann
  """
129 17b97ab3 Michael Hanselmann
  RemoveEtcHostsEntry(constants.ETC_HOSTS, hostname)
130 17b97ab3 Michael Hanselmann
  RemoveEtcHostsEntry(constants.ETC_HOSTS, hostname.split(".")[0])