summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2004-08-02 18:25:00 +0000
committerNarayan Desai <desai@mcs.anl.gov>2004-08-02 18:25:00 +0000
commit069e01e32f5d20ad7a588ca59a95d132ca3f6f35 (patch)
tree7cde7db453a59e02a39051040720202b0ff924d0
parent6ca7eb1b363d488ff283e8b8173a7495a11e1036 (diff)
downloadbcfg2-069e01e32f5d20ad7a588ca59a95d132ca3f6f35.tar.gz
bcfg2-069e01e32f5d20ad7a588ca59a95d132ca3f6f35.tar.bz2
bcfg2-069e01e32f5d20ad7a588ca59a95d132ca3f6f35.zip
fix dryrun mode
2004/08/02 13:04:04-05:00 anl.gov!desai (Logical change 1.24) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@119 ce84e21b-d406-0410-9b95-82705330c041
-rw-r--r--client/Toolset.py173
1 files changed, 173 insertions, 0 deletions
diff --git a/client/Toolset.py b/client/Toolset.py
index e69de29bb..c5c826d84 100644
--- a/client/Toolset.py
+++ b/client/Toolset.py
@@ -0,0 +1,173 @@
+#!/usr/bin/env python
+
+from grp import getgrgid
+from os import lstat, mkdir, stat
+from pwd import getpwuid
+from stat import *
+from string import join, split
+
+def print_failure():
+ if '-v' in argv: print "\033[60G[\033[1;31mFAILED\033[0;39m]\r"
+
+def print_success():
+ if '-v' in argv: print "\033[60G[ \033[1;32mOK\033[0;39m ]\r"
+
+def CalcPerms(initial,perms):
+ tempperms = initial
+ (s,u,g,o) = map(int, map(lambda x:perms[x], range(4)))
+ if s & 1:
+ tempperms |= S_ISVTX
+ if s & 2:
+ tempperms |= S_ISGID
+ if s & 4:
+ tempperms |= S_ISUID
+ if u & 1:
+ tempperms |= S_IXUSR
+ if u & 2:
+ tempperms |= S_IWUSR
+ if u & 4:
+ tempperms |= S_IRUSR
+ if g & 1:
+ tempperms |= S_IXGRP
+ if g & 2:
+ tempperms |= S_IWGRP
+ if g & 4:
+ tempperms |= S_IRGRP
+ if o & 1:
+ tempperms |= S_IXOTH
+ if o & 2:
+ tempperms |= S_IWOTH
+ if o & 4:
+ tempperms |= S_IROTH
+ return tempperms
+
+class Toolset(object):
+ __important__ = []
+
+ def __init__(self, cfg, setup):
+ self.setup = setup
+ if self.__important__:
+ for c in cfg.findall(".//ConfigFile"):
+ for name in self.__important__:
+ if c.get("name") == name:
+ self.InstallConfigFile(c)
+
+ def VerifySymLink(self, src, dst):
+ try:
+ s = readlink(dst)
+ if s == src:
+ return True
+ return False
+ except OSError:
+ return False
+
+ def InstallSymLink(self, src, dst):
+ try:
+ fmode = lstat(dst)[ST_MODE]
+ if S_ISREG(fmode) or S_ISLNK(fmode):
+ unlink(dst)
+ elif S_ISDIR(fmode):
+ system("mv %s/ %s.bak"%(dst, dst))
+ else:
+ unlink(dst)
+ except OSError, e:
+ pass
+ try:
+ symlink(src, dst)
+ except OSError, e:
+ return False
+
+ def VerifyDirectory(self, entry):
+ try:
+ ondisk=stat(entry.attrib['name'])
+ except OSError:
+ return False
+ try:
+ owner=getpwuid(ondisk[ST_UID])[0]
+ group=getgrgid(ondisk[ST_GID])[0]
+ except OSError:
+ owner='root'
+ group='root'
+ perms=stat(entry.attrib['name'])[ST_MODE]
+ if ((owner == entry.attrib['owner']) and
+ (group == entry.attrib['group']) and
+ (perms == entry.attrib['perms'])):
+ return True
+ else:
+ return False
+
+ def InstallDirectory(self, entry):
+ try:
+ fmode = lstat(entry.attrib['name'])
+ if not S_ISDIR(fmode[0]):
+ try:
+ unlink(entry.attrib['name'])
+ except:
+ return False
+ except OSError:
+ pass
+ try:
+ mkdir(entry.attrib['name'])
+ except OSError:
+ return False
+ try:
+ chown(entry.attrib['name'],getpwnam(self.attrib['owner'])[2],getgrnam(entry.attrib['group'])[2])
+ chmod(entry.attrib['name'],entry.attrib['perms'])
+ except:
+ return False
+
+ def VerifyConfigFile(self, entry):
+ try:
+ ondisk=stat(entry.attrib['name'])
+ except OSError:
+ return False
+ try:
+ data=open(entry.attrib['name']).read()
+ except IOError:
+ return False
+ try:
+ owner=getpwuid(ondisk[ST_UID])[0]
+ group=getgrgid(ondisk[ST_GID])[0]
+ except KeyError:
+ return False
+ perms=stat(entry.attrib['name'])[ST_MODE]
+ tempdata = entry.text
+ if ((data == tempdata) and (owner == entry.attrib['owner']) and
+ (group == entry.attrib['group']) and (perms == CalcPerms(S_IFREG, entry.attrib['perms']))):
+ return True
+ return False
+
+ def InstallConfigFile(self, entry):
+ if self.setup['dryrun'] or self.setup['verbose']:
+ print "Installing ConfigFile %s"%(entry.attrib['name'])
+ if self.setup['dryrun']:
+ return False
+ parent = join(split(entry.attrib['name'],"/")[:-1],"/")
+ if parent:
+ try:
+ s = lstat(parent)
+ try:
+ if not S_ISDIR(s[ST_MODE]):
+ unlink(parent)
+ mkdir(parent)
+ except OSError:
+ return False
+ except OSError:
+ # need to handle mkdir -p case
+ mkdir(parent)
+
+ # If we get here, then the parent directory should exist
+ try:
+ newfile = open("%s.new"%(entry.attrib['name']), 'w')
+ newfile.write(entry.text)
+ newfile.close()
+ chown(newfile.name, entry.attrib['owner'], entry.attrib['group'])
+ chmod(newfile.name, CalcPerms(S_IFREG, entry.attrib['perms']))
+ rename(newfile.name, entry.attrib['name'])
+ return True
+ except (OSError, IOError), e:
+ print e
+ return False
+
+
+