blob: d34741f08b5235f3b1fe0837cab6313e0da2464b [file] [log] [blame]
#
#
# Copyright (C) 2006, 2007, 2010, 2011 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
"""Utility functions for manipulating /etc/hosts.
"""
from cStringIO import StringIO
from ganeti import pathutils
from ganeti.utils import algo
from ganeti.utils import io
def SetEtcHostsEntry(file_name, ip, hostname, aliases):
"""Sets the name of an IP address and hostname in /etc/hosts.
@type file_name: str
@param file_name: path to the file to modify (usually C{/etc/hosts})
@type ip: str
@param ip: the IP address
@type hostname: str
@param hostname: the hostname to be added
@type aliases: list
@param aliases: the list of aliases to add for the hostname
"""
# Ensure aliases are unique
names = algo.UniqueSequence([hostname] + aliases)
out = StringIO()
def _write_entry(written):
if not written:
out.write("%s\t%s\n" % (ip, " ".join(names)))
return True
written = False
for line in io.ReadFile(file_name).splitlines(True):
fields = line.split()
if fields and not fields[0].startswith("#") and ip == fields[0]:
written = _write_entry(written)
else:
out.write(line)
_write_entry(written)
io.WriteFile(file_name, data=out.getvalue(), uid=0, gid=0, mode=0644,
keep_perms=io.KP_IF_EXISTS)
def AddHostToEtcHosts(hostname, ip):
"""Wrapper around SetEtcHostsEntry.
@type hostname: str
@param hostname: a hostname that will be resolved and added to
L{pathutils.ETC_HOSTS}
@type ip: str
@param ip: The ip address of the host
"""
SetEtcHostsEntry(pathutils.ETC_HOSTS, ip, hostname, [hostname.split(".")[0]])
def RemoveEtcHostsEntry(file_name, hostname):
"""Removes a hostname from /etc/hosts.
IP addresses without names are removed from the file.
@type file_name: str
@param file_name: path to the file to modify (usually C{/etc/hosts})
@type hostname: str
@param hostname: the hostname to be removed
"""
out = StringIO()
for line in io.ReadFile(file_name).splitlines(True):
fields = line.split()
if len(fields) > 1 and not fields[0].startswith("#"):
names = fields[1:]
if hostname in names:
while hostname in names:
names.remove(hostname)
if names:
out.write("%s %s\n" % (fields[0], " ".join(names)))
continue
out.write(line)
io.WriteFile(file_name, data=out.getvalue(), uid=0, gid=0, mode=0644,
keep_perms=io.KP_IF_EXISTS)
def RemoveHostFromEtcHosts(hostname):
"""Wrapper around RemoveEtcHostsEntry.
@type hostname: str
@param hostname: hostname that will be resolved and its
full and shot name will be removed from
L{pathutils.ETC_HOSTS}
"""
RemoveEtcHostsEntry(pathutils.ETC_HOSTS, hostname)
RemoveEtcHostsEntry(pathutils.ETC_HOSTS, hostname.split(".")[0])