예제 #1
0
def get_preseed( xml ):
    pack_dir = elbepack.__path__[0]
    def_xml = etree( os.path.join( pack_dir, "default-preseed.xml" ) )

    preseed = {}
    for c in def_xml.node("/preseed"):
        k = (c.et.attrib["owner"], c.et.attrib["key"])
        v = (c.et.attrib["type"], c.et.attrib["value"])

        preseed[k] = v

    if not xml.has("./project/preseed"):
        return preseed

    for c in xml.node("/project/preseed"):
        k = (c.et.attrib["owner"], c.et.attrib["key"])
        v = (c.et.attrib["type"], c.et.attrib["value"])

        preseed[k] = v

    return preseed
예제 #2
0
def get_preseed( xml ):
    pack_dir = elbepack.__path__[0]
    def_xml = etree( os.path.join( pack_dir, "default-preseed.xml" ) )

    preseed = {}
    for c in def_xml.node("/preseed"):
        k = (c.et.attrib["owner"], c.et.attrib["key"])
        v = (c.et.attrib["type"], c.et.attrib["value"])

        preseed[k] = v

    if not xml.has("./project/preseed"):
        return preseed

    for c in xml.node("/project/preseed"):
        k = (c.et.attrib["owner"], c.et.attrib["key"])
        v = (c.et.attrib["type"], c.et.attrib["value"])

        preseed[k] = v

    return preseed
예제 #3
0
def run_command( argv ):
    oparser = OptionParser(usage="usage: %prog adjustpkgs [options] <xmlfile>")

    oparser.add_option( "-o", "--output", dest="output",
                        help="name of logfile" )
    oparser.add_option( "-n", "--name", dest="name",
                        help="name of the project (included in the report)" )
    (opt,args) = oparser.parse_args(argv)

    if len(args) != 1:
       print "Wrong number of arguments"
       oparser.print_help()
       sys.exit(20)

    if not opt.output:
        return 0

    outf = asccidoclog(opt.output)

    if opt.name:
        outf.h1( "ELBE Report for Project "+opt.name )
    else:
        outf.h1( "ELBE Report" )

    xml = etree( args[0] )

    pkgs = xml.node("/target/pkg-list")

    cache = apt.Cache()
    cache.update()
    cache.open(None)

    errors = 0

    pkglist = ["parted", "mtd-utils", "dpkg-dev", "dosfstools", "apt-rdepends",
               "python-apt", "rsync", "genisoimage", "reprepro", "python-parted", "grub-pc"]

    if xml.has("./project/buildimage/pkg-list"):
        build_pkglist = [p.et.text for p in xml.node("project/buildimage/pkg-list")]
    else:
        build_pkglist = []
    with cache.actiongroup():

        want_pkgs = [p.et.text for p in pkgs] + pkglist + build_pkglist

        for p in cache:
            if not p.is_installed:
                continue
            if p.essential or p.is_auto_installed or (p.name in want_pkgs) or p.installed.priority == "important" or p.installed.priority == "required":
                continue
            p.mark_delete( auto_fix=False, purge=True )

        for name in want_pkgs:

            if not name in cache:
                outf.printo( "- package %s does not exist" % name )
                errors += 1
                continue

            cp = cache[name]

            cp.mark_install()

        for p in cache:
            if not p.is_installed:
                continue
            if p.is_auto_removable:
                p.mark_delete( purge=True )

    cache.commit(apt.progress.base.AcquireProgress(),
                 apt.progress.base.InstallProgress())
