gnt-cluster: Add hv/disk state to init
[ganeti-local] / lib / utils / nodesetup.py
index 80e2b98..0931ee3 100644 (file)
@@ -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):