slitaz-modular view mkiso.sh @ rev 28

Removed iso path in md5sum for iso. Added a BACKUP_ALL option. I can now add soft links to iso so it will be followed and added to iso.
author Christopher Rogers <slaxemulator@gmail.com>
date Fri Feb 25 12:01:24 2011 +0000 (2011-02-25)
parents 2cb69be2a51a
children 72d2798193ef
line source
1 #!/bin/bash
3 . /etc/slitaz/slitaz.conf
5 QUIET="y"
6 FORCE="y"
7 export LABEL="slitaz_$(date +%Y%m)"
8 PUBLISHER="Slitaz"
9 APPLICATION="Slitaz"
10 CREATE_DEFAULT="n"
11 BASEDIR="$(pwd)"
12 PROFILE="$BASEDIR/$1"
13 ver=""
14 CDNAME="slitaz"
15 RMSTUFF=n
16 MVSTUFF=n
17 UNGZIP=n
18 EXT="xz"
19 COMPRESSION="xz -Xbcj x86"
20 MKOPTION="-b 256k"
21 MODULES=""
22 WORKING="$PROFILE/working"
23 INITRAMFS="$WORKING/initramfs"
24 UNION="$WORKING/union"
25 LOG="$WORKING/log"
26 ISODIR="$WORKING/iso"
27 IMGNAME="$PROFILE/$CDNAME-$1-$(date +%F).iso"
28 IMGMD5NAME="$IMGNAME.md5"
29 LASTBR="$INITRAMFS"
30 SGNFILE="$ISODIR/$CDNAME/livecd.sgn"
31 MODULES_DIR="$WORKING/modules"
32 HG_DIR="$WORKING/hg"
33 HG_URL="http://hg.slitaz.org"
34 HG_PATH="home/slitaz/repos"
35 COPY_HG="no"
36 UPDATE_HG="no"
37 BACKUP_SOURCES="no"
38 BACKUP_PACKAGES="no"
39 BACKUP_ALL="no"
40 CLEAN_MODULES_DIR="no"
41 CLEAN_INITRAMFS="no"
42 PACKAGES_REPOSITORY="$LOCAL_REPOSITORY/packages"
43 SOURCES_REPOSITORY="$LOCAL_REPOSITORY/src"
44 HG_LIST="flavors flavors-stable slitaz-base-files slitaz-boot-scripts slitaz-configs slitaz-dev-tools slitaz-doc slitaz-forge slitaz-pizza slitaz-tools tazlito tazpkg tazusb tazwok website wok wok-stable wok-tiny wok-undigest"
46 error () { echo -e "\033[1;31;40m!!! \033[1;37;40m$@\033[1;0m"; }
47 warn () { echo -e "\033[1;33;40m*** \033[1;37;40m$@\033[1;0m"; }
48 info () { echo -e "\033[1;32;40m>>> \033[1;37;40m$@\033[1;0m"; }
50 # do UID checking here so someone can at least get usage instructions
51 #if [ "$EUID" != "0" ]; then
52 # error "error: This script must be run as root."
53 # exit 1
54 #fi
55 if [ ! -d $PROFILE -o "$1" = "" ]; then
56 echo "$0 profile-name"
57 echo "ex $0 core"
58 exit 1
59 fi
61 ROOT_MOD="$(ls -1 ${PROFILE}/list | head -1)"
62 INST_ROOT="${MODULES_DIR}/$(basename ${ROOT_MOD} .list)"
64 if [ -f ${PROFILE}/config ]; then
65 source ${PROFILE}/config
66 fi
68 _overlay()
69 {
70 if [ -d ${MODULES_DIR}/overlay ]; then
71 rm -rf ${MODULES_DIR}/overlay
72 cp -rf ${PROFILE}/overlay ${MODULES_DIR}
73 else
74 cp -rf ${PROFILE}/overlay ${MODULES_DIR}
75 fi
77 if [ "${QUIET}" = "y" ]; then
78 mksquashfs "${MODULES_DIR}/overlay" "${ISODIR}/${CDNAME}/modules/zzz.overlay.${EXT}" -comp ${COMPRESSION} -noappend ${MKOPTION} >/dev/null
79 else
80 mksquashfs "${MODULES_DIR}/overlay" "${ISODIR}/${CDNAME}/modules/zzz.overlay.${EXT}" -comp ${COMPRESSION} -noappend ${MKOPTION}
81 fi
82 }
84 lzma_switches()
85 {
86 echo "-d$(echo 24) -mt$(grep ^processor < /proc/cpuinfo | wc -l)"
87 }
89 # Pack rootfs
90 pack_rootfs()
91 {
92 ( cd $1 ; find . -print | cpio -o -H newc ) | \
93 if [ -x /usr/bin/lzma ]; then
94 info "Generating lzma'ed initramfs... "
95 lzma e -si -so $(lzma_switches $1) > $2
96 else
97 info "Generating gziped initramfs... "
98 gzip -9 > $2
99 fi
100 echo 1 > /tmp/rootfs
101 }
103 download()
104 {
105 for file in $@; do
106 wget -q $file && break
107 done
108 }
110 initramfs () {
112 if [ ! -e "$BASEDIR/initramfs/initramfs.list" ]; then
113 error "error: $BASEDIR/initramfs/initramfs.list doesn't exist, aborting."
114 exit 1
115 fi
117 if [ "$CLEAN_INITRAMFS" = "yes" ]; then
118 if [ -d ${INITRAMFS} ]; then
119 rm -Rf ${INITRAMFS}
120 fi
121 fi
123 if [ ! -d ${INITRAMFS} ]; then
124 mkdir -p $INITRAMFS
125 fi
127 info "Making bootable image"
128 cat "$BASEDIR/initramfs/initramfs.list" | grep -v "^#" | while read pkgname; do
129 if [ ! -f ${INITRAMFS}/var/lib/tazpkg/installed/${pkgname}/files.list ]; then
130 tazpkg get-install $pkgname --root=$INITRAMFS | tee -a $LOG/initramfs.log
131 sleep 1
132 else
133 info "${pkgname} installed"
134 fi
135 done
137 if [ ! -d $ISODIR/boot ]; then
138 mkdir -p $ISODIR/boot
139 fi
141 #if [ ! -f $ISODIR/boot/bzImage ]; then
142 cp -f $INITRAMFS/boot/vmlinuz* $ISODIR/boot/bzImage
143 rm -f $INITRAMFS/boot/vmlinuz*
144 #fi
146 if [ -d $BASEDIR/initramfs ]; then
147 cp -af $BASEDIR/initramfs/* $INITRAMFS
148 fi
149 }
151 copy_hg() {
152 if [ ! -d ${HG_DIR}/${1}/${HG_PATH}/${1} ]; then
153 info "Cloning $1 repo ..."
154 hg clone $HG_URL/${1} ${HG_DIR}/${1}/${HG_PATH}/${1}
155 if [ $(grep -l "^HG_URL=$HG_URL" $PROFILE/config) ]; then
156 if [ ! $(grep -l "$HG_URL" ${HG_DIR}/${1}/${HG_PATH}/${1}/.hg/hgrc) ]; then
157 echo "mirror = $HG_URL/$1" >> ${HG_DIR}/${1}/${HG_PATH}/${1}/.hg/hgrc
158 fi
159 fi
160 elif [ -d ${HG_DIR}/${1}/${HG_PATH}/${1} -a ${UPDATE_HG} = "yes" ]; then
161 info "Updating $1 repo ..."
162 cd ${HG_DIR}/${1}/${HG_PATH}/${1}
163 hg pull $HG_URL/${1} -u
164 if [ $(grep -l "^HG_URL=$HG_URL" $PROFILE/config) ]; then
165 if [ ! $(grep -l "$HG_URL" ${HG_DIR}/${1}/${HG_PATH}/${1}/.hg/hgrc) ]; then
166 echo "mirror = $HG_URL/$1" >> ${HG_DIR}/${1}/${HG_PATH}/${1}/.hg/hgrc
167 fi
168 fi
169 cd $PROFILE
170 fi
171 }
173 squashfs_hg() {
174 if [ ! -d "$ISODIR/$CDNAME/modules/hg" ]; then
175 mkdir -p "$ISODIR/$CDNAME/modules/hg"
176 fi
177 if [ -d ${HG_DIR}/${1}/ ]; then
178 _mksquash ${HG_DIR}/${1} "$ISODIR/$CDNAME/modules/hg/" /${HG_PATH}/${1}
179 fi
180 }
182 slitaz_union () {
184 if [ -d ${MODULES_DIR}/${mod}/var/lib/tazpkg/installed ]; then
185 echo "${mod} module exist. Moving on."
186 elif [ ! -d ${MODULES_DIR}/${mod}/var/lib/tazpkg/installed ]; then
187 if [ -f "$PROFILE/list/${mod}.list" ]; then
188 cat "$PROFILE/list/${mod}.list" | grep -v "^#" | while read pkgname; do
189 if [ ! -f ${UNION}/var/lib/tazpkg/installed/${pkgname}/files.list ]; then
190 tazpkg get-install $pkgname --root=${UNION} | tee -a ${LOG}/${mod}-current.log
191 sleep 1
192 else
193 info "${pkgname} installed"
194 fi
195 done
196 fi
198 if [ -f $PROFILE/list/${mod}.removelist ]; then
199 cat "$PROFILE/list/${mod}.removelist" | grep -v "^#" | while read pkgname; do
200 if [ -f ${UNION}/var/lib/tazpkg/installed/${pkgname}/files.list ]; then
201 echo "y" | tazpkg remove ${pkgname} --root=${UNION} | tee -a ${LOG}/${mod}-current.log
202 sleep 1
203 else
204 info "${pkgname} removed"
205 fi
206 done
207 fi
208 fi
209 }
211 union () {
212 mkdir -p $WORKING
213 mkdir -p $UNION
214 mkdir -p $LOG
215 mkdir -p $ISODIR/${CDNAME}/base
216 mkdir -p $ISODIR/${CDNAME}/modules
217 mkdir -p $ISODIR/${CDNAME}/optional
218 mkdir -p $ISODIR/${CDNAME}/rootcopy
219 mkdir -p $ISODIR/${CDNAME}/tmp
220 mkdir -p $LASTBR
221 touch $SGNFILE
223 modprobe aufs
224 if [ $? -ne 0 ]; then
225 error "Error loading Union filesystem module. (aufs)"
226 exit 1
227 fi
229 # $INITRAMFS is now $LASTBR
230 # This will be copyed to /mnt/memory/changes on boot
231 initramfs
233 mount -t aufs -o br:${LASTBR}=rw aufs ${UNION}
234 if [ $? -ne 0 ]; then
235 error "Error mounting $union."
236 exit 1
237 fi
239 info "====> Installing packages to '$UNION'"
240 for mod in $MODULES; do
242 if [ "$CLEAN_MODULES_DIR" = "yes" ]; then
243 if [ -d $MODULES_DIR/$mod ]; then
244 rm -Rf $MODULES_DIR/$mod
245 fi
246 fi
248 if [ ! -d $MODULES_DIR/$mod ]; then
249 mkdir -p $MODULES_DIR/$mod
250 fi
251 info "Adding $MODULES_DIR/$mod as top branch of union."
252 mount -t aufs -o remount,add:0:${MODULES_DIR}/${mod}=rw aufs $UNION
253 info "Adding $LASTBR as lower branch of union."
254 mount -t aufs -o remount,mod:${LASTBR}=rr+wh aufs $UNION
255 LASTBR="$MODULES_DIR/${mod}"
257 slitaz_union
258 done
260 if [ -d ${UNION}/${INSTALLED} ]; then
261 find ${UNION}/${INSTALLED} -type d | sort > $ISODIR/packages-installed.list
262 sed -i "s|${UNION}/${INSTALLED}/||g" $ISODIR/packages-installed.list
263 fi
265 info "Unmounting union"
266 umount -l "${UNION}"
268 info "Removing unionfs .wh. files."
269 find ${MODULES_DIR} -type f -name ".wh.*" -exec rm {} \;
270 find ${MODULES_DIR} -type d -name ".wh.*" -exec rm -rf {} \;
271 }
273 backup_pkg() {
274 if [ "${BACKUP_PACKAGES}" = "yes" ]; then
275 [ -d $ISODIR/boot/packages ] && rm -r $ISODIR/boot/packages
276 mkdir -p $ISODIR/boot/packages
277 info "Making cooking list based installed packages in union"
278 tazwok gen-cooklist $ISODIR/packages-installed.list > $ISODIR/cookorder.list
279 #[ -f $INCOMING_REPOSITORY/wok-wanted.txt ] || tazwok gen-wok-db
281 info "Linking all installed packages to $ISODIR/boot/packages"
282 cat $ISODIR/packages-installed.list | while read PACKAGE; do
283 VERSION=$(grep ^VERSION= ${HG_DIR}/wok/${PACKAGE}/receipt | cut -d "=" -f2 | sed -e 's/"//g')
284 CACHE_PACKAGE=$(find $CACHE_DIR/$(cat /etc/slitaz-release)/packages -type f -name "$PACKAGE-$VERSION.tazpkg")
285 if [ -f $CACHE_PACKAGE ]; then
286 info "Copying $CACHE_PACKAGE to $ISODIR/boot/packages"
287 ln -sf $CACHE_PACKAGE $ISODIR/boot/packages
288 #elif [ ! -f $CACHE_PACKAGE ]; then
289 # info "$CACHE_PACKAGE doesn't exist. Downloading it."
290 # cd $CACHE_DIR/$(cat /etc/slitaz-release)/packgages
291 # tazpkg get $PACKAGE
292 # cd $WORKING
293 # if [ -f $CACHE_PACKAGE ]; then
294 # ln -sf $CACHE_PACKAGE $ISODIR/packages
295 # fi
296 fi
297 done
299 cat $ISODIR/cookorder.list | while read PACKAGE; do
300 rwanted=$(grep $'\t'$PACKAGE$ $INCOMING_REPOSITORY/wok-wanted.txt | cut -f 1)
301 echo $rwanted | while read WANTED_PKG; do
302 VERSION=$(grep ^VERSION= ${HG_DIR}/wok/${WANTED_PKG}/receipt | cut -d "=" -f2 | sed -e 's/"//g')
303 CACHE_PACKAGE=$(find $CACHE_DIR/$(cat /etc/slitaz-release)/packages -type f -name "$WANTED_PKG-$VERSION.tazpkg")
304 if [ -f $CACHE_PACKAGE ]; then
305 info "Copying $CACHE_PACKAGE to $ISODIR/boot/packages"
306 ln -sf $CACHE_PACKAGE $ISODIR/boot/packages
307 #elif [ ! -f $CACHE_PACKAGE ]; then
308 # info "$CACHE_PACKAGE doesn't exist. Downloading it."
309 # cd $CACHE_DIR/$(cat /etc/slitaz-release)/packgages &>/dev/null
310 # tazpkg get $PACKAGE
311 # cd $WORKING
312 # if [ -f $CACHE_PACKAGE ]; then
313 # ln -sf $CACHE_PACKAGE $ISODIR/packages
314 # fi
315 fi
316 done
317 done
319 [ -d $ISODIR/boot/packages ] && tazwok gen-list $ISODIR/boot/packages
320 fi
322 }
324 backup_src() {
326 if [ "${BACKUP_PACKAGES}" = "yes" -a "${BACKUP_SOURCES}" = "yes" ]; then
327 [ -d $SOURCES_REPOSITORY ] || mkdir -p $SOURCES_REPOSITORY
328 [ -d $ISODIR/boot/src ] || mkdir -p $ISODIR/boot/src
330 cat $ISODIR/cookorder.list | while read PACKAGE; do
331 WGET_URL=$(grep ^WGET_URL= ${HG_DIR}/wok/${PACKAGE}/receipt | cut -d "=" -f2 | sed -e 's/"//g' | head -n 1)
332 VERSION=$(grep ^VERSION= ${HG_DIR}/wok/${PACKAGE}/receipt | cut -d "=" -f2 | sed -e 's/"//g' | head -n 1)
333 TARBALL=$(grep ^TARBALL= ${HG_DIR}/wok/${PACKAGE}/receipt | cut -d "=" -f2 | sed -e 's/"//g' | head -n 1)
335 if [ ! -f "$SOURCES_REPOSITORY/$TARBALL" ] && \
336 [ ! -f "$SOURCES_REPOSITORY/${SOURCE:-$PACKAGE}-$VERSION.tar.lzma" ]; then
337 tazwok get-src $PACKAGE --nounpack
338 if [ -f "$SOURCES_REPOSITORY/$TARBALL" ]; then
339 ln -sf $SOURCES_REPOSITORY/$TARBALL $ISODIR/sources/$TARBALL
340 elif [ -f "$SOURCES_REPOSITORY/${SOURCE:-$PACKAGE}-$VERSION.tar.lzma" ]; then
341 ln -sf $SOURCES_REPOSITORY/${SOURCE:-$PACKAGE}-$VERSION.tar.lzma $ISODIR/sources/${SOURCE:-$PACKAGE}-$VERSION.tar.lzma
342 fi
343 else
344 [ -f "$SOURCES_REPOSITORY/$TARBALL" ] && ln -sf $SOURCES_REPOSITORY/$TARBALL $ISODIR/sources/$TARBALL
345 fi
346 done
347 cd $ISODIR/boot/src
348 info "Make md5sum file for sources"
349 find * -not -type d | grep -v md5sum | xargs md5sum > md5sum
350 cd $WORKING
351 fi
353 }
355 backup_all()
356 {
357 if [ "${BACKUP_ALL}" = "yes" ]; then
358 [ -d $ISODIR/boot/src ] || ln -sf $SOURCES_REPOSITORY $ISODIR/boot/src
359 [ -d $ISODIR/boot/packages ] || ln -sf $PACKAGES_REPOSITORY $ISODIR/boot/packages
360 fi
361 }
363 # _mksquash dirname
364 _mksquash () {
365 if [ ! -d "$1" ]; then
366 error "Error: '$1' is not a directory"
367 return 1
368 fi
370 if [ ! -d "$2" ]; then
371 error "Error: '$2' is not a directory"
372 return 1
373 fi
375 if [ ! -d "${1}${3}" ]; then
376 error "Error: '${1}${3}' is not a directory"
377 return 1
378 fi
380 time_dir="${3}"
381 sqimg="${2}/$(basename ${1}).${EXT}"
382 info "====> Generating SquashFS image for '${1}'"
383 if [ -e "${sqimg}" ]; then
384 dirhaschanged=$(find ${1}${time_dir} -newer ${sqimg})
385 if [ "${dirhaschanged}" != "" ]; then
386 info "SquashFS image '${sqimg}' is not up to date, rebuilding..."
387 rm "${sqimg}"
388 else
389 info "SquashFS image '${sqimg}' is up to date, skipping."
390 return
391 fi
392 fi
394 info "Creating SquashFS image. This may take some time..."
395 start=$(date +%s)
396 if [ "${QUIET}" = "y" ]; then
397 mksquashfs "${1}" "${sqimg}" -noappend ${MKOPTION} -comp ${COMPRESSION} >/dev/null
398 else
399 mksquashfs "${1}" "${sqimg}" -noappend ${MKOPTION} -comp ${COMPRESSION}
400 fi
401 minutes=$(echo $start $(date +%s) | awk '{ printf "%0.2f",($2-$1)/60 }')
402 info "Image creation done in $minutes minutes."
403 }
405 imgcommon () {
406 if [ "${MODULES}" != "" ]; then
407 for MOD in ${MODULES}; do
408 if [ -d "${MODULES_DIR}/${MOD}" ]; then
409 _mksquash "${MODULES_DIR}/${MOD}" "$ISODIR/$CDNAME/base" /var/lib/tazpkg/installed
410 fi
411 done
412 fi
414 if [ "$HG_LIST" != "" ]; then
415 if [ "$COPY_HG" = "yes" ]; then
416 for hg in $HG_LIST; do
417 copy_hg $hg
418 squashfs_hg $hg
419 done
420 fi
421 fi
423 if [ "${HG_LIST}" != "" ]; then
424 for hg in ${HG_LIST}; do
425 if [ -d "${MODULES_DIR}/${hg}" ]; then
426 squashfs_hg $hg
427 fi
428 done
429 fi
430 if [ -d ${HG_DIR}/wok ]; then
431 backup_pkg
432 backup_src
433 fi
435 backup_all
437 info "====> Making bootable image"
439 # Sanity checks
440 if [ ! -d "${ISODIR}" ]; then
441 error "Error: '${ISODIR}' doesn't exist. What did you do?!"
442 exit 1
443 fi
445 if [ ! -f "${SGNFILE}" ]; then
446 error "Error: the ${SGNFILE} file doesn't exist. This image won't do anything"
447 error " Protecting you from yourself and erroring out here..."
448 exit 1
449 fi
452 if [ -e "${IMGNAME}" ]; then
453 if [ "${FORCE}" = "y" ]; then
454 info "Removing existing bootable image..."
455 rm -rf "${IMGNAME}"
456 else
457 error "Error: Image '${IMGNAME}' already exists, aborting."
458 exit 1
459 fi
460 fi
462 }
464 make_iso () {
465 imgcommon
467 info "Creating rootfs.gz"
468 pack_rootfs $INITRAMFS $ISODIR/boot/rootfs.gz
470 if [ -d $PROFILE/rootcd ]; then
471 cp -af $PROFILE/rootcd/* $ISODIR/
472 fi
474 info "Copying isolinux files..."
475 if [ -d $INITRAMFS/boot/isolinux ]; then
476 cp -a $INITRAMFS/boot/isolinux $ISODIR/boot
477 fi
479 if [ -d ${PROFILE}/overlay ]; then
480 _overlay
481 fi
483 info "Creating ISO image..."
484 genisoimage -R -J -f -o $IMGNAME -b boot/isolinux/isolinux.bin \
485 -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 \
486 -V "SliTaz" -input-charset iso8859-1 -boot-info-table $ISODIR
487 if [ -x /usr/bin/isohybrid ]; then
488 info "Creating hybrid ISO..."
489 isohybrid "${IMGNAME}"
490 fi
491 md5sum "$IMGNAME" > $IMGMD5NAME
492 sed -i "s|$PROFILE/||g" $IMGMD5NAME
493 }
495 if [ "$MODULES" != "" ]; then
496 union
497 else
498 error "MODULES was empty. exiting."
499 exit 1
500 fi
502 make_iso