예제 #4
0
파일: dump.py 프로젝트: ArashJavan/elbe
def run_command( argv ):
    oparser = OptionParser(usage="usage: %prog dump [options] <xmlfile>")

    oparser.add_option( "-f", "--finetuning", dest="finetuning",
                        help="filename of finetuning script" )
    oparser.add_option( "-t", "--target", dest="target",
                        help="directoryname of target" )
    oparser.add_option( "-a", "--archive", dest="archive",
                        help="filename of archive" )
    oparser.add_option( "-o", "--output", dest="output",
                        help="name of logfile" )
    oparser.add_option( "-n", "--name", dest="name",
                        help="name of the project (included in the report)" )
    oparser.add_option( "-v", "--validation", dest="validation",
                        help="name of the validation logfile" )
    oparser.add_option( "-k", "--kinitrd", dest="kinitrd",
                        help="name of the kinitrd package" )
    (opt,args) = oparser.parse_args(argv)

    if len(args) != 1:
       print "Wrong number of arguments"
       oparser.print_help()
       sys.exit(20)

    xml = etree( args[0] )

    if opt.validation:
        pkgs = xml.node("/target/pkg-list")
        if xml.has("fullpkgs"):
            check_full_pkgs(pkgs, xml.node("/fullpkgs"), opt.validation, opt.kinitrd)
        else:
            check_full_pkgs(pkgs, None, opt.validation, opt.kinitrd)

    paktree = xml.ensure_child( 'fullpkgs' )
    paktree.clear()

    curr_pkgs = get_pkgs( opt.kinitrd )
    for p in curr_pkgs:
        append_pkg_elem( paktree, p[0], p[1], p[2], p[3] )

    sources_list = xml.ensure_child( 'sources_list' )
    slist = read_file("/etc/apt/sources.list")
    sources_list.set_text( slist )

    try:
        preferences = xml.ensure_child( 'apt_prefs' )
        prefs = read_file("/etc/apt/preferences")
        preferences.set_text(prefs)
    except:
        print "no /etc/apt/preferences on system"
        prefs = ""

    buildv = xml.ensure_child( 'elbe_version' )
    buildv.set_text(elbe_version)

    xml.write( args[0] )

    if not opt.output:
        return 0
    if not opt.target:
        return 0

    outf = asccidoclog(opt.output)

    if opt.name:
        outf.h1( "ELBE Report for Project "+opt.name )
    else:
        outf.h1( "ELBE Report" )

    outf.printo( "report timestamp: "+datetime.datetime.now().strftime("%Y%m%d-%H%M%S") )

    outf.h2( "Apt Sources dump" )
    outf.verbatim_start()
    outf.print_raw(slist)
    outf.verbatim_end()

    outf.h2( "Apt Preferences dump" )
    outf.verbatim_start()
    outf.print_raw(prefs)
    outf.verbatim_end()

    outf.h2( "Installed Packages List" )
    outf.table()
    cache = apt.Cache(memonly=True)
    for p in cache:
        if p.is_installed:
            orig = p.installed.origins[0].site
            outf.printo( "|%s|%s|%s" % (p.name, p.installed.version, orig) )
    outf.table()

    # archive extraction is done before and after finetuning the first
    # extraction is needed that the files can be used (copied/moved to the
    # buildenv in finetuning
    # the second extraction is done to ensure that files from the archive
    # can't be modified/removed in finetuning

    outf.h2( "archive extract before finetuning" )

    if opt.archive:
        outf.verbatim_start()
        outf.print_raw( do_command( 'tar xvfj "%s" -C "%s"' % (opt.archive, opt.target) ) )
        outf.verbatim_end()

    outf.h2( "finetuning log" )
    outf.verbatim_start()

    index = get_fileindex()
    mt_index = mtime_snap( opt.target )
    if opt.finetuning:
        outf.print_raw( do_command( opt.finetuning ) )
        mt_index_post_fine = mtime_snap( opt.target )
    else:
        mt_index_post_fine = mt_index

    outf.verbatim_end()

    outf.h2( "archive extract after finetuning" )

    outf.verbatim_start()

    if opt.archive:
        outf.print_raw( do_command( 'tar xvfj "%s" -C "%s"' % (opt.archive, opt.target) ) )
        mt_index_post_arch = mtime_snap( opt.target )
    else:
        mt_index_post_arch = mt_index_post_fine

    outf.verbatim_end()

    outf.h2( "fileslist" )
    outf.table()

    tgt_pkg_list = Set()

    for fpath, realpath in walk_files(opt.target):
        if index.has_key(fpath):
            pkg = index[fpath]
            tgt_pkg_list.add(pkg)
        else:
            pkg = "postinst generated"

        if mt_index_post_fine.has_key(fpath) and mt_index.has_key(fpath):
            if mt_index_post_fine[fpath] > mt_index[fpath]:
                pkg = "modified finetuning"
        if mt_index_post_fine.has_key(fpath):
            if mt_index_post_arch[fpath] > mt_index_post_fine[fpath]:
                pkg = "from archive"
            elif not mt_index.has_key(fpath):
                pkg = "added in finetuning"
        else:
            pkg = "added in archive"

        outf.printo( "|+%s+|%s" % (fpath,pkg) )

    outf.table()

    outf.h2( "Deleted Files" )
    outf.table()
    for fpath in mt_index.keys():
        if not mt_index_post_arch.has_key(fpath):
            if index.has_key(fpath):
                pkg = index[fpath]
            else:
                pkg = "postinst generated"
            outf.printo( "|+%s+|%s" % (fpath,pkg) )
    outf.table()

    outf.h2( "Target Package List" )
    outf.table()
    cache = apt.Cache(memonly=True)
    if xml.has("target/pkgversionlist"):
        os.remove('/target/etc/elbe_pkglist')
        f = open('/target/etc/elbe_pkglist', 'w')
    for pkg in tgt_pkg_list:
        p = cache[pkg]
        outf.printo( "|%s|%s|%s|%s" % (p.name, p.installed.version, p.is_auto_installed, p.installed.md5) )
        if xml.has("target/pkgversionlist"):
            f.write ("%s %s %s\n" % (p.name, p.installed.version, p.installed.md5))
    outf.table()

    if xml.has("target/pkgversionlist"):
        f.close ()
