148 lines
4.7 KiB
Bash
Executable File
148 lines
4.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
source settings.sh
|
|
|
|
echo -n | mariadb -h $MYSQL_HOST -u $MYSQL_USER --password=$MYSQL_PASSWD $MYSQL_DB >/dev/null
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "unable to connect to database" >&2
|
|
exit 1
|
|
fi
|
|
|
|
help()
|
|
{
|
|
cat <<EOF >&2
|
|
options: -b|--bdr: prepare for BD-R media
|
|
-d|--dvdr: prepare for DVD-R media
|
|
-c|--cdr: prepare for CD-R media
|
|
-l|--dual-layer: prepare for dual-layer media (DVD-R/BD-R only)
|
|
-r|--reserve: reserve space for dvdisaster (default: 20%)
|
|
-e|--reserve-percent: change reserved percentage for dvdisaster
|
|
-p|--progress filename: write progress messages (default: /dev/null)
|
|
-h|--help: this message
|
|
EOF
|
|
}
|
|
|
|
progress=/dev/null
|
|
|
|
OPTS=`getopt -o bcdlrhp:e: --long bdr,cdr,dvdr,dual-layer,reserve,help,progress,reserve-percent -- "$@"`
|
|
eval set -- "$OPTS"
|
|
while true; do
|
|
case "$1" in
|
|
-b|--bdr) media=bdr; shift;;
|
|
-c|--cdr) media=cdr ; shift;;
|
|
-d|--dvdr) media=dvdr; shift;;
|
|
-l|--dual-layer) dual=1; shift;;
|
|
-r|--reserve) reserve=1; shift;;
|
|
-e|--reserve-percent) rsvpct="$2"; shift 2;;
|
|
-h|--help) help; exit 1;;
|
|
-p|--progress) progress="$2"; shift 2;;
|
|
--) shift; break;;
|
|
*) echo "Internal error" >&2; exit 1;;
|
|
esac
|
|
done
|
|
|
|
if [ "$media" == "" ]
|
|
then
|
|
help; exit 1
|
|
fi
|
|
|
|
case "$media" in
|
|
"bdr") if [ "$dual" == "1" ]; then cap=24438784; else cap=12219392; fi;;
|
|
"dvdr") if [ "$dual" == "1" ]; then cap=4171712; else cap=2295104; fi;;
|
|
"cdr") cap=360000;;
|
|
esac
|
|
|
|
if [ "$rsvpct" == "" ]
|
|
then
|
|
rsvpct=20
|
|
fi
|
|
|
|
if [ "$reserve" == "1" ]
|
|
then
|
|
#cap=`echo $cap/5\*4 | bc`
|
|
cap=`echo $cap $rsvpct | awk '{printf("%.0f\n", (1-$2/100)*$1)}'`
|
|
fi
|
|
|
|
# 29 Aug 14: estimate space needed for database backup, and deduct it
|
|
|
|
b1=`mariadb-dump -h $MYSQL_HOST -u $MYSQL_USER --password=$MYSQL_PASSWD -R $MYSQL_DB | xz -z9 | wc -c`
|
|
b2=`tar cJf - *.sh | wc -c`
|
|
total=`echo \( $b1 / 2048 + 1 \) + \( $b2 / 2048 + 1 \) | bc`
|
|
cap=`echo $cap - $total | bc`
|
|
|
|
#echo === Selecting files to copy === && \
|
|
cat <<EOF | mariadb -h $MYSQL_HOST -u $MYSQL_USER --password=$MYSQL_PASSWD $MYSQL_DB | grep -Pv "^filesize\tfilename\tfiledate$" >contents
|
|
update backup_index set discnum=null where discnum=-1;
|
|
call pick_files($cap);
|
|
select filesize, filename, filedate from backup_index where discnum=-1;
|
|
EOF
|
|
|
|
discnum=`echo "select max(discnum)+1 from backup_index;" | mariadb -h $MYSQL_HOST -u $MYSQL_USER --password=$MYSQL_PASSWD $MYSQL_DB | tail -n 1`
|
|
echo $discnum >>contents
|
|
|
|
cat <<EOF | mariadb -h $MYSQL_HOST -u $MYSQL_USER --password=$MYSQL_PASSWD $MYSQL_DB | grep -v "^filename$" >filelist
|
|
select filename from backup_index where discnum=-1;
|
|
EOF
|
|
|
|
#echo === Linking files === && \
|
|
if [ -e tmp ]
|
|
then
|
|
rm -r tmp
|
|
fi
|
|
mkdir tmp && \
|
|
ln -s "`readlink -f contents`" tmp/ && \
|
|
#sed "s/\(.*\)/d=\`dirname \"\1\"\`\nmkdir -p tmp\/\"\$d\"\nln -s $SEDROOTDIR\/\"\1\" tmp\/\"\1\"/" filelist | bash &&
|
|
sed "s/\`/\\\\\`/g;s/\(.*\)/d=\$\(dirname \"\1\"\)\nmkdir -p tmp\/\"\$d\"\nln -s $SEDROOTDIR\/\"\1\" tmp\/\"\1\"/" filelist | bash &&
|
|
|
|
# 29 Aug 14: include database and scripts in disc image
|
|
|
|
cat <<EOF | mariadb -h $MYSQL_HOST -u $MYSQL_USER --password=$MYSQL_PASSWD $MYSQL_DB
|
|
update backup_index set discnum=$discnum where discnum=-1;
|
|
EOF
|
|
|
|
mariadb-dump -h $MYSQL_HOST -u $MYSQL_USER --password=$MYSQL_PASSWD -R $MYSQL_DB | xz -z9 >tmp/backup_index.sql.xz
|
|
tar cJf tmp/backup_index_scripts.tar.xz *.sh
|
|
|
|
cat <<EOF | mariadb -h $MYSQL_HOST -u $MYSQL_USER --password=$MYSQL_PASSWD $MYSQL_DB
|
|
update backup_index set discnum=-1 where discnum=$discnum;
|
|
EOF
|
|
|
|
#echo === Building backup_$discnum.iso ===
|
|
|
|
# old cdrtools?
|
|
#mkisofs -iso-level 3 -f -JR -udf -V backup_$discnum -o backup_$discnum.iso tmp &>>"$progress"
|
|
|
|
# cdrkit:
|
|
#mkisofs -allow-limited-size -iso-level 3 -f -r -udf -V backup_$discnum -o backup_$discnum.iso tmp &>>"$progress"
|
|
|
|
# cdrtools:
|
|
mkisofs -iso-level 3 -f -r -udf -V backup_$discnum -o backup_$discnum.iso tmp &>>"$progress"
|
|
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "error in mkisofs"
|
|
exit $?
|
|
fi
|
|
rm filelist contents && \
|
|
rm -r tmp && mkdir tmp && \
|
|
|
|
#echo === Gathering MD5 sums === && \
|
|
sudo mount -o loop,ro backup_$discnum.iso tmp && \
|
|
(cd tmp; find . -type f | sed "s/^\.\///" | grep -v ^contents\$ | sed "s/^/\"/;s/\$/\"/" | xargs md5sum) >backup_$discnum.sums && \
|
|
sudo umount tmp && \
|
|
rmdir tmp && \
|
|
|
|
#echo === Updating index ===
|
|
sed "s/'/''/g;s/\([0-9a-f]*\) \(.*\)/update backup_index set discnum=$discnum, md5='\1' where filename='\2';/" backup_$discnum.sums | mariadb -h $MYSQL_HOST -u $MYSQL_USER --password=$MYSQL_PASSWD $MYSQL_DB
|
|
|
|
if [ "$reserve" == "1" ]
|
|
then
|
|
# echo === Augmenting image with recovery data ===
|
|
dvdisaster -mRS03 -x 4 -ci backup_$discnum.iso &>>"$progress"
|
|
fi
|
|
|
|
#echo === Done preparing backup_$discnum.iso. ===
|
|
echo "backup_$discnum.iso"
|
|
rm backup_$discnum.sums
|