3 # Common functions for build scripts used by various packages
4 # incorporated (e.g., build, myplc, myplc-devel, vserver-reference)
6 # Marc E. Fiuczynski <mef@cs.princeton.edu>
7 # Copyright (C) 2007 The Trustees of Princeton University
12 function pl_getDefaultDistro() {
13 # FC4 is currently the default release
18 function pl_getDefaultRelease() {
19 # FC4 is currently the default release
24 function pl_getDistro() {
25 defaultDistro=$(pl_getDefaultDistro)
26 if [ -f "/etc/redhat-release" ] ; then
27 distro=$(awk ' { print $1 } ' /etc/redhat-release)
35 function pl_getRelease() {
36 defaultRelease=$(pl_getDefaultRelease)
37 if [ -f "/etc/redhat-release" ] ; then
38 release=$(awk ' { if ($1=="Fedora" && $2=="Core") print $4 ; if (($1=="Fedora" && $2!="Core")||$1=="CentOS") print $3 } ' /etc/redhat-release)
39 [ $release -lt $defaultRelease ] && release=$defaultRelease
41 release=$defaultRelease
47 # vserver expects something like fc4 or f7
48 # for fedora and centos only for now
49 function pl_getReleaseName () {
54 if [ "$release" -le 6 ] ; then
55 releasename=fc$release
60 if [ "$release" = "4.5" ] ; then
61 # centos 4.5 is just centos4 + enhancements
64 releasename=centos$release
67 releasename="unknown-name-for-${pl_DISTRO}-please-edit-build.common"
68 echo 1>&2 "build.common: WARNING - releasename not set for distro=$pl_DISTRO"
76 # figure out which redhat distro we are using (fedora, centos, redhat)
77 pl_DISTRO=$(pl_getDistro)
79 # select basearch of the host devel environment
80 pl_DISTRO_ARCH=$(uname -i)
82 # let mkfedora select one of its mirrors
85 # the release number (plain number)
86 pl_DISTRO_RELEASE=$(pl_getRelease)
88 # the release name - for vserver build - like fc4, f8 or centos4
89 pl_DISTRO_NAME=$(pl_getReleaseName)
91 # get path to appropriate yumgroups.xml file
92 # Thierry: quick & dirty improvement
93 # this file is updated by the toplevel build, from groups/<pldistro>.xml
94 pl_DISTRO_YUMGROUPS="../../../RPMS/yumgroups.xml"
96 function pl_process_fedora_options () {
99 while getopts "l:r:a:h" opt ; do
102 pl_DISTRO_URL=$OPTARG
103 let shiftcount=$shiftcount+2
106 pl_DISTRO_RELEASE=$OPTARG
107 let shiftcount=$shiftcount+2
110 pl_DISTRO_ARCH=$OPTARG
111 let shiftcount=$shiftcount+2
114 echo "Usage: $0 [OPTION]..."
115 echo " -l url distro mirror location (default: $pl_DISTRO_URL)"
116 echo " -r release distro release number (default: $pl_DISTRO_RELEASE)"
117 echo " -a arch distro architecture (default: $pl_DISTRO_ARCH)"
118 echo "where distro can be either fedora, centos, or redhat"
119 echo " -h This message"
127 function pl_makedevs() {
129 # Clean ${vroot}/dev, but only when ${vroot}!=""
130 [ -n $vroot ] && rm -rf $vroot/dev
133 mknod -m 666 $vroot/dev/null c 1 3
134 mknod -m 666 $vroot/dev/zero c 1 5
135 mknod -m 666 $vroot/dev/full c 1 7
136 mknod -m 644 $vroot/dev/random c 1 8
137 mknod -m 644 $vroot/dev/urandom c 1 9
138 mknod -m 666 $vroot/dev/tty c 5 0
139 mknod -m 666 $vroot/dev/ptmx c 5 2
140 # For bash command substitution
141 ln -nsf ../proc/self/fd $vroot/dev/fd
143 # For df and linuxconf
144 touch $vroot/dev/hdv1
147 mkdir -p $vroot/dev/pts
149 # (Might have to remove the following for vserver-reference.)
152 mkdir -p $vroot/dev/shm
155 mkdir -p $vroot/dev/net
156 mknod -m 600 $vroot/dev/net/tun c 10 200
158 # For mkinitrd (in case a kernel is being installed)
159 # As well for loop back mounting within a vserver.
160 for i in $(seq 0 255) ; do
161 mknod -m 640 $vroot/dev/loop$i b 7 $i
165 function pl_mkfedora() {
172 [ -n "$pl_DISTRO_URL" ] && options="$options -l $pl_DISTRO_URL"
173 [ -n "$pl_DISTRO_ARCH" ] && options="$options -a $pl_DISTRO_ARCH"
174 [ -n "$pl_DISTRO_RELEASE" ] && options="$options -r $pl_DISTRO_RELEASE"
175 # echo "mkfedora -v $options $root"
176 eval mkfedora -v $options $root
179 function pl_setup_chroot() {
184 pl_mkfedora $root $options
186 # Disable all services in reference image
187 chroot $root sh -c "/sbin/chkconfig --list | awk '{ print \$1 }' | xargs -i /sbin/chkconfig {} off"
189 # FC2 minilogd starts up during shutdown and makes unmounting
190 # impossible. Just get rid of it.
191 rm -f $root/sbin/minilogd
192 ln -nsf /bin/true $root/sbin/minilogd
194 # This tells the Boot Manager that it is okay to update
195 # /etc/resolv.conf and /etc/hosts whenever the network configuration
196 # changes. Users are free to delete this file.
197 touch $vroot/etc/AUTO_UPDATE_NET_FILES
200 # Move specified directories out of a src tree into a dst tree, and
201 # then for each moved directory create a symlink in src to dst.
202 function pl_move_dirs() {
209 for datadir in "$@" ; do
210 mkdir -p ${data}${datadir}
211 if [ -d ${root}/${datadir} -a ! -h ${root}/${datadir} ] ; then
212 (cd ${root} && find ./${datadir} | cpio -p -d -u ../${data}/)
214 rm -rf ${root}/${datadir}
215 mkdir -p $(dirname ${root}/${datadir})
216 ln -nsf /${store}/${datadir} ${root}/${datadir}
220 # Construct an image file from given some directory
221 # XXX in the future maybe use livecdtools?
222 function pl_make_image() {
227 # Leave about 100 MB free space and allow for about 20% inode overhead
228 bytes=$((($(du -sb $root | cut -f1) + $extraspace) * 120 / 100))
230 blocks=$(($bytes / $bs))
231 dd bs=$bs count=$blocks if=/dev/zero of=$image
232 mkfs.ext3 -b $bs -j -F $image
234 # Temporarily mount it
235 tmp=$(mktemp -d tmp.XXXXXX)
236 mount -o loop $image $tmp
237 trap "umount $tmp; rmdir $tmp" ERR INT
240 (cd $root && tar cpf - .) | (cd $tmp && tar xpf -)
248 # Fix permissions on tmp directories
249 function pl_fixtmp_permissions() {
251 chmod 1777 $root/tmp $root/usr/tmp $root/var/tmp
254 function pl_fixdirs() {
257 for datadir in datadirs ; do
258 if [ -h ${root}/${datadir} ] ; then
259 rm -f ${root}/${datadir}
260 mkdir -p ${root}/${datadir}
265 ########## .pkgs format
266 # comments start with a # - this is needed only if you use a keyword in a comment
267 # for a given keyword like 'package' :
268 # we support fcdistro-dependant format, for tokens (pkgname) without whitespace
270 # package: pkg1 .. pkgn
271 # package+f8: pkg1 .. pkgn
272 # package-f8: pkg1 .. pkgn
274 function pl_parsePkgs () {
278 # remaining arguments are paths to the pkgs files
280 # grab regular descriptions
281 all=$(grep -v '^#' "$@" | grep --regexp="^${keyword}:" | sed -e "s,${keyword}:,,")
283 add=$(grep -v '^#' "$@" | grep --regexp="^${keyword}+${fcdistro}:" | sed -e "s,${keyword}\+${fcdistro}:,,")
285 sub=$(grep -v '^#' "$@" | grep --regexp="^${keyword}\-${fcdistro}:" | sed -e "s,${keyword}\-${fcdistro}:,,")
287 for i in $all $add; do
288 for exclude in $sub; do
289 [ "$i" = "$exclude" ] && continue 2
296 function pl_getPackages() { fcdistro=$1; shift ; pl_parsePkgs package $fcdistro "$@" ; }
297 function pl_getGroups() { fcdistro=$1; shift ; pl_parsePkgs group $fcdistro "$@" ; }
298 ### # add -p before each package for mkfedora
299 ### function pl_getPackagesOptions2 () { pl_getPackages2 "$@" | awk '{for (i=1;i<=NF;i++) {print "-p " $i}}' ; }
300 ### # add -g before each group for mkfedora
301 ### function pl_getGroupsOptions2 () { pl_getGroups2 "$@" | awk '{for (i=1;i<=NF;i++) {print "-g " $i}}' ; }
303 # locates a pldistro-dependant file
304 # tries first in build/<pldistro>/, then in build/planetlab/
305 function pl_locateDistroFile () {
312 paths="$builddir/config.$pldistro/$pkgsfile $builddir/config.planetlab/$pkgsfile"
313 for path in $paths; do
314 if [ -f $path/$pkgsfile ] ; then
319 if [ -z "$pkgspath" ] ; then
320 echo 1>&2 "pl_locateDistroFile: cannot locate $pkgsfile in $builddir"
321 echo "not-found-by-pl_locateDistroFile"
324 echo 1>&2 "pl_locateDistroFile: using $pkgspath"