예제 #5
0
def run_command( argv ):
    oparser = OptionParser(usage="usage: %prog buildchroot [options] <xmlfile>")
    oparser.add_option( "-t", "--target", dest="target",
                        help="directoryname of target" )
    oparser.add_option( "-o", "--output", dest="output",
                        help="name of logfile" )
    oparser.add_option( "-n", "--name", dest="name",
                        help="name of the project (included in the report)" )
    oparser.add_option( "--skip-validation", action="store_true",
                        dest="skip_validation", default=False,
                        help="Skip xml schema validation" )
    oparser.add_option( "--skip-debootstrap", action="store_true",
                        dest="skip_debootstrap", default=False,
                        help="Skip debootstrap" )
    oparser.add_option( "--skip-cdrom", action="store_true",
                        dest="skip_cdrom", default=False,
                        help="Skip cdrom iso generation" )
    oparser.add_option( "--build-sources", action="store_true",
                        dest="buildsources", default=False,
                        help="Build Source CD" )
    oparser.add_option( "--debug", action="store_true", dest="debug",
                        default=False,
                        help="Enable various features to debug the build" )
    oparser.add_option( "--buildtype", dest="buildtype",
                        help="Override the buildtype" )
    oparser.add_option( "--proxy", dest="proxy",
                        help="Override the http proxy" )

    (opt,args) = oparser.parse_args(argv)

    if len(args) != 1:
        print "wrong number of arguments"
        oparser.print_help()
        sys.exit(20)

    if not opt.skip_validation:
        if not validate_xml( args[0] ):
            print "xml validation failed. Bailing out"
            sys.exit(20)

    xml = etree( args[0] )
    prj = xml.node("/project")
    tgt = xml.node("/target")

    if not opt.output:
        return 0
    if not opt.target:
        return 0

    if opt.buildtype:
        buildtype = opt.buildtype
    elif xml.has( "project/buildtype" ):
        buildtype = xml.text( "/project/buildtype" )
    else:
        buildtype = "nodefaults"

    defs = ElbeDefaults( buildtype )

    chroot = os.path.join(opt.target, "chroot")
    os.system( 'mkdir -p "%s"' % chroot )

    outf = asccidoclog(opt.output)

    if opt.name:
        outf.h1( "ELBE Report for Project "+opt.name )
    else:
        outf.h1( "ELBE Report" )

    outf.printo( "report timestamp: "+datetime.datetime.now().strftime("%Y%m%d-%H%M%S") )

    suite = prj.text("suite")
    target_arch = prj.text("buildimage/arch", default=defs, key="arch")

    slist = ""
    mirror = "Error"
    if prj.has("mirror/primary_host"):
        mirror = "%s://%s/%s" % ( prj.text("mirror/primary_proto"), prj.text("mirror/primary_host"), prj.text("mirror/primary_path") )
        slist += "deb %s %s main\n" % (mirror, suite)
        slist += "deb-src %s %s main\n" % (mirror, suite)

    if prj.has("mirror/cdrom"):
        cdrompath = os.path.join( opt.target, "cdrom" )
        mirror = "file://%s/debian" % cdrompath
        os.system( 'mkdir -p "%s"' % cdrompath )
        os.system( 'mount -o loop "%s" "%s"' % (prj.text("mirror/cdrom"), cdrompath ) )

        slist += "deb copy:///mnt %s main\n" % (suite)
        #slist += "deb-src file:///mnt %s main\n" % (suite)

    if opt.proxy:
        os.environ["http_proxy"] = opt.proxy
    elif prj.has("mirror/primary_proxy"):
        os.environ["http_proxy"] = prj.text("mirror/primary_proxy")

    os.environ["LANG"] = "C"
    os.environ["LANGUAGE"] = "C"
    os.environ["LC_ALL"] = "C"
    os.environ["DEBIAN_FRONTEND"]="noninteractive"
    os.environ["DEBONF_NONINTERACTIVE_SEEN"]="true"

    try:
        if prj.node("mirror/url-list"):
            for n in prj.node("mirror/url-list"):
                slist += "deb %s\n" % n.text("binary").strip()

        serial_con, serial_baud = tgt.text( "console" ).split(',')

        if not opt.skip_debootstrap:
            debootstrap( outf, chroot, mirror, suite, target_arch, defs )
        seed_files( outf, chroot, slist, xml, args[0], opt, defs )

    finally:
        if prj.has("mirror/cdrom"):
            os.system( 'umount "%s"' % cdrompath )

    mount_stuff( outf, chroot )
    if prj.has("mirror/cdrom"):
        os.system( 'mount -o loop "%s" "%s"' % (prj.text("mirror/cdrom"), os.path.join(chroot, "mnt")) )

    pkglist = ["parted", "mtd-utils", "dpkg-dev", "dosfstools", "apt-rdepends",
               "python-apt", "rsync", "genisoimage", "reprepro", "python-parted"]

    try:
        do_chroot( outf, chroot, "apt-get update" )
        do_chroot( outf, chroot, """/bin/sh -c 'debconf-set-selections < /opt/elbe/custom-preseed.cfg'""" )
        if not opt.skip_debootstrap:
            do_chroot( outf, chroot, "apt-get install -y --force-yes " + string.join( pkglist ) )
        do_chroot( outf, chroot, "python /opt/elbe/adjustpkgs.py -o /opt/elbe/bla.log /opt/elbe/source.xml" )
        do_chroot( outf, chroot, """/bin/sh -c 'echo "%s\\n%s\\n" | passwd'""" % (tgt.text("passwd"), tgt.text("passwd")) )
        do_chroot( outf, chroot, """/bin/sh -c 'echo "127.0.0.1 %s %s.%s" >> /etc/hosts'""" % (tgt.text("hostname"), tgt.text("hostname"), tgt.text("domain")) )
        do_chroot( outf, chroot, """/bin/sh -c 'echo "%s" > /etc/hostname'""" % tgt.text("hostname") )
        do_chroot( outf, chroot, """/bin/sh -c 'echo "%s.%s" > /etc/mailname'""" % (tgt.text("hostname"), tgt.text("domain")) )
        do_chroot( outf, chroot, """/bin/sh -c 'echo "T0:23:respawn:/sbin/getty -L %s %s vt100" >> /etc/inittab'""" % (serial_con, serial_baud) )
        do_chroot( outf, chroot, "rm /usr/sbin/policy-rc.d" )
        do_chroot( outf, chroot, "/opt/elbe/create-target-rfs.sh" )
        if not opt.skip_cdrom:
            do_chroot( outf, chroot, "/opt/elbe/mkcdrom.sh" )

    finally:
        if prj.has("mirror/cdrom"):
            os.system( 'umount "%s"' % os.path.join(chroot, "mnt") )
        umount_stuff( outf, chroot )

    extract = open( os.path.join(chroot, "opt/elbe/files-to-extract"), "r" )
    for fname in extract.readlines():
        outf.do_command( 'cp "%s" "%s"' % (chroot+fname.strip(), opt.target) ) 
    extract.close()
