/ Published in: Bash
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
#!/bin/bash # # Version 0.04 - JF Nutbroek 2008 # # Various Paths SCRIPT="/root/tools" HTFOLDER="/opt/lampp/htdocs" MYSQL="/opt/lampp/bin/mysql" MYSQLDUMP="/opt/lampp/bin/mysqldump" BACKUPLOC="/backups" # temporary file TEMP=/tmp/answer$$ # set default values MIRROR="" ; USERNAME="root" ; PASSWORD="" EXCLUDEDB="" ; EXCLUDEHTDOCS="" ; FTP="yes" ; FTPDUMP="no" FTPUSERNAME="anonymous" ; FTPPASSWORD="root@localhost" ; FTPIP="" FTPDIR="/backups" ; LASTWEEK="yes" ; SAVE="no" ; ONEDAY="no" # clean up and exit clean_up() { setterm -background black clear rm -f $TEMP >/dev/null 2>&1 exit } # Note: The functions startftp, stopftp, enable and disable # need to be modified according to the Linux system in use # Code starts here if [ -f "$SCRIPT/.backup" ]; then . $SCRIPT/.backup fi startftp() { SERVICE="vsftpd" RUNNING=`ps ax | grep -v grep | grep $SERVICE` if [ "$RUNNING" = "" ]; then sh /etc/rc.d/rc.vsftpd start >/dev/null 2>&1 fi } stopftp() { SERVICE="vsftpd" RUNNING=`ps ax | grep -v grep | grep $SERVICE` if [ ! "$RUNNING" = "" ]; then sh /etc/rc.d/rc.vsftpd stop >/dev/null 2>&1 fi } disable() { if [ -f "/etc/cron.daily/startbackup.sh" ]; then rm /etc/cron.daily/startbackup.sh fi echo "Backup has been disabled" } enable() { echo "#!/bin/bash" > /etc/cron.daily/startbackup.sh echo "sh $SCRIPT/backup.sh start" >> /etc/cron.daily/startbackup.sh chmod 0755 /etc/cron.daily/startbackup.sh echo "Backup has been enabled" } check() { OUT=$? if [ ! $OUT -eq 0 ]; then echo "Error! - Please check your configuration" exit 2 fi } start() { # Get todays date DAYOFWEEK=`date +%a` TODAY=`date +%F%t%R` # Check if configurationfile is available if [ ! -f "$SCRIPT/.backup" ]; then echo "Please configure the backup first!" exit 2 fi # Stop FTP service if [ "$FTP" = "yes" ]; then stopftp fi # Create required directories if [ ! -d $BACKUPLOC ]; then mkdir $BACKUPLOC fi cd $BACKUPLOC check if [ "$ONEDAY" = "yes" ]; then rm -r * >/dev/null 2>&1 fi if [ ! -d daily ]; then mkdir daily check fi if [ "$LASTWEEK" = "yes" ]; then if [ ! -d lastweek ]; then mkdir lastweek check fi fi cd daily check if [ ! -d $DAYOFWEEK ]; then mkdir $DAYOFWEEK check fi # Redirect I/O if [ -f $BACKUPLOC/daily/$DAYOFWEEK/.logfile ]; then rm $BACKUPLOC/daily/$DAYOFWEEK/.logfile else touch $BACKUPLOC/daily/$DAYOFWEEK/.logfile fi exec 6>&1 exec > $BACKUPLOC/daily/$DAYOFWEEK/.logfile exec 7>&2 exec 2> $BACKUPLOC/daily/$DAYOFWEEK/.logfile # Start backup of HTDOCS directory cd $HTFOLDER check HTDOCSNAMES="`find -type d -maxdepth 1 | sed 's/\.//g;' | sed 's/\///g;' | sed -e '1,1d'`" for exclude in $EXCLUDEHTDOCS do HTDOCSNAMES=`echo $HTDOCSNAMES | sed "s/\b$exclude\b//g"` done echo "$TODAY" > $BACKUPLOC/daily/$DAYOFWEEK/.mailmessage echo "" >> $BACKUPLOC/daily/$DAYOFWEEK/.mailmessage rm $BACKUPLOC/daily/$DAYOFWEEK/htdocs_*.tar.gz >/dev/null 2>&1 for include in $HTDOCSNAMES do HT="`echo $include | sed 's/%/ /g'`" tar cfz htdocs_${HT}_$DAYOFWEEK.tar.gz $HT mv htdocs_${HT}_$DAYOFWEEK.tar.gz $BACKUPLOC/daily/$DAYOFWEEK/ done # Backup all htdocs root files tar cfz htdocs_rootfiles_$DAYOFWEEK.tar.gz *.* mv htdocs_rootfiles_$DAYOFWEEK.tar.gz $BACKUPLOC/daily/$DAYOFWEEK/ # Start backup of MySQL directory cd $BACKUPLOC/daily/$DAYOFWEEK/ DBNAMES="`$MYSQL --user=$USERNAME --password=$PASSWORD --host=localhost --batch --skip-column-names -e "show databases" | sed 's/ /%/g'`" for exclude in $EXCLUDEDB do DBNAMES=`echo $DBNAMES | sed "s/\b$exclude\b//g"` done rm mysql_*.gz >/dev/null 2>&1 for include in $DBNAMES do DB="`echo $include | sed 's/%/ /g'`" $MYSQLDUMP --user=$USERNAME --password=$PASSWORD --host=localhost --quote-names --opt $DB > mysql_${DB}_$DAYOFWEEK.sql gzip -f mysql_${DB}_$DAYOFWEEK.sql done # Start FTP if [ "$FTP" = "yes" ]; then startftp fi echo "Created the following archives:" >> .mailmessage echo "" >> .mailmessage du -hl *.gz >> .mailmessage echo "" >> .mailmessage # Rotate the backups to the lastweek directory DAYNUMBER=`date +%u` if [ "$LASTWEEK" = "yes" ]; then if [ "$DAYNUMBER" = "7" ]; then cp -rf $BACKUPLOC/daily $BACKUPLOC/lastweek/ echo "- Rotated last weeks backups" >> .mailmessage echo "" >> .mailmessage fi fi # Create a mirror copy on another drive if [ ! "$MIRROR" = "" ]; then rsync -av $BACKUPLOC $MIRROR >/dev/null 2>&1 echo "- Created mirror to $MIRROR" >> .mailmessage echo "" >> .mailmessage fi # Create FTP dump if [ "$FTPDUMP" = "yes" ]; then TODAY=`date +%R` echo "- Starting FTP dump at $TODAY" >> .mailmessage /usr/local/bin/ncftpput -u "$FTPUSERNAME" -p "$FTPPASSWORD" -R -V "$FTPIP" "$FTPDIR" "$BACKUPLOC/daily/$DAYOFWEEK/" TODAY=`date +%R` echo "- Ended FTP dump on $TODAY" >> .mailmessage echo "" >> .mailmessage fi # Add filesystem details to the log and send it by email echo "Current filesystem usage:" >> .mailmessage echo "" >> .mailmessage df -h >> .mailmessage echo "" >> .mailmessage # Add logfile if [ -s .logfile ]; then echo "Error messages:" >> .mailmessage cat .logfile >> .mailmessage else echo "No error messages" >> .mailmessage fi echo "" >> .mailmessage # Clean up I/O redirection exec 1>&6 6>&- exec 1>&7 7>&- TODAY=`date +%F%t%R` echo "$TODAY" >> .mailmessage if [ ! "$EMAILADDRESS" = "" ]; then cat .mailmessage | mail -s "Backup report" $EMAILADDRESS fi } restore() { # Restore MySQL or HTDOCS echo "##### WARNING - RESTORING OLD ARCHIVE #####" echo "" PS3='Please make your selection: ' select type in "Restore MySQL Database" "Restore HTDOCS folder" ; do break done echo "" # Restore MySQL if [ "$type" = "Restore MySQL Database" ]; then echo "Restoring MySQL Database" echo "" DBNAMES="`$MYSQL --user=$USERNAME --password=$PASSWORD --host=localhost --batch --skip-column-names -e "show databases" | sed 's/ /%/g'`" for exclude in $EXCLUDEDB do DBNAMES=`echo $DBNAMES | sed "s/\b$exclude\b//g"` done PS3='Please select the database you would like to restore:' select DB in $DBNAMES "Not listed" ; do break done echo "" if [ "$DB" = "Not listed" ]; then echo "Please enter the database name" read DB echo "" fi archives="`find $BACKUPLOC -iname mysql_${DB}*.gz`" PS3='Please select the backup to restore: ' select archive in $archives "Cancel" ; do break done echo "" if [ "$archive" = "Cancel" ]; then echo "" echo "Restore database has been cancelled" exit 0 fi echo "Restore: $archive (yes or no)?" read answer if [ "$answer" = "yes" ]; then gunzip $archive archive="`echo $archive | sed 's/\.gz//g'`" $MYSQL --user=$USERNAME --pass=$PASSWORD --host=localhost $DB < $archive gzip -f $archive echo "" echo "Database restored" else echo "" echo "Restore database has been cancelled" fi fi # Restore HTDOCS if [ "$type" = "Restore HTDOCS archive" ]; then echo "Restoring HTDOCS archive" echo "" cd $HTFOLDER HTDOCSNAMES="`find -type d -maxdepth 1 | sed 's/\.//g;' | sed 's/\///g;' | sed -e '1,1d'`" for exclude in $EXCLUDEHTDOCS do HTDOCSNAMES=`echo $HTDOCSNAMES | sed "s/\b$exclude\b//g"` done PS3='Please select the HTDOCS archive you would like to restore:' select HT in $HTDOCSNAMES "Not listed" ; do break done echo "" if [ "$HT" = "Not listed" ]; then echo "Please enter the HTDOCS archive name" read HT echo "" fi archives="`find $BACKUPLOC -iname htdocs_${HT}*.gz`" PS3='Please select the backup to restore: ' select archive in $archives "Cancel" ; do break done echo "" if [ "$archive" = "Cancel" ]; then echo "" echo "Restore HTDOCS archive has been cancelled" exit 0 fi echo "Restore: $archive (yes or no)?" read answer if [ "$answer" = "yes" ]; then cp $archive $HTFOLDER/ archive="`basename $archive`" gunzip $archive archive="`echo $archive | sed 's/\.gz//g'`" tar -xf $archive rm $archive echo "" echo "HTDOCS archive restored" else echo "" echo "HTDOCS restore cancelled" fi fi } main_menu() { dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --menu "Select a function:" 0 0 0 \ 1 "EDIT backup configuration" \ 2 "SHOW backup configuration" \ 3 "SAVE backup configuration" \ 4 "ENABLE daily backup" \ 5 "DISABLE daily backup" \ 6 "TEST backup now!" \ 7 "EXIT" 2>$TEMP if [ "$?" != "0" ] ; then clean_up ; fi choice=`cat $TEMP` case $choice in 1) edit_backup;; 2) view_backup;; 3) save;; 4) if [ "$SAVE" = "yes" ]; then save enable else enable fi dialog \ --sleep 1 \ --infobox "Enabling.." 3 30 ;; 5) disable dialog \ --sleep 1 \ --infobox "Disabling.." 3 30 ;; 6) dialog \ --sleep 1 \ --infobox "Starting backup.." 3 30 start if [ "$EMAILADDRESS" = "" ]; then dialog \ --sleep 3 \ --infobox "Completed!\nCheck $BACKUPLOC for the result" 5 45 else dialog \ --sleep 3 \ --infobox "Completed!\nCheck your email for the result" 5 45 fi ;; 7) clean_up;; esac main_menu } save() { dialog \ --sleep 1 \ --infobox "Saving..." 3 13 echo "#!/bin/bash" > $SCRIPT/.backup echo "# Backup configuration file" >> $SCRIPT/.backup echo "BACKUPLOC=\"$BACKUPLOC\"" >> $SCRIPT/.backup echo "MIRROR=\"$MIRROR\"" >> $SCRIPT/.backup echo "USERNAME=\"$USERNAME\"" >> $SCRIPT/.backup echo "PASSWORD=\"$PASSWORD\"" >> $SCRIPT/.backup echo "EXCLUDEDB=\"$EXCLUDEDB\"" >> $SCRIPT/.backup echo "EXCLUDEHTDOCS=\"$EXCLUDEHTDOCS\"" >> $SCRIPT/.backup echo "FTP=\"$FTP\"" >> $SCRIPT/.backup echo "FTPDUMP=\"$FTPDUMP\"" >> $SCRIPT/.backup echo "FTPUSERNAME=\"$FTPUSERNAME\"" >> $SCRIPT/.backup echo "FTPPASSWORD=\"$FTPPASSWORD\"" >> $SCRIPT/.backup echo "FTPIP=\"$FTPIP\"" >> $SCRIPT/.backup echo "FTPDIR=\"$FTPDIR\"" >> $SCRIPT/.backup echo "LASTWEEK=\"$LASTWEEK\"" >> $SCRIPT/.backup echo "ONEDAY=\"$ONEDAY\"" >> $SCRIPT/.backup echo "EMAILADDRESS=\"$EMAILADDRESS\"" >> $SCRIPT/.backup SAVE="no" main_menu } view_backup() { echo "Your configuration:" >$TEMP.summary echo "" >>$TEMP.summary echo "Main backup location: $BACKUPLOC" >>$TEMP.summary if [ ! "$MIRROR" = "" ]; then echo "Mirror location: $MIRROR" >>$TEMP.summary else echo "Mirror: disabled" >>$TEMP.summary fi echo "" >>$TEMP.summary if [ ! "$EXCLUDEDB" = "" ]; then echo "Excluded databases:" >>$TEMP.summary echo "$EXCLUDEDB" >>$TEMP.summary else echo "Exclude databases: disabled" >>$TEMP.summary fi DBNAMES="`$MYSQL --user=$USERNAME --password=$PASSWORD --host=localhost --batch --skip-column-names -e "show databases" | sed 's/ /%/g'`" for exclude in $EXCLUDEDB do DBNAMES=`echo $DBNAMES | sed "s/\b$exclude\b//g"` done echo "Databases included in the backup:" >>$TEMP.summary echo "$DBNAMES" >>$TEMP.summary echo "" >>$TEMP.summary if [ "$FTP" = "yes" ]; then echo "FTP Service: disabled during backup" >>$TEMP.summary else echo "FTP Service: enabled during backup" >>$TEMP.summary fi echo "" >>$TEMP.summary if [ ! "$EXCLUDEHTDOCS" = "" ]; then echo "Excluded directories:" >>$TEMP.summary echo "$EXCLUDEHTDOCS" >>$TEMP.summary else echo "Exclude directories: disabled" >>$TEMP.summary fi cd $HTFOLDER HTDOCSNAMES="`find -type d -maxdepth 1 | sed 's/\.//g;' | sed 's/\///g;' | sed -e '1,1d'`" for exclude in $EXCLUDEHTDOCS do HTDOCSNAMES=`echo $HTDOCSNAMES | sed "s/\b$exclude\b//g"` done echo "Directories included in the backup:" >>$TEMP.summary echo "$HTDOCSNAMES" >>$TEMP.summary echo "" >>$TEMP.summary if [ "$FTPDUMP" = "yes" ]; then echo "FTP dump: enabled" >>$TEMP.summary echo "FTP server IP: $FTPIP" >>$TEMP.summary echo "FTP directory: $FTPDIR" >>$TEMP.summary else echo "FTP dump: disabled" >>$TEMP.summary fi echo "" >>$TEMP.summary if [ "$LASTWEEK" = "yes" ]; then echo "Backup period: 14 days" >>$TEMP.summary else if [ "$ONEDAY" = "yes" ]; then echo "Backup period: 1 day" >>$TEMP.summary else echo "Backup period: 7 days" >>$TEMP.summary fi fi echo "" >>$TEMP.summary if [ "$EMAILADDRESS" = "" ]; then echo "Email confirmation: disabled" >>$TEMP.summary else echo "Email confirmation to: $EMAILADDRESS" >>$TEMP.summary fi echo "" >>$TEMP.summary dialog \ --title "Configure Backup" \ --textbox $TEMP.summary 20 60 2>/dev/null rm $TEMP.summary main_menu } edit_backup() { dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --menu "Select a function:" 0 0 0 \ 1 "Enter main backup location" \ 2 "Enter mirror location" \ 3 "Database details" \ 4 "Webserver details" \ 5 "FTP dump" \ 6 "Backup period" \ 7 "Email confirmation" \ 8 "Return to main menu" 2>$TEMP if [ "$?" != "0" ] ; then main_menu ; fi choice=`cat $TEMP` case $choice in 1) enter_mainbackup;; 2) enter_mirror;; 3) mysql_config;; 4) apache_config;; 5) ftp_config;; 6) backup_period;; 7) enter_email;; 8) main_menu;; esac } backup_period() { dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --radiolist "Select backup period\nUse SPACE to select" 0 0 0 \ 1 "1 day" off \ 2 "7 days" off \ 3 "14 days" ON \ 2>$TEMP if [ "$?" != "0" ] ; then edit_network ; fi choice=`cat $TEMP` case $choice in 1) ONEDAY="yes" LASTWEEK="no" ;; 2) ONEDAY="no" LASTWEEK="no" ;; 3) ONEDAY="no" LASTWEEK="yes" ;; esac save="yes" edit_backup } enter_mainbackup() { dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --inputbox "Please enter the main backup location:" 10 45 "$BACKUPLOC" 2>$TEMP if [ "$?" != "0" ] ; then edit_backup ; fi BACKUPLOC=`cat $TEMP` SAVE="yes" enter_mirror } enter_mirror() { dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --inputbox "Please enter the mirror location:\nExample /mnt/hda2\n(leave empty to disable)" 10 45 "$MIRROR" 2>$TEMP if [ "$?" != "0" ] ; then edit_backup ; fi MIRROR=`cat $TEMP` SAVE="yes" mysql_config } mysql_config() { dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --inputbox "Please enter your MySQL username" 10 45 "$USERNAME" 2>$TEMP if [ "$?" != "0" ] ; then edit_backup ; fi USERNAME=`cat $TEMP` dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --insecure \ --passwordbox "Please enter your MySQL password" 10 45 2>$TEMP if [ "$?" != "0" ] ; then edit_backup ; fi PASSWORD=`cat $TEMP` DBNAMES="`$MYSQL --user=$USERNAME --password=$PASSWORD --host=localhost --batch --skip-column-names -e "show databases" | sed 's/ /%/g'`" if [ "$DBNAMES" = "" ]; then dialog \ --sleep 2 \ --infobox "Wrong username/password!" 3 30 mysql_config fi dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --inputbox "Please enter databases (space separated) to EXCLUDE\nThe following databases are available:\n \n$DBNAMES" 15 60 "$EXCLUDEDB" 2>$TEMP if [ "$?" != "0" ] ; then edit_backup ; fi EXCLUDEDB=`cat $TEMP` dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --yesno "Would you like to disable the FTP service during backup (to stop incoming data)?\nNote: backup might take a long time" 10 45 case $? in 0) FTP="yes";; 1) FTP="no";; 255) edit_backup;; esac SAVE="yes" apache_config } apache_config() { cd $HTFOLDER HTDOCSNAMES="`find -type d -maxdepth 1 | sed 's/\.//g;' | sed 's/\///g;' | sed -e '1,1d'`" dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --inputbox "Please enter directories (space separated) to EXCLUDE\nThe following directories are available:\n \n$HTDOCSNAMES" 15 60 "$EXCLUDEHTDOCS" 2>$TEMP if [ "$?" != "0" ] ; then edit_backup ; fi EXCLUDEHTDOCS=`cat $TEMP` SAVE="yes" edit_backup } ftp_config() { dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --yesno "Would you like to enable the FTP dump?" 6 50 case $? in 0) FTPDUMP="yes";; 1) FTPDUMP="no";; 255) edit_backup;; esac if [ "$FTPDUMP" = "yes" ]; then dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --inputbox "Please enter your FTP username" 10 50 "$FTPUSERNAME" 2>$TEMP if [ "$?" != "0" ] ; then edit_backup ; fi FTPUSERNAME=`cat $TEMP` dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --insecure \ --passwordbox "Please enter your FTP password" 10 50 2>$TEMP if [ "$?" != "0" ] ; then edit_backup ; fi FTPPASSWORD=`cat $TEMP` dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --inputbox "Please enter the FTP server IP address" 10 50 "$FTPIP" 2>$TEMP if [ "$?" != "0" ] ; then edit_backup ; fi FTPIP=`cat $TEMP` dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --inputbox "Please enter the FTP server path" 10 45 "$FTPDIR" 2>$TEMP if [ "$?" != "0" ] ; then edit_backup ; fi FTPDIR=`cat $TEMP` if [ "$FTPDIR" = "" ]; then FTPDIR="/" fi fi SAVE="yes" edit_backup } enter_email() { dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --yesno "Would you like to receive a daily email confirmation?" 8 45 case $? in 0) EMAIL="yes";; 1) EMAIL="no";; 255) edit_backup;; esac if [ "$EMAIL" = "yes" ]; then dialog \ --backtitle "by JF Nutbroek - www.mywebmymail.com" \ --title "Configure Backup" \ --inputbox "Please enter your email address:" 10 45 "$EMAILADDRESS" 2>$TEMP if [ "$?" != "0" ] ; then edit_backup ; fi EMAILADDRESS=`cat $TEMP` else EMAILADDRESS="" fi SAVE="yes" edit_backup } trap clean_up SIGHUP SIGINT SIGQUIT SIGKILL SIGTERM case "$1" in 'start') start ;; 'config') setterm -background blue clear main_menu setterm -background black ;; 'disable') disable ;; 'enable') enable ;; 'restore') setterm -background blue clear restore setterm -background black ;; *) echo "Usage: backup_software config | start | disable | enable | restore" esac exit 0