"""
-import os
+from cStringIO import StringIO
from ganeti import constants
"""
# Ensure aliases are unique
- aliases = algo.UniqueSequence([hostname] + aliases)[1:]
-
- def _WriteEtcHosts(fd):
- # Duplicating file descriptor because os.fdopen's result will automatically
- # close the descriptor, but we would still like to have its functionality.
- out = os.fdopen(os.dup(fd), "w")
- try:
- for line in io.ReadFile(file_name).splitlines(True):
- fields = line.split()
- if fields and not fields[0].startswith("#") and ip == fields[0]:
- continue
- out.write(line)
-
- out.write("%s\t%s" % (ip, hostname))
- if aliases:
- out.write(" %s" % " ".join(aliases))
- out.write("\n")
- out.flush()
- finally:
- out.close()
-
- io.WriteFile(file_name, fn=_WriteEtcHosts, mode=0644)
+ 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(), mode=0644)
def AddHostToEtcHosts(hostname, ip):
@param hostname: the hostname to be removed
"""
- def _WriteEtcHosts(fd):
- # Duplicating file descriptor because os.fdopen's result will automatically
- # close the descriptor, but we would still like to have its functionality.
- out = os.fdopen(os.dup(fd), "w")
- try:
- 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)
-
- out.flush()
- finally:
- out.close()
-
- io.WriteFile(file_name, fn=_WriteEtcHosts, mode=0644)
+ 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(), mode=0644)
def RemoveHostFromEtcHosts(hostname):