#!/bin/bash

crw=false
lrw=false
cnt=
drw=
 
########################################################################

function usage {

echo "
This script is made to run in a *live-only* session
in order to backup overlayed persistent data.

Usage:    $0 [directory-of-tarball with full path]
Examples: $0        # try to use 'usbdata' partition
          $0 /media/$USER/data  # not relative path"  
}

function getcnt {

cnt=$(sudo lsblk -lo label | grep "$1" | wc -l)
}

function getdrw {

drw=$(sudo lsblk -lo name,label | grep "$1" | cut -d ' ' -f 1)
drw=/dev/"$drw"
}
########################################################################

# main

########################################################################

if [ "$1" == "-h" ] || [ "$1" == "--help" ]
then
 usage
 exit
fi

distr=$(grep -i '^ID=' /etc/*release|sed s/.*ID=//)

if [ "$distr" != "ubuntu" ]
then
 echo "$0 works only for Ubuntu and distros based on Ubuntu"
 exit
fi

# checking partitions that store persistent overlay data

getcnt casper-rw
if [ $cnt -eq 1 ]
then
 crw=true
elif [ $cnt -gt 1 ]
then
 echo "More than one casper-rw partition."
 echo "Please remove/rename all but one for the backup to work!"
 exit
fi
getcnt writable
if [ $cnt -eq 1 ]
then
 lrw=true
elif [ $cnt -gt 1 ]
then
 echo "More than one 'writable' partition."
 echo "Please remove/rename all but one for the backup to work!"
 exit
fi

#echo "crw=$crw; lrw=$lrw"

if $crw && $lrw
then
 echo "Both 'casper-rw' partition and 'writable' partition."
 read -p "Select casper-rw: c or writable: w " sel
 if [ "$sel" == "c" ]
 then
  srw="casper-rw"
  getdrw casper-rw
 elif [ "$sel" == "w" ]
 then
  srw="writable"
  getdrw writable
 else
  exit
 fi
elif ! $crw && ! $lrw
then
 echo "Neither a 'casper-rw' nor a 'writable' partition found"
 exit
elif $crw
then
 srw="casper-rw"
 getdrw casper-rw
elif $lrw
then
 srw="writable"
 getdrw writable
fi

#echo "drw=$drw"
sudo umount "$drw"

mnt=$(mktemp -d)
sudo mount "$drw" "$mnt"

rw0=$(df | grep -m 1 -e "$drw")
rw=$(echo "$rw0"|tr -s ' ' ' '|sed 's#[^ ]* ##'|sed 's# [^ ]*$##')
rt=$(df | grep '/$'|tr -s ' ' ' '|sed 's#[^ ]* ##'|sed 's# [^ ]*$##')

#echo "rt=$rt"
#echo "rw=$rw"

if [ "$rt" == "$rw" ]
then
 echo "$0: You are running a persistent live session."
 echo "Please reboot into a *live-only* session or from another drive!"
 sudo umount "$drw"
 rmdir "$mnt"
 exit
elif [ "$rw" == "" ]
then
 echo "$0: Running in a *live-only* session or from another drive,"
 echo "to backup overlayed persistent data, but no such data found."
 sudo umount "$drw"
 rmdir "$mnt"
 exit
fi

minrel=14.04
if [ "$1" == "" ]
then
 drels=$(grep 'DISTRIB_RELEASE' /etc/lsb-release|cut -d = -f 2)
 drels=${drels//.}
 if [ $? -ne 0 ] || [ $drels -lt ${minrel//.} ]
 then
  tdir="/media/usbdata"
 else
  tdir="/media/$USER/usbdata"
 fi
else
 tdir="$1"
fi
#echo "tdir=$tdir"

user=$(whoami)
if ! test -d "$tdir" || [ "${tdir:0:1}" != "/" ]
then
 echo "no directory of tarball found"
 usage
 echo ""
 sudo umount "$drw"
 rmdir "$mnt"
 exit
fi

read -p "Do you want to back up to '$tdir'? " ans
if [ "$ans" != "y" ]
then
 sudo umount "$drw"
 rmdir "$mnt"
 exit
fi

# unmount

drw=${rw0/ *}
sudo umount "$drw"

# check/repair

sudo e2fsck -f "$drw"

# mount again

sudo mount "$drw" "$mnt"

# select tarball name

#echo "srw=$srw###############"

cd "$tdir"
tarball=$(ls -1 *-$srw.tar.gz|sed "s/-$srw/ $srw/"|sort -n|tail -n1)
#echo "0: tarball=$tarball"
if [ "$tarball" != "" ]
then
# echo "1: tarball=$tarball"
 tnum="${tarball/ *}"
# echo "1: tnum=$tnum"
 tarball="${tarball/* }"
 tnum=$((tnum+1))
# echo "2: tnum=$tnum"
 tarball="$tnum-$tarball"
else
 tarball="1-$srw.tar.gz"
fi
#echo "2: tarball=$tarball" 

# make a tarball (backup) of the overlayed persistent data

cd "$mnt"

sudo tar --one-file-system --exclude=upper/media -cvzf "$tdir/$tarball" .
#touch "$tdir/$tarball"  ################## during testing

if [ $? -eq 0 ]
then
 echo "Backup to '$tdir/$tarball' successful"
else
 echo "Backup to '$tdir/$tarball' failed"
fi
echo "Wait while 'sync' flushes the buffers ..."
cd
sudo umount "$drw"
rmdir "$mnt"
echo "Done :-)"
