diff options
Diffstat (limited to 'cobbler/serializer.py')
-rw-r--r-- | cobbler/serializer.py | 78 |
1 files changed, 57 insertions, 21 deletions
diff --git a/cobbler/serializer.py b/cobbler/serializer.py index da4c684..a63cd6e 100644 --- a/cobbler/serializer.py +++ b/cobbler/serializer.py @@ -1,28 +1,64 @@ # Michael DeHaan <mdehaan@redhat.com> import syck # PySyck 0.61 or greater, not syck-python 0.55 -import msg +import errno +import os + +import utils def serialize(obj): - if obj.filename() is None: - raise Exception("not serializable") - fd = open(obj.filename(),"w+") - datastruct = obj.to_datastruct() - encoded = syck.dump(datastruct) - fd.write(encoded) - fd.close() - return True + """ + Save an object to disk. Object must "implement" Serializable. + Will create intermediate paths if it can. Returns True on Success, + False on permission errors. + """ + filename = obj.filename() + try: + fd = open(filename,"w+") + except IOError, ioe: + basename = os.path.basename(filename) + if not os.path.exists(basename): + try: + os.makedirs(basename) + except: + raise CobblerException("need_perms", basename) + return False + try: + fd = open(filename,"w+") + except: + raise CobblerException("need_perms", filename) + return False + datastruct = obj.to_datastruct() + encoded = syck.dump(datastruct) + fd.write(encoded) + fd.close() + return True def deserialize(obj): - if obj.filename() is None: - raise Exception("not serializable") - try: - fd = open(obj.filename(),"r") - except: - print msg.m("parse_error") % obj.filename() - return - data = fd.read() - datastruct = syck.load(data) - fd.close() - obj.from_datastruct(datastruct) - return True + """ + Populate an existing object with the contents of datastruct. + Object must "implement" Serializable. Returns True assuming + files could be read and contained decent YAML. Otherwise returns + False. + """ + filename = obj.filename() + try: + fd = open(filename,"r") + except IOError, ioe: + # if it doesn't exist, that's cool -- it's not a bug until we try + # to write the file and can't create it. + if not os.path.exists(filename): + return True + else: + raise CobblerException("need_perms",obj.filename()) + data = fd.read() + datastruct = syck.load(data) + if type(datastruct) == str: + # PySyck returns strings when it chokes on data + # it doesn't really throw exceptions + raise CobblerException("parse_error",filename) + fd.close() + obj.from_datastruct(datastruct) + return True + + |