예제 #6
0
def run_command( argv ):

    oparser = OptionParser( usage="usage: %prog hdimg <xmlfile>")
    oparser.add_option( "--directory", dest="dir",
                        help="mount the loop file here",
                        metavar="FILE" )

    (opt,args) = oparser.parse_args(argv)

    if len(args) != 1:
	print "Wrong number of arguments"
	oparser.print_help()
	sys.exit(20)

    if not opt.dir:
	print "No mount directory specified!"
	oparser.print_help()
	sys.exit(20)

    try:
	xml = etree( args[0] )
    except:
	print "Error reading xml file!"
	sys.exit(20)

    tgt = xml.node("target")

    if not tgt.has("images"):
	print "no images defined"
	sys.exit(20)

    if not tgt.has("fstab"):
	print "no fstab defined"
	sys.exit(20)

    outf = asccidoclog()
    outf.h2( "Formatting Disks" )

    # Build a dictonary of mount points
    fslabel = {}
    for fs in tgt.node("fstab"):
	if fs.tag != "bylabel":
	    continue

	fslabel[fs.text("label")] = fstabentry(fs)

    # Build a sorted list of mountpoints
    fslist = fslabel.values()
    fslist.sort( key = lambda x: x.mountdepth() )

    # now move all mountpoints into own directories
    # begin from deepest mountpoints

    outf.do_command( 'mkdir -p /opt/elbe/filesystems' )

    for l in reversed(fslist):
        outf.do_command( 'mkdir -p "%s"' % os.path.join( '/opt/elbe/filesystems', l.label ) )
        outf.do_command( 'mkdir -p "%s"' % '/target' + l.mountpoint )
        if len(os.listdir( '/target' + l.mountpoint )) > 0:
            outf.do_command( 'mv "%s"/* "%s"' % ( '/target' + l.mountpoint, os.path.join( '/opt/elbe/filesystems', l.label ) ) )

    try:
	# Now iterate over all images and create filesystems and partitions
	for i in tgt.node("images"):
	    if i.tag == "msdoshd":
		do_image_hd( outf, i, fslabel, opt )

	    if i.tag == "gpthd":
		do_image_hd( outf, i, fslabel, opt )

	    if i.tag == "mtd":
		mkfs_mtd( outf, i, fslabel )
    finally:
	# Put back the filesystems into /target
	# most shallow fs first...
	for i in fslist:
            if len(os.listdir(os.path.join( '/opt/elbe/filesystems', i.label ))) > 0:
                outf.do_command( 'mv "%s"/* "%s"' % ( os.path.join( '/opt/elbe/filesystems', i.label ), '/target' + i.mountpoint ) )

    # Files are now moved back. ubinize needs files in place, so we run it now.
    for i in tgt.node("images"):
	if i.tag == "mtd":
	    build_image_mtd( outf, i, fslabel )
