#!/bin/sh

# mybackuptool.sh
# ---------------
# 
# Quick 'n' dirty backup tool for my home needs
# ---------------------------------------------
# Coded by: d1s4st3r
# E-Mail:   d1s4st3r [at] gmail [dot] com)
# Website:  http://xoomer.virgilio.it/mental_insomnia/
# ICQ:      303201806


# Welcome header
clear
echo "+--------------------------+"
echo "|+------------------------+|"
echo "||     My Backup Tool     ||"
echo "|+------------------------+|"
echo "+--------------------------+"
echo


# Directories that need to be backed up (change for your needs)

MYDIR[0]="/etc"
MYDIR[1]="/boot"
MYDIR[2]="/home/foo"
MYDIR[3]="/usr/local/share"
###   MYDIR[n] = "<path>"

#Array index stuff
i=0 # index counter (first position)
UPPERLIMIT=3 # index's last position (NOTE: UPPERLIMIT must equals n where n is MYDIR[n] index value)


# Checks if you are r00t

if [ ! "`id -u`" = "0" ]; then
    echo "Sorry, only r00t may run this program!"
    exit 1
fi


# r00t's home directory

ROOTHOMEDR=`cd ~root && pwd`
cd $ROOTHOMEDR


# System infos

SYSTEMINFO=`uname -a`


# Backup's log file

BACKUPLOGF="/var/log/backup_log.log"


# Errors log file

BACKUPLOGE="/var/log/backup_err.log"


# Date of backup

BACKUPDATE=`date +%F`


# Beginning time of backup

BACKUPSTTM=`date +%T`


# Ending time of backup (use at end of file for calculate passed time - not yet implemented)

#BACKUPENTM = ...


# Defines backup partition

BACKUPPART="/dev/hda3"


# Defines backup partition's filesystem

BACKUPPTFS="ext2"


# Defines backup partition's mount point

BACKUPMNTP="/mnt/backup"


# Sets the backup directory for current backup

BACKUPCDIR="`date +%Y%m%d_%H%M%S`"


echo "------( $BACKUPDATE )------" >> $BACKUPLOGF
echo "$BACKUPSTTM - STARTING BACKUP" >> $BACKUPLOGF


# Checks if backup partition is mounted or not (mounts it in case)

if [ -z "`mount | grep $BACKUPPART`" ]; then
    echo "Backup partition do not seems to be mounted."
    echo "Mounting \"$BACKUPPART\" on \"$BACKUPMNTP\" with $BACKUPPTFS filesystem..."
    mount $BACKUPPART -t $BACKUPPTFS $BACKUPMNTP
    echo "Backup partition has been mounted."
    echo "`date +%T` - Mounted backup partition \"$BACKUPPART\" on \"$BACKUPMNTP\" with \"$BACKUPPTFS\" filesystem." >> $BACKUPLOGF
    echo
fi


# Makes the Backup(TM) begin!!!

echo "o------------------------------------------------------------------o"
echo "| Starting backup procedure on $BACKUPDATE at $BACKUPSTTM              |"
echo "o------------------------------------------------------------------o"
echo


echo -n "Creating backup directory \"$BACKUPMNTP/$BACKUPCDIR\"..."
mkdir $BACKUPMNTP/$BACKUPCDIR
echo " done!"
echo "Ready to backup `echo $UPPERLIMIT+1 | bc -l` directories!"
echo

while [ "$i" -le "$UPPERLIMIT" ]; do
  echo "o------------------------------------------------------------------o"
  echo "| Considering \"${MYDIR[$i]}\" directory (size: `du -csh ${MYDIR[$i]} | tail -n 1 | awk '{print $1}'`B)..."
  echo -n "|---> Archiving directory..."
  BACKUPTBFN=`echo ${MYDIR[$i]} | sed -e 's/\//__/g'`
  tar -cvvf $BACKUPMNTP/$BACKUPCDIR/$BACKUPTBFN.tar ${MYDIR[$i]} 2> $BACKUPLOGE &> /dev/null
  echo " done!"
  echo "${MYDIR[$i]}" >> $BACKUPMNTP/$BACKUPCDIR.DIRLIST.txt
  echo -n "|---> Compressing archive..."
  sleep 3
  bzip2 $BACKUPMNTP/$BACKUPCDIR/$BACKUPTBFN.tar 2> $BACKUPLOGE &> /dev/null
  echo " done!"
  echo "`date +%T` - \"${MYDIR[$i]}\" directory (`du -csh ${MYDIR[$i]} | tail -n 1 | awk '{print $1}'`B) backed up." >> $BACKUPLOGF
  let "i += 1"
done


echo "o------------------------------------------------------------------o"
echo -n "|===> Creating final archive..."
cd $BACKUPMNTP
tar -cvvf $BACKUPCDIR.tar $BACKUPCDIR 2> $BACKUPLOGE &> /dev/null
echo " done!"
echo -n "|===> Compressing final archive..."
sleep 3
bzip2 $BACKUPCDIR.tar 2> $BACKUPLOGE &> /dev/null
echo "`date +%T` - \"$BACKUPMNTP/$BACKUPCDIR\" final directory (`du -csh $BACKUPMNTP/$BACKUPCDIR | tail -n 1 | awk '{print $1}'`B) backed up." >> $BACKUPLOGF
rm -r $BACKUPCDIR 2> $BACKUPLOGE &> /dev/null
echo " done!"
sleep 3


echo "|"
echo -n "| Unmounting backup partition \"$BACKUPPART\"..."
(umount $BACKUPPART || umount $BACKUPMNTP) 2> $BACKUPLOGE &> /dev/null
sleep 1
echo " done!"
echo "`date +%T` - Unmounted backup partition \"$BACKUPPART\"." >> $BACKUPLOGF


echo "|"
echo "o------------------------------------------------------------------o"
echo "| Backup procedure finished successfully on `date +%F` at `date +%T` |"
echo "o------------------------------------------------------------------o"

echo -e "`date +%T` - BACKUP FINISHED\n\n" >> $BACKUPLOGF

cd $ROOTHOMEDR

