#!/usr/bin/env python # # $Id: $ # # Copyright (c) 2007-2009 Platform Computing Inc # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA # # import os import os.path from path import path import pwd import string import sys import glob import tempfile import time import gettext import glob from sets import Set try: import subprocess except: from popen5 import subprocess import kusu.core.netutil as netutil import kusu.core.database as db import sqlalchemy as sa from optparse import OptionParser import rpm from kusu.ocssetup.kitdownloader import YumKitDownloader,deleteTMPDir import kusu.util.log as kusulog import rpmUtils.miscutils # provided by Yum from primitive.support.util import runCommand import kusu.core.database as db import atexit KITPKGS=['component-base-installer', 'component-base-node', 'component-gnome-desktop', 'component-icr-facilitator', 'primitive', 'python-psycopg2.x86_64', 'initrd-templates', 'kit-base', 'kusu-release', 'kusu-base-installer', 'kusu-base-node.x86_64', 'kusu-boot', 'kusu-buildkit', 'kusu-core', 'kusu-driverpatch', 'kusu-hardware', 'kusu-kitops', 'kusu-networktool', 'kusu-nodeinstaller-patchfiles', 'kusu-path', 'kusu-repoman', 'kusu-ui', 'kusu-util', 'environment-modules.x86_64', 'pdsh.x86_64', 'pdsh-mod-dshgroup.x86_64', 'pdsh-mod-machines.x86_64', 'pdsh-mod-netgroup.x86_64', 'pdsh-rcmd-exec.x86_64', 'pdsh-rcmd-rsh.x86_64', 'pdsh-rcmd-ssh.x86_64', 'python-cheetah.x86_64', 'python-sqlalchemy', 'python-sqlite2.x86_64', 'python-IPy', 'kusu-autoinstall', 'kusu-createrepo', 'kusu-installer', 'kusu-md5crypt', 'kusu-nodeinstaller'] if __name__ == '__main__': args = sys.argv reponame = 'rhel5_x86_64' #XXX Fixme - hardcoded kitname = 'base' name = os.path.splitext(os.path.basename(args[0]))[0] parser = OptionParser('%s [-d | --dlonly ] [-h | --help]'\ % name) parser.add_option('-d','--dlonly', dest='download',action='store_true', help='Only downloads the kit') parser.add_option('-l','--localrepo', dest='localrepo',action='store_true', help='Use only a localrepo') options = parser.parse_args()[0] if options.download: download = True else: download = False if options.localrepo: localrepo = True else: localrepo = False # default options otherwise. sys.stdout.write('Downloading base kit...\n') tmpdir = tempfile.mkdtemp(prefix='kit-installer-') atexit.register(deleteTMPDir,tmpdir) app = YumKitDownloader(download=download, localrepo=localrepo, packages=KITPKGS, destdir=tmpdir, match_arch=True) try: retval = app.run() except Exception,e : sys.stderr.write("Error downloading requested packages : %s" % e) retval = -1 if retval: sys.stderr.write("Kit downloader failed with return code: %s" % retval) sys.exit(-1) # Initialise Database dbdriver = os.getenv('KUSU_DB_ENGINE','postgres') db = db.DB(dbdriver,'kusudb','apache') # Test if base kit is installed kits_root_row = db.AppGlobals.selectfirst_by(kname='DEPOT_KITS_ROOT') if kits_root_row: kits_root = kits_root_row.kvalue else: kits_root = '/depot/kits' bkit = db.Kits.selectfirst_by(rname='base') if bkit: base_install = False #upgrade # Update the DB entry # delete the directory # oldver = bkit.version if bkit.version != '5.2': bkit.version = '5.2' old_base_kit = path(kits_root) / kitname / oldver if old_base_kit.exists(): old_base_kit.rmtree() basekit_dir = path(kits_root) / kitname/ bkit.version if not basekit_dir.exists(): basekit_dir.makedirs() for p in path(tmpdir).glob('*'): p.copy(basekit_dir / bkit.arch) bkit.save() db.flush() # if the kit is the same verison, we do nothing else: base_install = True # Call kitops to add base kit cmd = 'kitops --add -m %s' % tmpdir try: out, err = runCommand(cmd) sys.stdout.write(out) sys.stdout.write('\n') sys.stderr.write(err) except Exception,e: sys.stderr.write('Failed to add base kit using kitops!\n') sys.exit(-1) # Deal with ICR component before installing base kit icr_component = db.Components.selectfirst_by(cname='component-irc-facilitator') base_kid = db.Kits.selectfirst_by(rname=kitname).kid if icr_component: #upgrade - nothing to do pass else: new_icr_comp = db.Components(cname='component-icr-facilitator', cdesc=\ 'Component for Intel(R) Cluster Ready Facilitator', os='rhel-5-x86_64',kid=base_kid) new_icr_comp.save() db.flush() if not download: # Do the Kit association as well if base_install: # Fresh install so add base kit cmd = 'repoman -a --kit %s -r %s' % (kitname,reponame) out , err = runCommand(cmd) sys.stdout.write(out) sys.stdout.write('\n') cmd = 'repoman -u -r %s' % reponame out , err = runCommand(cmd) sys.stdout.write(out) sys.stdout.write('\n') cmd = 'cfmsync -u -f -p' out , err = runCommand(cmd) sys.stdout.write(out) sys.stdout.write('\n') sys.exit(retval)