예제 #7
0
def run_command(argv):
    oparser = OptionParser(usage="usage: %prog dump [options] <xmlfile>")

    oparser.add_option("-f",
                       "--finetuning",
                       dest="finetuning",
                       help="filename of finetuning script")
    oparser.add_option("-t",
                       "--target",
                       dest="target",
                       help="directoryname of target")
    oparser.add_option("-a",
                       "--archive",
                       dest="archive",
                       help="filename of archive")
    oparser.add_option("-o", "--output", dest="output", help="name of logfile")
    oparser.add_option("-n",
                       "--name",
                       dest="name",
                       help="name of the project (included in the report)")
    oparser.add_option("-v",
                       "--validation",
                       dest="validation",
                       help="name of the validation logfile")
    oparser.add_option("-k",
                       "--kinitrd",
                       dest="kinitrd",
                       help="name of the kinitrd package")
    (opt, args) = oparser.parse_args(argv)

    if len(args) != 1:
        print "Wrong number of arguments"
        oparser.print_help()
        sys.exit(20)

    xml = etree(args[0])

    if opt.validation:
        pkgs = xml.node("/target/pkg-list")
        if xml.has("fullpkgs"):
            check_full_pkgs(pkgs, xml.node("/fullpkgs"), opt.validation,
                            opt.kinitrd)
        else:
            check_full_pkgs(pkgs, None, opt.validation, opt.kinitrd)

    paktree = xml.ensure_child('fullpkgs')
    paktree.clear()

    curr_pkgs = get_pkgs(opt.kinitrd)
    for p in curr_pkgs:
        append_pkg_elem(paktree, p[0], p[1], p[2], p[3])

    sources_list = xml.ensure_child('sources_list')
    slist = read_file("/etc/apt/sources.list")
    sources_list.set_text(slist)

    try:
        preferences = xml.ensure_child('apt_prefs')
        prefs = read_file("/etc/apt/preferences")
        preferences.set_text(prefs)
    except:
        print "no /etc/apt/preferences on system"
        prefs = ""

    buildv = xml.ensure_child('elbe_version')
    buildv.set_text(elbe_version)

    xml.write(args[0])

    if not opt.output:
        return 0
    if not opt.target:
        return 0

    outf = asccidoclog(opt.output)

    if opt.name:
        outf.h1("ELBE Report for Project " + opt.name)
    else:
        outf.h1("ELBE Report")

    outf.printo("report timestamp: " +
                datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))

    outf.h2("Apt Sources dump")
    outf.verbatim_start()
    outf.print_raw(slist)
    outf.verbatim_end()

    outf.h2("Apt Preferences dump")
    outf.verbatim_start()
    outf.print_raw(prefs)
    outf.verbatim_end()

    outf.h2("Installed Packages List")
    outf.table()
    cache = apt.Cache(memonly=True)
    for p in cache:
        if p.is_installed:
            orig = p.installed.origins[0].site
            outf.printo("|%s|%s|%s" % (p.name, p.installed.version, orig))
    outf.table()

    # archive extraction is done before and after finetuning the first
    # extraction is needed that the files can be used (copied/moved to the
    # buildenv in finetuning
    # the second extraction is done to ensure that files from the archive
    # can't be modified/removed in finetuning

    outf.h2("archive extract before finetuning")

    if opt.archive:
        outf.verbatim_start()
        outf.print_raw(
            do_command('tar xvfj "%s" -C "%s"' % (opt.archive, opt.target)))
        outf.verbatim_end()

    outf.h2("finetuning log")
    outf.verbatim_start()

    index = get_fileindex()
    mt_index = mtime_snap(opt.target)
    if opt.finetuning:
        outf.print_raw(do_command(opt.finetuning))
        mt_index_post_fine = mtime_snap(opt.target)
    else:
        mt_index_post_fine = mt_index

    outf.verbatim_end()

    outf.h2("archive extract after finetuning")

    outf.verbatim_start()

    if opt.archive:
        outf.print_raw(
            do_command('tar xvfj "%s" -C "%s"' % (opt.archive, opt.target)))
        mt_index_post_arch = mtime_snap(opt.target)
    else:
        mt_index_post_arch = mt_index_post_fine

    outf.verbatim_end()

    outf.h2("fileslist")
    outf.table()

    tgt_pkg_list = Set()

    for fpath, realpath in walk_files(opt.target):
        if index.has_key(fpath):
            pkg = index[fpath]
            tgt_pkg_list.add(pkg)
        else:
            pkg = "postinst generated"

        if mt_index_post_fine.has_key(fpath) and mt_index.has_key(fpath):
            if mt_index_post_fine[fpath] > mt_index[fpath]:
                pkg = "modified finetuning"
        if mt_index_post_fine.has_key(fpath):
            if mt_index_post_arch[fpath] > mt_index_post_fine[fpath]:
                pkg = "from archive"
            elif not mt_index.has_key(fpath):
                pkg = "added in finetuning"
        else:
            pkg = "added in archive"

        outf.printo("|+%s+|%s" % (fpath, pkg))

    outf.table()

    outf.h2("Deleted Files")
    outf.table()
    for fpath in mt_index.keys():
        if not mt_index_post_arch.has_key(fpath):
            if index.has_key(fpath):
                pkg = index[fpath]
            else:
                pkg = "postinst generated"
            outf.printo("|+%s+|%s" % (fpath, pkg))
    outf.table()

    outf.h2("Target Package List")
    outf.table()
    cache = apt.Cache(memonly=True)
    if xml.has("target/pkgversionlist"):
        os.remove('/target/etc/elbe_pkglist')
        f = open('/target/etc/elbe_pkglist', 'w')
    for pkg in tgt_pkg_list:
        p = cache[pkg]
        outf.printo("|%s|%s|%s|%s" % (p.name, p.installed.version,
                                      p.is_auto_installed, p.installed.md5))
        if xml.has("target/pkgversionlist"):
            f.write("%s %s %s\n" %
                    (p.name, p.installed.version, p.installed.md5))
    outf.table()

    if xml.has("target/pkgversionlist"):
        f.close()
예제 #8
0
def run_command( argv ):
    oparser = OptionParser(usage="usage: %prog buildchroot [options] <xmlfile>")
    oparser.add_option( "-t", "--target", dest="target",
                        help="directoryname of target" )
    oparser.add_option( "-o", "--output", dest="output",
                        help="name of logfile" )
    oparser.add_option( "-n", "--name", dest="name",
                        help="name of the project (included in the report)" )
    oparser.add_option( "--skip-validation", action="store_true",
                        dest="skip_validation", default=False,
                        help="Skip xml schema validation" )
    oparser.add_option( "--skip-debootstrap", action="store_true",
                        dest="skip_debootstrap", default=False,
                        help="Skip debootstrap" )
    oparser.add_option( "--skip-cdrom", action="store_true",
                        dest="skip_cdrom", default=False,
                        help="Skip cdrom iso generation" )
    oparser.add_option( "--build-sources", action="store_true",
                        dest="buildsources", default=False,
                        help="Build Source CD" )
    oparser.add_option( "--debug", action="store_true", dest="debug",
                        default=False,
                        help="Enable various features to debug the build" )
    oparser.add_option( "--buildtype", dest="buildtype",
                        help="Override the buildtype" )
    oparser.add_option( "--proxy", dest="proxy",
                        help="Override the http proxy" )

    (opt,args) = oparser.parse_args(argv)

    if len(args) != 1:
        print "wrong number of arguments"
        oparser.print_help()
        sys.exit(20)

    if not opt.skip_validation:
        if not validate_xml( args[0] ):
            print "xml validation failed. Bailing out"
            sys.exit(20)

    xml = etree( args[0] )
    prj = xml.node("/project")
    tgt = xml.node("/target")

    if not opt.output:
        return 0
    if not opt.target:
        return 0

    if opt.buildtype:
        buildtype = opt.buildtype
    elif xml.has( "project/buildtype" ):
        buildtype = xml.text( "/project/buildtype" )
    else:
        buildtype = "nodefaults"

    defs = ElbeDefaults( buildtype )

    chroot = os.path.join(opt.target, "chroot")
    os.system( 'mkdir -p "%s"' % chroot )

    outf = asccidoclog(opt.output)

    if opt.name:
        outf.h1( "ELBE Report for Project "+opt.name )
    else:
        outf.h1( "ELBE Report" )

    outf.printo( "report timestamp: "+datetime.datetime.now().strftime("%Y%m%d-%H%M%S") )

    suite = prj.text("suite")
    target_arch = prj.text("buildimage/arch", default=defs, key="arch")

    slist = ""
    mirror = "Error"
    if prj.has("mirror/primary_host"):
        mirror = "%s://%s/%s" % ( prj.text("mirror/primary_proto"), prj.text("mirror/primary_host"), prj.text("mirror/primary_path") )
        slist += "deb %s %s main\n" % (mirror, suite)
        slist += "deb-src %s %s main\n" % (mirror, suite)

    if prj.has("mirror/cdrom"):
        cdrompath = os.path.join( opt.target, "cdrom" )
        mirror = "file://%s/debian" % cdrompath
        os.system( 'mkdir -p "%s"' % cdrompath )
        os.system( 'mount -o loop "%s" "%s"' % (prj.text("mirror/cdrom"), cdrompath ) )

        slist += "deb copy:///mnt %s main\n" % (suite)
        #slist += "deb-src file:///mnt %s main\n" % (suite)

    if opt.proxy:
        os.environ["http_proxy"] = opt.proxy
    elif prj.has("mirror/primary_proxy"):
        os.environ["http_proxy"] = prj.text("mirror/primary_proxy")

    os.environ["LANG"] = "C"
    os.environ["LANGUAGE"] = "C"
    os.environ["LC_ALL"] = "C"
    os.environ["DEBIAN_FRONTEND"]="noninteractive"
    os.environ["DEBONF_NONINTERACTIVE_SEEN"]="true"

    try:
        if prj.node("mirror/url-list"):
            for n in prj.node("mirror/url-list"):
                if n.has("binary"):
                  tmp = n.text("binary").replace("LOCALMACHINE", "localhost")
                  slist += "deb %s\n" % tmp.strip()
                if n.has("source"):
                  tmp = n.text("source").replace("LOCALMACHINE", "localhost")
                  slist += "deb-src %s\n" % tmp.strip()

        serial_con, serial_baud = tgt.text( "console" ).split(',')

        if not opt.skip_debootstrap:
            debootstrap( outf, chroot, mirror, suite, target_arch, defs )
        seed_files( outf, chroot, slist, xml, args[0], opt, defs )

    finally:
        if prj.has("mirror/cdrom"):
            os.system( 'umount "%s"' % cdrompath )

    mount_stuff( outf, chroot )
    if prj.has("mirror/cdrom"):
        os.system( 'mount -o loop "%s" "%s"' % (prj.text("mirror/cdrom"), os.path.join(chroot, "mnt")) )

    pkglist = ["parted", "mtd-utils", "dpkg-dev", "dosfstools", "apt-rdepends",
               "python-apt", "rsync", "genisoimage", "reprepro", "python-parted"]

    try:
        do_chroot( outf, chroot, "apt-get update" )
        do_chroot( outf, chroot, """/bin/sh -c 'debconf-set-selections < /opt/elbe/custom-preseed.cfg'""" )
        if not opt.skip_debootstrap:
            do_chroot( outf, chroot, "apt-get install -y --force-yes " + string.join( pkglist ) )
        do_chroot( outf, chroot, "python /opt/elbe/adjustpkgs.py -o /opt/elbe/bla.log /opt/elbe/source.xml" )
        do_chroot( outf, chroot, """/bin/sh -c 'echo "%s\\n%s\\n" | passwd'""" % (tgt.text("passwd"), tgt.text("passwd")) )
        do_chroot( outf, chroot, """/bin/sh -c 'echo "127.0.0.1 %s %s.%s" >> /etc/hosts'""" % (tgt.text("hostname"), tgt.text("hostname"), tgt.text("domain")) )
        do_chroot( outf, chroot, """/bin/sh -c 'echo "%s" > /etc/hostname'""" % tgt.text("hostname") )
        do_chroot( outf, chroot, """/bin/sh -c 'echo "%s.%s" > /etc/mailname'""" % (tgt.text("hostname"), tgt.text("domain")) )
        do_chroot( outf, chroot, """/bin/sh -c 'echo "T0:23:respawn:/sbin/getty -L %s %s vt100" >> /etc/inittab'""" % (serial_con, serial_baud) )
        do_chroot( outf, chroot, "rm /usr/sbin/policy-rc.d" )
        do_chroot( outf, chroot, "/opt/elbe/create-target-rfs.sh" )
        if not opt.skip_cdrom:
            do_chroot( outf, chroot, "/opt/elbe/mkcdrom.sh" )

    finally:
        if prj.has("mirror/cdrom"):
            os.system( 'umount "%s"' % os.path.join(chroot, "mnt") )
        umount_stuff( outf, chroot )

    extract = open( os.path.join(chroot, "opt/elbe/files-to-extract"), "r" )
    for fname in extract.readlines():
        outf.do_command( 'cp "%s" "%s"' % (chroot+fname.strip(), opt.target) ) 
    extract.close()