#!/bin/bash
###################################################################################
# UCK - Ubuntu Customization Kit #
# Copyright (C) 2006-2010 UCK Team #
# #
# UCK is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# UCK is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with UCK. If not, see . #
###################################################################################
function check_if_user_is_root()
{
if [ $UID != 0 ]; then
echo "You need root privileges"
exit 2
fi
}
# The mountpoint utility is buggy as it does not correctly account for bind
# mounts. This makes unmounting of REMASTER_DIR/tmp fail if /tmp is not
# mounted.
function mountpoint()
{
case "$1" in
-q) shift;; # ignore -q option
esac
# /proc/mounts uses octal escapes for non-printable chars.
# This code uses "echo -e" to expand them for comparison.
mpoints=`cat /proc/mounts | awk '{ print $2 }'`
echo -e "$mpoints" | grep "^$1$" >/dev/null
}
# Mount - make sure target exists
function mount_directory()
{
if [ ! -d "$2" ]; then
mkdir -p "$2" ||
failure "Cannot create $2"
fi
echo "Mounting $1"
mount --bind "$1" "$2" ||
failure "Cannot bind mount $1 to $2"
}
# Unmount - but only if mounted
function unmount_directory()
{
#if mountpoint -q "$1"; then
if mountpoint "$1"; then
echo "Unmounting $1..."
umount -l "$1" || failure "Cannot unmount $1"
fi
}
# Check, whether union mounts are possible
function check_union_mounts()
{
[ -x /sbin/mount.aufs -o -x /usr/bin/unionfs-fuse ]
}
# union_mount -- mount a r/o file system r/w
# Parameters: src_file dest
function union_mount()
{
# Mount the readonly volume
[ ! -d "$2-mount" ] && mkdir -p "$2-mount"
if mount -o loop -r "$1" "$2-mount"; then
: ok, mount succeeded
else
rmdir "$2-mount" 2>/dev/null
return 1
fi
# Create cache and r/w directory
[ ! -d "$2-cache" ] && mkdir -p "$2-cache"
[ ! -d "$2" ] && mkdir -p "$2"
# mount as union to target
if [ -x /sbin/mount.aufs ]; then
mount -t aufs -o br:$2-cache:$2-mount none "$2"
elif [ -x /usr/bin/unionfs-fuse ]; then
unionfs-fuse -o cow,max_files=32768,hide_meta_files \
-o allow_other,suid,dev \
"$2-cache"=RW:"$2-mount"=RO "$2"
else
echo "Cannot use union_mounts!" >&2
false
fi
status=$?
if [ $status -ne 0 ]; then
umount "$2-mount" >/dev/null 2>&1
rmdir "$2" "$2-cache" "$2-mount" >/dev/null 2>&1
fi
return $status
}
# union_umount -- unmount a union_mount
# Paramters: mountdir
function union_umount()
{
sync
# Kill processes possibly still using the mount
for pid in `lsof 2>/dev/null | grep "$1" | grep -v unionfs | awk '{print $2}' | sort -u`
do
kill $pid
sleep 2 # Give some time to terminate...
done
sync
umount "$1"
rmdir "$1" >/dev/null 2>&1
rmdir "$1-cache" >/dev/null 2>&1
umount "$1-mount"
rmdir "$1-mount" >/dev/null 2>&1
}
# Create/Mount all filesystems for chroot environment
function mount_pseudofilesystems()
{
if [ ! -e "$REMASTER_DIR" ]; then
failure "Remastering root directory does not exists"
fi
# Create the directories we are about to mount in the root_fs tree
# - Create an empty apt cache
if [ ! -d "$REMASTER_HOME/remaster-apt-cache/archives/partial" ]; then
echo "Creating apt cache..."
mkdir -p "$REMASTER_HOME/remaster-apt-cache/archives/partial" ||
failure "Cannot create apt cache"
fi
# - Create an empty home directory for root
if [ ! -d "$REMASTER_HOME/remaster-root-home" ]; then
echo "Creating root home..."
mkdir -p "$REMASTER_HOME/remaster-root-home" ||
failure "Cannot create root home"
fi
mount_directory /proc "$REMASTER_DIR/proc"
mount_directory /sys "$REMASTER_DIR/sys"
mount_directory /dev/pts "$REMASTER_DIR/dev/pts"
mount_directory /tmp "$REMASTER_DIR/tmp"
mount_directory "$REMASTER_HOME/remaster-root-home" "$REMASTER_DIR/root"
mount_directory "$REMASTER_HOME/remaster-apt-cache" "$REMASTER_DIR/var/cache/apt"
if [ -d "/run" ]; then
HOST_VAR_RUN="/run"
else
HOST_VAR_RUN="/var/run"
fi
if [ -d "$REMASTER_DIR/run" ]; then
GUEST_VAR_RUN="$REMASTER_DIR/run"
else
GUEST_VAR_RUN="$REMASTER_DIR/var/run"
fi
mount_directory "$HOST_VAR_RUN" "$GUEST_VAR_RUN"
# Mount customization scripts, if any
if [ -e "$REMASTER_HOME/customization-scripts" ]; then
if [ ! -d "$REMASTER_DIR/tmp/customization-scripts" ]; then
mkdir "$REMASTER_DIR/tmp/customization-scripts" ||
failure "Cannot create $REMASTER_DIR/tmp/customization-scripts"
fi
mount_directory "$REMASTER_HOME/customization-scripts" \
"$REMASTER_DIR/tmp/customization-scripts"
fi
}
# Unmount all filesystems mounted in chroot environment
function unmount_pseudofilesystems()
{
if [ -n "$REMASTER_DIR" ]; then
for i in `mount | grep " $REMASTER_DIR/" | cut -d " " -f3 | sort -r`; do
unmount_directory "$i"
done
fi
}
function unmount_loopfilesystems()
{
if [ -n "$SQUASHFS_MOUNT_DIR" ]; then
unmount_directory "$SQUASHFS_MOUNT_DIR"
fi
if [ -n "$ISO_MOUNT_DIR" ]; then
unmount_directory "$ISO_MOUNT_DIR"
fi
}
function unmount_all()
{
unmount_pseudofilesystems
unmount_loopfilesystems
}
function failure()
{
unmount_all
echo "$@"
exit 2
}
function script_cancelled_by_user()
{
failure "Script cancelled by user"
}
function remove_directory()
{
DIR_TO_REMOVE="$1"
if [ "$DIR_TO_REMOVE" = "/" ]; then
failure "Trying to remove root directory"
fi
rm -rf "$DIR_TO_REMOVE"
}
function unpack_initrd()
{
remove_remaster_initrd
mkdir -p "$INITRD_REMASTER_DIR" || failure "Cannot create directory $INITRD_REMASTER_DIR"
echo "Unpacking initrd image..."
pushd "$INITRD_REMASTER_DIR" || failure "Failed to change directory to $INITRD_REMASTER_DIR, error=$?"
if [ -e "$ISO_REMASTER_DIR/casper/initrd.lz" ]; then
INITRD_FILE="$ISO_REMASTER_DIR/casper/initrd.lz"
INITRD_PACK=lzma
elif [ -e "$ISO_REMASTER_DIR/casper/initrd.gz" ]; then
INITRD_FILE="$ISO_REMASTER_DIR/casper/initrd.gz"
INITRD_PACK=gzip
elif [ -e "$ISO_REMASTER_DIR/install/initrd.gz" ]; then
INITRD_FILE="$ISO_REMASTER_DIR/install/initrd.gz"
INITRD_PACK=gzip
else
failure "Can't find initrd.gz nor initrd.lz file"
fi
cat "$INITRD_FILE" | $INITRD_PACK -d | cpio -i
RESULT=$?
if [ $RESULT -ne 0 ]; then
failure "Failed to unpack $INITRD_FILE to $INITRD_REMASTER_DIR, error=$RESULT"
fi
popd
}
function pack_initrd()
{
if [ ! -e "$INITRD_REMASTER_DIR" ]; then
failure "Initrd remastering directory does not exists"
fi
echo "Packing initrd image..."
pushd "$INITRD_REMASTER_DIR" || failure "Failed to change directory to $INITRD_REMASTER_DIR, error=$?"
if [ -e "$ISO_REMASTER_DIR/casper/initrd.lz" ]; then
INITRD_FILE="$ISO_REMASTER_DIR/casper/initrd.lz"
INITRD_PACK=lzma
elif [ -e "$ISO_REMASTER_DIR/casper/initrd.gz" ]; then
INITRD_FILE="$ISO_REMASTER_DIR/casper/initrd.gz"
INITRD_PACK=gzip
elif [ -e "$ISO_REMASTER_DIR/install/initrd.gz" ]; then
INITRD_FILE="$ISO_REMASTER_DIR/install/initrd.gz"
INITRD_PACK=gzip
else
failure "Can't find where to copy the initrd.packed file"
fi
find | cpio -H newc -o | $INITRD_PACK >"$REMASTER_HOME/initrd.packed"
RESULT=$?
if [ $RESULT -ne 0 ]; then
rm "$REMASTER_HOME/initrd.packed"
failure "Failed to compress initird image $INITRD_REMASTER_DIR to $REMASTER_HOME/initrd.packed, error=$RESULT"
fi
popd
mv "$REMASTER_HOME/initrd.packed" "$INITRD_FILE" || failure "Failed to move $REMASTER_HOME/initrd.packed to $INITRD_FILE, error=$?"
}
function mount_iso()
{
echo "Mounting ISO image..."
mkdir -p "$ISO_MOUNT_DIR" || failure "Cannot create directory $ISO_MOUNT_DIR, error=$?"
mount "$ISO_IMAGE" "$ISO_MOUNT_DIR" -o loop || failure "Cannot mount $ISO_IMAGE in $ISO_MOUNT_DIR, error=$?"
}
function unmount_iso()
{
if [ -e "$ISO_MOUNT_DIR" ] ; then
echo "Unmounting ISO image..."
umount "$ISO_MOUNT_DIR" || echo "Failed to unmount ISO mount directory $ISO_MOUNT_DIR, error=$?"
rmdir "$ISO_MOUNT_DIR" || echo "Failed to remove ISO mount directory $ISO_MOUNT_DIR, error=$?"
fi
}
function unpack_iso()
{
echo "Unpacking ISO image..."
cp -a "$ISO_MOUNT_DIR" "$ISO_REMASTER_DIR" || failure "Failed to unpack ISO from $ISO_MOUNT_DIR to $ISO_REMASTER_DIR"
manifest_diff
}
function manifest_diff()
{
#can't trap errors with diff because of its return codes,
#we pass the diff's output to cut cause we strip the version number
if [ -e "$ISO_REMASTER_DIR/casper/filesystem.manifest" ]; then
if [ -e "$ISO_REMASTER_DIR/casper/filesystem.manifest-desktop" ]; then
diff --unchanged-group-format='' "$ISO_REMASTER_DIR/casper/filesystem.manifest" "$ISO_REMASTER_DIR/casper/filesystem.manifest-desktop" | cut -d ' ' -f 1 > "$ISO_REMASTER_DIR/casper/manifest.diff"
fi
fi
}
function mount_squashfs()
{
echo "Mounting SquashFS image..."
mkdir -p "$SQUASHFS_MOUNT_DIR" || failure "Cannot create directory $SQUASHFS_MOUNT_DIR, error=$?"
mount -t squashfs "$SQUASHFS_IMAGE" "$SQUASHFS_MOUNT_DIR" -o loop || failure "Cannot mount $SQUASHFS_IMAGE in $SQUASHFS_MOUNT_DIR, error=$?"
}
function unmount_squashfs()
{
if [ -e "$SQUASHFS_MOUNT_DIR" ] ; then
echo "Unmounting SquashFS image..."
umount "$SQUASHFS_MOUNT_DIR" ||
echo "Failed to unmount $SQUASHFS_MOUNT_DIR, error=$?"
rmdir "$SQUASHFS_MOUNT_DIR" ||
echo "Failed to remove directory $SQUASHFS_MOUNT_DIR, error=$?"
fi
}
function unpack_rootfs()
{
echo "Unpacking SquashFS image..."
cp -a "$SQUASHFS_MOUNT_DIR" "$REMASTER_DIR" ||
failure "Cannot copy files from $SQUASHFS_MOUNT_DIR to $REMASTER_DIR, error=$?"
}
#
# REMASTER_DIR -- root_fs tree
# REMASTER_HOME -- project directory
#
function prepare_rootfs_for_chroot()
{
mount_pseudofilesystems
if [ ! -e "$REMASTER_DIR/etc/resolv.conf" ] ; then
echo "Copying resolv.conf..."
cp -f /etc/resolv.conf "$REMASTER_DIR/etc/resolv.conf" ||
echo "Failed to copy resolv.conf, error=$?"
fi
echo "Copying fstab/mtab..."
if [ -f "$REMASTER_DIR/etc/fstab" ] ; then
mv "$REMASTER_DIR/etc/fstab" "$REMASTER_DIR/etc/fstab.uck" ||
failure "Failed to copy fstab, error=$?"
fi
cp -f /etc/fstab "$REMASTER_DIR/etc/fstab" ||
failure "Failed to copy fstab, error=$?"
cp -f /etc/mtab "$REMASTER_DIR/etc/mtab" ||
failure "Failed to copy mtab, error=$?"
echo "Creating DBUS uuid..."
chroot "$REMASTER_DIR" dbus-uuidgen --ensure 1>/dev/null 2>&1
if [ -e "$REMASTER_HOME/customization-scripts/Xcookie" ] ; then
UCK_USER_HOME_DIR=`xauth info|grep 'Authority file'| sed "s/[ \t]//g" | sed "s/\/\.Xauthority//" | cut -d ':' -f2`
if [ `echo $UCK_USER_HOME_DIR | cut -d '/' -f2` == 'home' ] ; then
echo "Creating user directory..."
chroot "$REMASTER_DIR" mkdir -p "$UCK_USER_HOME_DIR" >/dev/null 2>&1
echo "Copying X authorization file to chroot filesystem..."
cat "$REMASTER_HOME/customization-scripts/Xcookie" | chroot "$REMASTER_DIR" xauth -f /root/.Xauthority merge - || failure "Failed to merge X authorization file, error=$?"
cat "$REMASTER_HOME/customization-scripts/Xcookie" | chroot "$REMASTER_DIR" xauth merge - || failure "Failed to merge X authorization file in user directory, error=$?"
fi
fi
echo "Deactivating initctl..."
chroot "$REMASTER_DIR" mv /sbin/initctl /sbin/initctl.uck_blocked
chroot "$REMASTER_DIR" ln -s /bin/true /sbin/initctl
echo "Hacking invoke-rc.d to ignore missing init scripts..."
chroot "$REMASTER_DIR" sed -i -e "s/exit 100/exit 0 #exit 100/" /usr/sbin/invoke-rc.d
echo "Deactivating update-grub..."
chroot "$REMASTER_DIR" mv /usr/sbin/update-grub /usr/sbin/update-grub.uck_blocked
chroot "$REMASTER_DIR" ln -s /bin/true /usr/sbin/update-grub
echo "Deactivating grub-probe..."
chroot "$REMASTER_DIR" mv /usr/sbin/grub-probe /usr/sbin/grub-probe.uck_blocked
chroot "$REMASTER_DIR" ln -s /bin/true /usr/sbin/grub-probe
echo "Hacking grub-probe postinst/postrm..."
chroot "$REMASTER_DIR" sed -i -e "s/exec update-grub/true #exec update-grub/" /etc/kernel/postinst.d/zz-update-grub
chroot "$REMASTER_DIR" sed -i -e "s/exec update-grub/true #exec update-grub/" /etc/kernel/postrm.d/zz-update-grub
if [ ! -e "$REMASTER_DIR/scripts" ]; then
echo "Linking missing /scripts dir..."
chroot "$REMASTER_DIR" ln -s /usr/share/initramfs-tools/scripts /scripts
fi
echo "Remembering kernel update state..."
update_flags="reboot-required reboot-required.pkgs do-not-hibernate"
varrun="$REMASTER_DIR"/var/run
for flag in $update_flags; do
[ -f "$varrun"/$flag ] &&
mv "$varrun"/$flag "$varrun"/$flag.uck_blocked
done
}
function clean_rootfs_after_chroot()
{
echo "Restoring kernel update state..."
update_flags="reboot-required reboot-required.pkgs do-not-hibernate"
varrun="$REMASTER_DIR"/var/run
for flag in $update_flags; do
rm -f "$varrun"/$flag
[ -f "$varrun"/$flag.uck_blocked ] &&
mv "$varrun"/$flag.uck_blocked "$varrun"/$flag
done
echo "Reactivating initctl..."
chroot "$REMASTER_DIR" rm /sbin/initctl
chroot "$REMASTER_DIR" mv /sbin/initctl.uck_blocked /sbin/initctl
echo "Restoring invoke-rc.d..."
chroot "$REMASTER_DIR" sed -i -e "s/exit 0 #exit 100/exit 100/" /usr/sbin/invoke-rc.d
echo "Reactivating update-grub..."
chroot "$REMASTER_DIR" rm /usr/sbin/update-grub
chroot "$REMASTER_DIR" mv /usr/sbin/update-grub.uck_blocked /usr/sbin/update-grub
echo "Reactivating grub-probe..."
chroot "$REMASTER_DIR" rm /usr/sbin/grub-probe
chroot "$REMASTER_DIR" mv /usr/sbin/grub-probe.uck_blocked /usr/sbin/grub-probe
echo "Reactivating grub-probe postinst/postrm..."
chroot "$REMASTER_DIR" sed -i -e "s/true #exec update-grub/exec update-grub/" /etc/kernel/postinst.d/zz-update-grub
chroot "$REMASTER_DIR" sed -i -e "s/true #exec update-grub/exec update-grub/" /etc/kernel/postrm.d/zz-update-grub
if [ -L "$REMASTER_DIR/scripts" ]; then
echo "Removing linked /scripts dir..."
chroot "$REMASTER_DIR" rm /scripts
fi
UCK_USER_HOME_DIR=`xauth info|grep 'Authority file'| sed "s/[ \t]//g" | sed "s/\/\.Xauthority//" | cut -d ':' -f2`
if [ `echo $UCK_USER_HOME_DIR | cut -d '/' -f2` == 'home' ] ; then
echo "Removing /home/username directory..."
chroot "$REMASTER_DIR" rm -rf "$UCK_USER_HOME_DIR"
fi
echo "Removing generated machine uuid..."
chroot "$REMASTER_DIR" rm -f /var/lib/dbus/machine-id
if [ ! -h "$REMASTER_DIR/etc/resolv.conf" ] ; then
echo "Removing generated resolv.conf..."
chroot "$REMASTER_DIR" rm -f /etc/resolv.conf
fi
echo "Removing generated fstab/mtab..."
chroot "$REMASTER_DIR" rm -f /etc/mtab
chroot "$REMASTER_DIR" rm -f /etc/fstab
if [ -f "$REMASTER_DIR/etc/fstab.uck" ] ; then
mv "$REMASTER_DIR/etc/fstab.uck" "$REMASTER_DIR/etc/fstab"
fi
echo "Removing crash reports..."
chroot "$REMASTER_DIR" rm -f /var/crash/*
unmount_pseudofilesystems
# Need a shell to perform wildcard expansion in chroot environment!
# No need to clean /tmp - was a bind mount.
echo "Cleaning up temporary directories..."
chroot "$REMASTER_DIR" sh -c "rm -rf /var/tmp/* /var/tmp/.??*"
}
function prepare_new_files_directories()
{
echo "Preparing directory for new files"
if [ -e "$NEW_FILES_DIR" ]; then
remove_directory "$NEW_FILES_DIR" ||
failure "Failed to remove directory $NEW_FILES_DIR"
fi
mkdir -p "$NEW_FILES_DIR"
}
function pack_rootfs()
{
if [ -e "$REMASTER_DIR" ]; then
echo "Updating files lists..."
chroot "$REMASTER_DIR" dpkg-query -W --showformat='${Package} ${Version}\n' > "$ISO_REMASTER_DIR/casper/filesystem.manifest" || failure "Cannot update filesystem.manifest, error=$?"
if [ $CLEAN_DESKTOP_MANIFEST == 1 ] && [ -e "$ISO_REMASTER_DIR/casper/manifest.diff" ]; then
#stripping version number from manifest
cat "$ISO_REMASTER_DIR/casper/filesystem.manifest" | cut -d ' ' -f 1 > "$ISO_REMASTER_DIR/filesystem.manifest.tmp"
# can't trap errors with diff because of its return codes
diff --unchanged-group-format='' "$ISO_REMASTER_DIR/filesystem.manifest.tmp" "$ISO_REMASTER_DIR/casper/manifest.diff" > "$ISO_REMASTER_DIR/filesystem.manifest-desktop.tmp"
#building the right manifest-desktop file
chroot "$REMASTER_DIR" dpkg-query -W --showformat='${Package} ${Version}\n' `cat "$ISO_REMASTER_DIR/filesystem.manifest-desktop.tmp"` | egrep '.+ .+' > "$ISO_REMASTER_DIR/casper/filesystem.manifest-desktop"
#removing temp files
rm "$ISO_REMASTER_DIR/filesystem.manifest.tmp" "$ISO_REMASTER_DIR/filesystem.manifest-desktop.tmp"
else
cp "$ISO_REMASTER_DIR/casper/filesystem.manifest" "$ISO_REMASTER_DIR/casper/filesystem.manifest-desktop" || failure "Failed to copy $ISO_REMASTER_DIR/casper/filesystem.manifest to $ISO_REMASTER_DIR/casper/filesystem.manifest-desktop"
fi
echo "Packing SquashFS image..."
if [ -e "$ISO_REMASTER_DIR/casper/filesystem.squashfs" ]; then
rm -f "$ISO_REMASTER_DIR/casper/filesystem.squashfs" || failure "Cannot remove $ISO_REMASTER_DIR/casper/filesystem.squashfs to make room for created squashfs image, error=$?"
fi
EXTRA_OPTS=""
if [ -e "$CUSTOMIZE_DIR/rootfs.sort" ]; then
#FIXME: space not allowed in $CUSTOMIZE_DIR
EXTRA_OPTS="-sort $CUSTOMIZE_DIR/rootfs.sort"
fi
#if mksquashfs version => 4.1 and guest's kernel => 2.6.30 we can enable xz compression
SQUASHFS_VERSION=`dpkg-query -p squashfs-tools | grep Version | cut -d ':' -f3 | cut -d '-' -f1`
GUEST_KERNEL_VERSION=`ls /boot/config-* | sed 's/.*config-//' | cut -d '-' -f1 | sort -r | head -n1`
if [ `echo -e "${SQUASHFS_VERSION}\n4.2" | sort | head -n1` = "4.2" ]; then
if [ `echo -e "${GUEST_KERNEL_VERSION}\n2.6.30" | sort | head -n1` = "2.6.30" ]; then
echo "Squashfs>=4.1, guest kernel>=2.6.30: Enabling XZ compression for squashfs..."
EXTRA_OPTS="${EXTRA_OPTS} -comp xz"
fi
fi
mksquashfs "$REMASTER_DIR" "$ISO_REMASTER_DIR/casper/filesystem.squashfs" $EXTRA_OPTS ||
failure "Failed to create squashfs image to $ISO_REMASTER_DIR/casper/filesystem.squashfs, error=$?"
else
echo "Remastering root directory does not exists"
fi
}
function remove_iso_remaster_dir()
{
if [ -e "$ISO_REMASTER_DIR" ] ; then
echo "Removing ISO remastering dir..."
remove_directory "$ISO_REMASTER_DIR" ||
failure "Failed to remove directory $ISO_REMASTER_DIR, error=$?"
fi
}
function remove_remaster_dir()
{
if [ -e "$REMASTER_DIR" ] ; then
unmount_pseudofilesystems
echo "Removing remastering root dir..."
remove_directory "$REMASTER_DIR"
fi
}
function remove_remaster_initrd()
{
if [ -e "$INITRD_REMASTER_DIR" ]; then
echo "Removing initrd remastering dir..."
remove_directory "$INITRD_REMASTER_DIR"
fi
}
# update_iso_locale has an optional argument - the language of the live CD
function update_iso_locale()
{
echo "Updating locale"
if [ -e "$CUSTOMIZE_DIR/livecd_locale" ]; then
LIVECD_LOCALE=`cat "$CUSTOMIZE_DIR/livecd_locale"`
elif [ -n "$1" ]; then
LIVECD_LOCALE="$1"
fi
if [ -n "$LIVECD_LOCALE" ]; then
cat "$ISO_REMASTER_DIR/isolinux/isolinux.cfg" | sed "s#\#append debian-installer/locale=$LIVECD_LOCALE#g" >"$NEW_FILES_DIR/isolinux.cfg"
RESULT=$?
if [ $RESULT -ne 0 ]; then
failure "Failed to filter $ISO_REMASTER_DIR/isolinux/isolinux.cfg into $NEW_FILES_DIR/isolinux.cfg, error=$RESULT"
fi
cp -a "$NEW_FILES_DIR/isolinux.cfg" "$ISO_REMASTER_DIR/isolinux/isolinux.cfg" || failure "Failed to copy $NEW_FILES_DIR/isolinux.cfg to $ISO_REMASTER_DIR/isolinux/isolinux.cfg, error=$?"
fi
}
# pack_iso has one mandatory argument (the architecture of the ISO)
# and an optional second argument - the live ISO description
function pack_iso()
{
if [ ! -e "$ISO_REMASTER_DIR" ]; then
failure "ISO remastering directory does not exists"
fi
#skip boot.cat, isolinux.bin, md5sums.txt
#mismatches are for those files, because they are generated by mkisofs or by generating MD5 sums:
EXCLUDED_FROM_MD5="./isolinux/isolinux.bin ./isolinux/boot.cat ./md5sum.txt ./.checksum.md5 ./manifest.diff"
EXCLUDED_FROM_MD5_EXPRESSION=$(echo $EXCLUDED_FROM_MD5 | tr ' ' '|')
EXCLUDED_FROM_MD5_EXPRESSION="($EXCLUDED_FROM_MD5_EXPRESSION)"
echo "Updating md5sums..."
pushd "$ISO_REMASTER_DIR"
find . -type f -print0 | grep --null-data -v -E "$EXCLUDED_FROM_MD5_EXPRESSION" | xargs -0 md5sum | tee md5sum.txt | sed 's/ \.\// /g' >.checksum.md5
popd
echo "Packing ISO image..."
if [ -e "$CUSTOMIZE_DIR/iso_description" ] ; then
LIVECD_ISO_DESCRIPTION=`cat "$CUSTOMIZE_DIR/iso_description"`
elif [ -n "$2" ]; then
LIVECD_ISO_DESCRIPTION="$2"
else
LIVECD_ISO_DESCRIPTION="Remastered Ubuntu LiveCD"
fi
echo "ISO description set to: $LIVECD_ISO_DESCRIPTION"
MKISOFS_EXTRA_OPTIONS=""
if [ -e "$CUSTOMIZE_DIR/mkisofs_extra_options" ] ; then
MKISOFS_EXTRA_OPTIONS=`cat "$CUSTOMIZE_DIR/mkisofs_extra_options"`
fi
if [ "$1" = "ppc" ]; then
genisoimage -o "$NEW_FILES_DIR/$NEW_ISO_FILE_NAME" \
-p "Ubuntu Customization Kit - http://uck.sf.net" \
-probe -map "$UCK_LIBRARIES_DIR/hfs.map" -chrp-boot -iso-level 2 \
-part -no-desktop -r --netatalk -hfs \
-hfs-bless "$ISO_REMASTER_DIR/install" \
-x "$ISO_REMASTER_DIR"/casper/manifest.diff \
-V "$LIVECD_ISO_DESCRIPTION" \
-joliet-long \
$MKISOFS_EXTRA_OPTIONS \
"$ISO_REMASTER_DIR"
elif [ "$1" = "x86_64" ]; then
genisoimage -o "$NEW_FILES_DIR/$NEW_ISO_FILE_NAME" \
-b "isolinux/isolinux.bin" -c "isolinux/boot.cat" \
-p "Ubuntu Customization Kit - http://uck.sf.net" \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-V "$LIVECD_ISO_DESCRIPTION" -cache-inodes -r -J -l \
-x "$ISO_REMASTER_DIR"/casper/manifest.diff \
-joliet-long \
$MKISOFS_EXTRA_OPTIONS \
"$ISO_REMASTER_DIR"
elif [ "$1" = "ia64" ]; then
genisoimage -o "$NEW_FILES_DIR/$NEW_ISO_FILE_NAME" \
-b "isolinux/isolinux.bin" -c "isolinux/boot.cat" \
-no-emul-boot -V "$LIVECD_ISO_DESCRIPTION" -J -r \
-x "$ISO_REMASTER_DIR"/casper/manifest.diff \
-joliet-long \
$MKISOFS_EXTRA_OPTIONS \
"$ISO_REMASTER_DIR"
else
genisoimage -o "$NEW_FILES_DIR/$NEW_ISO_FILE_NAME" \
-b "isolinux/isolinux.bin" -c "isolinux/boot.cat" \
-p "Ubuntu Customization Kit - http://uck.sf.net" \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-V "$LIVECD_ISO_DESCRIPTION" -cache-inodes -r -J -l \
-x "$ISO_REMASTER_DIR"/casper/manifest.diff \
-joliet-long \
$MKISOFS_EXTRA_OPTIONS \
"$ISO_REMASTER_DIR"
fi
RESULT=$?
if [ $RESULT -ne 0 ]; then
failure "Failed to pack ISO image, error=$RESULT"
fi
if [ $HYBRID = 1 ]; then
if [ -e "/usr/bin/isohybrid" ] ; then
echo "Making your ISO hybrid..."
/usr/bin/isohybrid "$NEW_FILES_DIR/$NEW_ISO_FILE_NAME"
RESULT=$?
if [ $RESULT -ne 0 ]; then
failure "Failed to pack ISO image, error=$RESULT"
fi
else
failure "You asked for a hybrid ISO but isohybrid command was not found"
fi
fi
}
function generate_md5_for_new_iso()
{
echo "Generating md5sum for newly created ISO..."
cd $NEW_FILES_DIR
md5sum $NEW_ISO_FILE_NAME > $NEW_ISO_FILE_NAME.md5
}
######################
# some useful things #
######################
if [ -e libraries/remaster-live-cd.sh ]; then
UCK_LIBRARIES_DIR=./libraries
else
UCK_LIBRARIES_DIR=/usr/lib/uck/
fi
export LC_ALL=C
check_if_user_is_root
trap unmount_all EXIT
trap script_cancelled_by_user SIGINT