summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2007-04-11 18:37:22 +0000
committerNarayan Desai <desai@mcs.anl.gov>2007-04-11 18:37:22 +0000
commitddb40a5a09dee2340922085b3643e40b2e5d2d20 (patch)
tree47caa3e9ba6724d4c588d1dd6303ac846e0abb0f /src
parentada003add2413f90794ec43f6a3ea03d45d25072 (diff)
downloadbcfg2-ddb40a5a09dee2340922085b3643e40b2e5d2d20.tar.gz
bcfg2-ddb40a5a09dee2340922085b3643e40b2e5d2d20.tar.bz2
bcfg2-ddb40a5a09dee2340922085b3643e40b2e5d2d20.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/lib/Client/Tools/POSIX.py28
-rw-r--r--src/lib/Server/Plugins/Cfg.py5
2 files changed, 29 insertions, 4 deletions
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<owner>\S+)|group:(\s)*(?P<group>\S+)|' +
'perms:(\s)*(?P<perms>\w+)|encoding:(\s)*(?P<encoding>\w+)|' +
- '(?P<paranoid>paranoid(\s)*)|interpolate:(\s)*(?P<interpolate>\w+)(\s)*$')
+ '(?P<paranoid>paranoid(\s)*)|mtime:(\s)*(?P<mtime>\w+)|'
+ 'interpolate:(\s)*(?P<interpolate>\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'''