#!/usr/bin/env python import re, os def pkglist(device): pass def usage(): print """ Usage: install the Solaris binary package for NexentaOS. A quick hack for SunStudio installation, USE IT AT YOUR OWN RISK! emerge.py packages ... emerge.py -p packages ... emerge.py -l path Option: -h --help print this page -p --pertend list the dependencies -l --list list the avaliable package in the path -f --force install the package regardless the dependencies """ def pkginfo(meta): fh = open(meta) return dict([line.strip().split('=', 1) for line in fh.readlines()]) def pkglist(device): return [pkginfo(device + '/' + x + '/pkginfo') for x in os.listdir(device) ] def calcdependencies(argv): pattern = re.compile('^P\s+([^\s]+)\s+(.*)$') print 'calculating the dependency recursively ....' deps = {} stack = list(argv) while len(stack): t = stack.pop() file = os.path.basename(t) path = os.path.dirname(t) try: fh = open(t + '/install/depend') except IOError: continue for line in fh.readlines(): dep = pattern.search(line) if dep: k,v = dep.groups() if k not in deps.keys(): deps.update(dict( [dep.groups()] )) stack.append(os.path.join(path, k)) return deps def install(pkg): def run(cmd): print cmd os.system(cmd) try: pi = pkginfo(pkg + '/pkginfo') base = pi['BASEDIR'] print "Installing %s to %s" % (pi['PKG'], base) os.system('unzip %s/archive/none -d %s' % (pkg, pi['BASEDIR'])) # read the pkgmap to chmod fh = open(pkg + '/pkgmap') for line in fh.readlines(): if line[0] == ':': continue t = line.split() x, flag, none, cmd = t[:4] if flag == 's': src, dest = cmd.split('=') src = os.path.join(base, src) run( 'ln -sf %s %s' % (dest, src) ) if flag == 'd': run( 'mkdir -p %s' % os.path.join(base, cmd)) if len(t) > 6: mod, user, group = t[4:7] run('chown %s:%s %s' % (user, group, os.path.join(base, cmd))) run('chmod %s %s' % (mod, os.path.join(base, cmd))) except IOError: print "%s is not found, a system package? " % pkg def main(): import sys, getopt force = False try: opts, argv = getopt.getopt(sys.argv[1:], 'plhf', ['--pretend', '--list', '--help', 'force']) except getopt.GetoptError: usage() sys.exit(2) for o, a in opts: if o in ('-h', '--help'): usage() sys.exit() if o in ('-l', '--list'): if len(argv) == 1: pi = pkglist(argv[0]) print "\n".join([ "%s\t\t%s" % (x['PKG'], x['NAME']) for x in pi]) sys.exit() else: usage() sys.exit() if o in ('-p', '--pretend'): deps = calcdependencies(argv) deps.update( dict([ (k, "") for k in argv ]) ) print "\n".join( ["\t\t".join(x) for x in deps.items() ] ) sys.exit() if o in ('-f', '--force'): force = True # now we are going to emerge argv if len(argv) < 1: usage() sys.exit(2) if force: map(install, argv) else: deps = calcdependencies(argv) deps.update( dict([ (k, "") for k in argv ]) ) map(install, deps.keys()) if __name__ == "__main__": main()