From 24c855a7a42ce5b4ca4ce76b6ec8826ec03fe21d Mon Sep 17 00:00:00 2001 From: Iustin Pop <iustin@google.com> Date: Wed, 27 Apr 2011 17:33:48 +0200 Subject: [PATCH] =?UTF-8?q?Convert=20utils.nodesetup=20to=20utils.WriteFil?= =?UTF-8?q?e(data=3D=E2=80=A6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It makes no sense to iteratively write the new etc/hosts file, as we can pre-compute the desired contents (neither the old nor the new versions are safe against concurrent changes anyway). Signed-off-by: Iustin Pop <iustin@google.com> Reviewed-by: Michael Hanselmann <hansmi@google.com> --- lib/utils/nodesetup.py | 69 +++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 41 deletions(-) diff --git a/lib/utils/nodesetup.py b/lib/utils/nodesetup.py index 80e2b9807..13b70f3c7 100644 --- a/lib/utils/nodesetup.py +++ b/lib/utils/nodesetup.py @@ -23,6 +23,7 @@ """ import os +from cStringIO import StringIO from ganeti import constants @@ -46,26 +47,19 @@ 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 = StringIO() + 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() + out.write("%s\t%s" % (ip, hostname)) + if aliases: + out.write(" %s" % " ".join(aliases)) + out.write("\n") - io.WriteFile(file_name, fn=_WriteEtcHosts, mode=0644) + io.WriteFile(file_name, data=out.getvalue(), mode=0644) def AddHostToEtcHosts(hostname, ip): @@ -92,29 +86,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): -- GitLab