gen2stage4/mkstage4.sh

239 lines
5.4 KiB
Bash
Raw Normal View History

2014-05-18 17:52:33 -04:00
#!/bin/bash
# checks if run as root:
if ! [ "`whoami`" == "root" ]
then
echo "`basename $0`: must be root."
exit 1
fi
#set flag variables to null
EXCLUDE_BOOT=0
EXCLUDE_CONNMAN=0
2016-02-19 15:15:25 -05:00
EXCLUDE_LOST=0
QUIET=0
USER_EXCL=""
S_KERNEL=0
x86_64=0
PARALLEL=0
if [ `getconf LONG_BIT` = "64" ]
then
x86_64=1
fi
2016-02-11 01:51:15 -05:00
USAGE="usage:\n\
`basename $0` [-q -c -b -l -k -p] [-s || -t <target-mountpoint>] [-e <additional excludes dir*>] <archive-filename> [custom-tar-options]\n\
2016-02-11 01:51:15 -05:00
-q: activates quiet mode (no confirmation).\n\
-c: excludes connman network lists.\n\
-b: excludes boot directory.\n\
2016-02-19 15:15:25 -05:00
-l: excludes lost+found directory.\n\
-p: compresses parallelly using pbzip2.\n\
2018-05-11 00:27:22 -04:00
-e: an additional excludes directory (one dir one -e, donot use it with *).\n\
2016-02-11 01:51:15 -05:00
-s: makes tarball of current system.\n\
2018-05-11 00:27:22 -04:00
-k: separately save current kernel modules and src (smaller & save decompression time).\n\
2016-02-11 01:51:15 -05:00
-t: makes tarball of system located at the <target-mountpoint>.\n\
-h: displays help message."
2014-05-18 17:52:33 -04:00
# reads options:
while getopts ':t:e:skqcblph' flag; do
2014-05-18 17:52:33 -04:00
case "${flag}" in
t)
TARGET="$OPTARG"
;;
s)
TARGET="/"
;;
q)
QUIET=1
;;
k)
S_KERNEL=1
2019-05-08 16:16:42 -04:00
;;
2014-05-18 17:52:33 -04:00
c)
EXCLUDE_CONNMAN=1
;;
b)
EXCLUDE_BOOT=1
;;
l)
2016-02-19 15:15:25 -05:00
EXCLUDE_LOST=1
;;
e)
USER_EXCL+=" --exclude=${OPTARG}"
;;
p)
PARALLEL=1
;;
2016-02-11 01:51:15 -05:00
h)
echo -e "$USAGE"
exit 0
;;
2014-05-18 17:52:33 -04:00
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
2016-02-11 01:45:57 -05:00
if [ "$TARGET" == "" ]
then
echo "`basename $0`: no target specified."
2016-02-11 01:51:15 -05:00
echo -e "$USAGE"
2016-02-11 01:45:57 -05:00
exit 1
fi
2017-03-22 12:17:24 -04:00
# make sure TARGET path ends with slash
if [ "`echo $TARGET | grep -c '\/$'`" -le "0" ]
then
TARGET="${TARGET}/"
fi
2014-05-18 17:52:33 -04:00
# shifts pointer to read mandatory output file specification
shift $(($OPTIND - 1))
ARCHIVE=$1
# checks for correct output file specification
if [ "$ARCHIVE" == "" ]
then
echo "`basename $0`: no archive file name specified."
2016-02-11 01:51:15 -05:00
echo -e "$USAGE"
2014-05-18 17:52:33 -04:00
exit 1
fi
# checks for quiet mode (no confirmation)
if [ ${QUIET} -eq 1 ]
then
AGREE="yes"
fi
# determines if filename was given with relative or absolute path
2016-01-26 18:16:58 -05:00
if [ "`echo $ARCHIVE | grep -c '^\/'`" -gt "0" ]
2014-05-18 17:52:33 -04:00
then
STAGE4_FILENAME="${ARCHIVE}.tar.bz2"
else
STAGE4_FILENAME="`pwd`/${ARCHIVE}.tar.bz2"
fi
#Shifts pointer to read custom tar options
shift;OPTIONS="$@"
if [ ${S_KERNEL} -eq 1 ]
then
2018-05-11 00:27:22 -04:00
USER_EXCL+=" --exclude=${TARGET}usr/src/* "
if [ ${x86_64} -eq 1 ]
then
USER_EXCL+=" --exclude=${TARGET}lib64/modules/* "
else
USER_EXCL+=" --exclude=${TARGET}lib/modules/* "
fi
fi
2014-05-18 17:52:33 -04:00
# Excludes:
EXCLUDES="\
2017-03-22 12:17:24 -04:00
--exclude=${TARGET}home/*/.bash_history \
--exclude=${TARGET}dev/* \
--exclude=${TARGET}var/tmp/* \
2017-03-22 12:17:24 -04:00
--exclude=${TARGET}media/* \
--exclude=${TARGET}mnt/*/* \
--exclude=${TARGET}proc/* \
--exclude=${TARGET}run/* \
--exclude=${TARGET}sys/* \
--exclude=${TARGET}tmp/* \
--exclude=${TARGET}usr/portage/* \
--exclude=${TARGET}var/lock/* \
--exclude=${TARGET}var/log/* \
--exclude=${TARGET}var/run/* \
--exclude=${TARGET}var/lib/docker/*"
2014-05-18 17:52:33 -04:00
EXCLUDES+=$USER_EXCL
2014-05-18 17:52:33 -04:00
if [ "$TARGET" == "/" ]
then
2016-01-26 17:49:29 -05:00
EXCLUDES+=" --exclude=${STAGE4_FILENAME#/}"
2014-05-18 17:52:33 -04:00
fi
if [ ${EXCLUDE_CONNMAN} -eq 1 ]
then
2017-03-22 12:17:24 -04:00
EXCLUDES+=" --exclude=${TARGET}var/lib/connman/*"
2014-05-18 17:52:33 -04:00
fi
if [ ${EXCLUDE_BOOT} -eq 1 ]
then
2017-03-22 12:17:24 -04:00
EXCLUDES+=" --exclude=${TARGET}boot/*"
2014-05-18 17:52:33 -04:00
fi
if [ ${EXCLUDE_LOST} -eq 1 ]
then
EXCLUDES+=" --exclude=lost+found"
fi
2014-05-18 17:52:33 -04:00
# Generic tar options:
TAR_OPTIONS="-cpP --ignore-failed-read --xattrs-include='*.*' --numeric-owner"
if [ ${PARALLEL} -eq 1 ]
then
if hash pbzip2 2>/dev/null; then
TAR_OPTIONS+=" --use-compress-prog=pbzip2"
else
echo "WARING: pbzip2 isn't installed, single-threaded compressing is used."
TAR_OPTIONS+=" -j"
fi
else
TAR_OPTIONS+=" -j"
fi
2014-05-18 17:52:33 -04:00
# if not in quiet mode, this message will be displayed:
if [ "$AGREE" != "yes" ]
then
echo "Are you sure that you want to make a stage 4 tarball of the system"
2014-05-20 19:21:51 -04:00
echo "located under the following directory?"
echo "$TARGET"
2014-05-18 17:52:33 -04:00
echo ""
echo "WARNING: since all data is saved by default the user should exclude all"
echo "security- or privacy-related files and directories, which are not"
echo "already excluded by mkstage4 options (such as -c), manually per cmdline."
2014-05-18 17:52:33 -04:00
echo "example: \$ `basename $0` -s /my-backup --exclude=/etc/ssh/ssh_host*"
echo ""
2016-02-11 01:55:30 -05:00
echo "COMMAND LINE PREVIEW:"
2017-03-22 12:17:24 -04:00
echo "tar $TAR_OPTIONS $EXCLUDES $OPTIONS -f $STAGE4_FILENAME ${TARGET}*"
2018-05-11 00:27:22 -04:00
if [ ${S_KERNEL} -eq 1 ]
then
echo ""
echo "tar $TAR_OPTIONS -f $STAGE4_FILENAME.ksrc ${TARGET}usr/src/linux-$(uname -r)*"
if [ ${x86_64} -eq 1 ]
then
echo ""
echo "tar $TAR_OPTIONS -f $STAGE4_FILENAME.kmod ${TARGET}lib64/modules/$(uname -r)*"
else
echo ""
echo "tar $TAR_OPTIONS -f $STAGE4_FILENAME.kmod ${TARGET}lib/modules/$(uname -r)*"
2019-05-08 16:16:42 -04:00
fi
2018-05-11 00:27:22 -04:00
fi
2014-05-18 17:52:33 -04:00
echo ""
echo -n "Type \"yes\" to continue or anything else to quit: "
read AGREE
fi
# start stage4 creation:
if [ "$AGREE" == "yes" ]
then
2017-03-22 12:17:24 -04:00
tar $TAR_OPTIONS $EXCLUDES $OPTIONS -f $STAGE4_FILENAME ${TARGET}*
if [ ${S_KERNEL} -eq 1 ]
then
2018-05-11 00:27:22 -04:00
tar $TAR_OPTIONS -f $STAGE4_FILENAME.ksrc ${TARGET}usr/src/linux-$(uname -r)*
if [ ${x86_64} -eq 1 ]
then
2018-05-11 00:27:22 -04:00
tar $TAR_OPTIONS -f $STAGE4_FILENAME.kmod ${TARGET}lib64/modules/$(uname -r)*
else
2018-05-11 00:27:22 -04:00
tar $TAR_OPTIONS -f $STAGE4_FILENAME.kmod ${TARGET}lib/modules/$(uname -r)*
2019-05-08 16:16:42 -04:00
fi
fi
2014-05-18 17:52:33 -04:00
fi
exit 0