summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2009-12-23 19:57:42 +0000
committerNarayan Desai <desai@mcs.anl.gov>2009-12-23 19:57:42 +0000
commit7abcf2f24ecb1fdb75db341bffa2451f081aca6d (patch)
treec1f8143869ec1c06ac2c312249afcb7e17325bdf
parent9f8578f99ccc3d2944ef5d3d8a1385d351743f59 (diff)
downloadbcfg2-7abcf2f24ecb1fdb75db341bffa2451f081aca6d.tar.gz
bcfg2-7abcf2f24ecb1fdb75db341bffa2451f081aca6d.tar.bz2
bcfg2-7abcf2f24ecb1fdb75db341bffa2451f081aca6d.zip
Metadata: handle errors more robustly, and perform clients.xml wranging in new file
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5632 ce84e21b-d406-0410-9b95-82705330c041
-rw-r--r--src/lib/Server/Plugins/Metadata.py32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/lib/Server/Plugins/Metadata.py b/src/lib/Server/Plugins/Metadata.py
index 4468cd990..d92168dd3 100644
--- a/src/lib/Server/Plugins/Metadata.py
+++ b/src/lib/Server/Plugins/Metadata.py
@@ -4,6 +4,7 @@ __revision__ = '$Revision$'
import copy
import fcntl
import lxml.etree
+import os
import socket
import time
import Bcfg2.Server.Plugin
@@ -472,13 +473,11 @@ class Metadata(Bcfg2.Server.Plugin.Plugin,
def write_back_clients(self):
'''Write changes to client.xml back to disk'''
try:
- datafile = open("%s/%s" % (self.data, 'clients.xml'), 'w')
+ datafile = open("%s/%s" % (self.data, 'clients.xml.new'), 'w')
except IOError:
- self.logger.error("Failed to write clients.xml")
+ self.logger.error("Failed to write clients.xml.new")
raise MetadataRuntimeError
- fd = datafile.fileno()
- while self.locked(fd) == True:
- pass
+ # prep data
dataroot = self.clientdata_original.getroot()
if hasattr(dataroot, 'iter'):
items = dataroot.iter()
@@ -488,9 +487,26 @@ class Metadata(Bcfg2.Server.Plugin.Plugin,
# no items have text data of any sort
item.tail = None
item.text = None
- datafile.write(lxml.etree.tostring(dataroot, pretty_print=True))
- fcntl.lockf(fd, fcntl.LOCK_UN)
- datafile.close()
+ newcontents = lxml.etree.tostring(dataroot, pretty_print=True)
+
+ fd = datafile.fileno()
+ while self.locked(fd) == True:
+ pass
+ try:
+ datafile.write(newcontents)
+ except:
+ fcntl.lockf(fd, fcntl.LOCK_UN)
+ self.logger.error("Metadata: Failed to write new clients data to clients.xml.new", exc_info=1)
+ os.unlink("%s/%s" % (self.data, "clients.xml.new"))
+ raise MetadataRuntimeError
+ datafile.close()
+
+ try:
+ os.rename("%s/%s" % (self.data, 'clients.xml.new'),
+ "%s/%s" % (self.data, 'clients.xml'))
+ except:
+ self.logger.error("Metadata: Failed to rename clients.xml.new")
+ raise MetadataRuntimeError
def locked(self, fd):
try: