Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jun 2007 16:39:45 GMT
From:      Ivan Voras <ivoras@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 122287 for review
Message-ID:  <200706251639.l5PGdjE6066823@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=122287

Change 122287 by ivoras@ivoras_finstall on 2007/06/25 16:39:37

	MakeImage can now embed 3rd party packages / ports in the LiveCD,
	chosen from those installed on the build machine.
	Among the minor changes, curses interface is now much improved and
	consistend across the script.

Affected files ...

.. //depot/projects/soc2007/ivoras_finstall/makeimage/makeimage.py#4 edit
.. //depot/projects/soc2007/ivoras_finstall/makeimage/pkglist#1 add
.. //depot/projects/soc2007/ivoras_finstall/makeimage/util.py#2 edit

Differences ...

==== //depot/projects/soc2007/ivoras_finstall/makeimage/makeimage.py#4 (text+ko) ====

@@ -25,7 +25,7 @@
 import os, os.path, sys
 from time import strftime
 from getopt import getopt, GetoptError
-from util import nukedir, execute, printmsg, cmdout, initutils
+from util import nukedir, execute, printmsg, cmdout, readline, initutils, getpkgdeps, getpkgfullname
 
 class MakeImageException(Exception):
 	pass
@@ -36,9 +36,27 @@
 if cmdout("which mkisofs").find("not found") != -1:
 	raise MakeImageException("This utility requires mkisofs(8) (install ports/sysutils/cdrtools)")
 
-def usage():
-	print "usage: %s -d WORKDIR [-s SRCDIR] [-k KERNEL] [-b] [-c] [-i ISOFILE]" % sys.argv[0]
-	sys.exit(1)
+def usage(exit=True):
+	print "usage: %s -d WORKDIR [-i ISOFILE] [-k KERNEL] [-p PKGLISTFILE] [-s SRCDIR] [-b] [-c] " % sys.argv[0]
+	print
+	print "Description:"
+	print "	-d WORKDIR	Base work directory to hold intermediate and final files"
+	print "			(requires ~800MB free). This is the only required"
+	print "			argument."
+	print "	-k KERNEL	FreeBSD kernel to package (default: GENERIC)"
+	print "	-i ISOFILE	ISO image to generate (default: WORKDIR/image.iso)"
+	print "	-p PKGLISTFILE	File containing list of packages to bundle with the"
+	print "			LiveCD system. All packages from the list must be"
+	print "			installed on the system doing the build."
+	print "	-s SRCDIR	Directory with FreeBSD source tree (default: /usr/src)"
+	print "	-b		Do buildworld / buildkernel before proceeding"
+	print "	-c		Assume installworld / installkernel phase has been"
+	print "			done in WORKDIR/livecd and proceed with configuration"
+	print "			and ISO image build"
+	if exit:
+		sys.exit(1)
+	else:
+		print
 
 WORKDIR = None		# Working directory. Will create DESTDIR inside it.
 DESTDIR = None		# The directory that will contain the root drive hierarchy
@@ -46,10 +64,11 @@
 KERNEL = "GENERIC"
 DoBuild = False
 DoMakeRoot = True	# Create / install livecd tree
-LABEL = "FreeBSD7"
+LABEL = "FreeBSD7"	# ISO9660 Volume label
+PKGLISTFILE = None
 ISO = None
 
-opts, args = getopt(sys.argv[1:], "d:s:i:bch")
+opts, args = getopt(sys.argv[1:], "d:s:i:p:bch")
 for o,a in opts:
 	if o == "-d":
 		WORKDIR = a
@@ -63,6 +82,8 @@
 			raise MakeImageException("Source directory not found: '%s'" % SRCDIR)
 	elif o == "-k":
 		KERNEL = a
+	elif o == "-p":
+		PKGLISTFILE = a
 	elif o == "-b":
 		DoBuild = True
 	elif o == "-c":
@@ -73,6 +94,7 @@
 		usage()
 
 if WORKDIR == None:
+	usage(False)
 	raise MakeImageException("Directory not specified (use '-d WORKDIR' argument)")
 if not os.path.exists(SRCDIR):
 	raise MakeImageException("Source directory not found: '%s'")
@@ -81,22 +103,21 @@
 
 DESTDIR = "%s/livecd" % WORKDIR
 
