def _installInTmpDir(self, pkg, ainstTmpPkgDir): rpmFilePath = self._getRpmFilePath(pkg) if not rpmFilePath: return False if not file_util.makeDir(ainstTmpPkgDir, True): Log.cout(Log.ERROR, 'Prepare tmp dir for install failed') return False if not rpmutils.rpm2dir(rpmFilePath, ainstTmpPkgDir): Log.cout(Log.ERROR, 'Rpm %s to dir failed' % rpmFilePath) return False # disable dir checking # if not self._changeToValidRootDir(ainstTmpPkgDir): # Log.cout(Log.ERROR, 'Change to valid root dir failed') # return False if not file_util.makeDir(ainstTmpPkgDir + '/ainst'): return False if not file_util.copyFile(rpmFilePath, ainstTmpPkgDir + self._bakRpmPath): Log.cout(Log.ERROR, 'Copy installed.rpm failed') return False return True
def getPackage(self, pkg): if self._getRepoDataDir() is None: return None pkgCacheDir = self._getRepoDataDir() + self.packageCacheDir preUmask = os.umask(0) if not file_util.makeDir(pkgCacheDir): os.umask(preUmask) Log.cout(Log.ERROR, 'Make cache dir [%s] failed' % pkgCacheDir) return None os.umask(preUmask) uri = pkg.getLocation() if not uri.lower().startswith('http'): return None pkgFilePath = pkgCacheDir + os.path.basename(uri) if file_util.exists(pkgFilePath): ctime = os.stat(pkgFilePath).st_ctime nowtime = time.time() if nowtime - ctime < self.expireTime: Log.cout(Log.DEBUG, "Get package [%s] from cache" % pkg) return pkgFilePath if not file_util.remove(pkgFilePath): Log.cout(Log.DEBUG, "Remove old package [%s] because of expired" % pkg) return None if not self.fileFetcher.fetch(uri, pkgFilePath) or \ not file_util.chmod(pkgFilePath, 0666): return None
def getPackage(self, pkg): if self._getRepoDataDir() is None: return None pkgCacheDir = self._getRepoDataDir() + self.packageCacheDir preUmask = os.umask(0) if not file_util.makeDir(pkgCacheDir): os.umask(preUmask) Log.cout(Log.ERROR, 'Make cache dir [%s] failed' % pkgCacheDir) return None os.umask(preUmask) uri = pkg.getLocation() if not uri.lower().startswith('http'): return None pkgFilePath = pkgCacheDir + os.path.basename(uri) if file_util.exists(pkgFilePath): ctime = os.stat(pkgFilePath).st_ctime nowtime = time.time() if nowtime - ctime < self.expireTime: Log.cout(Log.DEBUG, "Get package [%s] from cache" % pkg) return pkgFilePath if not file_util.remove(pkgFilePath): Log.cout(Log.DEBUG, "Remove old package [%s] because of expired" % pkg) return None if not self.fileFetcher.fetch(uri, pkgFilePath) or \ not file_util.chmod(pkgFilePath, 0666): return None return pkgFilePath
def init(self): if self._inited: return True, None if not self._root: return False, None markFilePath = self._root + '/' + self._ainstRootMarkFile initTrace = [] if not file_util.isDir(self._root): if not file_util.makeDir(self._root): self.clearInit(initTrace) return False, None initTrace.append(self._root) if not file_util.writeToFile(markFilePath, ''): self.clearInit(initTrace) return False, None initTrace.append(markFilePath) else: if not file_util.isFile(markFilePath): subDirs = file_util.listDir(self._root) if subDirs and len(subDirs) > 0: self.clearInit(initTrace) return False, None if not file_util.writeToFile(markFilePath, ''): self.clearInit(initTrace) return False, None initTrace.append(markFilePath) if not self._initRoot(initTrace): return False, None os.environ[self._installRootEnvKey] = self._root self._inited = True return True, initTrace
def rpm2dir(rpmPath, destDir, timeout=600): currentWorkdir = os.getcwd() if not file_util.isDir(destDir) and not file_util.makeDir(destDir): Log.cout(Log.ERROR, 'Make rpm dir %s failed' % destDir) return False try: os.chdir(destDir) except OSError, e: return False
def _initRoot(self, initTrace): for name in self._rootDirs: if file_util.isDir(self._rootDirs[name]): continue if not file_util.makeDir(self._rootDirs[name]): self.clearInit(initTrace) return False initTrace.append(self._rootDirs[name]) for name in self._rootVarDirs: if file_util.isDir(self._rootVarDirs[name]): continue if not file_util.makeDir(self._rootVarDirs[name]): self.clearInit(initTrace) return False initTrace.append(self._rootVarDirs[name]) for name in self._rootVarAinstDirs: if file_util.isDir(self._rootVarAinstDirs[name]): continue if not file_util.makeDir(self._rootVarAinstDirs[name]): self.clearInit(initTrace) return False initTrace.append(self._rootVarAinstDirs[name]) initRootState = self._rootVarAinstDirs['save'] + 'root-state-0' if not file_util.exists(initRootState): state = RootState(time.time(), '', self._root, common.AINST_VERSION, [], {}) content = RootStateStreamer().toString(state) if not content or not file_util.writeToFile(initRootState, content): self.clearInit(initTrace) return False initTrace.append(initRootState) if not self._clearTmp: if not file_util.remove(self._rootVarAinstDirs['tmp']) or\ not file_util.makeDir(self._rootVarAinstDirs['tmp']): self.clearInit(initTrace) return False self._clearTmp = True return True
def undo(self): if self._dryrun: return True if not self._executed: return False Log.cout(Log.INFO, 'Undo deactivate pkg %s ...' % self._pkg) if self._success: if not self._noExecute and not self._processScriptByName('pre-activate'): return False # roll back unlink from root for dest in self._rmdirList: if not file_util.makeDir(dest): return False for src, dest in self._unlinkList: if not file_util.link(src, dest): return False for src, dest in self._confDict.values(): if not file_util.move(src, dest): return False if self._modifyDb and not self._addFileToDb(): return False if self._crontabSrcDest: cronFilePath, tmpPath = self._crontabSrcDest if not file_util.move(tmpPath, cronFilePath): return False # roll back unlink from active if self._lastActivePkg: if not file_util.symLink(self._lastActivePkg, self._ainstActivePkg): return False if self._success: if not self._noExecute and not self._processScriptByName('post-activate'): return False # roll back stop if not self._noExecute and not self._noStop and self._aicfInfo and\ self._aicfInfo.autoStart and self._aicfInfo.scripts.has_key('start'): scriptContent = self._aicfInfo.scripts['start'] if scriptContent: self._exportToEnv(self._ainstPathEnv) self._exportToEnv(self._settingsEnv) self._processScript(scriptContent) self._removeFromEnv(self._settingsEnv) self._removeFromEnv(self._ainstPathEnv) self._init() return True
def _getRepoDataDir(self): if self.repoDataDir: return self.repoDataDir if not self.cacheDir or not self.repoid: return None self.repoDataDir = self.cacheDir + '/' + self.repoid if not file_util.exists(self.repoDataDir): preUmask = os.umask(0) ret = file_util.makeDir(self.repoDataDir, True, 0777) os.umask(preUmask) if not ret: Log.cout(Log.ERROR, 'make repo data dir %s failed' % self.repoDataDir) return None return self.repoDataDir