From ddb40a5a09dee2340922085b3643e40b2e5d2d20 Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Wed, 11 Apr 2007 18:37:22 +0000 Subject: Implement ConfigFile mtime assertion (Resolves Ticket #421) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@3031 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Client/Tools/POSIX.py | 28 +++++++++++++++++++++++++--- src/lib/Server/Plugins/Cfg.py | 5 ++++- 2 files changed, 29 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/lib/Client/Tools/POSIX.py b/src/lib/Client/Tools/POSIX.py index 610011cc2..2eccedb2b 100644 --- a/src/lib/Client/Tools/POSIX.py +++ b/src/lib/Client/Tools/POSIX.py @@ -3,7 +3,7 @@ __revision__ = '$Revision$' from stat import S_ISVTX, S_ISGID, S_ISUID, S_IXUSR, S_IWUSR, S_IRUSR, S_IXGRP from stat import S_IWGRP, S_IRGRP, S_IXOTH, S_IWOTH, S_IROTH, ST_MODE, S_ISDIR -from stat import S_IFREG, ST_UID, ST_GID, S_ISREG, S_IFDIR, S_ISLNK +from stat import S_IFREG, ST_UID, ST_GID, S_ISREG, S_IFDIR, S_ISLNK, ST_MTIME import binascii, difflib, grp, os, pwd, xml.sax.saxutils import Bcfg2.Client.Tools @@ -96,10 +96,16 @@ class POSIX(Bcfg2.Client.Tools.Tool): self.logger.error('User/Group resolution failed for path %s' % (entry.get('name'))) owner = 'root' group = 'root' - perms = oct(os.stat(entry.get('name'))[ST_MODE])[-4:] + finfo = os.stat(entry.get('name')) + perms = oct(finfo[ST_MODE])[-4:] + if entry.get('mtime', '-1') != '-1': + mtime = str(finfo[ST_MTIME]) + else: + mtime = '-1' if ((owner == entry.get('owner')) and (group == entry.get('group')) and - (perms == entry.get('perms'))): + (perms == entry.get('perms')) and + (mtime == entry.get('mtime', '-1'))): return True else: if owner != entry.get('owner'): @@ -124,6 +130,15 @@ class POSIX(Bcfg2.Client.Tools.Tool): nqtext += "%s perms are %s should be %s" % \ (entry.get('name'), perms, entry.get('perms')) entry.set('qtext', nqtext) + if mtime != entry.get('mtime', '-1'): + entry.set('current_mtime', mtime) + self.logger.debug("%s %s mtime is %s should be %s" \ + % (entry.tag, entry.get('name'), mtime, + entry.get('mtime'))) + nqtext = entry.get('qtext', '') + '\n' + nqtext += "%s mtime is %s should be %s" % \ + (entry.get('name'), mtime, entry.get('mtime')) + entry.set('qtext', nqtext) if entry.tag != 'ConfigFile': nnqtext = entry.get('qtext') nnqtext += '\nInstall %s %s: (y/N) ' % (entry.tag, entry.get('name')) @@ -294,6 +309,13 @@ class POSIX(Bcfg2.Client.Tools.Tool): os.chown(newfile.name, 0, 0) os.chmod(newfile.name, calcPerms(S_IFREG, entry.get('perms'))) os.rename(newfile.name, entry.get('name')) + try: + os.utime(entry.get('name'), (int(entry.get('mtime')), + int(entry.get('mtime')))) + except: + self.logger.error("ConfigFile %s mtime fix failed" \ + % (entry.get('name'))) + return False return True except (OSError, IOError), err: if err.errno == 13: diff --git a/src/lib/Server/Plugins/Cfg.py b/src/lib/Server/Plugins/Cfg.py index c75afbc18..084a14b3c 100644 --- a/src/lib/Server/Plugins/Cfg.py +++ b/src/lib/Server/Plugins/Cfg.py @@ -79,7 +79,8 @@ class ConfigFileEntry(object): all data for all clients.''' info = re.compile('^owner:(\s)*(?P\S+)|group:(\s)*(?P\S+)|' + 'perms:(\s)*(?P\w+)|encoding:(\s)*(?P\w+)|' + - '(?Pparanoid(\s)*)|interpolate:(\s)*(?P\w+)(\s)*$') + '(?Pparanoid(\s)*)|mtime:(\s)*(?P\w+)|' + 'interpolate:(\s)*(?P\w+)(\s)*$') iignore = re.compile('^\S*$') def __init__(self, path, repopath): @@ -118,6 +119,8 @@ class ConfigFileEntry(object): self.paranoid = True elif mgd['interpolate'] in ["True", "true"]: self.interpolate = True + elif mgd['mtime']: + self.metadata['mtime'] = mgd['mtime'] def AddEntry(self, name): '''add new file additions for a single cf file''' -- cgit v1.2.3-1-g7c22