+initutils()
 if DoMakeRoot:
 	if os.path.exists(DESTDIR):
 		if not os.path.exists("%s/COPYRIGHT" % DESTDIR):
-			print "--> %s doesn't look like a FreeBSD root" % DESTDIR
-			resp = raw_input("Delete it anyway? (y/N) ").upper()
+			printmsg("%s doesn't look like a FreeBSD root" % DESTDIR)
+			resp = readline("Delete it anyway? (y/N)").upper()
 			if resp != "Y":
-				print "Canceling"
+				printmsg("Canceling")
 				sys.exit(1)
 			else:
-				print "Wiping out %s" % DESTDIR
+				printmsg("Wiping out %s" % DESTDIR)
 		nukedir(DESTDIR)
 
 	os.makedirs(DESTDIR)
 
-	initutils()
-
 	printmsg("Using '%s' as source directory" % SRCDIR)
 	printmsg("Using '%s' as working directory (root on '%s')" % (WORKDIR, DESTDIR))
 	printmsg("Using '%s' kernel" % KERNEL)
@@ -139,6 +160,38 @@
 f.write('syslogd_flags="-C"\n')
 f.close()
 
+if PKGLISTFILE != None:
+	# Install packages into the liveCD tree, using chroot
+	master_pkglist = []
+	f = file(PKGLISTFILE, "r")
+	for line in f.readlines():
+		line = line.strip()
+		if len(line) == 0:
+			continue
+		if line[0] == "#":
+			continue
+		master_pkglist.append(getpkgfullname(line))
+	dest_pkgs = {}
+	for pkg in master_pkglist:
+		dest_pkgs[pkg] = True
+		for p2 in getpkgdeps(pkg):
+			dest_pkgs[p2] = True
+	os.chdir("%s/tmp" % DESTDIR)
+	for pkg in dest_pkgs:
+		pkg_file = "%s.tbz" % pkg
+		execute("pkg_create -v -j -b %s %s" % (pkg, pkg_file))
+		dest_pkgs[pkg] = pkg_file
+	f = file("pkginst.sh", "w")
+	f.write("#!/bin/sh\ncd /tmp\npkg_delete -av\n")
+	for pkg in master_pkglist:
+		f.write("/usr/sbin/pkg_add -v %s\n" % dest_pkgs[pkg])
+	f.close()
+	execute("chroot %s /bin/sh /tmp/pkginst.sh" % DESTDIR)
+	for pkg in dest_pkgs:
+		os.unlink(dest_pkgs[pkg])
+	os.unlink("pkginst.sh")
+
+
 os.chdir(WORKDIR)
 if ISO == None:
 	ISO = "%s/image.iso" % WORKDIR

==== //depot/projects/soc2007/ivoras_finstall/makeimage/util.py#2 (text+ko) ====

@@ -54,12 +54,21 @@
 def printmsg(str):
 	global msgwin, cmdwin
 	if msgwin != None:
-		msgwin.addstr(" ### %s\n" % str)
+		msgwin.addstr("\n ### %s" % str)
 		msgwin.refresh()
 	else:
 		print " ### %s" % str
 
 
+def readline(prompt):
+	global msgwin
+	if msgwin != None:
+		msgwin.addstr("\n >>> %s : " % prompt)
+		return msgwin.getstr()
+	else:
+		return raw_input(" >>> %s : " % prompt)
+
+
 def execute(cmd):
 	global msgwin, cmdwin
 	printmsg("Executing: \"%s\"" % cmd)
@@ -88,3 +97,28 @@
 def cmdout(cmd):
 	return os.popen(cmd, "r").read()
 
+
+def getpkgdeps(pkg):
+	f = os.popen("pkg_info -r %s" % pkg, "r")
+	deps = []
+	for line in f.readlines():
+		line = line.strip()
+		if line.startswith("Dependency: "):
+			d, dep = line.split(": ", 1)
+			deps.append(dep)
+	f.close()
+	return deps
+
+
+def getpkgfullname(pkg):
+	"""Not a very intelligent implementation of "base package name" to
+	"fully qualified package name" translator. E.g. returns "python24-2.4.4"
+	when given "python24"
+	"""
+	f = os.popen("pkg_info", "r")
+	for line in f.readlines():
+		if line.startswith(pkg):
+			fullname, etc = line.split(" ", 1)
+			return fullname.strip()
+	return None
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200706251639.l5PGdjE6066823>