slitaz-modular view mkiso.sh @ rev 27

Updated core profile. Added local-mirror script. Local-mirror will allow one to use the hg repos on slitaz to make a local network of slitaz.org.
author Christopher Rogers <slaxemulator@gmail.com>
date Wed Feb 23 05:03:35 2011 +0000 (2011-02-23)
parents 8f8af6b88207
children 6273083365ce
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 CLEAN_MODULES_DIR="no"
40 CLEAN_INITRAMFS="no"
41 HG_LIST="flavors flavors-stable libtaz slitaz-base-files slitaz-boot-scripts slitaz-configs slitaz-doc slitaz-forge slitaz-pizza slitaz-tools tank tazchroot tazlito tazpkg tazusb tazwok website wok wok-stable wok-tiny wok-undigest"
43 error () { echo -e "\033[1;31;40m!!! \033[1;37;40m$@\033[1;0m"; }
44 warn () { echo -e "\033[1;33;40m*** \033[1;37;40m$@\033[1;0m"; }
45 info () { echo -e "\033[1;32;40m>>> \033[1;37;40m$@\033[1;0m"; }
47 # do UID checking here so someone can at least get usage instructions
48 #if [ "$EUID" != "0" ]; then
49 # error "error: This script must be run as root."
50 # exit 1
51 #fi
52 if [ ! -d $PROFILE -o "$1" = "" ]; then
53 echo "$0 profile-name"
54 echo "ex $0 core"
55 exit 1
56 fi
58 ROOT_MOD="$(ls -1 ${PROFILE}/list | head -1)"
59 INST_ROOT="${MODULES_DIR}/$(basename ${ROOT_MOD} .list)"
61 if [ -f ${PROFILE}/config ]; then
62 source ${PROFILE}/config
63 fi
65 _overlay()
66 {
67 if [ -d ${MODULES_DIR}/overlay ]; then
68 rm -rf ${MODULES_DIR}/overlay
69 cp -rf ${PROFILE}/overlay ${MODULES_DIR}
70 else
71 cp -rf ${PROFILE}/overlay ${MODULES_DIR}
72 fi
74 if [ "${QUIET}" = "y" ]; then
75 mksquashfs "${MODULES_DIR}/overlay" "${ISODIR}/${CDNAME}/modules/zzz.overlay.${EXT}" -comp ${COMPRESSION} -noappend ${MKOPTION} >/dev/null
76 else
77 mksquashfs "${MODULES_DIR}/overlay" "${ISODIR}/${CDNAME}/modules/zzz.overlay.${EXT}" -comp ${COMPRESSION} -noappend ${MKOPTION}
78 fi
79 }
81 lzma_switches()
82 {
83 echo "-d$(echo 24) -mt$(grep ^processor < /proc/cpuinfo | wc -l)"
84 }
86 # Pack rootfs
87 pack_rootfs()
88 {
89 ( cd $1 ; find . -print | cpio -o -H newc ) | \
90 if [ -x /usr/bin/lzma ]; then
91 info "Generating lzma'ed initramfs... "
92 lzma e -si -so $(lzma_switches $1) > $2
93 else
94 info "Generating gziped initramfs... "
95 gzip -9 > $2
96 fi
97 echo 1 > /tmp/rootfs
98 }
100 download()
101 {
102 for file in $@; do
103 wget -q $file && break
104 done
105 }
107 initramfs () {
109 if [ ! -e "$BASEDIR/initramfs/initramfs.list" ]; then
110 error "error: $BASEDIR/initramfs/initramfs.list doesn't exist, aborting."
111 exit 1
112 fi
114 if [ "$CLEAN_INITRAMFS" = "yes" ]; then
115 if [ -d ${INITRAMFS} ]; then
116 rm -Rf ${INITRAMFS}
117 fi
118 fi
120 if [ ! -d ${INITRAMFS} ]; then
121 mkdir -p $INITRAMFS
122 fi
124 info "Making bootable image"
125 cat "$BASEDIR/initramfs/initramfs.list" | grep -v "^#" | while read pkgname; do
126 if [ ! -f ${INITRAMFS}/var/lib/tazpkg/installed/${pkgname}/files.list ]; then
127 tazpkg get-install $pkgname --root=$INITRAMFS | tee -a $LOG/initramfs.log
128 sleep 1
129 else
130 info "${pkgname} installed"
131 fi
132 done
134 if [ ! -d $ISODIR/boot ]; then
135 mkdir -p $ISODIR/boot
136 fi
138 #if [ ! -f $ISODIR/boot/bzImage ]; then
139 cp -f $INITRAMFS/boot/vmlinuz* $ISODIR/boot/bzImage
140 rm -f $INITRAMFS/boot/vmlinuz*
141 #fi
143 if [ -d $BASEDIR/initramfs ]; then
144 cp -af $BASEDIR/initramfs/* $INITRAMFS
145 fi
146 }
148 copy_hg() {
149 if [ ! -d ${HG_DIR}/${1}/${HG_PATH}/${1} ]; then
150 info "Cloning $1 repo ..."
151 hg clone $HG_URL/${1} ${HG_DIR}/${1}/${HG_PATH}/${1}
152 if [ $(grep -l "^HG_URL=$HG_URL" $PROFILE/config) ]; then
153 if [ ! $(grep -l "$HG_URL" ${HG_DIR}/${1}/${HG_PATH}/${1}/.hg/hgrc) ]; then
154 echo "mirror = $HG_URL/$1" >> ${HG_DIR}/${1}/${HG_PATH}/${1}/.hg/hgrc
155 fi
156 fi
157 elif [ -d ${HG_DIR}/${1}/${HG_PATH}/${1} -a ${UPDATE_HG} = "yes" ]; then
158 info "Updating $1 repo ..."
159 cd ${HG_DIR}/${1}/${HG_PATH}/${1}
160 hg pull $HG_URL/${1} -u
161 if [ $(grep -l "^HG_URL=$HG_URL" $PROFILE/config) ]; then
162 if [ ! $(grep -l "$HG_URL" ${HG_DIR}/${1}/${HG_PATH}/${1}/.hg/hgrc) ]; then
163 echo "mirror = $HG_URL/$1" >> ${HG_DIR}/${1}/${HG_PATH}/${1}/.hg/hgrc
164 fi
165 fi
166 cd $PROFILE
167 fi
168 }
170 squashfs_hg() {
171 if [ ! -d "$ISODIR/$CDNAME/modules/hg" ]; then
172 mkdir -p "$ISODIR/$CDNAME/modules/hg"
173 fi
174 if [ -d ${HG_DIR}/${1}/ ]; then
175 _mksquash ${HG_DIR}/${1} "$ISODIR/$CDNAME/modules/hg/" /${HG_PATH}/${1}
176 fi
177 }
179 slitaz_union () {
181 if [ -d ${MODULES_DIR}/${mod}/var/lib/tazpkg/installed ]; then
182 echo "${mod} module exist. Moving on."
183 elif [ ! -d ${MODULES_DIR}/${mod}/var/lib/tazpkg/installed ]; then
184 if [ -f "$PROFILE/list/${mod}.list" ]; then
185 cat "$PROFILE/list/${mod}.list" | grep -v "^#" | while read pkgname; do
186 if [ ! -f ${UNION}/var/lib/tazpkg/installed/${pkgname}/files.list ]; then
187 tazpkg get-install $pkgname --root=${UNION} | tee -a ${LOG}/${mod}-current.log
188 sleep 1
189 else
190 info "${pkgname} installed"
191 fi
192 done
193 fi
195 if [ -f $PROFILE/list/${mod}.removelist ]; then
196 cat "$PROFILE/list/${mod}.removelist" | grep -v "^#" | while read pkgname; do
197 if [ -f ${UNION}/var/lib/tazpkg/installed/${pkgname}/files.list ]; then
198 echo "y" | tazpkg remove ${pkgname} --root=${UNION} | tee -a ${LOG}/${mod}-current.log
199 sleep 1
200 else
201 info "${pkgname} removed"
202 fi
203 done
204 fi
205 fi
206 }
208 union () {
209 mkdir -p $WORKING
210 mkdir -p $UNION
211 mkdir -p $LOG
212 mkdir -p $ISODIR/${CDNAME}/base
213 mkdir -p $ISODIR/${CDNAME}/modules
214 mkdir -p $ISODIR/${CDNAME}/optional
215 mkdir -p $ISODIR/${CDNAME}/rootcopy
216 mkdir -p $ISODIR/${CDNAME}/tmp
217 mkdir -p $LASTBR
218 touch $SGNFILE
220 modprobe aufs
221 if [ $? -ne 0 ]; then
222 error "Error loading Union filesystem module. (aufs)"
223 exit 1
224 fi
226 # $INITRAMFS is now $LASTBR
227 # This will be copyed to /mnt/memory/changes on boot
228 initramfs
230 mount -t aufs -o br:${LASTBR}=rw aufs ${UNION}
231 if [ $? -ne 0 ]; then
232 error "Error mounting $union."
233 exit 1
234 fi
236 info "====> Installing packages to '$UNION'"
237 for mod in $MODULES; do
239 if [ "$CLEAN_MODULES_DIR" = "yes" ]; then
240 if [ -d $MODULES_DIR/$mod ]; then
241 rm -Rf $MODULES_DIR/$mod
242 fi
243 fi
245 if [ ! -d $MODULES_DIR/$mod ]; then
246 mkdir -p $MODULES_DIR/$mod
247 fi
248 info "Adding $MODULES_DIR/$mod as top branch of union."
249 mount -t aufs -o remount,add:0:${MODULES_DIR}/${mod}=rw aufs $UNION
250 info "Adding $LASTBR as lower branch of union."
251 mount -t aufs -o remount,mod:${LASTBR}=rr+wh aufs $UNION
252 LASTBR="$MODULES_DIR/${mod}"
254 slitaz_union
255 done
257 if [ -d ${UNION}/${INSTALLED} ]; then
258 find ${UNION}/${INSTALLED} -type d | sort > $ISODIR/packages-installed.list
259 sed -i "s|${UNION}/${INSTALLED}/||g" $ISODIR/packages-installed.list
260 fi
262 info "Unmounting union"
263 umount -l "${UNION}"
265 info "Removing unionfs .wh. files."
266 find ${MODULES_DIR} -type f -name ".wh.*" -exec rm {} \;
267 find ${MODULES_DIR} -type d -name ".wh.*" -exec rm -rf {} \;
268 }
270 backup_pkg() {
271 if [ "${BACKUP_PACKAGES}" = "yes" ]; then
272 [ -d $ISODIR/packages ] && rm -r $ISODIR/packages
273 mkdir -p $ISODIR/packages
274 info "Making cooking list based installed packages in union"
275 tazwok gen-cooklist $ISODIR/packages-installed.list > $ISODIR/cookorder.list
276 #[ -f $INCOMING_REPOSITORY/wok-wanted.txt ] || tazwok gen-wok-db
278 info "Linking all installed packages to $ISODIR/packages"
279 cat $ISODIR/packages-installed.list | while read PACKAGE; do
280 VERSION=$(grep ^VERSION= ${HG_DIR}/wok/${PACKAGE}/receipt | cut -d "=" -f2 | sed -e 's/"//g')
281 CACHE_PACKAGE=$(find $CACHE_DIR/$(cat /etc/slitaz-release)/packages -type f -name "$PACKAGE-$VERSION.tazpkg")
282 if [ -f $CACHE_PACKAGE ]; then
283 info "Copying $CACHE_PACKAGE to $ISODIR/packages"
284 ln -sf $CACHE_PACKAGE $ISODIR/packages
285 #elif [ ! -f $CACHE_PACKAGE ]; then
286 # info "$CACHE_PACKAGE doesn't exist. Downloading it."
287 # cd $CACHE_DIR/$(cat /etc/slitaz-release)/packgages
288 # tazpkg get $PACKAGE
289 # cd $WORKING
290 # if [ -f $CACHE_PACKAGE ]; then
291 # ln -sf $CACHE_PACKAGE $ISODIR/packages
292 # fi
293 fi
294 done
296 cat $ISODIR/cookorder.list | while read PACKAGE; do
297 rwanted=$(grep $'\t'$PACKAGE$ $INCOMING_REPOSITORY/wok-wanted.txt | cut -f 1)
298 echo $rwanted | while read WANTED_PKG; do
299 VERSION=$(grep ^VERSION= ${HG_DIR}/wok/${WANTED_PKG}/receipt | cut -d "=" -f2 | sed -e 's/"//g')
300 CACHE_PACKAGE=$(find $CACHE_DIR/$(cat /etc/slitaz-release)/packages -type f -name "$WANTED_PKG-$VERSION.tazpkg")
301 if [ -f $CACHE_PACKAGE ]; then
302 info "Copying $CACHE_PACKAGE to $ISODIR/packages"
303 ln -sf $CACHE_PACKAGE $ISODIR/packages
304 #elif [ ! -f $CACHE_PACKAGE ]; then
305 # info "$CACHE_PACKAGE doesn't exist. Downloading it."
306 # cd $CACHE_DIR/$(cat /etc/slitaz-release)/packgages &>/dev/null
307 # tazpkg get $PACKAGE
308 # cd $WORKING
309 # if [ -f $CACHE_PACKAGE ]; then
310 # ln -sf $CACHE_PACKAGE $ISODIR/packages
311 # fi
312 fi
313 done
314 done
316 [ -d $ISODIR/packages ] && tazwok gen-list $ISODIR/packages
317 fi
319 }
321 backup_src() {
323 if [ "${BACKUP_PACKAGES}" = "yes" -a "${BACKUP_SOURCES}" = "yes" ]; then
324 [ -d $SOURCES_REPOSITORY ] || mkdir -p $SOURCES_REPOSITORY
325 [ -d $ISODIR/sources ] || mkdir -p $ISODIR/sources
327 cat $ISODIR/cookorder.list | while read PACKAGE; do
328 WGET_URL=$(grep ^WGET_URL= ${HG_DIR}/wok/${PACKAGE}/receipt | cut -d "=" -f2 | sed -e 's/"//g' | head -n 1)
329 VERSION=$(grep ^VERSION= ${HG_DIR}/wok/${PACKAGE}/receipt | cut -d "=" -f2 | sed -e 's/"//g' | head -n 1)
330 TARBALL=$(grep ^TARBALL= ${HG_DIR}/wok/${PACKAGE}/receipt | cut -d "=" -f2 | sed -e 's/"//g' | head -n 1)
332 if [ ! -f "$SOURCES_REPOSITORY/$TARBALL" ] && \
333 [ ! -f "$SOURCES_REPOSITORY/${SOURCE:-$PACKAGE}-$VERSION.tar.lzma" ]; then
334 tazwok get-src $PACKAGE --nounpack
335 if [ -f "$SOURCES_REPOSITORY/$TARBALL" ]; then
336 ln -sf $SOURCES_REPOSITORY/$TARBALL $ISODIR/sources/$TARBALL
337 elif [ -f "$SOURCES_REPOSITORY/${SOURCE:-$PACKAGE}-$VERSION.tar.lzma" ]; then
338 ln -sf $SOURCES_REPOSITORY/${SOURCE:-$PACKAGE}-$VERSION.tar.lzma $ISODIR/sources/${SOURCE:-$PACKAGE}-$VERSION.tar.lzma
339 fi
340 else
341 [ -f "$SOURCES_REPOSITORY/$TARBALL" ] && ln -sf $SOURCES_REPOSITORY/$TARBALL $ISODIR/sources/$TARBALL
342 fi
343 done
344 cd $ISODIR/sources
345 info "Make md5sum file for sources"
346 find * -not -type d | grep -v md5sum | xargs md5sum > md5sum
347 cd $WORKING
348 fi
350 }
352 # _mksquash dirname
353 _mksquash () {
354 if [ ! -d "$1" ]; then
355 error "Error: '$1' is not a directory"
356 return 1
357 fi
359 if [ ! -d "$2" ]; then
360 error "Error: '$2' is not a directory"
361 return 1
362 fi
364 if [ ! -d "${1}${3}" ]; then
365 error "Error: '${1}${3}' is not a directory"
366 return 1
367 fi
369 time_dir="${3}"
370 sqimg="${2}/$(basename ${1}).${EXT}"
371 info "====> Generating SquashFS image for '${1}'"
372 if [ -e "${sqimg}" ]; then
373 dirhaschanged=$(find ${1}${time_dir} -newer ${sqimg})
374 if [ "${dirhaschanged}" != "" ]; then
375 info "SquashFS image '${sqimg}' is not up to date, rebuilding..."
376 rm "${sqimg}"
377 else
378 info "SquashFS image '${sqimg}' is up to date, skipping."
379 return
380 fi
381 fi
383 info "Creating SquashFS image. This may take some time..."
384 start=$(date +%s)
385 if [ "${QUIET}" = "y" ]; then
386 mksquashfs "${1}" "${sqimg}" -noappend ${MKOPTION} -comp ${COMPRESSION} >/dev/null
387 else
388 mksquashfs "${1}" "${sqimg}" -noappend ${MKOPTION} -comp ${COMPRESSION}
389 fi
390 minutes=$(echo $start $(date +%s) | awk '{ printf "%0.2f",($2-$1)/60 }')
391 info "Image creation done in $minutes minutes."
392 }
394 imgcommon () {
395 if [ "${MODULES}" != "" ]; then
396 for MOD in ${MODULES}; do
397 if [ -d "${MODULES_DIR}/${MOD}" ]; then
398 _mksquash "${MODULES_DIR}/${MOD}" "$ISODIR/$CDNAME/base" /var/lib/tazpkg/installed
399 fi
400 done
401 fi
403 if [ "$HG_LIST" != "" ]; then
404 if [ "$COPY_HG" = "yes" ]; then
405 for hg in $HG_LIST; do
406 copy_hg $hg
407 squashfs_hg $hg
408 done
409 fi
410 fi
412 if [ "${HG_LIST}" != "" ]; then
413 for hg in ${HG_LIST}; do
414 if [ -d "${MODULES_DIR}/${hg}" ]; then
415 squashfs_hg $hg
416 fi
417 done
418 fi
419 if [ -d ${HG_DIR}/wok ]; then
420 backup_pkg
421 backup_src
422 fi
424 info "====> Making bootable image"
426 # Sanity checks
427 if [ ! -d "${ISODIR}" ]; then
428 error "Error: '${ISODIR}' doesn't exist. What did you do?!"
429 exit 1
430 fi
432 if [ ! -f "${SGNFILE}" ]; then
433 error "Error: the ${SGNFILE} file doesn't exist. This image won't do anything"
434 error " Protecting you from yourself and erroring out here..."
435 exit 1
436 fi
439 if [ -e "${IMGNAME}" ]; then
440 if [ "${FORCE}" = "y" ]; then
441 info "Removing existing bootable image..."
442 rm -rf "${IMGNAME}"
443 else
444 error "Error: Image '${IMGNAME}' already exists, aborting."
445 exit 1
446 fi
447 fi
449 }
451 make_iso () {
452 imgcommon
454 info "Creating rootfs.gz"
455 pack_rootfs $INITRAMFS $ISODIR/boot/rootfs.gz
457 if [ -d $PROFILE/rootcd ]; then
458 cp -af $PROFILE/rootcd/* $ISODIR/
459 fi
461 info "Copying isolinux files..."
462 if [ -d $INITRAMFS/boot/isolinux ]; then
463 cp -a $INITRAMFS/boot/isolinux $ISODIR/boot
464 fi
466 if [ -d ${PROFILE}/overlay ]; then
467 _overlay
468 fi
470 info "Creating ISO image..."
471 genisoimage -R -o $IMGNAME -b boot/isolinux/isolinux.bin \
472 -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 \
473 -V "SliTaz" -input-charset iso8859-1 -boot-info-table $ISODIR
474 if [ -x /usr/bin/isohybrid ]; then
475 info "Creating hybrid ISO..."
476 isohybrid "${IMGNAME}"
477 fi
478 md5sum "${IMGNAME}" > $IMGMD5NAME
479 }
481 if [ "$MODULES" != "" ]; then
482 union
483 else
484 error "MODULES was empty. exiting."
485 exit 1
486 fi
488 make_iso