Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| #!/bin/sh | |
| ## live-partial-squashfs-updates - Generate partial squashfs updates. | |
| ## Copyright (C) 2013-2015 Richard Nelson <unixabg@gmail.com> | |
| ## | |
| ## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING. | |
| ## This is free software, and you are welcome to redistribute it | |
| ## under certain conditions; see COPYING for details. | |
| set -e | |
| #set -x | |
| Cleanup_mounts () { | |
| echo "Unmounting the areas we created." | |
| for mount_point in "${_MOUNTLIST}"; do | |
| umount -l $mount_point | |
| rmdir $mount_point | |
| done | |
| # The upperdir and work dir need to be cleaned up also. | |
| rm -rf ./psu_overlay_rw ./psu_overlay_work | |
| } | |
| _MOUNTDIR="" | |
| _MOUNTLIST="./filesystem_squashfs ./psu_overlay" | |
| _LSTACK="./filesystem_squashfs" | |
| for squash_file in $(ls ./psu-*.squashfs); do | |
| # Setup mount for the squashfs images. | |
| # Note that we stack here on the listing provided by ls command. | |
| _MOUNTDIR="$(basename $squash_file .squashfs)_squashfs" | |
| echo "Found $squash_file and setting up mount point of ${_MOUNTDIR}" | |
| if [ ! -d "${_MOUNTDIR}" ]; then | |
| mkdir "${_MOUNTDIR}" | |
| fi | |
| mount -o loop "./$squash_file" "./${_MOUNTDIR}" | |
| # The lowerdir stacks the list from right to left, hence the filesystem.squashfs | |
| # is the last one in the list, so we pre-append names to the list. | |
| _LSTACK="./${_MOUNTDIR}:${_LSTACK}" | |
| _MOUNTLIST="./${_MOUNTDIR} ${_MOUNTLIST}" | |
| done | |
| echo "${_LSTACK}" | |
| echo "${_MOUNTLIST}" | |
| # Setup mount for the filesystem.squashfs mount. | |
| if [ ! -d "filesystem_squashfs" ]; then | |
| mkdir filesystem_squashfs | |
| fi | |
| mount -o loop ./filesystem.squashfs ./filesystem_squashfs | |
| # Setup mount for the overlay upperdir which is rw which we will squash later. | |
| if [ ! -d "psu_overlay_rw" ]; then | |
| mkdir psu_overlay_rw | |
| fi | |
| # Setup mount for the overlay work folder which appears to be required. | |
| if [ ! -d "psu_overlay_work" ]; then | |
| mkdir psu_overlay_work | |
| fi | |
| # Setup mount for the overlay where we stack ro squashfs list. | |
| if [ ! -d "psu_overlay" ]; then | |
| mkdir psu_overlay | |
| fi | |
| _DEFAULTRUNTYPE="C" | |
| echo "#############################################################" | |
| echo " (C)hroot - Chroot in to the filesystem.squashfs + psu-*.squashfs stack." | |
| echo " (J)oin - Join the partial squashfs update files to new single psu-DATE.squashfs" | |
| echo " (N)ew - New master filesystem.squashfs file which joins all *.squashfs file to new single filesystem.squashfs" | |
| echo "Select run type (default is ${_DEFAULTRUNTYPE}):" | |
| read _RUNTYPE | |
| _RUNTYPE="${_RUNTYPE:-${_DEFAULTRUNTYPE}}" | |
| if [ ${_RUNTYPE} = "C" ] | |
| then | |
| #mount -t overlay overlay -olowerdir=./psu-2_squashfs:./psu-1_squashfs:filesystem_squashfs,upperdir=./psu_overlay_rw,workdir=./psu_overlay_work ./psu_overlay | |
| mount -t overlay overlay -olowerdir="${_LSTACK}",upperdir=./psu_overlay_rw,workdir=./psu_overlay_work ./psu_overlay | |
| echo "You selected to run a chroot" | |
| echo "Setup the chroot to overlay mount." | |
| echo "Mounting bindings for dev, proc, sys, pts in overlay." | |
| mount --bind /dev ./psu_overlay/dev | |
| mount --bind /proc ./psu_overlay/proc | |
| mount --bind /sys ./psu_overlay/sys | |
| mount --bind /dev/pts ./psu_overlay/dev/pts | |
| echo "Backup the overlay/etc/hosts." | |
| mv ./psu_overlay/etc/hosts ./hosts.bak | |
| echo "Copying /etc/hosts to overlay/etc/hosts." | |
| cp /etc/hosts ./psu_overlay/etc/hosts | |
| echo "Backup the overlay/etc/resolv.conf." | |
| mv ./psu_overlay/etc/resolv.conf ./resolv.conf.bak | |
| echo "Copying /etc/resolv.conf to the overlay/etc/resolv.conf." | |
| cp /etc/resolv.conf ./psu_overlay/etc/resolv.conf | |
| echo "Starting chroot in the overlay directory." | |
| chroot ./psu_overlay /bin/bash | |
| echo "Exited the chroot so time to clean up." | |
| umount -l ./psu_overlay/dev | |
| umount -l ./psu_overlay/proc | |
| umount -l ./psu_overlay/sys | |
| echo "Restore original overlay/etc/hosts." | |
| mv ./hosts.bak ./psu_overlay/etc/hosts | |
| echo "Restore overlay/etc/resolv.conf." | |
| mv ./resolv.conf.bak ./psu_overlay/etc/resolv.conf | |
| echo "Remove overlay/root/.bash_history." | |
| rm ./psu_overlay/root/.bash_history | |
| # Prompt to save changes or not. | |
| _DEFAULTYESNO="N" | |
| echo "#############################################################" | |
| echo " (Y)es save my chroot modifications." | |
| echo " (N)o do not save my chroot modifications." | |
| echo "Select to save your chroot modifications (default is ${_DEFAULTYESNO}): | |
| " | |
| read _YESNO | |
| _YESNO="${_YESNO:-${_DEFAULTYESNO}}" | |
| if [ ${_YESNO} = "Y" ] | |
| then | |
| _DATE=$(date +%Y%m%d-%H%M%S) | |
| echo "Now making the updated squashfs ${_DATE}." | |
| mksquashfs ./psu_overlay_rw psu-${_DATE}.squashfs | |
| # Since we use sed to put text at the top of the file make sure the file exists. | |
| if [ ! -e psu-changelog.txt ] | |
| then | |
| echo "Created changelog." >> psu-changelog.txt | |
| fi | |
| # Add entry to changelog for the psu file. | |
| echo "Please provide a small changelog entry for the psu-${_DATE}.squashfs :" | |
| read _NOTES | |
| sed -i "1s/^/${_DATE} - ${_NOTES}.\n/" psu-changelog.txt | |
| else | |
| echo "No chroot modifications saved to a psu file." | |
| fi | |
| Cleanup_mounts | |
| elif [ ${_RUNTYPE} = "J" ] || [ ${_RUNTYPE} = "N" ] | |
| then | |
| if [ ${_RUNTYPE} = "J" ] | |
| then | |
| # Modify the _LSTACK to not include the filesystem_squashfs mount so we just stack the updates together | |
| _LSTACK=$(echo ${_LSTACK} | sed s@:./filesystem_squashfs@@g) | |
| _ACTIONTYPE="join psu squashfs files to new single psu-DATE.squashfs" | |
| else | |
| _ACTIONTYPE="create a new single filesystem.squashfs" | |
| fi | |
| echo "${_LSTACK}" | |
| #mount -t overlay overlay -olowerdir=./psu-2_squashfs:./psu-1_squashfs,upperdir=./psu_overlay_rw,workdir=./psu_overlay_work ./psu_overlay | |
| mount -t overlay overlay -olowerdir="${_LSTACK}",upperdir=./psu_overlay_rw,workdir=./psu_overlay_work ./psu_overlay | |
| # Prompt to join squashfs files or not. | |
| _DEFAULTYESNO="N" | |
| echo "#############################################################" | |
| echo " (Y)es, ${_ACTIONTYPE}." | |
| echo " (N)o, do not ${_ACTIONTYPE}." | |
| echo "Select to ${_ACTIONTYPE} (default is ${_DEFAULTYESNO}): | |
| " | |
| read _YESNO | |
| _YESNO="${_YESNO:-${_DEFAULTYESNO}}" | |
| if [ ${_YESNO} = "Y" ] | |
| then | |
| # Since we use sed to put text at the top of the file make sure the file exists. | |
| if [ ! -e psu-changelog.txt ] | |
| then | |
| echo "Created changelog." >> psu-changelog.txt | |
| fi | |
| _DATE=$(date +%Y%m%d-%H%M%S) | |
| if [ ${_RUNTYPE} = "N" ] | |
| then | |
| if [ ! -d "new_squashfs" ]; then | |
| mkdir new_squashfs | |
| fi | |
| echo "Now making a new and updated filesystem.squashfs." | |
| mksquashfs ./psu_overlay ./new_squashfs/filesystem.squashfs | |
| # Add entry to changelog for the joining of the *.squashfs files to a new filesystem.squashfs. | |
| sed -i "1s/^/******* ${_DATE} - New filesystem.squashfs generated. ********\n/" psu-changelog.txt | |
| else | |
| echo "Now making the updated squashfs ${_DATE} from overlay." | |
| mksquashfs ./psu_overlay psu-${_DATE}.squashfs | |
| # Add entry to changelog for the joining of the psu files. | |
| sed -i "1s/^/******* ${_DATE} - Joined squashfs files. ********\n/" psu-changelog.txt | |
| fi | |
| else | |
| echo "No psu files will be joined." | |
| fi | |
| Cleanup_mounts | |
| # Remove old directories and move old partials out. | |
| if [ ${_YESNO} = "Y" ] | |
| then | |
| if [ ! -d "psu_overlay_rw-OLD-${_DATE}" ]; then | |
| mkdir psu-OOS-${_DATE} | |
| fi | |
| if [ ${_RUNTYPE} = "N" ] | |
| then | |
| rsync -av --remove-source-files ./psu-*.squashfs ./psu-OOS-${_DATE}/ | |
| rsync -av --remove-source-files ./filesystem.squashfs ./psu-OOS-${_DATE}/ | |
| rsync -av --remove-source-files ./new_squashfs/filesystem.squashfs ./ | |
| rmdir ./new_squashfs | |
| else | |
| rsync -av --remove-source-files --exclude psu-${_DATE}.squashfs ./psu-*.squashfs ./psu-OOS-${_DATE}/ | |
| fi | |
| else | |
| echo "No rsync of current partials to an Out Of Service folder will occur." | |
| fi | |
| else | |
| echo "You entered an unknowon choice!" | |
| echo "Aborting." | |
| Cleanup_mounts | |
| exit 1 | |
| fi | |
| echo "All done goodbye!" | |
| exit 0 |