X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/17b97ab3d27b766e64b8868019b7914c97d08fe1..c4929a8bcca4a43dc6434394a91a8ea67d854844:/lib/utils/nodesetup.py diff --git a/lib/utils/nodesetup.py b/lib/utils/nodesetup.py index 80e2b98..0931ee3 100644 --- a/lib/utils/nodesetup.py +++ b/lib/utils/nodesetup.py @@ -22,7 +22,7 @@ """ -import os +from cStringIO import StringIO from ganeti import constants @@ -44,28 +44,25 @@ def SetEtcHostsEntry(file_name, ip, hostname, aliases): """ # 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): @@ -92,29 +89,22 @@ def RemoveEtcHostsEntry(file_name, hostname): @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):